# GRID/CMS

The easiest way to manage data in Firestore.

Integrates with Firebase Hosting to provide a simple self-updating CMS with zero maintenance.

## Getting started

1. Go to firebase project (or `firebase init` in a blank folder) and make sure hosting and Firestore is setup.

2. Then run `npm init cms` and follow instructions.

3. Login and define what data you want exposed in the CMS.

### Hosting and config

GRID/CMS will automatically read the firebaseConfig from the hosting environment, unless specifically defined. This makes it easy to have `prod`, `dev` and `testing` environments without a bunch of `.env` files.

### Permissions

The schema will be saved in Firestore (`/_CMS_/schema`) and the current user will therefore need read/write access.

- If write access is given the user will be able to extend the schema.

- If only read access is given, the user will be able to login and manage data but not extend the schema.

An example of admin access for specific user:

```js
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{col}/{doc=**} {
      allow read, write: if request.auth.token.email == 'admin@e-corp.com';
    }
  }
}
```

A more detailed example of full admin and editor access using [Custom Claims](https://firebase.google.com/docs/auth/admin/custom-claims):

```js
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{col}/{doc=**} {
      allow read: if hasRole(['admin','editor']);
      allow write: if hasRole(['admin']) || (col != '_CMS_' && hasRole(['editor']));
    }
    function hasRole(roles) {
      return request.auth != null && request.auth.token.get("role", null) in roles;
    }
  }
}
```
