text: const Promise = require('bluebird');
  const common = require('../../lib/common');
  const models = require('../../models');
  
  const ALLOWED_INCLUDES = ['count.members'];
  
  module.exports = {
      docName: 'labels',
  
      browse: {
          options: [
              'include',
              'filter',
              'fields',
              'limit',
              'order',
              'page'
          ],
          validation: {
              options: {
                  include: {
                      values: ALLOWED_INCLUDES
                  }
              }
          },
          permissions: true,
          query(frame) {
              return models.Label.findPage(frame.options);
          }
      },
  
      read: {
          options: [
              'include',
              'filter',
              'fields'
          ],
          data: [
              'id',
              'slug'
          ],
          validation: {
              options: {
                  include: {
                      values: ALLOWED_INCLUDES
                  }
              }
          },
          permissions: true,
          query(frame) {
              return models.Label.findOne(frame.data, frame.options)
                  .then((model) => {
                      if (!model) {
                          return Promise.reject(new common.errors.NotFoundError({
                              message: common.i18n.t('errors.api.labels.labelNotFound')
                          }));
                      }
  
                      return model;
                  });
          }
      },
  
      add: {
          statusCode: 201,
          headers: {
              cacheInvalidate: true
          },
          options: [
              'include'
          ],
          validation: {
              options: {
                  include: {
                      values: ALLOWED_INCLUDES
                  }
              }
          },
          permissions: true,
          query(frame) {
              return models.Label.add(frame.data.labels[0], frame.options);
          }
      },
  
      edit: {
          headers: {},
          options: [
              'id',
              'include'
          ],
          validation: {
              options: {
                  include: {
                      values: ALLOWED_INCLUDES
                  },
                  id: {
                      required: true
                  }
              }
          },
          permissions: true,
          query(frame) {
              return models.Label.edit(frame.data.labels[0], frame.options)
                  .then((model) => {
                      if (!model) {
                          return Promise.reject(new common.errors.NotFoundError({
                              message: common.i18n.t('errors.api.labels.labelNotFound')
                          }));
                      }
  
                      if (model.wasChanged()) {
                          this.headers.cacheInvalidate = true;
                      } else {
                          this.headers.cacheInvalidate = false;
                      }
  
                      return model;
                  });
          }
      },
  
      destroy: {
          statusCode: 204,
          headers: {
              cacheInvalidate: true
          },
          options: [
              'id'
          ],
          validation: {
              options: {
                  include: {
                      values: ALLOWED_INCLUDES
                  },
                  id: {
                      required: true
                  }
              }
          },
          permissions: true,
          query(frame) {
              return models.Label.destroy(frame.options).then(() => null);
          }
      }
  };
  