Passed
Push — master ( 1a2682...079612 )
by Kyungmi
02:20
created

src/router/status-api-router.js   A

Complexity

Total Complexity 27
Complexity/F 1.42

Size

Lines of Code 162
Function Count 19

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 73.68%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 0
wmc 27
c 1
b 0
f 0
nc 128
mnd 2
bc 12
fnc 19
dl 0
loc 162
ccs 28
cts 38
cp 0.7368
crap 0
rs 10
bpm 0.6314
cpm 1.421
noi 1

1 Function

Rating   Name   Duplication   Size   Complexity  
A status-api-router.js ➔ ??? 0 22 3
1
/**
2
 * Status Service API router
3
 *
4
 * @since 1.0.0
5
 */
6
7 4
const Joi = require('joi');
8 4
const Status = require('./../repository/Status');
9 4
const config = require('../config/server.config').url;
10 4
const dateUtil = require('../common/date-util');
11
12 4
module.exports = [
13
  {
14
    method: 'GET',
15
    path: `${config.statusApiPrefix}`,
16
    handler: (request, reply) => {
17
      let filter = {};
18 2
      if (request.query.filter === 'current') { // 미래 포함
19
        filter = {
20
          $or: [
21
            { endTime: { $gt: new Date() } },
22
            { startTime: { $exists: false }, endTime: { $exists: false } },
23
          ],
24
        };
25 2
      } else if (request.query.filter === 'expired') {
26
        filter = { endTime: { $lte: new Date() } };
27
      }
28
      Promise.all([
29
        Status.find(filter, { isActivated: -1, startTime: 1, endTime: 1, createTime: 1 }, request.query.skip, request.query.limit),
30
        Status.count(filter),
31
      ]).then(([list, totalCount]) => {
32
        reply({
33
          data: dateUtil.formatDates(list),
34
          totalCount,
35
        });
36
      }).catch(err => reply(err));
37
    },
38
    config: {
39
      validate: {
40
        query: {
41
          filter: Joi.any().valid('current', 'expired'),
42
          skip: Joi.number(),
43
          limit: Joi.number(),
44
        },
45
      },
46
    },
47
  },
48
  {
49
    method: 'GET',
50
    path: `${config.statusApiPrefix}/check`,
51
    handler: (request, reply) => {
52 6
      Status.findWithComparators(request.query.deviceType || '*', request.query.deviceVersion || '*', request.query.appVersion || '*', { startTime: 1 })
53 4
        .then(result => dateUtil.formatDates(result))
54 4
        .then(result => reply({ data: result }))
55 1
        .catch(err => reply(err));
56
    },
57
    config: {
58
      validate: {
59
        query: {
60
          deviceType: Joi.string(),
61
          deviceVersion: Joi.string().regex(/^[0-9A-Za-z.*-]+$/),
62
          appVersion: Joi.string().regex(/^[0-9A-Za-z.*-]+$/),
63
        },
64
      },
65
      auth: false,
66
    },
67
  },
68
  {
69
    method: 'POST',
70
    path: `${config.statusApiPrefix}`,
71
    handler: (request, reply) => {
72 1
      const status = Object.assign({}, request.payload);
73 4
      if (status.startTime && status.endTime) {
74 1
        status.startTime = new Date(Date.parse(status.startTime));
75 1
        status.endTime = new Date(Date.parse(status.endTime));
76
      }
77 1
      Status.add(status)
78 1
        .then(result => reply(result))
79
        .catch(err => reply(err));
80
    },
81
    config: {
82
      validate: {
83
        payload: {
84
          startTime: Joi.string().isoDate(),
85
          endTime: Joi.string().isoDate(),
86
          deviceTypes: Joi.array().items(Joi.string()).required(),
87
          deviceSemVersion: Joi.string().regex(/^(([*>=<]{1,2}[0-9A-Za-z.-]*[\s]*)[\s|]*)+$/).required(),
88
          appSemVersion: Joi.string().regex(/^(([*>=<]{1,2}[0-9A-Za-z.-]*[\s]*)[\s|]*)+$/).required(),
89
          type: Joi.string().required(),
90
          url: Joi.string().uri().allow(''),
91
          title: Joi.string().required(),
92
          contents: Joi.string(),
93
          isActivated: Joi.boolean().required(),
94
        },
95
      },
96
    },
97
  },
98
  {
99
    method: 'PUT',
100
    path: `${config.statusApiPrefix}/{statusId}`,
101
    handler: (request, reply) => {
102 2
      const status = Object.assign({}, request.payload);
103
      let unset;
104 4
      if (!status.startTime && !status.endTime) {
105 1
        unset = { startTime: 1, endTime: 1 };
106
      } else {
107 2
        status.startTime = (status.startTime) ? new Date(Date.parse(status.startTime)) : undefined;
108 2
        status.endTime = (status.endTime) ? new Date(Date.parse(status.endTime)) : undefined;
109
      }
110
111 2
      Status.update(request.params.statusId, status, unset)
0 ignored issues
show
Bug introduced by
The variable unset seems to not be initialized for all possible execution paths. Are you sure update handles undefined variables?
Loading history...
112 2
        .then(result => reply(result))
113
        .catch(err => reply(err));
114
    },
115
    config: {
116
      validate: {
117
        params: {
118
          statusId: Joi.string().required(),
119
        },
120
        payload: {
121
          startTime: Joi.string().isoDate(),
122
          endTime: Joi.string().isoDate(),
123
          deviceTypes: Joi.array().items(Joi.string()).required(),
124
          deviceSemVersion: Joi.string().regex(/^(([*>=<]{1,2}[0-9A-Za-z.-]*[\s]*)[\s|]*)+$/).required(),
125
          appSemVersion: Joi.string().regex(/^(([*>=<]{1,2}[0-9A-Za-z.-]*[\s]*)[\s|]*)+$/).required(),
126
          type: Joi.string().required(),
127
          title: Joi.string().required(),
128
          url: Joi.string().uri().allow(''),
129
          contents: Joi.string(),
130
          isActivated: Joi.boolean().required(),
131
        },
132
      },
133
    },
134
  },
135
  {
136
    method: 'PUT',
137
    path: `${config.statusApiPrefix}/{statusId}/{action}`,
138
    handler: (request, reply) => {
139 2
      Status.update(request.params.statusId, { isActivated: request.params.action === 'activate' })
140 2
        .then(result => reply(result))
141
        .catch(err => reply(err));
142
    },
143
    config: {
144
      validate: {
145
        params: {
146
          statusId: Joi.string().required(),
147
          action: Joi.string().valid('activate', 'deactivate').required(),
148
        },
149
      },
150
    },
151
  },
152
  {
153
    method: 'DELETE',
154
    path: `${config.statusApiPrefix}/{statusId}`,
155
    handler: (request, reply) => {
156 1
      Status.remove(request.params.statusId)
157 1
        .then(result => reply(result))
158
        .catch(err => reply(err));
159
    },
160
    config: {
161
      validate: {
162
        params: {
163
          statusId: Joi.string().required(),
164
        },
165
      },
166
    },
167
  },
168
];
169