Приложение № 2. Требования к программным и техническим средствам, используемым собственниками или иными владельцами технологических сетей связи, имеющими уникальный идентификатор совокупности средств связи и иных технических средств в информационно-телекоммуникационной сети "Интернет", в части предоставления информации, хранящейся в схеме данных, при выполнении запросов от пунктов управления уполномоченных государственных органов, осуществляющих оперативно-разыскную деятельность или обеспечение безопасности Российской Федерации
1. Данные, хранящиеся в ИС, должны быть описаны с помощью схемы данных на языке SDL GraphQL (далее - схема данных).
2. Произвольный тип данных "А" в схеме данных должен иметь связь с произвольным типом данных "В", если произвольный тип данных "А" содержит поле произвольного типа данных "В" или поле, являющееся списком типа данных "В".
3. Произвольный тип данных "С" в схеме данных должен иметь двухстороннюю связь с произвольным типом данных "D", если произвольный тип данных "С" связан с произвольным типом данных "D" и произвольный тип данных "D" связан с произвольным типом данных "С".
4. Для схемы данных разработчиком ПТС должен быть определен перечень базовых типов данных на языке GraphQL, содержащих информацию, которая должна быть доступна для поиска в ПТС по запросам ПУ. Перечень базовых типов данных (приложение № 3 к Требованиям к ПТС) должен содержать параметры идентифицирующих признаков объектов физического мира.
5. Для схемы данных разработчиком ПТС определяется перечень сервисных типов на языке GraphQL, отражающих информацию о схеме данных, или описывающих HTTP URI для неформатированных данных, или предназначенных для получения статуса отложенных поисковых запросов или сигналов о функционировании ПТС. Посредством использования ПТС должен поддерживаться перечень сервисных типов, приведенный в приложении № 4 к Требованиям к ПТС.
6. Пользовательский тип данных на языке GraphQL, не являющийся базовым сервисным типом или встроенным типом языка GraphQL, должен содержать идентифицирующий признак объекта физического мира. Пользовательские типы используются для описания данных, содержащихся в ИС и отличных от данных, описываемых базовыми типами. Требования к пользовательским типам должны соответствовать пункту 6 настоящего приложения к Требованиям к ПТС.
7. Схема данных в части базовых, пользовательских и сервисных типов должна соответствовать следующим требованиям:
1) каждое поле пользовательского типа, которое отражает идентифицирующий признак объекта физического мира и будет доступно в качестве критерия поиска в ПТС по запросам ПУ, должно представляться базовым типом (или его списком);
2) поля пользовательского типа, которые содержат ссылки (HTTP URI) на неформатированные данные (файлы), должны представляться сервисным типом "Media";
3) остальные поля пользовательских типов должны представляться в том числе встроенными типами языка GraphQL;
4) для каждого пользовательского типа, имеющего хотя бы одно поле базового типа или связанного с другим пользовательским типом, имеющим хотя бы одно поле базового типа, должны быть определены следующие объекты языка GraphQL: тип для представления результатов выполнения поисковых запросов и входной объект для задания параметров поиска (далее - входной объект);
5) тип для представления результатов выполнения поисковых запросов должен иметь следующую структуру:
| Имя поля | Тип поля | Назначение поля |
| cursor | String | значение курсора для последнего элемента списка (поле "result") с результатами выполнения поискового запроса для данного пользовательского типа |
| hasNextPage | Boolean | признак наличия следующей страницы с результатами выполнения поискового запроса для данного пользовательского типа (может использоваться с любым видом постраничного получения результатов выполнения запроса) |
| result | список пользовательского типа | результат выполнения поискового запроса для данного пользовательского типа |
Программный код (тип поля представления результатов) выполнения поисковых запросов:
type {{UserTypeResult}} {
cursor: String
hasNextPage: Boolean
result: [{{UserType}}!]
},
в котором:
{{UserTypeResult}} - произвольное имя типа для представления результатов выполнения поисковых запросов,
{{UserType}} - имя пользовательского типа, для которого определен тип {{UserTypeResult}};
6) каждый входной объект для пользовательского типа должен иметь следующую структуру:
| Имя поля | Тип поля | Назначение поля |
| and | список исходных входных объектов | для задания параметров поиска с логической функцией "И" |
| or | список исходных входных объектов | для задания параметров поиска с логической функцией "ИЛИ" |
| not | исходный входной объект | для задания параметров поиска с логической функцией "НЕ" |
| все имена полей пользовательского типа, представленные базовыми типами | входные объекты для базовых типов, определенные в приложении № 5 к Требованиям к ПТС | для задания параметров поиска конкретных полей пользовательского типа, представленных базовыми типами |
Программный код входного объекта для пользовательского типа должен иметь следующую структуру:
input {{UserTypeFilterlnput}} {
and: [{{UserTypeFilterlnput}}]
or: [{{UserTypeFilterlnput}}]
not: {{UserTypeFilterlnput}}
{{baseField1}}: {{BaseFilterinput1}}
...
{{baseFieldN}}: {{BaseFilterlnputN}}},
в котором:
{{UserTypeFilterlnput}} - произвольное имя входного объекта для пользовательского типа,
{{baseField1}...{{baseFieldN}} - поля пользовательского типа, представленные одним из базовых типов,
{{baseFilterInput1}}...{{baseFilterInputN}} - входные объекты для базовых типов, определенные в приложении № 5 к Требованиям к ПТС;
7) все пользовательские типы, их поля и аргументы должны иметь описание на русском языке;
8) связь между двумя произвольными пользовательскими типами должна быть двухсторонней, за исключением случаев, если один из пользовательских типов не имеет ни одного поля базового типа;
9) схема данных должна содержать все сервисные типы из перечня, определенного в приложении № 4 к Требованиям к ПТС.
8. Схема данных в части стандартных типов "Query", "Subscription" языка GraphQL должна соответствовать следующим требованиям:
1) тип "Query" должен иметь поле "request" для задания поисковых запросов:
"request: QueryMessage!"
2) тип "QueryMessage" должен иметь следующую структуру:
| Имя поля | Тип поля | Назначение поля |
| requestID | String | идентификатор запроса |
| offline | Boolean | признак выполнения запроса в отложенном режиме |
| maxPageSize | Int | максимальное количество элементов в списке с результатами выполнения поискового запроса для одной страницы |
| все имена пользовательских типов, имеющие хотя бы одно поле базового типа | тип для представления результатов выполнения поисковых запросов, соответствующий пользовательскому типу | задание параметров поиска и постраничной передачи результатов поиска для пользовательского типа |
Поле типа "QueryMessage", содержащее все имена пользовательских типов, имеющее хотя бы одно поле базового типа, заданное списком пользовательского типа, должно иметь следующие аргументы:
"filter" - задает параметры поиска и представляется входным объектом для данного пользовательского типа;
"offset" - задает начальное смещение для постраничной передачи результатов;
"limit" - задает максимальное количество элементов на одной странице при постраничной передаче результатов, но не более значения maxPageSize;
"cursor" - значение курсора при использовании курсорной постраничной передачи результатов.
Аргументы "offset" и "limit" должны использоваться для постраничной передачи результатов со смещением, аргументы "limit" и "cursor" - для курсорной постраничной передачи результатов.
Программный код типа QueryMessage должен иметь следующую структуру:
type QueryMessage {
requestlD: String!
offline: Boolean!
maxPageSize: Int
{{userType1}}(filter: {{UserTypeFilterlnput1}}!, offset: Int, limit: Int, cursor: String):
{{UserTypeResult1}}!
...
{{userTypeN}}(filter: {{UserTypeFilterlnputN}}!, offset: Int, limit: Int, cursor: String):
{{UserTypeResultN}}!
},
в котором:
{{userType1}}...{{userTypeN}} - имена пользовательских типов, имеющих хотя бы одно поле базового типа;
{{UserTypeResult1}}...{{UserTypeResultN}} - имена типов для представления результатов выполнения поисковых запросов, соответствующие пользовательским типам;
{{UserTypeFilterlnput1}}...{{UserTypeFilterlnputN}} - входные объекты, соответствующие пользовательским типам;
3) тип "Subscription" должен содержать следующие поля для задания запросов постановки объектов на контроль:
| Имя поля | Тип поля | Назначение поля |
| все имена пользовательских типов, имеющие хотя бы одно поле базового типа | список пользовательского типа | задание параметров постановки объектов на контроль для пользовательского типа |
Каждое поле в типе "Subscription", представленное списком пользовательского типа, должно иметь аргумент "filter" для задания параметров постановки объектов на контроль и представляться входным объектом для данного пользовательского типа.
Программный код типа "Subscription" должен иметь следующую структуру:
type Subscription {
{{userType1}}(filter: {{UserTypeFilterlnput1}}!): [{{UserType1}}!]
...
{{userTypeN}}(filter: {{UserTypeFilterlnputN}}!): [{{UserTypeN}}]!
},
в котором:
{{userType1}}...{{userTypeN}} - имена пользовательских типов, имеющих хотя бы одно поле базового типа,
{{UserTypeFilterlnput1}}...{{UserTypeFilterlnputN}} - входные объекты, соответствующие пользовательским типам.
4) типы "Query" и "Subscription" должны содержать все запросы, соответствующие сервисным типам, которые приведены в приложении № 4 к Требованиям к ПТС.
9. В ПТС должны поддерживаться переменные типа "variables" языка GraphQL в поисковых запросах и запросах постановки объектов на контроль, получаемых от ПУ. В ПТС должна обеспечиваться возможность использования актуальных перечней базовых, сервисных типов и входных объектов для поиска.
10. Использование базовых, сервисных типов и входных объектов для задания параметров поиска, не предусмотренными Требованиями к ПТС, должно согласовываться во время внедрения ПТС с уполномоченным государственными органами, осуществляющими оперативно-разыскные мероприятия или обеспечение безопасности Российской Федерации.
11. Наименование пользовательского типа и его полей должно соответствовать следующим требованиям:
использование символа подчеркивания "_" в именах типов и их полей не допускается;
имена пользовательских типов пишутся с заглавной буквы и могут состоять из нескольких слов, написанных слитно без пробелов, каждое слово должно быть написано с заглавной буквы;
имена полей пользовательских типов пишутся со строчной буквы и могут состоять из нескольких слов, написанных слитно без пробелов, каждое слово, кроме первого слова, должно быть написано с заглавной буквы.