Dulce-Work-Schedule/2018.1-Dulce_Schedule

View on GitHub
Client/api.js

Summary

Maintainability
F
1 wk
Test Coverage

currentWeekNumber = require('current-week-number');

// The RegExp Object above validates MongoBD ObjectIds
function IsInvalidObjectId(objectIdString){
  var checkObjectId = new RegExp('^[0-9a-fA-F]{24}$');
  return (! checkObjectId.test(objectIdString))
}
var milliseconds_in_one_hour = 3600000.0

// Alternative python string.format() for javascript
// First, checks if it isn't implemented yet.
if (!String.prototype.format) {
  String.prototype.format = function(){
    var replaceable_count = (this.match(/{}/g) || []).length;
    if(arguments.length < replaceable_count){
      console.log(
        "Expecting " + replaceable_count + "arguments, " +
        arguments.length + 'found.');
      return this
    }else{
      var new_string = this;
      for (i=0; i < replaceable_count; i++){
        new_string = new_string.replace('{}', arguments[i]);
      }
      return new_string
    }
  };
}

// get_schedule_duration returns schedule duration in hours
function get_schedule_duration( start_time, end_time){
  // The diference between Dates are given in milliseconds.
  // So we divide by the amount of milliseconds in 1 hour
  console.log(start_time);
  console.log(end_time);
  var duration = (
    (end_time - start_time) /
    milliseconds_in_one_hour
  );
  console.log('Duração:{}'.format(duration));
  return duration;
}

function api(options){

//#############################################################################
  this.add('role:api,path:createSchedule', function(msg, respond){
    // result variable store attribute errors or the success created schedule
    var result = {};

    // check if body is empty.
    if (msg.args.body == {}){
      result.body_error = 'Nenhum parametro informado';
      respond(null, result);
    }

    var sector_id = msg.args.body.sector_id;
    var profile_id = msg.args.body.profile_id;
    var start_time = null;
    var end_time = null;

    // validate start time
    if (msg.args.body.start_time == null) {
      result.start_time_null_error = 'Horário inicial não pode ser nulo';
      console.log(result.start_time_null_error);
    } else {
      start_time = new Date(msg.args.body.start_time);
      if (start_time == "Invalid Date") {
        result.start_time_invalid_error = 'Horário inicial inválido';
        console.log(result.start_time_invalid_error);
      }
    }
    // validate end time
    if (msg.args.body.end_time == null) {
      result.end_time_null_error = 'Horário final não pode ser nulo';
      console.log(result.end_time_null_error);
    } else {
      end_time = new Date(msg.args.body.end_time);
      if (end_time == "Invalid Date") {
        result.end_time_invalid_error = 'Horário final inválido';
        console.log(result.end_time_invalid_error);
      }
    }
    console.log();
    // validate sector id
    if (sector_id == null || sector_id == "") {
      result.sector_id_error = 'O setor é obrigatório';
      console.log(result.sector_id_error);
    } else if (IsInvalidObjectId(sector_id)) {
      result.invalid_sector_id_error = 'sector_id inválido'
    }

    // validate profile id
    if (profile_id == null || profile_id == "") {
      result.profile_id_error = 'O usuário é obrigatório';
      console.log(result.profile_id_error);
    } else if (IsInvalidObjectId(profile_id)) {
      result.invalid_profile_id_error = 'profile_id inválido'
    }
    // validade interval between start time and end time
    if((end_time - start_time) < 0){
      result.date_interval_error = 'O fim do horário deve ser maior que o início do horário'
      console.log(result.date_interval_error);
    }else if((end_time - start_time) == 0){
      result.date_equals_error = 'O horário de início e de fim não podem ser iguais'
      console.log(result.date_interval_error);
    }


    if (get_schedule_duration(start_time, end_time) > 24){
      result.schedule_bigger_than_limit_error = 'O horário deve ser de no máximo 1 dia';
      console.log(result.schedule_bigger_than_limit_error)
    }


    // verify that an error has occurred
    if (Object.entries(result)[0]) {
      console.log("Result:");
      console.log(result);
      result.success = false;
      respond(null, result)
    // else, everything sucess
    } else {
      this.act('role:schedule,cmd:createSchedule',{
        start_time: start_time,
        end_time: end_time,
        sector_id: sector_id,
        profile_id: profile_id
      }, respond)
    }
  });

//#############################################################################
  this.add('role:api,path:createScheduleSettings', function(msg, respond){
    var max_hours_month = parseInt(msg.args.body.max_hours_month)
    var max_hours_week = parseInt(msg.args.body.max_hours_week)
    var min_hours_month = parseInt(msg.args.body.min_hours_month)
    var min_hours_week = parseInt(msg.args.body.min_hours_week)
    var max_hours_day = parseInt(msg.args.body.max_hours_day)
    var min_hours_schedule = parseInt(msg.args.body.min_hours_schedule)
    // Lista de ids de templates
    var templates = msg.args.body.templates

    result = {}
    // validar se ids de templates são validos

    // 24*7 = 168
    var max_hours_in_a_week = 168;
    // 24*31 = 744
    var max_hours_in_a_month = 744;
    // 24h
    var max_hours_in_a_day = 24;

    // Validações de horas máximas por day
    if(isNaN(max_hours_day)){
      result.max_hours_day_NaN_error = 'O máximo de horas por dia deve ser um valor inteiro positivo';
      console.log(result.max_hours_day_NaN_error);
    } else if(max_hours_day <= 0){
      result.max_hours_day_negative_number_error = 'O máximo de horas por dia deve ser um valor positivo maior que zero';
      console.log(result.max_hours_day_negative_number_error);
    } else if(max_hours_day > max_hours_in_a_day){
      result.day_limit_error = 'O máximo de horas por dia não pode ser maior que ' + max_hours_in_a_day;
      console.log(result.day_limit_error);
    }

    // Validações de horas mínimas por semana
    if(isNaN(min_hours_schedule)){
      result.min_hours_schedule_NaN_error = 'O número mínimo de horas por dia deve ser um valor inteiro positivo';
    } else if(min_hours_schedule <= 0){
      result.min_hours_schedule_negative_number_error = 'O número mínimo de horas por dia deve ser um valor positivo maior que zero';
    } else if(min_hours_schedule > max_hours_in_a_day){
      result.day_limit_error = 'O mínimo de horas por dia não pode ser maior que ' + max_hours_in_a_day;
      console.log(result.day_limit_error);
    }

    // Validações de horas máximas por mês
    if(isNaN(max_hours_month)){
      result.max_hours_month_NaN_error = 'O máximo de horas por mês deve ser um valor inteiro positivo';
      console.log(result.max_hours_month_NaN_error);
    } else if(max_hours_month <= 0){
      result.max_hours_month_negative_number_error = 'O máximo de horas por mês deve ser um valor positivo maior que zero';
      console.log(result.max_hours_month_negative_number_error);
    } else if(max_hours_month >= max_hours_in_a_month){
      result.month_limit_error = 'O máximo de horas por mês não pode ser maior ou igual a ' + max_hours_in_a_month;
      console.log(result.month_limit_error);
    }

    // Validações de horas máximas por semana
    if(isNaN(max_hours_week)){
      result.max_hours_week_NaN_error = 'O máximo de horas por semana deve ser um valor inteiro positivo';
      console.log(result.max_hours_week_NaN_error);
    } else if(max_hours_week <= 0){
      result.max_hours_week_negative_number_error = 'O máximo de horas por semana deve ser um valor positivo maior que zero';
      console.log(result.max_hours_week_negative_number_error);
    } else if(max_hours_week >= max_hours_in_a_week){
      result.week_limit_error = 'O máximo de horas por semana não pode ser maior ou igual a ' + max_hours_in_a_week;
      console.log(result.week_limit_error);
    }

    // Validações de horas mínimas por mês
    if(isNaN(min_hours_month)){
      result.min_hours_month_NaN_error = 'O mínimo de horas por mês deve ser um valor inteiro positivo';
      console.log(result.min_hours_month_NaN_error);
    } else if(min_hours_month <= 0){
      result.min_hours_month_negative_number_error = 'O mínimo de horas por mês deve ser um valor positivo maior que zero';
      console.log(result.min_hours_month_negative_number_error);
    } else if(min_hours_month >= max_hours_in_a_month){
      result.month_limit_error = 'O mínimo de horas por mês não pode ser maior ou igual a ' + max_hours_in_a_month;
      console.log(result.month_limit_error);
    }

    // Validações de horas mínimas por semana
    if(isNaN(min_hours_week)){
      result.min_hours_week_NaN_error = 'O número mínimo de horas por semana deve ser um valor inteiro positivo';
    } else if(min_hours_week <= 0){
      result.min_hours_week_negative_number_error = 'O número mínimo de horas por semana deve ser um valor positivo maior que zero';
      respond(null, {success:false, message: 'O mínimo de horas por semana deve ser um valor positivo'})
    } else if(min_hours_week >= max_hours_in_a_week){
      result.week_limit_error = 'O mínimo de horas por semana não pode ser maior ou igual a ' + max_hours_in_a_week;
      console.log(result.week_limit_error);
    }

    // Validate interval limit
    if (min_hours_month <= min_hours_week) {
      result.min_hours_month_lte_min_hours_week_error = 'O mínimo de horas por mês deve ser maior que o mínimo de horas por semana';
      console.log(result.min_hours_month_lte_min_hours_week_error);
    }

    // Validate interval limit
    if (max_hours_month <= max_hours_week) {
      result.max_hours_month_lte_min_hours_week_error = 'O máximo de horas por mês deve ser maior que o mínimo de horas por semana';
      console.log(result.max_hours_month_lte_min_hours_week_error);
    }

    // Validate interval limit
    if (max_hours_month <= min_hours_month) {
      result.min_max_hours_month_interval_invalid_error = 'O mínimo de horas por mês deve ser menor que o máximo de horas por mês';
      console.log(result.min_max_hours_month_interval_invalid_error);
    }

    // Validate interval limit
    if (max_hours_week <= min_hours_week) {
      result.hours_week_interval_invalid_error = 'O máximo de horas por semana deve ser maior que o mínimo de horas por semana';
      console.log(result.hours_week_interval_invalid_error);
    }

    // Validate interval limit
    if (max_hours_day <= min_hours_schedule) {
      result.hours_day_interval_invalid_error = 'O máximo de horas por dia deve ser maior que o mínimo de horas da escala';
      console.log(result.hours_week_interval_invalid_error);
    }
    if (Object.entries(result)[0]) {
      console.log("Result:");
      console.log(result);
      result.success = false;
      respond(null, result)
    } else {
      this.act('role:schedule,cmd:createScheduleSettings',{
        max_hours_month:max_hours_month,
        max_hours_week:max_hours_week,
        min_hours_month:min_hours_month,
        min_hours_week:min_hours_week,
        min_hours_schedule: min_hours_schedule,
        max_hours_day:max_hours_day,
        templates:templates
      }, respond)
    }
  });

//#############################################################################

  this.add('role:api,path:listYearByProfile', function (msg, respond) {
      var profile_id = msg.args.query.profile_id;
      result = {success:false};
      if(IsInvalidObjectId(profile_id)){
        result.invalid_profile_id_error = "Perfil inválido"
        respond(null, result);
      }else{
        var currentDate = new Date();
        var year = parseInt(msg.args.query.year);
        if (isNaN(year) == true) {
            year = currentDate.getFullYear();
        }else{
          // Nothing to do
        }
        start_year = new Date(year, 0, 1);
        end_year = new Date((year+1), 0, 1);

        console.log("Start" + start_year);
        console.log("End" + end_year);
        this.act('role:schedule,cmd:listYearByProfile', {
            start_year:start_year,
            end_year:end_year,
            profile_id:profile_id
        }, respond)
      }
  });

//#############################################################################

  this.add('role:api,path:listYearBySector', function (msg, respond) {
    console.log(msg.args)
    var currentDate = new Date();
    var year = msg.args.query.year;
    if (year == undefined || year == "Invalid Date") {
        year = currentDate.getFullYear();
    }
    year = parseInt(year);
    start_year= new Date(year, 0, 1);
    end_year= new Date((year+1), 0, 1);

    console.log("Start" + start_year)
    console.log("End" + end_year)

    var sector_id = msg.args.query.sector_id;
    this.act('role:schedule,cmd:listYearBySector', {
        start_year:start_year,
        end_year:end_year,
        sector_id:sector_id
    }, respond)
  });

//#############################################################################

  this.add('role:api,path:changeListYearBySector', function (msg, respond) {
    console.log(msg.args)
    var currentDate = new Date();
    var year = msg.args.query.year;
    if (year == undefined || year == "Invalid Date") {
        year = currentDate.getFullYear();
    }
    year = parseInt(year);
    start_year= new Date(year, 0, 1);
    end_year= new Date((year+1), 0, 1);

    console.log("Start" + start_year)
    console.log("End" + end_year)

    var sector_id = msg.args.query.sector_id;
    var profile_id = msg.args.query.profile_id;
    this.act('role:schedule,cmd:changeListYearBySector', {
        start_year:start_year,
        end_year:end_year,
        sector_id:sector_id,
        profile_id:profile_id
    }, respond)
  });

//#############################################################################

  this.add('role:api,path:listYearByUser', function (msg, respond) {
    console.log(msg.args)
    var currentDate = new Date();
    var year = msg.args.query.year;
    if (year == undefined || year == "Invalid Date") {
        year = currentDate.getFullYear();
    }
    year = parseInt(year);
    start_year= new Date(year, 0, 1);
    end_year= new Date((year+1), 0, 1);

    console.log("Start" + start_year)
    console.log("End" + end_year)

    var user_id = msg.args.query.user_id;
    this.act('role:schedule,cmd:listYearByUser', {
        start_year:start_year,
        end_year:end_year,
        user_id:user_id
    }, respond)
  });

//#############################################################################

  this.add('role:api,path:listByProfile', function (msg, respond) {
    var id = msg.args.query.id
    console.log("id informado:" + id);
    this.act('role:schedule, cmd:listByProfile', {
      id:id
    }, respond)
  });

//#############################################################################

  this.add('role:api,path:delete', function (msg, respond) {
    var schedule_id = msg.args.query.schedule_id;

    this.act('role:schedule,cmd:delete', {
        schedule_id:schedule_id
    }, respond)
  });

//#############################################################################

  this.add('role:api,path:error', function(msg, respond){
      this.act('role:schedule, cmd:error',{}, respond)
  });

//#############################################################################

  this.add('init:api', function (msg, respond) {
    this.act('role:web', {
      routes: {
        prefix: '/api/schedule',
        pin: 'role:api,path:*',
        map: {
          createSchedule: {
            POST: true
          },
          listByProfile: {
            GET: true
          },
          listYearByProfile: {
            GET: true
          },
          listYearBySector: {
            GET: true
          },
          changeListYearBySector: {
            GET: true
          },
          listYearByUser: {
            GET: true
          },
          delete: {
            DELETE: true
          },
          //  listSectorWeek: { GET: true,
          //    auth: {
          //        strategy: 'jwt',
          //        fail: '/api/schedule/error'
          //     }
          // },
          createScheduleSettings: {
            POST:true
          },
          error: {GET: true }
        }
      }
    }, respond)
  })
}
module.exports = api