Project

General

Profile

APIForNG » History » Version 25

Denis Kildishev, 02/26/2021 04:25 PM

1 1 Denis Kildishev
h1. APIForNG
2 4 Denis Kildishev
3 1 Denis Kildishev
По текущей модели предполагается использование следующих методов:
4 2 Denis Kildishev
Для всех методов по умолчанию используется один заголовочный параметр
5
Authorization со значением Bearer 36AC0A0F7F271314B72986EB54DB2343
6 1 Denis Kildishev
7
1.Получение списка проектов
8
Method:
9
GET
10
Path:
11
http://localhost:9988/projects
12 2 Denis Kildishev
Без дополнительных параметров
13
Пример выдачи
14 8 Alexey Khoroshilov
<pre><code class="javascript">
15 1 Denis Kildishev
{
16
  "success" : true,
17
  "result" : {
18
    "projects" : [ "Example", "з1", "arch", "stpo"],
19 10 Denis Kildishev
    "count" : 4
20 1 Denis Kildishev
  }
21
}
22 8 Alexey Khoroshilov
</code></pre>
23
24 2 Denis Kildishev
Без дополнительных параметров
25 1 Denis Kildishev
26 2 Denis Kildishev
2. Получение содержимого проекта(иерархия), для expandable - ограниченное 1м уровнем 
27 1 Denis Kildishev
Method:
28
GET
29
Path:
30 2 Denis Kildishev
http://localhost:9988/projects/{arch}[/expandable]
31
Здесь {arch} - имя проекта, на данный момент регистрозависимо
32
Без дополнительных параметров
33
Пример выдачи
34 9 Denis Kildishev
<pre><code class="javascript">
35 1 Denis Kildishev
{
36 9 Denis Kildishev
  "success": true,
37
  "result": {
38
    "name": "arch",
39
    "nodes": [
40
      {
41
        "uuid": "243f4afe-1d28-4652-80b9-4ad123b415a4"
42
        "name": "Documents",
43
        "type": "DocFolder",
44 1 Denis Kildishev
45 9 Denis Kildishev
      },
46
      {
47
        "uuid": "7a5374ee-eb7a-4731-997d-5f52f00ebc2e"
48
        "name": "Requirements",
49
        "type": "Requirement",
50
        "haveChildren":"true",
51
        "children": [
52
          {
53
            "uuid": "8ccd86e3-5689-43aa-9241-04728447e8f7",
54
            "name": "001",
55
            "type": "Requirement",
56
            "children": [],
57
          }
58
        ]
59
      },
60
      {
61
        "uuid": "ff42a6f4-f9ac-48c3-b41c-c36395df8a85",
62
        "name": "Reports",
63
        "type": "ReportFolder"
64
      }
65
    ],
66
  }
67 1 Denis Kildishev
}
68 9 Denis Kildishev
</code></pre>
69 1 Denis Kildishev
по умолчанию выдает все дерево с базовым набором из нескольких полей - уникального id uuid, отображаемого имени name, типа type и массива потомков children. 
70
поле haveChildren присутствует если у узла есть потомки и работает даже когда children не видны в режиме expandable для 2 уровня вложенности
71
при режиме [expandable] потомки выдаются до 1 уровня вложенности
72
73
3. Получение данных по поддереву
74
Method:
75
GET
76
Path:
77
http://localhost:9988/projects/{TEST}/hierarchy/ff42a6f4-f9ac-48c3-b41c-c36395df8a85[/expandable]
78
{TEST} - имя проекта
79
id после /hierarchy это id узла для которого получается поддерево, режим /expandable работает аналогично проекту
80
Без дополнительных параметров
81
Пример выдачи
82 9 Denis Kildishev
<pre><code class="javascript">
83 1 Denis Kildishev
{
84 9 Denis Kildishev
  "success": true, 
85
  "result": 
86
  {
87
    "uuid": "ff42a6f4-f9ac-48c3-b41c-c36395df8a85",
88
    "name": "Reports",
89
    "type": "ReportFolder",
90
    "parent": "ff42a6f4-f9ac-48c3-b41c-c36395df8a85"
91
  }
92 1 Denis Kildishev
}
93 9 Denis Kildishev
</code></pre>
94 1 Denis Kildishev
Содержимое result аналогично описанию одного узла и всех его потомков[или потомков 1 уровня вложенности для expandable] в выдаче проекта
95
96
4. Получение свойств узлов
97
Method:
98
POST
99
Path:
100
http://localhost:9988/projects/TEST/getattributes/
101
В теле запроса передаются все uuid ы узлов для которых нужно выдать свойства. Конкретная реализация пока уточняется, текущее предположение - просто передавать в текстовом виде с разделителем ;. Возможно будут передаваться в качестве массива по аналогии с передачей данных форм. Пример "4db0fbf4-f383-4740-9d72-891ef112f742;ff42a6f4-f9ac-48c3-b41c-c36395df8a85".
102
Пример выдачи
103 9 Denis Kildishev
<pre><code class="javascript">
104 1 Denis Kildishev
{
105 9 Denis Kildishev
  "success": true,
106
  "result": {
107
    "attributes": {
108
      "4db0fbf4-f383-4740-9d72-891ef112f742":{
109
        "Вид": {
110
          "value": "",
111
          "type": "STRING"
112
        },
113
        "_index": {
114
          "value": "1",
115
          "type": "STRING"
116
        },
117
        "_name": {
118
          "value": "Хронология",
119
          "type": "STRING"
120
        },
121
        "_type": {
122
          "value": "Requirement",
123
          "type": "STRING"
124
        },
125
        "_id": {
126
          "value": "001",
127
          "type": "STRING"
128
        },
129
        "ForeignID": {
130
          "value": "1",
131
          "type": "STRING"
132
        }
133
      },
134
      "9dffaddf-a55a-4fa1-a3bc-4a5fade4169f":{
135
        "Вид": {
136
          "value": "Заголовок",
137
          "enumName": "Вид",
138
          "valueType": "STRING",
139
          "type": "ENUM"
140
        },
141
        "_index": {
142
          "value": "1",
143
          "type": "STRING"
144
        },
145
        "_tags": {
146
          "value": [
147
            {
148
              "value": "section_Архитектура_ПО_Поток_управления"
149
            }
150
          ],
151
          "valuesType": "STRING",
152
          "type": "LIST"
153
        },
154
        "_type": {
155
          "value": "Requirement",
156
          "type": "STRING"
157
        },
158
        "_id": {
159
          "value": "Поток управления",
160
          "type": "STRING"
161
        },
162
        "_description": {
163
          "value": " ",
164
          "type": "HTML"
165
        },
166
        "ForeignID": {
167
          "value": "2",
168
          "type": "STRING"
169
        }
170
      }
171
    }
172
  }
173 3 Denis Kildishev
}
174 9 Denis Kildishev
</code></pre>
175 3 Denis Kildishev
176
В примере выдача свойств двух узлов. Они расположены в result в виде словаря где ключ это id а значение - набор свойств узла.
177
178
5. Метод для работы с ресурсами. Текущая реализация
179
Method:
180
GET
181
Path:
182
http://localhost:9988/projects/{TEST}/nodes/{n}/resources/{resFolder}/{res}
183
{Test} имя проекта
184
{n} - uuid узла
185
{resFolder} папка с ресурсами(внутри {node_id}_resources, например "images")
186 4 Denis Kildishev
{res} имя файла
187
Возвращает ответ типа APPLICATION_OCTET_STREAM включающий в себя содержимое нужного ресурса. В теле также передается имя файла.
188
Если ресурса нет то выдается ответ NOT_FOUND типа plain text
189
Если передано некорректное имя папки с ресурсами(включающее недопустимые символы) то выдается ответ INVALID FOLDER типа plain text
190
191 1 Denis Kildishev
Предположительно появится метод получения ресурсов по списку для множества узлов но потом
192
Возможный формат передачи данных - json пары
193 9 Denis Kildishev
<pre><code class="javascript">
194 1 Denis Kildishev
{"uuid":"resfolder/resname","uuid2":"resfolder2/resname2"}
195 9 Denis Kildishev
</code></pre>
196 1 Denis Kildishev
Возможный тип возвращаемого значения - multipart/mixed. Но при этом размер возвращаемых данных может оказаться значительным
197 11 Denis Kildishev
198
6. Метод для получения связей
199
Method:
200
POST
201
Path:
202
http://localhost:9988/projects/{TEST}/getlinks
203
В теле запроса передаются все uuid ы узлов для которых нужно выдать свойства. Текущее предположение - в текстовом виде с разделителем ';'. Пример "4db0fbf4-f383-4740-9d72-891ef112f742;ff42a6f4-f9ac-48c3-b41c-c36395df8a85".
204
Результат включает в себя аналог словаря uuid:{ссылки}. Если для узла ссылок нет то в выдачу он не попадает.
205
ссылки разбиты на 4 раздела
206
linkToRelations - исходящие ссылки по свойствам
207
linkedByRelations - входящие ссылки по свойствам
208
linkToTerms - связи от использования термина из другого узла к определению в данном узле
209
linkedByTerms - связи от использования термина из данного узла к определению в другом узле
210
Пример выдачи
211
<pre><code class="javascript">
212
{
213
  "success": true,
214
  "result": {
215
    "links": {
216
      "7a5374ee-eb7a-4731-997d-5f52f00ebc2e": {
217
        "linkToRelations": {
218
          "reg": [
219
            {
220
              "haveChildren": true,
221
              "name": "Архитектура ПО",
222
              "type": "Requirement",
223
              "parent": "7a5374ee-eb7a-4731-997d-5f52f00ebc2e",
224
              "externalId": "9",
225
              "uuid": "188f8992-12e1-4acc-bf5a-fd568b1a2161"
226
            }
227
          ],
228
        },
229
        "linkedByRelations": {
230
          "d": [
231
            {
232
              "haveChildren": true,
233
              "name": "если E = 2 k -1",
234
              "type": "Requirement",
235
              "project": "SQRT",
236
              "parent": "ba51211b-d1c6-46ae-9333-bdad409b1fdb",
237
              "uuid": "127bfded-ae30-4365-9274-c116201a4ac1"
238
            },
239
            {
240
              "name": "001",
241
              "type": "Requirement",
242
              "project": "SQRT",
243
              "parent": "ebc37a22-15c5-482d-9e4c-8c23461fca39",
244
              "uuid": "57b80f94-9011-43d8-844f-5bef23e37afb"
245
            },
246
            {
247
              "name": "002",
248
              "type": "Requirement",
249
              "project": "SQRT",
250
              "parent": "4b40ef1a-de18-4d71-8825-2ef16b502cd0",
251
              "uuid": "658b8768-55b8-45b5-99b3-f03ba252acb7"
252
            }
253
          ]
254
        }
255
      }
256
    }
257
  }
258
} 
259
</code></pre>
260 12 Denis Kildishev
261 23 Denis Kildishev
6.5. Получение единичного ресурса
262
Method:
263
GET
264
Paths:
265
http://localhost:9988/projects/someproject/resources/ed612ae4-ced3-408c-8d64-66d87981611f/subpath.xhtml
266
или
267
http://localhost:9988/projects/someproject/resources/ed612ae4-ced3-408c-8d64-66d87981611f/images/1.jpg
268
Содержат имя проекта {someproject}, uuid узла {ed612ae4-ced3-408c-8d64-66d87981611f} и путь к ресурсу относительно папки {nodeId}_resources.
269
Стоит отметить что если в описании присутствует конструкция вида {node.resURL}/{img} то для _description путь к картинке фактически будет составлять {nodeId}_resources/_description/{img}
270
271 12 Denis Kildishev
7. Установка свойств
272
Method:
273
POST
274
Datatype:
275 14 Denis Kildishev
multipart/form-data или application/json
276 12 Denis Kildishev
Path:
277 1 Denis Kildishev
http://localhost:9988/projects/{TEST}/nodes/{uuid_of_node}/attributes/
278 17 Denis Kildishev
В теле запроса передаются значения свойств которые требуется изменить. Пример запроса ниже. Значение свойств которые не переданы в запросе остаются неизмеными. Сами свойства передаются через application/json поле "input". Изображения передаются в виде прикрепленных файлов в поле images.//TODO добавить пример.
279 14 Denis Kildishev
При использовании типа application/json вместо multipart/form-data свойства передаются непосредственно в теле запроса
280 12 Denis Kildishev
<pre><code class="javascript">
281
{
282
  "attributes":
283
    {
284
      "test":
285
        {
286
          "value":"2"
287
        },
288
      "test2":
289
        {
290
          "value":"3", "type": "INT"
291
        }
292
    }
293
}
294
</code></pre>
295
Возвращает текущий набор видимых распологающихся в узле свойств
296
<pre><code class="javascript">
297
{
298
  "success": true,
299
  "result": {
300
    "attributes": {
301
      "test2": {
302
        "value": "3",
303
        "type": "INT"
304
      },
305
      "_index": {
306
        "value": "8",
307
        "type": "STRING"
308
      },
309
      "test": {
310
        "value": "2",
311
        "type": "STRING"
312
      },
313
      "_tags": {
314
        "valuesType": "STRING",
315
        "value": [
316
          {
317
            "value": "section_Архитектура_ПО"
318
          }
319
        ],
320
        "type": "LIST"
321
      },
322
      "_type": {
323
        "value": "Requirement",
324
        "type": "STRING"
325
      },
326
      "_id": {
327
        "value": "Архитектура ПО",
328
        "type": "STRING"
329
      }
330
    }
331
  }
332
}
333
</code></pre>
334
335
8. Замена свойств
336
Аналогичен 7, отличается использованием метода PUT. Удаляет все свойства которые не перечисленны в запросе
337
338
9. Удаление свойств
339
Method:
340
DELETE
341
Path:
342
http://localhost:9988/projects/{TEST}/nodes/{n}/attributes/
343
{TEST} - имя проекта
344
{n} - uuid узла
345
В теле запроса передаются все имена свойств которые требуется удалить в текстовом виде с разделителем ';'. Пример
346
_name;attributeName
347
Результат включают в себя список оставшихся свойств. 
348
Пример выдачи
349
350
<pre><code class="javascript">
351
{
352 13 Denis Kildishev
  "success": true,
353
  "result": {
354
    "attributes": [
355
      "Вид",
356
      "Производное",
357
      "_index",
358
      "_tags",
359
      "_type",
360
      "_id",
361
      "ForeignID"
362
    ],
363
  }
364 1 Denis Kildishev
}
365
</code></pre>
366 14 Denis Kildishev
367 15 Denis Kildishev
10. Создание проекта
368
Method:
369
PUT
370
Path:
371
http://localhost:9988/projects/{new_name}
372
{new_name} - имя проекта
373
Возвращает 
374
<pre><code class="javascript">
375
{
376
  "success": true,
377
  "result": {}
378
}
379
</code></pre>
380
либо если проект уже существует 
381
<pre><code class="javascript">
382
{
383
  "success": false,
384
  "error": {
385
    "code": "project_exists",
386
    "message": "Specified project already exists",
387
    "extra": {}
388
  }
389
}
390
</code></pre>
391 16 Denis Kildishev
392
10. Удаление проекта
393
Method:
394
DELETE
395
Path:
396
http://localhost:9988/projects/{name}
397
{name} - имя проекта
398
Возвращает 
399
<pre><code class="javascript">
400
{
401
  "success": true,
402
  "result": {}
403
}
404
</code></pre>
405
либо если проект не найден
406
<pre><code class="javascript">
407
{
408
  "success": false,
409
  "error": {
410
    "code": "project_not_found",
411
    "message": "Specified project does not exists",
412
    "extra": {}
413
  }
414
}
415 1 Denis Kildishev
</code></pre>
416 17 Denis Kildishev
417
11. Создание узла
418
Method:
419
PUT
420
Path:
421
http://localhost:9988/projects/{project_name}/create
422
project_name - имя проекта
423
Datatype:
424 19 Denis Kildishev
multipart/form-data или application/json
425
Для multipart/form-data в теле содержится два поля - input содержит json с описанием узла, images содержит изображения.
426
Для application/json в теле содержится только json с описанием
427 17 Denis Kildishev
<pre><code class="javascript">
428
{
429
  "parent": "516bbbbc-babf-45d6-a146-61db334411be",
430
  "type":"Requirement",
431
  "id":"002",
432
  "attributes":{
433
    "test": {
434
      "value": "13d23",
435
      "type": "INT"
436
    },
437
    "_name": {
438
      "value": "{test} test 123"
439
    },
440
    "Ref": {
441
      "type": "REFERENCE",
442
      "value":"test"
443
    },
444
    "_description": {
445
      "value":"test desc <img src='strange.png' alt='strange.xcf'/>", "type":"HTML"
446
    }
447
  }
448
}
449
</code>
450
</pre>
451
id является опциональным, если его не указывать он будет формироваться автоматически
452
Пример возвращаемого значения
453
<pre><code class="javascript">
454
{
455
  "success": true,
456
  "result": {
457
    "name": "13d23 test 123",
458
    "uuid": "fbc83670-6993-4baf-8c8c-0b98aaab8ab3",
459
    "parent": "1f6e9e4f-4f63-446b-bddd-15838c15c212",
460
    "attributes": {
461
      "Ref": {
462
        "value": "*Missing(Ref): 'test'",
463
        "type": "REFERENCE"
464
      },
465
      "test": {
466
        "value": "13d23",
467
        "type": "INT"
468
      },
469
      "_name": {
470
        "value": "13d23 test 123",
471
        "type": "STRING"
472
      },
473
      "_type": {
474
        "value": "Requirement",
475
        "type": "STRING"
476
      },
477
      "_id": {
478
        "value": "002",
479
        "type": "STRING"
480
      },
481
      "_description": {
482
        "value": "test desc <img src='strange.png' alt='strange.xcf'/>",
483
        "type": "HTML"
484
      }
485
    }
486
  }
487
}
488
</code>
489
</pre>
490 18 Denis Kildishev
491 1 Denis Kildishev
12. Удаление узла
492 18 Denis Kildishev
Method:
493 19 Denis Kildishev
DELETE
494 18 Denis Kildishev
Path:
495
http://localhost:9988/projects/{project_name}/node
496
project_name - имя проекта
497
В теле в виде текста содержится идентефикатор узла, например UUID, но можно использовать и другие способы идентефикации
498
Пример
499
<pre><code class="javascript">
500
03745ff6-6f9f-4517-b011-c92ca6081a47
501
</code>
502
</pre>
503
Пример удачного удаления. Возвращается иерархия на уровне родителя удаленного узла
504
<pre><code class="javascript">
505
{
506
  "success": true,
507
  "result": {
508
    "haveChildren": true,
509
    "name": "Requirements",
510
    "type": "Requirement",
511
    "uuid": "1f6e9e4f-4f63-446b-bddd-15838c15c212",
512
    "children": [
513
      {
514
        "name": "002",
515
        "type": "Requirement",
516
        "uuid": "fbc83670-6993-4baf-8c8c-0b98aaab8ab3"
517
      },
518
      {
519
        "name": "004",
520
        "type": "Requirement",
521
        "uuid": "fb594248-0739-4b74-9c82-7c6d84e09e18"
522
      },
523
      {
524
        "name": "005",
525
        "type": "Requirement",
526
        "uuid": "90ae2683-d4c7-4a97-ae03-255f449f9318"
527
      },
528 1 Denis Kildishev
      {
529 20 Denis Kildishev
       "name": "006",
530
       "type": "Requirement",
531
       "uuid": "2ce727b8-0740-4344-988f-3155d7cea5f2"
532
      },
533
      {
534
        "name": "007",
535
        "type": "Requirement",
536
        "uuid": "40155667-942e-43a6-9861-3c5b05adccfb"
537
      },
538
    ],
539
  }
540
}
541 18 Denis Kildishev
</code>
542
</pre>
543
Пример с отсутствующим узлом
544
<pre><code class="javascript">
545
{
546
  "success": false,
547
  "error": {
548
    "code": "qid_not_found",
549
    "message": "Specified QID does not exists",
550
    "extra": {}
551
  }
552
}
553
</code>
554 1 Denis Kildishev
</pre>
555 20 Denis Kildishev
556
13. Перемещение узла
557
Method:
558
POST
559
Path:
560
http://localhost:9988/projects/{project_name}/nodes/{uuid}/move
561
project_name - имя проекта
562
uuid - идентефикатор узла который требуется переместить
563
В теле содержится json с описанием параметров переноса
564
Пример
565
<pre><code class="javascript">
566
{
567
  "parent":"2ce727b8-0740-4344-988f-3155d7cea5f2",
568
  "node":"90ae2683-d4c7-4a97-ae03-255f449f9318",
569
  "position":"1"
570
}
571
</code>
572
</pre>
573
parent - указание на нового родителя
574
node и position - опциональные поля для того чтобы переместить узел в определенное место, могут не включаться в запрос
575
node при указании задает узел относительно которого нужно определить новую позицию
576
position может принимать значение <0 или >=1. Если он <0 то узел будет перемещен на позицию до целевого узла, если >=0 то после.
577
Пример удачного удаления. Возвращается иерархия на уровне нового родителя узла
578
<pre><code class="javascript">
579
{
580
  "success": true,
581
  "result": {
582
    "haveChildren": true,
583
    "name": "Requirements",
584
    "type": "Requirement",
585
    "uuid": "1f6e9e4f-4f63-446b-bddd-15838c15c212",
586
    "children": [
587
      {
588
        "name": "002",
589
        "type": "Requirement",
590
        "uuid": "fbc83670-6993-4baf-8c8c-0b98aaab8ab3"
591
      },
592
      {
593
        "name": "004",
594
        "type": "Requirement",
595
        "uuid": "fb594248-0739-4b74-9c82-7c6d84e09e18"
596
      },
597
      {
598
        "name": "005",
599
        "type": "Requirement",
600
        "uuid": "90ae2683-d4c7-4a97-ae03-255f449f9318"
601
      },
602
      {
603
       "name": "006",
604
       "type": "Requirement",
605
       "uuid": "2ce727b8-0740-4344-988f-3155d7cea5f2"
606
      },
607
      {
608
        "name": "007",
609
        "type": "Requirement",
610
        "uuid": "40155667-942e-43a6-9861-3c5b05adccfb"
611
      },
612
    ],
613
  }
614
}
615 21 Denis Kildishev
</code>
616
</pre>
617 24 Denis Kildishev
618
14. Начало транзакции
619
Method:
620
POST
621
Path:
622
http://localhost:9988/projects/{project_name}/startTransaction
623
Тело содержить имя транзакиции в виде plaint текста, обычно включает имя проекта
624
project_name - имя проекта
625
Начинает транзакцию с набором действий которые впоследствии можно отменить
626
627
15. Коммит транзакции
628
Method:
629
POST
630
Path:
631
http://localhost:9988/projects/{project_name}/commitTransaction
632
project_name - имя проекта
633
Применяет транзакцию
634
635
16. Откат транзакции
636
Method:
637
POST
638
Path:
639
http://localhost:9988/projects/{project_name}/rollbackTransaction
640
project_name - имя проекта
641
Отменяет действие транзакции и возвращает все в состояние до начала транзакции
642
643
17. Отмена прошлой транзакции
644
Method:
645 25 Denis Kildishev
GET
646 24 Denis Kildishev
Path:
647 25 Denis Kildishev
http://localhost:9988/projects/undo
648
Отменяет предидущую транзакцию.
649 1 Denis Kildishev
650
18. Возврат отмененной транзакции
651
Method:
652 25 Denis Kildishev
GET
653 1 Denis Kildishev
Path:
654 25 Denis Kildishev
http://localhost:9988/projects/redo
655
Возвращает отмененную транзакцию.
656
657
19. Список действий к отмене
658
Method:
659
GET
660
Path:
661
http://localhost:9988/projects/undoactions
662
Получение списка действий которые можно отменить.
663
Пример ответа
664
{
665
  "success" : true,
666
  "result" : {
667
    "transactions" : [ "Move Element", "Move Element" ]
668
  }
669
}
670
671
20. Список действий к возвращению
672
Method:
673
GET
674
Path:
675
http://localhost:9988/projects/redoactions
676
Получение списка действий которые можно вернуть.
677
Пример ответа
678
{
679
  "success" : true,
680
  "result" : {
681
    "transactions" : [ "Move Element", "Move Element" ]
682
  }
683
}