1 | 'use strict'
|
2 |
|
3 | const ChatServiceError = require('./ChatServiceError')
|
4 | const FastMap = require('collections/fast-map')
|
5 | const Promise = require('bluebird')
|
6 | const _ = require('lodash')
|
7 | const check = require('check-types')
|
8 | const { possiblyCallback } = require('./utils')
|
9 |
|
10 |
|
11 | class ArgumentsValidator {
|
12 |
|
13 | constructor (server) {
|
14 | this.server = server
|
15 | this.checkers = new FastMap()
|
16 | this.directMessagesChecker = this.server.directMessagesChecker
|
17 | this.roomMessagesChecker = this.server.roomMessagesChecker
|
18 | this.customCheckers = {
|
19 | directMessage: [ null, this.directMessagesChecker ],
|
20 | roomMessage: [ null, this.roomMessagesChecker ]
|
21 | }
|
22 | let commands = this.server.rpcRequestsNames
|
23 | for (let cmd of commands) {
|
24 | this.checkers.set(cmd, this[cmd]())
|
25 | }
|
26 | }
|
27 |
|
28 | checkArguments (name, ...args) {
|
29 | let [nargs, cb] = possiblyCallback(args)
|
30 | return Promise.try(() => {
|
31 | let checkers = this.checkers.get(name)
|
32 | if (!checkers) {
|
33 | let error = new ChatServiceError('noCommand', name)
|
34 | return Promise.reject(error)
|
35 | }
|
36 | let error = this.checkTypes(checkers, nargs)
|
37 | if (error) { return Promise.reject(error) }
|
38 | let customCheckers = this.customCheckers[name] || []
|
39 | return Promise.each(customCheckers, (checker, idx) => {
|
40 | if (checker) {
|
41 | return Promise.fromCallback(fn => checker(nargs[idx], fn))
|
42 | } else {
|
43 | return Promise.resolve()
|
44 | }
|
45 | }).return()
|
46 | }).asCallback(cb)
|
47 | }
|
48 |
|
49 | getArgsCount (name) {
|
50 | let checker = this.checkers.get(name)
|
51 | return checker ? checker.length : 0
|
52 | }
|
53 |
|
54 | splitArguments (name, oargs) {
|
55 | let nargs = this.getArgsCount(name)
|
56 | let args = _.slice(oargs, 0, nargs)
|
57 | let restArgs = _.slice(oargs, nargs)
|
58 | return {args, restArgs}
|
59 | }
|
60 |
|
61 | checkMessage (msg) {
|
62 | return check.object(msg) &&
|
63 | check.string(msg.textMessage) &&
|
64 | _.keys(msg).length === 1
|
65 | }
|
66 |
|
67 | checkObject (obj) {
|
68 | return check.object(obj)
|
69 | }
|
70 |
|
71 | checkTypes (checkers, args) {
|
72 | if (args.length !== checkers.length) {
|
73 | return new ChatServiceError(
|
74 | 'wrongArgumentsCount', checkers.length, args.length)
|
75 | }
|
76 | for (let idx = 0; idx < checkers.length; idx++) {
|
77 | let checker = checkers[idx]
|
78 | if (!checker(args[idx])) {
|
79 | return new ChatServiceError('badArgument', idx, args[idx])
|
80 | }
|
81 | }
|
82 | return null
|
83 | }
|
84 |
|
85 | directAddToList (listName, userNames) {
|
86 | return [
|
87 | check.string,
|
88 | check.array.of.string
|
89 | ]
|
90 | }
|
91 |
|
92 | directGetAccessList (listName) {
|
93 | return [
|
94 | check.string
|
95 | ]
|
96 | }
|
97 |
|
98 | directGetWhitelistMode () {
|
99 | return []
|
100 | }
|
101 |
|
102 | directMessage (toUser, msg) {
|
103 | return [
|
104 | check.string,
|
105 | this.directMessagesChecker ? this.checkObject : this.checkMessage
|
106 | ]
|
107 | }
|
108 |
|
109 | directRemoveFromList (listName, userNames) {
|
110 | return [
|
111 | check.string,
|
112 | check.array.of.string
|
113 | ]
|
114 | }
|
115 |
|
116 | directSetWhitelistMode (mode) {
|
117 | return [
|
118 | check.boolean
|
119 | ]
|
120 | }
|
121 |
|
122 | listOwnSockets () {
|
123 | return []
|
124 | }
|
125 |
|
126 | roomAddToList (roomName, listName, userNames) {
|
127 | return [
|
128 | check.string,
|
129 | check.string,
|
130 | check.array.of.string
|
131 | ]
|
132 | }
|
133 |
|
134 | roomCreate (roomName, mode) {
|
135 | return [
|
136 | check.string,
|
137 | check.boolean
|
138 | ]
|
139 | }
|
140 |
|
141 | roomDelete (roomName) {
|
142 | return [
|
143 | check.string
|
144 | ]
|
145 | }
|
146 |
|
147 | roomGetAccessList (roomName, listName) {
|
148 | return [
|
149 | check.string,
|
150 | check.string
|
151 | ]
|
152 | }
|
153 |
|
154 | roomGetOwner (roomName) {
|
155 | return [
|
156 | check.string
|
157 | ]
|
158 | }
|
159 |
|
160 | roomGetWhitelistMode (roomName) {
|
161 | return [
|
162 | check.string
|
163 | ]
|
164 | }
|
165 |
|
166 | roomRecentHistory (roomName) {
|
167 | return [
|
168 | check.string
|
169 | ]
|
170 | }
|
171 |
|
172 | roomHistoryGet (roomName, id, limit) {
|
173 | return [
|
174 | check.string,
|
175 | str => check.greaterOrEqual(str, 0),
|
176 | str => check.greaterOrEqual(str, 1)
|
177 | ]
|
178 | }
|
179 |
|
180 | roomHistoryInfo (roomName) {
|
181 | return [
|
182 | check.string
|
183 | ]
|
184 | }
|
185 |
|
186 | roomJoin (roomName) {
|
187 | return [
|
188 | check.string
|
189 | ]
|
190 | }
|
191 |
|
192 | roomLeave (roomName) {
|
193 | return [
|
194 | check.string
|
195 | ]
|
196 | }
|
197 |
|
198 | roomMessage (roomName, msg) {
|
199 | return [
|
200 | check.string,
|
201 | this.roomMessagesChecker ? this.checkObject : this.checkMessage
|
202 | ]
|
203 | }
|
204 |
|
205 | roomNotificationsInfo (roomName) {
|
206 | return [
|
207 | check.string
|
208 | ]
|
209 | }
|
210 |
|
211 | roomRemoveFromList (roomName, listName, userNames) {
|
212 | return [
|
213 | check.string,
|
214 | check.string,
|
215 | check.array.of.string
|
216 | ]
|
217 | }
|
218 |
|
219 | roomSetWhitelistMode (roomName, mode) {
|
220 | return [
|
221 | check.string,
|
222 | check.boolean
|
223 | ]
|
224 | }
|
225 |
|
226 | roomUserSeen (roomName, userName) {
|
227 | return [
|
228 | check.string,
|
229 | check.string
|
230 | ]
|
231 | }
|
232 |
|
233 | systemMessage (data) {
|
234 | return [
|
235 | () => true
|
236 | ]
|
237 | }
|
238 | }
|
239 |
|
240 | module.exports = ArgumentsValidator
|