https://github.com/profcomff/userdata-api
Серверная часть сервиса хранения и управления информации о пользователе
https://github.com/profcomff/userdata-api
auth-service
Last synced: 12 days ago
JSON representation
Серверная часть сервиса хранения и управления информации о пользователе
- Host: GitHub
- URL: https://github.com/profcomff/userdata-api
- Owner: profcomff
- License: bsd-3-clause
- Created: 2023-03-31T15:49:10.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-03-26T17:45:07.000Z (7 months ago)
- Last Synced: 2025-03-26T18:38:06.866Z (7 months ago)
- Topics: auth-service
- Language: Python
- Homepage:
- Size: 81.1 KB
- Stars: 13
- Watchers: 1
- Forks: 0
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Сервис пользовательских данных
Серверная часть сервиса хранения и управления информации о пользователе
[
](https://easycode.profcomff.com/templates/docker-fastapi/workspace?mode=manual¶m.Repository+URL=https://github.com/profcomff/userdata-api.git¶m.Working+directory=userdata-api)

## Функционал
1. Управление категориями, параметрами, источниками данных.
2. Управление правами доступа к информации
3. Получение/изменение пользовательской информации через HTTP
4. Потоковое изменение пользовательской информации на основе данных передаваемых OAuth методами входа
- Про понятия использоованные в этом пункте можно почитать ниже(см. Основные абстракции)
## Запуск
1. Перейдите в папку проекта
2. Создайте виртуальное окружение командой и активируйте его:
```console
foo@bar:~$ python3 -m venv venv
foo@bar:~$ source ./venv/bin/activate # На MacOS и Linux
foo@bar:~$ venv\Scripts\activate # На Windows
```
3. Установите библиотеки
```console
foo@bar:~$ pip install -r requirements.txt
foo@bar:~$ pip install -r requirements.dev.txt
```
4. Запускайте приложение!
```console
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
:star2: Все параметры для Kafka являются необязательными
- `DB_DSN=postgresql://postgres@localhost:5432/postgres` – Данные для подключения к БД
- `KAFKA_DSN` - URL для подключение к Kafka
- `KAFKA_LOGIN` - логин для подключения к Kafka
- `KAFKA_PASSWORD` - пароль для подключения к Kafka
- `KAFKA_TOPICS` - Kafka топики, из которых читается информация
- `KAFKA_GROUP_ID` - Группа, от имени которой происходит чтение топиков
- Остальные общие для всех АПИ параметры описаны [тут](https://docs.profcomff.com/tvoy-ff/backend/settings.html)
## Основные абстракции
- Параметр - поле для пользовательской информации(например: Email, Телефон, Адрес, Курс обучения, Номер студенческого билета)
- Категория - объединение нескольких параметров по общему признаку. Например: Email, Телефон - _личная информация_; Курс обучения, Номер студенческого билета - _учеба_. Категория имеет `read_scope` - право на её чтение другими пользователями и `update_scope` - право на её изменение дургими пользователями
- Источник - откуда пришла информация о пользователе. Наприимер: VK, GitHub, LKMSU, User(он сам её добавил), Admin(админ её добавил). Источник имеет `trust_level`: то есть информации из одних источников мы можем доверять больше, чем другим
- Информация - само значение поля. Имеет ссылку на параметр и источник. Соответственно, значение одного параметра у пользователя может быть списком, так как информация для этого параметра пришла из различных источников
### Пример
Пользователь с `id=1`
| Категория | Параметр | Источник | Значение |
|---|---|---|---|
| Учёба | Курс обучения | User | 4 |
| Учёба | Курс обучения | LKMSU | 4 |
| Учёба | Номер студенческого билета | LKMSU | 42424242 |
| Личная информация | Email | User | email1@real.email |
| Личная информация | Email | Admin | email2@real.email |
| Личная информация | Email | VK | email3@vk.real.email |
| Личная информация | Email | Yandex | email4@ya.real.email |
| Личная информация | Email | GitHub | email5@github.email |
| Личная информация | Телефон | User | +79094242 |
## Сценарий использования
### Создать категорию
1. Дёрнуть ручку `POST /category`. Вы передаете
```json
{
"name": "", // Имя категории
"read_scope": "", // Скоуп на чтение
"update_scope": "" // Скоуп на запись
}
```
2. Сооздать в Auth API нужные scopes(если передали не `null`)
### Создать параметр
1. Дернуть ручку `POST /category/{category_id}/param`. Передать
```json
{
"name": "", // Имя параметра
"is_required": bool, // Обязателен ли он
"changeable": bool, // Изменяем ли он после установки
"type": "all || last || most_trusted" // Какой значение параметра из множества, задаваемого источником, будет возвращаться
}
```
### Получить список категорий
1. Дернуть ручку `GET /category`. Если нужна иинформация о параметрах, которые есть в каждой из категорий, то дернуть ручку `GET /category?query=param`
### Обновить информацию о пользователе
1. Дернуть ручку `POST /user/{user_id}`, передать туда
```json
{
"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
- Основная [информация](https://docs.profcomff.com/tvoy-ff/backend/index.html) по разработке наших приложений
- [Ссылка](https://github.com/profcomff/userdata-api/blob/main/CONTRIBUTING.md) на страницу с информацией по разработке userdata-api