mozilla/publish.webmaker.org

View on GitHub
api/modules/publishedProjects/model.js

Summary

Maintainability
B
6 hrs
Test Coverage
"use strict";

const BaseModel = require(`../../classes/base_model`);

const ProjectsModel = require(`../projects/model`);

const DateTracker = require(`../../../lib/utils`).DateTracker;

class PublishedProjectsQueryBuilder {
  constructor(context) {
    this.context = context;
    this.PublishedProjectsModel = context.constructor;
  }

  getOne(id) {
    return new this.PublishedProjectsModel()
    .query()
    .where(this.context.column(`id`), id)
    .then(publishedProjects => this.context.parse(publishedProjects[0]));
  }

  createOne(data) {
    return new this.PublishedProjectsModel()
    .query()
    .insert(this.context.format(data), `id`)
    .then(function(ids) { return ids[0]; });
  }

  updateOne(id, updatedValues) {
    return new this.PublishedProjectsModel()
    .query()
    .where(this.context.column(`id`), id)
    .update(this.context.format(updatedValues))
    .then(function() { return id; });
  }

  deleteOne(id) {
    return new this.PublishedProjectsModel()
    .query()
    .where(this.context.column(`id`), id)
    .del();
  }
}

const instanceProps = {
  tableName: `publishedProjects`,
  project() {
    return this.hasOne(ProjectsModel, `published_id`);
  },
  user() {
    return this.belongsTo(require(`../users/model`)).through(ProjectsModel, `id`, `user_id`, `published_id`);
  },
  publishedFiles() {
    return this.hasMany(require(`../publishedFiles/model`));
  },
  format: DateTracker.formatDatesInModel,
  parse: DateTracker.parseDatesInModel,
  queryBuilder() {
    return new PublishedProjectsQueryBuilder(this);
  }
};

const classProps = {
  typeName: `publishedProjects`,
  filters: {
    project_id(queryBuilder, value) {
      return queryBuilder.whereIn(`project_id`, value);
    }
  },
  relations: [
    `publishedFiles`,
    `user`
  ]
};

module.exports = BaseModel.extend(instanceProps, classProps);