- fastapi + sqlalchemy + alembic + postgresql
- базовая jwt авторизация по email/password
- тикеты, категории, комментарии, внутренние комментарии и история событий
- owner/admin права доступа
- пагинация списков тикетов, комментариев и событий
- демо данные загружаются только через миграции
- dockerfile сразу применяет миграции и поднимает сервис
app/
api/
core/
db/
schemas/
services/
alembic/
tests/
- python 3.12
- docker и docker compose либо локальный postgresql
docker compose up --buildпосле старта будут доступны
- api
http://localhost:8000 - swagger
http://localhost:8000/docs - healthcheck
http://localhost:8000/health
cp .env.example .env
python3 -m venv .venv
source .venv/bin/activate
make install
make migrate
make runmake migratemake test- admin
admin@example.com/admin123 - user
user@example.com/user123 - user2
user2@example.com/user123 - inactive admin
inactive-admin@example.com/admin123
- billing
- technical
- access
категория обязательна при создании тикета создание категории доступно только администратору получение списка категорий доступно любому авторизованному пользователю
поддерживаются статусы
newin_progresswaiting_userresolvedclosed
разрешенные переходы
new -> in_progress | closedin_progress -> waiting_user | resolved | closedwaiting_user -> in_progress | resolved | closedresolved -> in_progress | closedclosedменяется только черезreopen
если обычный пользователь отвечает комментарием на тикет в статусе waiting_user, тикет автоматически переходит в in_progress
повторное закрытие запрещено
в закрытый тикет нельзя писать новые комментарии
в ticket_events пишутся
- создание тикета
- добавление обычного комментария
- добавление внутреннего комментария
- смена статуса
- смена приоритета
- смена ответственного
- переоткрытие тикета
обычный пользователь
- логиниться
- смотреть себя через
me - смотреть категории
- создавать тикеты
- смотреть только свои тикеты
- добавлять обычные комментарии только в свои тикеты
- смотреть комментарии и события только своих тикетов
- переоткрывать только свои закрытые тикеты
администратор
- все из списка обычного пользователя
- создавать категории
- смотреть все тикеты
- фильтровать все тикеты по статусу, категории и приоритету
- назначать ответственного
- менять приоритет
- менять статус
- писать внутренние комментарии
- видеть внутренние комментарии
POST /api/auth/jwt/loginGET /api/auth/users/me
POST /api/ticket-categoriesGET /api/ticket-categories
POST /api/ticketsGET /api/tickets/myGET /api/tickets/{ticket_id}GET /api/tickets/{ticket_id}/commentsPOST /api/tickets/{ticket_id}/commentsGET /api/tickets/{ticket_id}/eventsGET /api/ticketsPOST /api/tickets/{ticket_id}/assignPOST /api/tickets/{ticket_id}/priorityPOST /api/tickets/{ticket_id}/statusPOST /api/tickets/{ticket_id}/reopen
curl -X POST http://localhost:8000/api/auth/jwt/login -H 'content-type: application/json' -d '{"email":"admin@example.com","password":"admin123"}'curl -X POST http://localhost:8000/api/tickets -H 'authorization: bearer <access_token>' -H 'content-type: application/json' -d '{
"subject":"не открывается отчет",
"description":"при нажатии кнопки появляется 500",
"category_id":"10000000-0000-0000-0000-000000000002",
"priority":"high"
}'- войти под admin и получить access token
- войти под user и получить access token
- запросить
GET /api/auth/users/meс валидным токеном - запросить
GET /api/auth/users/meс невалидным токеном - создать категорию под admin
- попробовать создать категорию под обычным пользователем
- создать тикет с существующей категорией
- попробовать создать тикет с несуществующей категорией
- получить
GET /api/tickets/myи проверить пагинацию - добавить комментарий в тикет со статусом
waiting_userи проверить авто-переход вin_progress - попробовать добавить комментарий в закрытый тикет
- под admin сменить статус, приоритет, назначить ответственного и проверить записи в
GET /api/tickets/{ticket_id}/events