An open API service indexing awesome lists of open source software.

https://github.com/profcomff/print-api

Серверная часть сервиса отправки заданий на печать и получения файлов для печати с терминала
https://github.com/profcomff/print-api

print-service

Last synced: 27 days ago
JSON representation

Серверная часть сервиса отправки заданий на печать и получения файлов для печати с терминала

Awesome Lists containing this project

README

          

# Сервис печати
Серверная часть сервиса для работы с документами, отправляемыми на печать

[](https://easycode.profcomff.com/templates/docker-fastapi/workspace?mode=manual&param.Repository+URL=https://github.com/profcomff/print-api.git&param.Working+directory=print-api)

## Функционал
1. Управление файлами, отправляемыми пользователями на печать
- Создание/удаление файлов
- Редактирование параметров печати

2. Получение файлов со стороны клиента-терминала печати

3. Управление пользователями, которым разрешена печать на принтере

4. Прямое подключение клиентом-терминалом печати
- Генерация QR кодов для быстрой печати
- Отправка команд на мгновенное обновление/перезагрузку терминала

## Запуск

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
(venv) foo@bar:~$ pip install -r requirements.txt
(venv) foo@bar:~$ pip install -r requirements.dev.txt
```

4. Поднимите базу данных
```console
(venv) foo@bar:~$ docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --name db-print_service postgres:15
(venv) foo@bar:~$ alembic upgrade head # Произвести миграции БД
```

5. Запускайте приложение!
```console
(venv) foo@bar:~$ python -m print_service
```

## ENV-variables description

- `DB_DSN=postgresql://postgres@localhost:5432/postgres` – Данные для подключения к БД
- `STATIC_PATH` - путь до папки, в которой лежит статика.
- `REDIS_DSN` - Данные для подключения к Redis
- `CONTENT_TYPES` - типы принимаемого контента для печати
- `MAX_SIZE` - Максимальный размер файла в байтах
- `MAX_PAGE_COUNT` - Максимальное количество страниц для печати
- `STORAGE_TIME` - Время хранения файла в часах
- `ALLOW_STUDENT_NUMBER` - разрешить ли номер студенческого для печати
- `PIN_SYMBOLS` - символы из которых состоит ПИН-код
- `PIN_LENGTH` - длина пин-кода
- `QR_TOKEN_PREFIX` - префикс QR кода
- `QR_TOKEN_SYMBOLS` - символы из которых состоит QR-код
- `QR_TOKEN_LENGTH` - Длина QR-кода
- `QR_TOKEN_TTL` - время жизни QR-кода (время показа)
- `QR_TOKEN_DELAY` - как долго QR-код будет валидным после того, как прошел TTL (исчез с экрана)
- Остальные общие для всех АПИ параметры описаны [тут](https://docs.profcomff.com/tvoy-ff/backend/settings.html)

## Основные абстракции
- `Пользователь` - сущность, у которой есть номер студенческого и профсоюзного билета, а также фамилию
- `Файл` - сущность, отвечающая за загруженный пользователем файл. Имеет пин-код для скачивания, ссылку на реальный файл (который лежит в static хранилище), а также опции печати и ссылку на пользователья, который его загрузил
- `Факт печати` - сущность для статистики печати. Каждый раз, когда кто-то печатает файл, создается эта сущность со ссылкой на файл и его владельца, а также количеством использованных страниц

## Сценарий использования
1. Обновить список пользователей.

Дернуть ручку `POST /print/is_union_member`, передать json со списком новых пользователей:
```json
{
"users": [
{
"username": "string",
"union_number": "string",
"student_number": "string"
}
]
}
```
Если пользователь с таким студенческим _или_ профсоюзным уже существует, то вся остальная информация будет заменена. Иначе, создается новый пользователь.

2. Проверить, что пользователь существует в системе
Дернуть ручку `GET /print/is_union_member?surname=...&number=...`, передать в query параметрах фамилию и номер профсоюзного билета.
Вернет ответ, найден ли пользователь.
3. Загрузить файл

Дернуть ручку `POST /print/file`, передать туда json:
```json
{
"surname": "Иванов",
"number": "1015000",
"filename": "filename.pdf",
"source": "string",
"options": {
"pages": "", // "" если распечатать надо все страницы, иначе формат такой: "10-13,16,18,20,21,24,25,27,28,30", можно не сортировать
"copies": 1,
"two_sided": false
}
}
```
Передается пользователь с его проф. билетом.
Ручка вернет pin в таком формате:
```json
{
"pin": "OF72I1",
"options": {
"pages": "",
"copies": 1,
"two_sided": false
}
}
```
Его надо сохранить и отправить еще один запрос на загрузку самого файла:
Дернуть ручку `POST /print/file/{pin}`, передать файл в бинарном виде
Ручка вернет тот же json, что и предыдущая в случае успеха

После этого файл готов к печати

4. Получить файл
Дернуть ручку `GET /print/file/{pin}`
Вернет json:
```json
{
"filename": "2021-11-02-ZMNF5V...9.pdf",
"options": {
"pages": "",
"copies": 1,
"two_sided": false
}
}
```
По ссылке можно скачать файл из static хранилища, options помогают распечтать файл, если запрос идет от принтера

5. Как работает QR
Пользователь приходит к терминалу, считывает QR-код, после этого с его устройства идет запрос на `POST /qr`, в котором передается отсканированный QR-код и пин для печати

Терминал подключен к бэкенду через вебсокет. Бэкенд после получения запроса от пользователя в течение некоторого времени отправляет хапрос на печать файла.

6. Ручное обновление и перезагрузка
Делается с админским токеном
Ручки, соответственно: `POST /admin/update` и `POST /admin/reboot`
Спецификация доступна в Swagger UI

## Contributing

- Основная [информация](https://docs.profcomff.com/tvoy-ff/backend/index.html) по разработке наших приложений

- [Ссылка](https://github.com/profcomff/print-api/blob/main/CONTRIBUTING.md) на страницу с информацией по разработке print-api