mikebarkmin/baby-tracker

View on GitHub
server/src/modules/index.js

Summary

Maintainability
C
1 day
Test Coverage
import baby from './baby';
import diaper from './diaper';
import nursing from './nursing';
import sleep from './sleep';
import food from './food';
import measurement from './measurement';

export function eventHandler(socket, socketPrefix, Model) {
  socket.on(`${socketPrefix}/summary`, function (start, end, callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;

    if (start === null) {
      start = new Date();
      start.setHours(0, 0, 0, 0);
    }

    if (end === null) {
      end = new Date();
      end.setHours(23, 59, 59);
    }

    Model.find({ babyId, date: { $gte: start, $lte: end } })
      .sort({ date: -1 })
      .then((docs) => {
        let last = null;
        if (docs.length > 0) {
          last = docs[0];
        }

        callback({
          msg: 'success',
          summary: {
            number: docs.length,
            last,
            events: docs,
          },
        });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });

  socket.on(`${socketPrefix}/latest`, function (callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;
    Model.findOne({ babyId })
      .sort({ date: -1 })
      .then((doc) => {
        callback({ msg: 'success', event: doc });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });

  socket.on(`${socketPrefix}/get`, function (callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;
    Model.find({ babyId })
      .sort({ date: -1 })
      .limit(30)
      .then((docs) => {
        callback({ msg: 'success', events: docs });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });

  socket.on(`${socketPrefix}/getall`, function (callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;
    Model.find({ babyId })
      .sort({ date: -1 })
      .then((docs) => {
        callback({ msg: 'success', events: docs });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });

  socket.on(`${socketPrefix}/create`, function (eventData, callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;
    const event = new Model({ ...eventData, babyId });
    event
      .save()
      .then((doc) => {
        socket
          .to(socket.baby.shortId)
          .emit(`${socketPrefix}/created`, { event: doc });
        callback({ msg: 'success', event: doc });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });

  socket.on(`${socketPrefix}/delete`, function (id, callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;
    Model.deleteOne({ babyId, _id: id })
      .then(() => {
        socket.to(socket.baby.shortId).emit(`${socketPrefix}/deleted`, { id });
        callback({ msg: 'success' });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });

  socket.on(`${socketPrefix}/update`, function (id, event, callback) {
    if (!socket.baby) {
      callback({ msg: 'no baby' });
      return;
    }
    const babyId = socket.baby._id;
    Model.findOneAndUpdate({ babyId, _id: id }, event, { new: true })
      .then((doc) => {
        socket.to(socket.baby.shortId).emit(`${socketPrefix}/updated`, doc);
        callback({ msg: 'success', event: doc });
      })
      .catch((e) => {
        callback({ msg: e });
      });
  });
}

export default {
  baby,
  diaper,
  food,
  nursing,
  measurement,
  sleep,
};