Skip to content

Repository files navigation

support api

что внутри

  • 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

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 run

миграции

make migrate

тесты

make 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

логика категорий, статусов, событий и ролей

категории

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

статусы

поддерживаются статусы

  • new
  • in_progress
  • waiting_user
  • resolved
  • closed

разрешенные переходы

  • new -> in_progress | closed
  • in_progress -> waiting_user | resolved | closed
  • waiting_user -> in_progress | resolved | closed
  • resolved -> in_progress | closed
  • closed меняется только через reopen

если обычный пользователь отвечает комментарием на тикет в статусе waiting_user, тикет автоматически переходит в in_progress повторное закрытие запрещено в закрытый тикет нельзя писать новые комментарии

история событий

в ticket_events пишутся

  • создание тикета
  • добавление обычного комментария
  • добавление внутреннего комментария
  • смена статуса
  • смена приоритета
  • смена ответственного
  • переоткрытие тикета

кто что может делать

обычный пользователь

  • логиниться
  • смотреть себя через me
  • смотреть категории
  • создавать тикеты
  • смотреть только свои тикеты
  • добавлять обычные комментарии только в свои тикеты
  • смотреть комментарии и события только своих тикетов
  • переоткрывать только свои закрытые тикеты

администратор

  • все из списка обычного пользователя
  • создавать категории
  • смотреть все тикеты
  • фильтровать все тикеты по статусу, категории и приоритету
  • назначать ответственного
  • менять приоритет
  • менять статус
  • писать внутренние комментарии
  • видеть внутренние комментарии

основные ручки

auth

  • POST /api/auth/jwt/login
  • GET /api/auth/users/me

categories

  • POST /api/ticket-categories
  • GET /api/ticket-categories

tickets

  • POST /api/tickets
  • GET /api/tickets/my
  • GET /api/tickets/{ticket_id}
  • GET /api/tickets/{ticket_id}/comments
  • POST /api/tickets/{ticket_id}/comments
  • GET /api/tickets/{ticket_id}/events
  • GET /api/tickets
  • POST /api/tickets/{ticket_id}/assign
  • POST /api/tickets/{ticket_id}/priority
  • POST /api/tickets/{ticket_id}/status
  • POST /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"
  }'

cценарии ручной проверки

  1. войти под admin и получить access token
  2. войти под user и получить access token
  3. запросить GET /api/auth/users/me с валидным токеном
  4. запросить GET /api/auth/users/me с невалидным токеном
  5. создать категорию под admin
  6. попробовать создать категорию под обычным пользователем
  7. создать тикет с существующей категорией
  8. попробовать создать тикет с несуществующей категорией
  9. получить GET /api/tickets/my и проверить пагинацию
  10. добавить комментарий в тикет со статусом waiting_user и проверить авто-переход в in_progress
  11. попробовать добавить комментарий в закрытый тикет
  12. под admin сменить статус, приоритет, назначить ответственного и проверить записи в GET /api/tickets/{ticket_id}/events

About

api тикетов поддержки и комментариев / probation stuff pt.11

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages