anoubis 1.0.1 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/app/controllers/anoubis/application_controller.rb +4 -0
  4. data/app/controllers/anoubis/core/index/actions.rb +1 -1
  5. data/app/controllers/anoubis/core/index_controller.rb +3 -3
  6. data/app/controllers/anoubis/data/actions.rb +947 -0
  7. data/app/controllers/anoubis/data/callbacks.rb +66 -0
  8. data/app/controllers/anoubis/data/convert.rb +422 -0
  9. data/app/controllers/anoubis/data/defaults.rb +215 -0
  10. data/app/controllers/anoubis/data/get.rb +529 -0
  11. data/app/controllers/anoubis/data/load.rb +87 -0
  12. data/app/controllers/anoubis/data/set.rb +47 -0
  13. data/app/controllers/anoubis/data/setup.rb +102 -0
  14. data/app/controllers/anoubis/data_controller.rb +21 -0
  15. data/app/controllers/anoubis/etc/field.rb +7 -0
  16. data/app/controllers/anoubis/output/basic.rb +1 -1
  17. data/app/controllers/anoubis/sso/client/index_controller.rb +2 -2
  18. data/app/controllers/anoubis/sso/server/login_controller.rb +5 -5
  19. data/app/controllers/anoubis/sso/server/user_controller.rb +2 -2
  20. data/app/controllers/anoubis/tenant/index_controller.rb +3 -3
  21. data/app/models/anoubis/application_record.rb +141 -0
  22. data/app/services/anoubis/log_service.rb +97 -0
  23. data/app/services/anoubis/request_service.rb +134 -0
  24. data/config/locales/en.yml +20 -6
  25. data/config/locales/ru.yml +25 -13
  26. data/config/routes.rb +19 -19
  27. data/lib/anoubis/version.rb +1 -1
  28. metadata +32 -33
  29. data/app/controllers/anoubis/core/data/actions.rb +0 -962
  30. data/app/controllers/anoubis/core/data/callbacks.rb +0 -68
  31. data/app/controllers/anoubis/core/data/convert.rb +0 -407
  32. data/app/controllers/anoubis/core/data/defaults.rb +0 -217
  33. data/app/controllers/anoubis/core/data/get.rb +0 -531
  34. data/app/controllers/anoubis/core/data/load.rb +0 -89
  35. data/app/controllers/anoubis/core/data/set.rb +0 -49
  36. data/app/controllers/anoubis/core/data/setup.rb +0 -104
  37. data/app/controllers/anoubis/core/data_controller.rb +0 -28
  38. data/app/controllers/anoubis/sso/client/data/actions.rb +0 -5
  39. data/app/controllers/anoubis/sso/client/data/callbacks.rb +0 -5
  40. data/app/controllers/anoubis/sso/client/data/convert.rb +0 -5
  41. data/app/controllers/anoubis/sso/client/data/defaults.rb +0 -5
  42. data/app/controllers/anoubis/sso/client/data/get.rb +0 -5
  43. data/app/controllers/anoubis/sso/client/data/load.rb +0 -26
  44. data/app/controllers/anoubis/sso/client/data/set.rb +0 -5
  45. data/app/controllers/anoubis/sso/client/data/setup.rb +0 -5
  46. data/app/controllers/anoubis/sso/client/data_controller.rb +0 -21
  47. data/app/controllers/anoubis/tenant/data/actions.rb +0 -11
  48. data/app/controllers/anoubis/tenant/data/callbacks.rb +0 -11
  49. data/app/controllers/anoubis/tenant/data/convert.rb +0 -11
  50. data/app/controllers/anoubis/tenant/data/defaults.rb +0 -11
  51. data/app/controllers/anoubis/tenant/data/get.rb +0 -11
  52. data/app/controllers/anoubis/tenant/data/load.rb +0 -52
  53. data/app/controllers/anoubis/tenant/data/set.rb +0 -11
  54. data/app/controllers/anoubis/tenant/data/setup.rb +0 -11
  55. data/app/controllers/anoubis/tenant/data_controller.rb +0 -28
  56. data/app/controllers/anoubis/tenants_controller.rb +0 -7
  57. data/app/controllers/anoubis/users_controller.rb +0 -7
  58. data/app/mailers/anoubis/application_mailer.rb +0 -8
@@ -1,962 +0,0 @@
1
- module Anoubis
2
- module Core
3
- module Data
4
- ##
5
- # Module presents all default actions for for {DataController}.
6
- module Actions
7
- ##
8
- # Default action of {DataController}. Procedure outputs data loaded from database table.
9
- # Authorization bearer is required.
10
- #
11
- # <b>API request:</b>
12
- # GET /api/<version>/<controller>
13
- #
14
- # <b>Request Header:</b>
15
- # {
16
- # "Authorization": "Bearer <Session token>"
17
- # }
18
- #
19
- # <b>Parameters:</b>
20
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
21
- # - <b>offset</b> (String) --- starting number for selection <i>(optional value, default: 0)</i>
22
- # - <b>limit</b> (String) --- number of selected rows <i>(optional value, default: 10)</i>
23
- # - <b>tab</b> (String) --- the tab, is used for selected data <i>(optional value, default: first defined tab)</i>
24
- #
25
- # <b>Request example:</b>
26
- # curl --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/<controller>?offset=0&limit=10
27
- #
28
- # <b>Results:</b>
29
- #
30
- # Resulting data returns in JSON format.
31
- #
32
- # <b>Examples:</b>
33
- #
34
- # <b>Success:</b> HTTP response code 200
35
- # {
36
- # "result": 0,
37
- # "message": "Successful",
38
- # "count": 5,
39
- # "tab": "inner",
40
- # "offset": "0",
41
- # "limit": "10",
42
- # "timestamp": 1563169525,
43
- # "fields": [
44
- # {
45
- # "prop": "title",
46
- # "title": "Soldier Ttitle"
47
- # "type": "string",
48
- # "sortable": true
49
- # },
50
- # {
51
- # "prop": "name",
52
- # "title": "Soldier Name"
53
- # "type": "string",
54
- # "sortable": true
55
- # },
56
- # {
57
- # "prop": "age",
58
- # "title": "Girl Age"
59
- # "type": "string",
60
- # "sortable": true
61
- # }
62
- # ],
63
- # "data": [
64
- # {
65
- # "id": 1,
66
- # "sys_title": "Sailor Moon",
67
- # "actions": {
68
- # "edit": "Edit: Sailor Moon",
69
- # "delete": "Delete: Sailor Moon"
70
- # },
71
- # "title": "Sailor Moon",
72
- # "name": "Banny Tsukino",
73
- # "age": 16,
74
- # "state": "inner"
75
- # },
76
- # {
77
- # "id": 2,
78
- # "sys_title": "Sailor Mercury",
79
- # "actions": {
80
- # "edit": "Edit: Sailor Mercury",
81
- # "delete": "Delete: Sailor Mercury"
82
- # },
83
- # "title": "Sailor Mercury",
84
- # "name": "Amy Mitsuno",
85
- # "age": 16,
86
- # "state": "inner"
87
- # }
88
- # ]
89
- # }
90
- def index
91
- self.etc.data = Anoubis::Etc::Data.new
92
- self.set_parent_model 'index'
93
- self.output = Anoubis::Output::Data.new
94
- self.output.count = self.get_table_data_count
95
- self.setup_fields
96
- self.output.limit = self.etc.data.limit
97
- self.output.offset = self.etc.data.offset
98
- self.output.fields = self.get_fields_properties if self.etc.time == 0
99
- self.output.filter = self.get_filter_properties if self.etc.time == 0
100
- self.output.data = self.get_table_data
101
- self.output.tab = self.etc.tab.tab
102
- self.output.sortable = self.is_sortable
103
- self.output.order = self.etc.tab.order if self.etc.tab.order != ''
104
- self.output.sort = self.etc.tab.sort if self.etc.tab.sort != nil
105
- self.after_get_table_data
106
- self.before_output
107
- respond_to do |format|
108
- format.json { render json: around_output(self.output.to_h) }
109
- end
110
- end
111
-
112
- ##
113
- # <i>Frame</i> action of {DataController}. Procedure outputs frame data information (title, tabs, frame buttons)
114
- # Authorization bearer is required.
115
- #
116
- # <b>API request:</b>
117
- # GET /api/<version>/<controller>/frame
118
- #
119
- # <b>Request Header:</b>
120
- # {
121
- # "Authorization": "Bearer <Session token>"
122
- # }
123
- #
124
- # <b>Parameters:</b>
125
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
126
- # - <b>offset</b> (String) --- starting number for selection <i>(optional value, default: 0)</i>
127
- # - <b>limit</b> (String) --- number of selected rows <i>(optional value, default: 10)</i>
128
- # - <b>tab</b> (String) --- the tab, is used for selected data <i>(optional value, default: first defined tab)</i>
129
- #
130
- # <b>Request example:</b>
131
- # curl --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/<controller>/frame
132
- #
133
- # <b>Results:</b>
134
- #
135
- # Resulting data returns in JSON format.
136
- #
137
- # <b>Examples:</b>
138
- #
139
- # <b>Success:</b> HTTP response code 200
140
- # {
141
- # "result": 0,
142
- # "message": "Successful",
143
- # "timestamp": 1563271417,
144
- # "title": "Sailor soldiers",
145
- # "short": "Soldiers",
146
- # "mode": "soldiers",
147
- # "access": "write",
148
- # "tabs": [
149
- # {
150
- # "tab": "inner",
151
- # "title": "Inner Senshi",
152
- # "buttons": [
153
- # {
154
- # "key": "new",
155
- # "mode": "single",
156
- # "type": "primary"
157
- # }
158
- # ],
159
- # "hint": "Shows only inner soldiers"
160
- # },
161
- # {
162
- # "tab": "outer",
163
- # "title": "Outer Senshi",
164
- # "buttons": [
165
- # {
166
- # "key": "new",
167
- # "mode": "single",
168
- # "type": "primary"
169
- # },
170
- # {
171
- # "key": "delete",
172
- # "mode": "multiple",
173
- # "type": "danger"
174
- # }
175
- # ]
176
- # }
177
- # ]
178
- # }
179
- #
180
- #
181
- # <b>Error (session expired):</b> HTTP response code 422
182
- # {
183
- # "result": -1,
184
- # "message": "Session expired",
185
- # "timestamp": 1563271417,
186
- # "tab": "inner"
187
- # }
188
- def frame
189
- self.output = Anoubis::Output::Frame.new
190
- self.etc.data = Anoubis::Etc::Data.new if !self.etc.data
191
- self.etc.action = 'frame'
192
- if self.parent_model
193
- if !self.get_parent_data
194
- self.output.result = -2
195
- end
196
- end
197
- self.setup_frame
198
- self.before_output
199
- respond_to do |format|
200
- format.json { render json: self.output.to_h }
201
- end
202
- end
203
-
204
- ##
205
- # <i>Show</i> action of {DataController}. Procedure outputs values for view form.
206
- # Authorization bearer is required.
207
- #
208
- # <b>API request:</b>
209
- # GET /api/<version>/<controller>/<id>
210
- #
211
- # <b>Request Header:</b>
212
- # {
213
- # "Authorization": "Bearer <Session token>"
214
- # }
215
- #
216
- # <b>Parameters:</b>
217
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
218
- # - <b>tab</b> (String) --- the tab, is used for action <i>(optional value, default: first defined tab)</i>
219
- #
220
- # Resulting output title is took from translation file <lang>.yml at path:
221
- # <lang>:
222
- # <controller name divided by level>:
223
- # edit:
224
- # form:
225
- # title: "Edit soldier %{title}"
226
- #
227
- # If this path isn't defined in translation file, then value is took from path:
228
- # <lang>:
229
- # anubis:
230
- # form:
231
- # titles:
232
- # edit: "Edit element: %{title}"
233
- #
234
- # <b>Request example:</b>
235
- # curl --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/<controller>/<id>?tab=<tab>
236
- #
237
- # <b>Results:</b>
238
- #
239
- # Resulting data returns in JSON format.
240
- #
241
- # <b>Examples:</b>
242
- #
243
- # <b>Success:</b> HTTP response code 200
244
- # {
245
- # "result": 0,
246
- # "message": "Successful",
247
- # "timestamp": 1563271417,
248
- # "tab": "inner",
249
- # "title": "Edit soldier Sailor Mars",
250
- # "values": {
251
- # "id": 3,
252
- # "title": "Sailor Mars",
253
- # "name": "Rey Hino",
254
- # "state_view": "Inner Senshi",
255
- # "state": "inner"
256
- # },
257
- # "options": {
258
- # "state": {
259
- # "inner": "Inner Senshi",
260
- # "outer": "Outer Senshi",
261
- # "star": "Sailor Star"
262
- # }
263
- # }
264
- # }
265
- #
266
- #
267
- # <b>Error (incorrect request id):</b> HTTP response code 200
268
- # {
269
- # "result": -2,
270
- # "message": "Incorrect request parameters",
271
- # "timestamp": 1563271417,
272
- # "tab": "inner"
273
- # }
274
- #
275
- #
276
- # <b>Error (session expired):</b> HTTP response code 422
277
- # {
278
- # "result": -1,
279
- # "message": "Session expired",
280
- # "timestamp": 1563271417,
281
- # "tab": "inner"
282
- # }
283
- def show
284
- self.output = Anoubis::Output::Edit.new
285
- self.set_parent_model 'show'
286
- self.output.tab = self.etc.tab.tab
287
- if params.key?(:value) && params.key?(:field)
288
- self.load_data_by_title params[:field], params[:value]
289
- params[:id] = self.etc.data.data.id if self.etc.data.data
290
- end
291
- if params.key? :id
292
- self.load_data_by_id params[:id] if !self.etc.data.data
293
- if self.etc.data.data
294
- self.output.values = self.get_data_row self.etc.data.data
295
- if params.key? :time
296
- self.output.options = self.get_data_options params[:time]
297
- else
298
- self.output.options = self.get_data_options 0
299
- end
300
- self.output.fields = self.get_fields_properties if self.etc.time == 0
301
- else
302
- self.output.result = -2
303
- end
304
- else
305
- self.output.result = -2
306
- end
307
- if self.output.result == 0
308
- self.output.title = I18n.t(format('%s.show.form.title', params[:controller].sub('/', '.')), title: self.output.values[:sys_title],
309
- default: I18n.t('anubis.form.titles.show', title: self.output.values[:sys_title]))
310
- end
311
- self.before_output
312
- respond_to do |format|
313
- format.json { render json: self.output.to_h }
314
- end
315
- end
316
-
317
- ##
318
- # <i>New</i> action of {DataController}. Procedure outputs default values for create form.
319
- # Authorization bearer is required.
320
- #
321
- # <b>API request:</b>
322
- # GET /api/<version>/<controller>/new
323
- #
324
- # <b>Request Header:</b>
325
- # {
326
- # "Authorization": "Bearer <Session token>"
327
- # }
328
- #
329
- # <b>Parameters:</b>
330
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
331
- # - <b>tab</b> (String) --- the tab, is used for action <i>(optional value, default: first defined tab)</i>
332
- #
333
- # Resulting output title is took from translation file <lang>.yml at path:
334
- # <lang>:
335
- # <controller name divided by level>:
336
- # new:
337
- # form:
338
- # title: "Add new soldier"
339
- #
340
- # If this path isn't defined in translation file, then value is took from path:
341
- # <lang>:
342
- # anubis:
343
- # form:
344
- # titles:
345
- # new: "Add new element"
346
- #
347
- # <b>Request example:</b>
348
- # curl --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/<controller>/new?tab=<tab>
349
- #
350
- # <b>Results:</b>
351
- #
352
- # Resulting data returns in JSON format.
353
- #
354
- # <b>Examples:</b>
355
- #
356
- # <b>Success:</b> HTTP response code 200
357
- # {
358
- # "result": 0,
359
- # "message": "Successful",
360
- # "timestamp": 1563271417,
361
- # "tab": "inner",
362
- # "title": "Add new soldier",
363
- # "values": {
364
- # "title": "",
365
- # "name": "",
366
- # "state_view": "Inner Senshi",
367
- # "state": "inner"
368
- # },
369
- # "options": {
370
- # "state": {
371
- # "inner": "Inner Senshi",
372
- # "outer": "Outer Senshi",
373
- # "star": "Sailor Star"
374
- # }
375
- # }
376
- # }
377
- #
378
- #
379
- # <b>Error (session expired):</b> HTTP response code 422
380
- # {
381
- # "result": -1,
382
- # "message": "Session expired",
383
- # "timestamp": 1563271417,
384
- # "tab": "inner"
385
- # }
386
- def new
387
- new_action_skeleton 'new'
388
- end
389
-
390
- def new_action_skeleton(action)
391
- self.output = Anoubis::Output::Edit.new
392
- self.set_parent_model action
393
- self.output.tab = self.etc.tab.tab
394
- if self.etc.tab.buttons.key? action.to_sym
395
- self.load_new_data action
396
- if etc.data.data
397
- self.output.values = get_data_row etc.data.data
398
- if params.key? :time
399
- self.output.options = get_data_options params[:time]
400
- else
401
- self.output.options = self.get_data_options 0
402
- end
403
- etc.action = 'new'
404
- self.output.fields = self.get_fields_properties if self.etc.time == 0
405
- etc.action = action
406
- else
407
- self.output.result = -2
408
- end
409
- else
410
- self.output.result = -1
411
- end
412
- if self.output.result == 0
413
- self.output.title = I18n.t(format('%s.%s.form.title', params[:controller].sub('/', '.'), action), default: I18n.t('anubis.form.titles.new'))
414
- end
415
- self.before_output
416
-
417
-
418
- respond_to do |format|
419
- format.json { render json: self.output.to_h }
420
- end
421
- end
422
-
423
- ##
424
- # <i>Create</i> action of {DataController}. Procedure inserts data into database.
425
- # Authorization bearer is required.
426
- #
427
- # <b>API request:</b>
428
- # POST /api/<version>/<controller>/new
429
- #
430
- # <b>Request Header:</b>
431
- # {
432
- # "Authorization": "Bearer <Session token>"
433
- # }
434
- #
435
- # <b>Parameters:</b>
436
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
437
- # - <b>tab</b> (String) --- the tab, is used for action <i>(optional value, default: first defined tab)</i>
438
- # - <b>data</b> (String) --- inserted data <i>(required value)</i>
439
- #
440
- # <b>Request example:</b>
441
- # curl --request POST --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' --data='{"title": "Sailor Mars", "name": "Rey Hino", "state": "inner"}' http://<server>:<port>/api/<api-version>/<controller>/?tab=<tab>
442
- #
443
- # <b>Results:</b>
444
- #
445
- # Resulting data returns in JSON format.
446
- #
447
- # <b>Examples:</b>
448
- #
449
- # <b>Success:</b> HTTP response code 200
450
- # {
451
- # "result": 0,
452
- # "message": "Successful",
453
- # "timestamp": 1563271417,
454
- # "tab": "inner",
455
- # "values": {
456
- # "id": 3,
457
- # "sys_title": "Sailor Mars",
458
- # "actions": {
459
- # "edit": "Edit: Sailor Mars",
460
- # "delete": "Delete: Sailor Mars"
461
- # },
462
- # "title": "Sailor Mars",
463
- # "name": "Rey Hino",
464
- # "state": "Inner Senshi",
465
- # "raw_state": "inner"
466
- # },
467
- # "action": ""
468
- # }
469
- #
470
- #
471
- # <b>Error (data presents):</b> HTTP response code 200
472
- # {
473
- # "result": -3,
474
- # "message": "Error update data",
475
- # "timestamp": 1563271417,
476
- # "tab": "inner",
477
- # "errors": [
478
- # "Title already presents"
479
- # ]
480
- # }
481
- #
482
- #
483
- # <b>Error (session expired):</b> HTTP response code 422
484
- # {
485
- # "result": -1,
486
- # "message": "Session expired",
487
- # "timestamp": 1563271417,
488
- # "tab": "inner"
489
- # }
490
- def create
491
- self.output = Anoubis::Output::Update.new
492
- self.set_parent_model 'create'
493
- self.output.tab = self.etc.tab.tab
494
- if params.key? :data
495
- if self.etc.tab.buttons.key? :new
496
- self.load_new_data
497
- if self.etc.data.data
498
- self.setup_fields
499
- data = get_permited_params
500
-
501
- data = self.before_create_data data
502
-
503
- if data
504
- data.each_key do |key|
505
- self.convert_view_to_db_value key, data[key]
506
- end
507
-
508
- if self.etc.data.data.respond_to? :tenant_id
509
- if self.current_user.respond_to? :tenant_id
510
- self.etc.data.data.tenant_id = self.current_user.tenant_id if !self.etc.data.data.tenant_id
511
- end
512
- end
513
-
514
- if self.etc.data.data.save
515
- else
516
- self.output.errors.concat self.etc.data.data.errors.full_messages
517
- end
518
- else
519
- self.output.result = -4
520
- end
521
-
522
- if self.output.errors.length == 0
523
- self.etc.data.fields = nil
524
- self.set_new_action 'index'
525
- self.output.values = self.get_data_row self.etc.data.data
526
- self.set_new_action 'create'
527
- self.after_create_data
528
- else
529
- self.output.result = -3
530
- end
531
- else
532
- self.output.result = -2
533
- end
534
- else
535
- self.output.result = -1
536
- end
537
- else
538
- self.output.result = -2
539
- end
540
- self.before_output
541
- respond_to do |format|
542
- format.json { render json: self.output.to_h }
543
- end
544
- end
545
-
546
- ##
547
- # <i>Edit</i> action of {DataController}. Procedure outputs values for edit form.
548
- # Authorization bearer is required.
549
- #
550
- # <b>API request:</b>
551
- # GET /api/<version>/<controller>/<id>/edit
552
- #
553
- # <b>Request Header:</b>
554
- # {
555
- # "Authorization": "Bearer <Session token>"
556
- # }
557
- #
558
- # <b>Parameters:</b>
559
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
560
- # - <b>tab</b> (String) --- the tab, is used for action <i>(optional value, default: first defined tab)</i>
561
- #
562
- # Resulting output title is took from translation file <lang>.yml at path:
563
- # <lang>:
564
- # <controller name divided by level>:
565
- # edit:
566
- # form:
567
- # title: "Edit soldier %{title}"
568
- #
569
- # If this path isn't defined in translation file, then value is took from path:
570
- # <lang>:
571
- # anubis:
572
- # form:
573
- # titles:
574
- # edit: "Edit element: %{title}"
575
- #
576
- # <b>Request example:</b>
577
- # curl --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/<controller>/<id>/edit?tab=<tab>
578
- #
579
- # <b>Results:</b>
580
- #
581
- # Resulting data returns in JSON format.
582
- #
583
- # <b>Examples:</b>
584
- #
585
- # <b>Success:</b> HTTP response code 200
586
- # {
587
- # "result": 0,
588
- # "message": "Successful",
589
- # "timestamp": 1563271417,
590
- # "tab": "inner",
591
- # "title": "Edit soldier Sailor Mars",
592
- # "values": {
593
- # "id": 3,
594
- # "title": "Sailor Mars",
595
- # "name": "Rey Hino",
596
- # "state_view": "Inner Senshi",
597
- # "state": "inner"
598
- # },
599
- # "options": {
600
- # "state": {
601
- # "inner": "Inner Senshi",
602
- # "outer": "Outer Senshi",
603
- # "star": "Sailor Star"
604
- # }
605
- # }
606
- # }
607
- #
608
- #
609
- # <b>Error (incorrect request id):</b> HTTP response code 200
610
- # {
611
- # "result": -2,
612
- # "message": "Incorrect request parameters",
613
- # "timestamp": 1563271417,
614
- # "tab": "inner"
615
- # }
616
- #
617
- #
618
- # <b>Error (session expired):</b> HTTP response code 422
619
- # {
620
- # "result": -1,
621
- # "message": "Session expired",
622
- # "timestamp": 1563271417,
623
- # "tab": "inner"
624
- # }
625
- def edit
626
- self.output = Anoubis::Output::Edit.new
627
- self.set_parent_model 'edit'
628
- self.output.tab = self.etc.tab.tab
629
- if self.table_actions.include?('edit')
630
- if params.key?(:value) && params.key?(:field)
631
- self.load_data_by_title params[:field], params[:value]
632
- params[:id] = self.etc.data.data.id if self.etc.data.data
633
- end
634
- if params.key? :id
635
- self.load_data_by_id params[:id] if !self.etc.data.data
636
- if self.etc.data.data
637
- self.output.values = self.get_data_row self.etc.data.data
638
- if params.key? :time
639
- self.output.options = self.get_data_options params[:time]
640
- else
641
- self.output.options = self.get_data_options 0
642
- end
643
- self.output.fields = self.get_fields_properties if self.etc.time == 0
644
- else
645
- self.output.result = -2
646
- end
647
- else
648
- self.output.result = -2
649
- end
650
- else
651
- self.output.result = -1
652
- end
653
- if self.output.result == 0
654
- self.output.title = I18n.t(format('%s.edit.form.title', params[:controller].sub('/', '.')), title: self.output.values[:sys_title],
655
- default: I18n.t('anubis.form.titles.edit', title: self.output.values[:sys_title]))
656
- end
657
- self.before_output
658
- respond_to do |format|
659
- format.json { render json: self.output.to_h }
660
- end
661
- end
662
-
663
- ##
664
- # <i>Update</i> action of {DataController}. Procedure updates data in database.
665
- # Authorization bearer is required.
666
- #
667
- # <b>API request:</b>
668
- # PUT /api/<version>/<controller>/<id>/
669
- #
670
- # <b>Request Header:</b>
671
- # {
672
- # "Authorization": "Bearer <Session token>"
673
- # }
674
- #
675
- # <b>Parameters:</b>
676
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
677
- # - <b>tab</b> (String) --- the tab, is used for action <i>(optional value, default: first defined tab)</i>
678
- # - <b>data</b> (String) --- inserted data <i>(required value)</i>
679
- #
680
- # <b>Request example:</b>
681
- # curl --request PUT --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' --data='{"title": "Sailor Mars", "name": "Rey Hino", "state": "inner"}' http://<server>:<port>/api/<api-version>/<controller>/<id>/?tab=<tab>
682
- #
683
- # <b>Results:</b>
684
- #
685
- # Resulting data returns in JSON format.
686
- #
687
- # <b>Examples:</b>
688
- #
689
- # <b>Success:</b> HTTP response code 200
690
- # {
691
- # "result": 0,
692
- # "message": "Successful",
693
- # "timestamp": 1563271417,
694
- # "tab": "inner",
695
- # "values": {
696
- # "id": 3,
697
- # "sys_title": "Sailor Mars",
698
- # "actions": {
699
- # "edit": "Edit: Sailor Mars",
700
- # "delete": "Delete: Sailor Mars"
701
- # },
702
- # "title": "Sailor Mars",
703
- # "name": "Rey Hino",
704
- # "state": "Inner Senshi",
705
- # "raw_state": "inner"
706
- # },
707
- # "action": ""
708
- # }
709
- #
710
- #
711
- # <b>Error (data presents):</b> HTTP response code 200
712
- # {
713
- # "result": -3,
714
- # "message": "Error update data",
715
- # "timestamp": 1563271417,
716
- # "tab": "inner",
717
- # "errors": [
718
- # "Title already presents"
719
- # ]
720
- # }
721
- #
722
- #
723
- # <b>Error (session expired):</b> HTTP response code 422
724
- # {
725
- # "result": -1,
726
- # "message": "Session expired",
727
- # "timestamp": 1563271417,
728
- # "tab": "inner"
729
- # }
730
- def update
731
- self.output = Anoubis::Output::Update.new
732
- self.set_parent_model 'update'
733
- self.output.tab = self.etc.tab.tab
734
- if self.table_actions.include?('edit')
735
- if params.key?(:id) && params.key?(:data)
736
- self.load_data_by_id params[:id]
737
- if self.etc.data.data
738
- self.setup_fields
739
- data = get_permited_params
740
-
741
- data = self.before_update_data data
742
-
743
- if data
744
- data.each_key do |key|
745
- self.convert_view_to_db_value key, data[key]
746
- end
747
-
748
- if self.etc.data.data.save
749
- else
750
- self.output.errors.concat self.etc.data.data.errors.full_messages
751
- end
752
-
753
- if self.output.errors.length == 0
754
- self.etc.data.fields = nil
755
- self.set_new_action 'index'
756
- self.output.values = self.get_data_row self.etc.data.data
757
- self.output.action = 'refresh' if self.etc.data.data.need_refresh
758
- self.set_new_action 'update'
759
- self.after_update_data
760
- else
761
- self.output.result = -3
762
- end
763
- end
764
- else
765
- self.output.result = -4
766
- end
767
- else
768
- self.output.result = -2
769
- end
770
- else
771
- self.output.result = -1
772
- end
773
- self.before_output
774
- respond_to do |format|
775
- format.json { render json: self.output.to_h }
776
- end
777
- end
778
-
779
- ##
780
- # <i>Destroy</i> action of {DataController}. Procedure deletes data from database.
781
- # Authorization bearer is required.
782
- #
783
- # <b>API request:</b>
784
- # DELETE /api/<version>/<controller>/<id>/
785
- #
786
- # <b>Request Header:</b>
787
- # {
788
- # "Authorization": "Bearer <Session token>"
789
- # }
790
- #
791
- # <b>Parameters:</b>
792
- # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
793
- # - <b>tab</b> (String) --- the tab, is used for action <i>(optional value, default: first defined tab)</i>
794
- #
795
- # <b>Request example:</b>
796
- # curl --request DELETE --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/<controller>/<id>/?tab=<tab>
797
- #
798
- # <b>Results:</b>
799
- #
800
- # Resulting data returns in JSON format.
801
- #
802
- # <b>Examples:</b>
803
- #
804
- # <b>Success:</b> HTTP response code 200
805
- # {
806
- # "result": 0,
807
- # "message": "Successful",
808
- # "timestamp": 1563271417,
809
- # "tab": "inner"
810
- # }
811
- #
812
- #
813
- # <b>Error (incorrect request id):</b> HTTP response code 200
814
- # {
815
- # "result": -2,
816
- # "message": "Incorrect request parameters",
817
- # "timestamp": 1563271417,
818
- # "tab": "inner"
819
- # }
820
- #
821
- #
822
- # <b>Error (session expired):</b> HTTP response code 422
823
- # {
824
- # "result": -1,
825
- # "message": "Session expired",
826
- # "timestamp": 1563271417,
827
- # "tab": "inner"
828
- # }
829
- def destroy
830
- self.output = Anoubis::Output::Delete.new
831
- self.set_parent_model 'destroy'
832
- self.output.tab = self.etc.tab.tab
833
- if self.etc.tab.buttons.key? :delete
834
- if params.key?(:value) && params.key?(:field)
835
- self.load_data_by_title params[:field], params[:value]
836
- params[:id] = self.etc.data.data.id if self.etc.data.data
837
- end
838
- if params.key?(:id)
839
- self.load_data_by_id params[:id] if !self.etc.data.data
840
- if self.etc.data.data
841
- self.output.id = self.etc.data.data.id
842
- if self.etc.data.data.can_delete( { tab: self.etc.tab } )
843
- self.destroy_data
844
- else
845
- self.output.result = -1
846
- end
847
- else
848
- self.output.result = -2
849
- end
850
- else
851
- self.output.result = -2
852
- end
853
- else
854
- self.output.result = -1
855
- end
856
- self.before_output
857
- respond_to do |format|
858
- format.json { render json: self.output.to_h }
859
- end
860
- end
861
-
862
- ##
863
- # Returns autocomplete data
864
- def autocomplete
865
- self.output = Anoubis::Output::Autocomplete.new
866
- self.output.result = -1
867
- self.set_parent_model 'autocomplete'
868
- self.output.tab = self.etc.tab.tab
869
- if params.key?(:field) && params.key?(:value)
870
- self.setup_fields
871
- if self.etc.data.fields
872
- if self.etc.data.fields.key? params[:field].to_s.to_sym
873
- field = self.etc.data.fields[params[:field].to_s.to_sym]
874
- #puts 'autocomplete'
875
- #puts field.to_h
876
- if field.autocomplete
877
- self.output.result = 0
878
- self.get_autocomplete_data field, params[:value]
879
- #puts field.to_h
880
- end
881
- end
882
- end
883
- end
884
- self.before_output
885
- respond_to do |format|
886
- format.json { render json: self.output.to_h }
887
- end
888
- end
889
-
890
- ##
891
- # Export data from database
892
- def export
893
- self.etc.data = Anoubis::Etc::Data.new
894
- self.set_parent_model 'export'
895
- self.output = Anoubis::Output::Data.new
896
- if self.etc.tab.export
897
- self.output.count = self.get_table_data_count
898
- count = (self.output.count / 40).to_i + 1
899
- self.setup_fields
900
-
901
- self.exports = Anoubis::Export.new format: self.export_format, fields: self.get_fields_properties
902
-
903
- case self.exports.format
904
- when 'xls'
905
- headers['Content-Disposition'] = 'attachment; filename="export.xlsx" filename*="export.xlsx"'
906
- end
907
-
908
- self.etc.data.limit = 40
909
- self.etc.data.offset = 0
910
- self.output.data = self.get_table_data
911
- self.after_get_table_data
912
- self.before_output
913
- self.exports.add self.output.data
914
-
915
- if count > 1
916
- for i in 2..count
917
- self.etc.data.offset = (i-1)*40
918
- self.output.data = self.get_table_data
919
- self.after_get_table_data
920
- self.before_output
921
- self.exports.add self.output.data
922
- end
923
- end
924
-
925
- respond_to do |format|
926
- case self.exports.format
927
- when 'xls'
928
- format.xlsx {
929
- send_data self.render_xls_file, type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
930
- }
931
- end
932
- end
933
- else
934
- respond_to do |format|
935
- format.any { render json: {result: -1}, status: :unprocessable_entity }
936
- end
937
-
938
- end
939
- end
940
-
941
- ##
942
- # Returns rendered xlsx data
943
- def render_xls_file
944
- Axlsx::Package.new do |p|
945
- wb = p.workbook
946
- wb.styles do |s|
947
- default = s.add_style :sz => 11, :font_name => "Calibri", :alignment => {:vertical => :center}
948
- default_bold = s.add_style :sz => 11, :font_name => "Calibri", :alignment => {:vertical => :center}, :b => true
949
- wb.add_worksheet(name: 'Data') do |sheet|
950
- sheet.add_row self.exports.title, :style => default_bold
951
- self.exports.data.each do |data|
952
- sheet.add_row data, :style => default
953
- end
954
- end
955
- end
956
- return p.to_stream().read
957
- end
958
- end
959
- end
960
- end
961
- end
962
- end