Skip to content

Серверная часть сервиса хранения и управления информации о пользователе

License

Notifications You must be signed in to change notification settings

profcomff/userdata-api

Repository files navigation

Сервис пользовательских данных

Серверная часть сервиса хранения и управления информации о пользователе

Auth Schema

Функционал

  1. Управление категориями, параметрами, источниками данных.
  2. Управление правами доступа к информации
  3. Получение/изменение пользовательской информации через HTTP
  4. Потоковое изменение пользовательской информации на основе данных передаваемых OAuth методами входа
  • Про понятия использоованные в этом пункте можно почитать ниже(см. Основные абстракции)

Запуск

  1. Перейдите в папку проекта

  2. Создайте виртуальное окружение командой и активируйте его:

    foo@bar:~$ python3 -m venv venv
    foo@bar:~$ source ./venv/bin/activate  # На MacOS и Linux
    foo@bar:~$ venv\Scripts\activate  # На Windows
  3. Установите библиотеки

    foo@bar:~$ pip install -r requirements.txt
    foo@bar:~$ pip install -r requirements.dev.txt
  4. Запускайте приложение!

    foo@bar:~$ python -m userdata_api start --instance api -- запустит АПИ
    foo@bar:~$ python -m userdata_api start --instance worker -- запустит Kafka worker

Приложение состоит из двух частей - АПИ и Kafka worker'а.

АПИ нужно для управления структурой пользовательских данных - контроль над категориями данных, параметрами, источниками данных. Также, в АПИ пользовательские данные может слать сам пользователь(владелец этих данных), а также админ

Kafka worker нужен для того, чтобы разгребать поступающие от OAuth методов авторизации AuthAPI пользовательские данные

ENV-variables description

🌟 Все параметры для Kafka являются необязательными

  • DB_DSN=postgresql://postgres@localhost:5432/postgres – Данные для подключения к БД
  • KAFKA_DSN - URL для подключение к Kafka
  • KAFKA_LOGIN - логин для подключения к Kafka
  • KAFKA_PASSWORD - пароль для подключения к Kafka
  • KAFKA_TOPICS - Kafka топики, из которых читается информация
  • KAFKA_GROUP_ID - Группа, от имени которой происходит чтение топиков
  • Остальные общие для всех АПИ параметры описаны тут

Основные абстракции

  • Параметр - поле для пользовательской информации(например: Email, Телефон, Адрес, Курс обучения, Номер студенческого билета)

  • Категория - объединение нескольких параметров по общему признаку. Например: Email, Телефон - личная информация; Курс обучения, Номер студенческого билета - учеба. Категория имеет read_scope - право на её чтение другими пользователями и update_scope - право на её изменение дургими пользователями

  • Источник - откуда пришла информация о пользователе. Наприимер: VK, GitHub, LKMSU, User(он сам её добавил), Admin(админ её добавил). Источник имеет trust_level: то есть информации из одних источников мы можем доверять больше, чем другим

  • Информация - само значение поля. Имеет ссылку на параметр и источник. Соответственно, значение одного параметра у пользователя может быть списком, так как информация для этого параметра пришла из различных источников

Пример

Пользователь с id=1

Категория Параметр Источник Значение
Учёба Курс обучения User 4
Учёба Курс обучения LKMSU 4
Учёба Номер студенческого билета LKMSU 42424242
Личная информация Email User [email protected]
Личная информация Email Admin [email protected]
Личная информация Email VK [email protected]
Личная информация Email Yandex [email protected]
Личная информация Email GitHub [email protected]
Личная информация Телефон User +79094242

Сценарий использования

Создать категорию

  1. Дёрнуть ручку POST /category. Вы передаете
{
  "name": "", // Имя категории
  "read_scope": "", // Скоуп на чтение
  "update_scope": "" // Скоуп на запись
}
  1. Сооздать в Auth API нужные scopes(если передали не null)

Создать параметр

  1. Дернуть ручку POST /category/{category_id}/param. Передать
{
  "name": "", // Имя параметра
  "is_required": bool, // Обязателен ли он
  "changeable": bool, // Изменяем ли он после установки
  "type": "all || last || most_trusted" // Какой значение параметра из множества, задаваемого источником, будет возвращаться
}

Получить список категорий

  1. Дернуть ручку GET /category. Если нужна иинформация о параметрах, которые есть в каждой из категорий, то дернуть ручку GET /category?query=param

Обновить информацию о пользователе

  1. Дернуть ручку POST /user/{user_id}, передать туда
{
  "items": [ // Список новых значений
    {
      "category": "", // Имя категории в которой находится параметр
      "param": "", // Имя изменяемого параметра
      "value": "" // Новое значение. Если раньше значения не существовало, то оно будет создано. Если передать null, то значение будет удалено.
    }
  ],
  "source": "string" // Источник информации. По http доступно только user и admin
}
  • Информацию меняется только в пределах источника. То есть админ не может поменять инфоормацию, переданную пользователем. Он может только создать новую или поменять информацию из источника admin

  • Пользователь может создать любую информацию о себе

  • Пользователь может обновить/удалить только изменяемую информацию

  • Неизменяемая информация изменяема при наличии scope userdata.info.update

  • Обновить информацию о другом пользователе из конкретноой категории можно только при наличии права на изменение в этой категории (см. category.update_scope)

Получить информацию о пользователе/пользователях

Получить информацию о пользователе по id

Дернуть ручку GET /user/{user_id}.

  • Пользователь может получить всю информацию о себе

Получить информацию о нескольких пользователях об указанных категориях

Дернуть ручку GET /user?users=...?categories=....

  • Ручка закрыта за скоупом userdata.info.admin

  • Query параметры users и categories обязательные

В обеих GET /user/ ручках информация будет возвращаться таким образом:

  • В соответствии с переданными scopes

  • Можно получить только информацию из тех категорий на которые у него есть права (см category.read_scope)

  • С поставленными param.type.

    • Если поставлен all то вернется информация соотв. данному параметру из всех источников
    • last - вернется последняя обновленная информация
    • most_trusted - вернется информация из самого доверенного источника

Contributing

  • Основная информация по разработке наших приложений

  • Ссылка на страницу с информацией по разработке userdata-api

About

Серверная часть сервиса хранения и управления информации о пользователе

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages