# Usages without react

## prerequisites
- entitiesManager (how to configure : [configure-entities-manager](configure-entities-manager.md))
- store (how to configure : [configure-entities-manager](configure-entities-manager.md))

## how to writes & reads

#### entitiesDefinition used in this guide
```javascript
import { EntitiesManager as EM } from '@pedaling/firebase-entities-manager';

const entitiesDefinition = {
  user: {
    signedUpAt: EM.createdAt(),
    postCount: EM.count('post')
  },
  post: {
    postedAt: EM.createdAt(),
    updatedAt: EM.updatedAt(),
    authoredBy: EM.parentId('user'),
    tags: EM.parentIds('tag')
  },
  tag: {
    name: EM.required(),
    taggedPostCount: EM.count('post')
  },
};
```

#### entityItems used in this guide
```javascript
user: [
  {
    id: 'userA'
    signedUpAt: 1522205987785,
    postCount: 1
  },
  {
    id: 'userB',
    signedUpAt: 1522205997882,
    postCount: 0
  }
]

post: [
  {
    id: 'postA',
    postedAt: 1522414909722,
    updatedAt: 1522414909722,
    authoredBy: 'userA',
    tags: {
      'development',
      'javascript'
    },
    content: 'javascript is awesome'
  }
]

tag: [
  {
    id: 'development',
    name: 'development',
    taggedPostCount: 1
  },
  {
    id: 'javascript',
    name: 'javascript',
    taggedPostCount: 1
  },
  {
    id: 'python',
    name: 'python',
    taggedPostCount: 0
  }
]
```

#### writes
```javascript
// ---------- addItem ----------
store.dispatch(em.entity('user').addItem({ }))
  .then(userId => console.log('userId:', userId)); // => 'userC'

store.dispatch(
  em.entity('post').addItem({
    authoredBy: 'userB',
    tags: {
      'development': true,
      'python': true
    },
    content: 'python is awesome'
  })
).then(postId => console.log('postId:', postId)); // => 'postB'

// ---------- updateItem ----------
store.dispatch(
  em.entity('post').updateItem('postA', {
    tags: {
      'development': true,
      'python': true
    },
    content: 'yeah, python is awesome'
  })
).then(result => console.log('update result: ', result)); // => 'DONE'

// with condition (업데이트 직전에 DB에 있는 Object상태 체크 : 클라이언트에서 체크하므로 완벽하진 않지만 fairly reliable)
store.dispatch(
  em.entity('payment').updateItem(
    'payment1',
    { shippingState: 'preparingShipping' },
    (beforeItem) => beforeItem.state !== 'canceled'
  )
)

// ---------- deleteItem ----------
store.dispatch(em.entity('user').deleteItem('userC'))
  .then(result => console.log('delete result: ', result)); // => 'DONE'
```

#### reads
```javascript
// ---------- fetchItem ----------
store.dispatch(em.entity('post').fetchItem('postA'))
  .then(result => console.log('fetch result:', result)); // => 'DONE'

// ---------- fetchList ----------
// fetchList(orderBy:string, directionString:'asc'|'desc')
store.dispatch(em.entity('post').fetchList('postedAt', 'asc'))
  .then(result => console.log('fetch result:', result)); // => 'DONE'

// ---------- queryList ----------
store.dispatch(em.entity('post').queryList(
  'developmentPosts', 
  [[ 'tags.development', '==', true ]],
  'postedAt',
  'asc'
)).then(result => console.log('query result:', result));
```

#### selectors
```javascript
// ---------- getItem ----------
const postA = em.entity('post').getItem('postA')(store.getState());

// ---------- getAllItemList ----------
const allPostsInStore = em.entity('post').getAllItemList()(store.getState());

// ---------- getOrderedList ----------
const orderdPosts = em.entity('post').getOrderedList('postedAt')(store.getState());

// ---------- getQueriedList ----------
const developmentPosts = em.entity('post').getQueriedList('developmentPosts')(store.getState());
```
