mylisabox/lisa-box

View on GitHub
api/services/DashboardService.js

Summary

Maintainability
B
6 hrs
Test Coverage
'use strict'

const Service = require('trails/service')

/**
 * @module DashboardService
 * @description Service to manage dashboard
 */
module.exports = class DashboardService extends Service {
  _prepareDashboard(dashboard, devices) {
    const data = dashboard.toJSON()
    const widgets = []
    dashboard.widgets.forEach(value => {
      const device = devices.find(device => device.id === value)
      if (device) {
        widgets.push(device)
      }
    })
    devices.forEach(device => {
      const isAbsent = widgets.indexOf(device) === -1
      if (isAbsent) {
        widgets.push(device)
      }
    })

    data.widgets = widgets
    return data
  }

  getOrderedDeviceForRoom(roomId, userId) {
    const promises = [
      this.app.orm.Dashboard.find({
        where: {
          roomId: roomId,
          userId: userId
        }
      })
    ]

    if (roomId) {
      promises.push(this.app.services.DeviceService.findWithFavorites(userId, { roomId: roomId }))
    }
    else {
      promises.push(this.app.services.FavoritesService.getFavoritesAndSyncData(userId))
    }

    return Promise.all(promises).then(results => {
      const dashboard = results[0]
      let devices = results[1]

      devices = devices.concat(this.getAdditionalGroupDevice(roomId, devices))

      if (dashboard) {
        return Promise.resolve(this._prepareDashboard(dashboard, devices))
      }
      else {
        return this.app.orm.Dashboard.create({
          roomId: roomId,
          userId: userId,
          widgets: devices.map(device => device.id)
        }).then(dashboard => {
          return Promise.resolve(this._prepareDashboard(dashboard, devices))
        })
      }
    })
  }

  getAdditionalGroupDevice(roomId, devices, wantedType) {
    const groupDevices = []
    if (!wantedType || wantedType === this.app.lisa.DEVICE_TYPE.LIGHT) {
      const lights = devices.filter(devices => devices.type === this.app.lisa.DEVICE_TYPE.LIGHT)
      if (roomId && lights.length > 1) {
        const lightsDevice = {
          id: 1000 + roomId, //FIXME get proper way to do this
          name: 'Lights',
          type: 'group_light',
          roomId: roomId,
          data: {
            onoff: 'off',
            images: { 'off': '/images/widgets/light_off.png', 'on': '/images/widgets/light_on.png' }
          },
          favorite: false,
          template: undefined
        }

        let hasDim = false
        let hasHue = false
        lights.forEach(light => {
          if (light.data.onoff === 'on') {
            lightsDevice.data.onoff = 'on'
          }
          if (light.data.dim) {
            hasDim = true
            lightsDevice.data.dim = light.data.dim
          }
          if (light.data.hue) {
            hasHue = true
            lightsDevice.data.hue = light.data.hue
          }
        })
        if (hasHue) {
          lightsDevice.template = require('../../widgets/hue_color.json')
        }
        else if (hasDim) {
          lightsDevice.template = require('../../widgets/hue_white.json')
        }
        else {
          lightsDevice.template = require('../../widgets/light.json')
        }
        groupDevices.push(lightsDevice)
      }
    }
    return groupDevices
  }

  saveDevicesOrderForRoom(roomId, userId, widgetsOrder) {
    return this.app.orm.Dashboard.find({
      where: {
        roomId: roomId,
        userId: userId
      }
    }).then(dashboard => {
      if (dashboard) {
        return this.app.orm.Dashboard.update({
          roomId: roomId,
          userId: userId,
          widgets: widgetsOrder
        }, {
          where: {
            roomId: roomId,
            userId: userId
          }
        }).then(_ => {
          return Promise.resolve(dashboard)
        })
      }
      else {
        return this.app.orm.Dashboard.create({
          roomId: roomId,
          userId: userId,
          widgets: widgetsOrder
        }).then(dashboard => {
          return Promise.resolve(dashboard)
        })
      }
    })
  }
}