Описание основных backend-флоу. Все пути API ниже идут от /api/v1/.
POST /auth/register с profile fields и phone/email.UserRegisterInSerializer валидирует payload и проверяет существующего пользователя.UserService.register() создает User через manager, инвалидирует старые OTP и создает новый OTPToken.message.POST /auth/verify-code.UserVerifyCodeSerializer находит пользователя по phone/email.UserService.verify_code() проверяет OTP, помечает пользователя verified и возвращает refresh token.access, refresh, token_type, user.Login использует тот же OTP verification path:
POST /auth/login валидирует phone/email.UserService.login() проверяет verified user и создает OTP.POST /auth/verify-code выпускает JWT.Profile:
GET /auth/users/me/ возвращает UserSerializer.PATCH /auth/users/me/ валидируется UserUpdateSerializer.UserService.update() обновляет профиль и avatar metadata/file, если передан avatar.Address:
PATCH /auth/users/me/address/.UserAddressUpdateSerializer валидирует части адреса.UserService.update_address() собирает строковый user.address.AddressViewSet и AddressService; AddressSerializer ограничивает создание одним адресом на пользователя.BaseSheetSerializer.BaseSheetViewSet.BaseModelViewSet.perform_create() вызывает domain *SheetService.create().BaseSheetService.create():
search_tags;provider=request.user;service_type;nearby action фильтрует sheets по радиусу от текущего адреса пользователя и применяет текстовый поиск./<sheet_id>/jobs, /<sheet_id>/products.BaseProductViewSet.BaseProductService.create() проверяет sheet через sheet service и создает product с FK на sheet.*PhotoService, наследующий BaseRelatedPhotoService.Этот flow общий для job, bringing, contract, storage.
POST /<domain-sheets>/<sheet_id>/events.*OrderEventSerializer валидирует event fields, products и optional user_card_id.*OrderEventService.create() запускает transaction.BaseOrderEventService.create():
products в event payload;*EventService.create();UserCard, если передан user_card_id;*OrderService.create();BaseEventService.create():
service_location_type;BaseEventProductService.BaseSheetOrderService.create():
user_card отсутствует, ставит pending_payment_method.Common actions:
POST /events/<id>/client-approve:
event.status == created;pending;issuer_approval.POST /events/<id>/cancel:
canceled, cancellation_author, cancellation_date.Domain-specific actions:
suggest_move: participant предлагает новое время;client_time_move_approval;issuer_time_move_approval;confirm_move: opposite participant подтверждает, время обновляется, статус возвращается к previous status или pending.move: issuer меняет дату/время, если статус позволяет перенос.client_approve: created -> issuer_approval;issuer_approve: issuer_approval -> pending;move: issuer меняет contract start/end dates.confirm_move: participant подтверждает новое receiving time.Некоторые статусы (in_progress, done, controversy) пока не имеют публичного transition endpoint в текущем коде. Их выставление происходит только внутренней логикой/админскими сценариями или прямым изменением состояния.
CalendarTemplate.CalendarTemplateService следит, чтобы был один default template.CalendarDayService.get_or_create_default() материализует день из default template.Команда:
cd django_around/around
python manage.py seed_demo_data
В Docker:
docker compose exec around_back python manage.py seed_demo_data
Что делает:
+77000001001 / demo.provider@example.com+77000001002 / demo.client@example.comUserRegisterInSerializer + UserService.register().UserVerifyCodeSerializer + UserService.verify_code().UserUpdateSerializer + UserService.update().AddressSerializer + AddressService.CalendarTemplateService and CalendarDayService.JobSheetSerializer + JobSheetService.JobSerializer + JobInstanceService.JobOrderEventSerializer + JobOrderEventService.EventStatusEnum и все InternalOrderStatusEnum.Повторный запуск идемпотентен по демо-пользователям, sheet and job item. Для удаления demo users перед seed:
python manage.py seed_demo_data --reset-demo