efcsydney/efcsydney-roster

View on GitHub
api/data/event-repository.js

Summary

Maintainability
A
0 mins
Test Coverage
const Sequelize = require('sequelize');
const Event = require('../models/event').Event;
const CalendarDate = require('../models/calendar-date').CalendarDate;
const Position = require('../models/position').Position;
const Service = require('../models/service').Service;
const Op = Sequelize.Op;

class EventRepository {
  static getEventsByDateRange(dateRange, service) {
    const { from, to } = dateRange;
    return Event.findAll({
      include: [
        {
          model: CalendarDate,
          as: 'calendarDate',
          where: { date: { [Op.gte]: from, [Op.lte]: to } }
        },
        {
          model: Position,
          as: 'position',
          required: true,
          include: [
            {
              model: Service,
              as: 'service',
              required: true,
              where: { name: { [Op.eq]: service } }
            }
          ]
        }
      ],
      order: [
        [{ model: CalendarDate, as: 'calendarDate' }, 'date', 'DESC'],
        [{ model: Position, as: 'position' }, 'order', 'ASC']
      ]
    });
  }

  static async getEventByDatePositionServiceName(criteria) {
    const { date, position, serviceName } = criteria;

    const service = await Service.findOne({
      where: { name: serviceName }
    });

    return await Event.findOne({
      include: [
        {
          model: CalendarDate,
          as: 'calendarDate',
          where: { date: { [Op.eq]: date } }
        },
        {
          model: Position,
          as: 'position',
          where: { name: position, serviceId: service.id },
          required: true
        }
      ]
    });
  }

  static getEventByDatePosition(criteria) {
    const { date, position } = criteria;
    return Event.findOne({
      include: [
        {
          model: CalendarDate,
          as: 'calendarDate',
          where: { date: { [Op.eq]: date } }
        },
        {
          model: Position,
          as: 'position',
          where: { name: position },
          required: true
        }
      ]
    });
  }

  static async createEvent(event) {
    return await Event.create(event);
  }

  static updateEvent(event) {
    return Event.update(
      {
        volunteerName: event.volunteerName
      },
      {
        where: { id: event.id }
      }
    );
  }
}

module.exports = { EventRepository };