# Предложения по взаимодействию сервиса «Паспорт» с ИС «Вся Россия» #### 1. Функция получения идентификатора пользователя в ИС «Вся Россия» по токену авторизации > В качестве идентификтора пользователя должно быть выбрано такое поле, которое уникально, назначается записи польователя в момент ее создания, не изменяется во время существования записи пользователя, и, в случае удаления записи, не используется повторно в новых записях. Пример того, как могла бы выглядеть и работать данная функция. Запрос: ``` curl POST /api/v1/getUserId HTTP/1.1 Host: profile.er.ru User-Agent: curl/7.68.0 X-Auth: <passport secret token> <token> ``` Ответ: ``` curl HTTP/1.1 200 OK Content-Type: application/json <user_id> ``` #### 2. Функция для получения данных профиля пользователя Для получения данных по профилям пользователей, причем не только текущего пользователя, но и авторов комментариев, участников чатов и событий календаря, и в других подобных случаях требуется функция, которая по идентификатору пользователя возвращает данные его профиля. Эта же функция может служить для получения ролей пользователей в проектах, либо для этого можно реализовать отдельную функцию, которая получает на входе идентификатор пользователя и идентификатор проекта, и возвращает роль пользователя в указанном проекте. Функция, возвращающая профиль пользователя, обязательно должна включать в свой ответ следующие поля: * Фамилия * Имя * Отчество * Адрес электронной почты * Номер телефона * Должность * Дата регистрации * URL фотографии профиля * Регион В случае, если принимается предложение, высказанное во втором абзаце данного пункта, в ответ включается также структура вида `{project: role}`. Запрос: ``` curl POST /api/v1/getUserProfile HTTP/1.1 Host: profile.er.ru User-Agent: curl/7.68.0 X-Auth: <passport secret token> <user_id> ``` Ответ: ``` curl HTTP/1.1 200 OK Content-Type: application/json { "surname": "Иванов", "name": "Иван", "patronymic": "Иванович", "email": "ivanov@er.ru", "phone": "7 (900) 000 0000", "position": "Тестировщик", "reg_date": "2021-07-13T16:42:08.099Z" "photo_url": "https://thispersondoesnotexist.com", "region": "Московская область", // При включении в ответ списка ролей "roles": { "messenger": "region_admin", "calendar": "global_admin" } } ``` #### 3. Функция получения контактов пользователя, которые видны ему при поиске Поскольку разрабатываемые нами сервисы, если полагаться только на две описанные выше функции, могут узнавать о существовании пользоваетелей только при их первом входе в сервис, либо при явном упоминании их идентификаторов, требуется дополнительная функция получения контактов пользователя, которые видны ему при поиске. Эта функция требуется для предоставления разрабатываемым нами сервисам возможности поиска пользователей, которые ранее не были подключены к конкретному сервису. Функция используется в таких случаях, как добавление участников чата администраторами регионов, поиск контактов в мессенджере, добавление пользователей в общие календари. Эта задача может быть делигирована сервису «Паспорт» в случае, если паспорт будет обладать списком всех активных пользователей, по которым планируется делать отбор. Запрос: ``` curl POST /api/v1/getUserСontacts HTTP/1.1 Host: profile.er.ru User-Agent: curl/7.68.0 X-Auth: <passport secret token> <user_id> ``` Ответ: ``` curl HTTP/1.1 200 OK Content-Type: application/json [1, 2, 3, 4] ``` #### 4. Альтернативное предложение взамен пунктов 2 и 3 Сервис «Паспорт» может регулярно синхронизироваться с ИС «Вся Россия» через определённый временной интервал. При синхронизации он может получить список всех относящихся к нему изменений, которые произошли на стороне ИС «Вся Россия». Для этого каждой записи пользователя в ИС сопоставляется поле `last_modified`, хранящее время последнего изменения записи. Такое время может быть установлено триггерами БД. Сопоставление поля `last_modified` записи пользователя можно выполнить либо непосредственно добавив его в соответствующую табллицу, либо сделав дополнительную таблицу, содержащую идентификатор пользователя и `last_modified` с индексом по нему. Эту дополнительную таблицу можно также дополнять и изменять триггерами, а также помещать в неё не все записи о пользователях, а только для таких пользователей, которые фигурируют в соответствующих сервисах заказчика (Мессенджер, Календарь и подобные) В время запроса делается отбор записей, `last_modified` которых больше указанного параметра. Так сервис «Паспорт» при первом запуске указывает наименьше возможное время и получает список всех пользователей, а после этого каждый интервал времени запрашивает записи с указанием времени последнего запроса. Запрос: ``` curl POST /api/v1/sync HTTP/1.1 Host: profile.er.ru User-Agent: curl/7.68.0 X-Auth: <passport secret token> 1970-01-01T00:00:00.000Z ``` Ответ: ``` curl HTTP/1.1 200 OK Content-Type: application/json [ { "id": 1, "surname": "Иванов", "name": "Иван", "patronymic": "Иванович", "email": "ivanov@er.ru", "phone": "7 (900) 000 0000", "position": "Тестировщик", "reg_date": "2021-07-13T16:42:08.099Z" "photo_url": "https://thispersondoesnotexist.com", "region": "Московская область", "roles": { "messenger": "region_admin", "calendar": "global_admin" } }, { "id": 2, "surname": "Петров", "name": "Петр", "patronymic": "Петрович", "email": "petrov@er.ru", "phone": "7 (900) 000 0001", "position": "Тестировщик", "reg_date": "2021-07-12T11:30:41.820Z" "photo_url": "https://thispersondoesnotexist.com", "region": "Московская область", "roles": { "messenger": "user", "calendar": "user" } }, { "id": 3, "deleted": true } ] ``` Для синхронизации систем в случае удаления записи пользователя в ИС «Вся Россия» предлагается в указанной выше таблице с полями `user_id`, `lastModified` сделать дополнительное поле `deleted` логического типа, заполняемое признаком удаления с помощью соответствующего триггера. #### 5. Принудительный выход пользователя Если в каком-то экстренном случае требуется немедленная деавторизация пользователя, мы по требованию заказчика готовы реализовать в сервисе «Паспорт» метод, который немедленно прекращает авторизацию конкретного токена, или всех сессий пользователя. Запрос: ``` curl POST /api/v1/logOut HTTP/1.1 Host: passport.er.digitalhq.ru User-Agent: curl/7.68.0 X-Auth: <ais secret token> {token: "...token..."} ``` Другой вариант запроса: ``` curl POST /api/v1/logOut HTTP/1.1 Host: passport.er.digitalhq.ru User-Agent: curl/7.68.0 X-Auth: <ais secret token> {user_id: 123} ``` Ответ: ``` curl HTTP/1.1 200 OK Content-Type: application/json "ok" ```