Эта страница фиксирует сквозные пользовательские и системные флоу по текущему коду в django_around/around и chat_around. Код mobile_around в этом workspace отсутствует, поэтому мобильные шаги описаны только со стороны backend/chat API.
Справочные страницы:
/api/v1/, /api/schema/ и /ws/chats.healthcheck_task.POST /api/v1/auth/register с phone/email и profile fields.UserRegisterInSerializer ищет пользователя по phone или email и запрещает повторную регистрацию.UserService.register() создает authentication.User, инвалидирует старые OTP через OTPService.issue_otp() и создает новый OTPToken.send_otp_sms_task.delay(user.id, otp).MOBIZON_ENABLED=false, OTP стабильно равен 0000; если Mobizon включен, генерируется случайный 4-значный OTP и отправляется SMS.message; TTL OTP - 5 минут. Resend timeout по умолчанию 60 секунд применяется только когда Mobizon включен.POST /api/v1/auth/verify-code.UserService.verify_code() проверяет активный неистекший OTP, делает пользователя is_verified=True и выпускает SimpleJWT refresh/access.Login использует тот же OTP path:
POST /api/v1/auth/login принимает phone/email.UserService.login() требует существующего verified user и создает новый OTP.POST /api/v1/auth/verify-code возвращает access, refresh, token_type, user.POST /api/v1/auth/resend-otp выпускает новый OTP с теми же ограничениями.POST /api/v1/auth/refresh обновляет access/refresh.POST /api/v1/auth/logout blacklist-ит refresh token.GET /api/v1/auth/users/me/.PATCH /api/v1/auth/users/me/ обновляет профиль; endpoint принимает JSON, form-data и multipart.avatar, UserService.update() создает или обновляет UserAvatar, сохраняет файл через Django storage и копирует avatar.url в user.avatar_url.avatar_crop_x, avatar_crop_y, avatar_crop_width, avatar_crop_height) можно обновлять только если аватар уже есть или вместе с новым файлом.PATCH /api/v1/auth/users/me/address/ собирает строковый user.address; если переданы latitude, longitude и адресная строка, создает или обновляет первый объект base.Address./api/v1/addresses/, но текущий валидатор временно ограничивает пользователя одним адресом.nearby поиска; без адреса BaseSheetService возвращает доменную ошибку UserAddressRequiredError.preferred_language хранится в user profile and can be updated through profile PATCH./api/v1/sheets/favorites/ and /api/v1/sheets/<id>/favorite/./api/v1/schedule/templates/: job, bringing или общий storage_contract. Создание доступно из бизнес-меню; при входе из анкеты тип предустановлен. Применённые даты сохраняются через /api/v1/schedule/days/.breaks; отдельный CRUD breaks доступен через nested endpoints.CalendarTemplateService поддерживает один default template на пользователя, но CalendarTemplateSerializer сейчас не открывает поле is_default наружу.CalendarDay отсутствует, часть доменных сервисов материализует день из default template; если default template отсутствует, создание события может завершиться ошибкой./api/v1/job-sheets//api/v1/bringing-sheets//api/v1/contract-sheets//api/v1/storage-sheets/BaseSheetService.create() назначает provider=request.user, выставляет доменный service_type, создает недостающие SearchTag и связывает их с sheet.archive/unarchive меняют lifecycle status./<sheet_id>/jobs//<sheet_id>/products/BaseRelatedPhotoService сохраняет файл, выставляет url, original_name, crop поля и следит, чтобы primary photo была только одна.GET /api/v1/sheets/nearby/ с Bearer token.query, min_rating, radius_km, service_types, location_types, receiving_types, tags, sort.query короче 3 символов отклоняется.title, description, search_tags, а также по связанным product/job names/descriptions.icontains fallback.relevance при текстовом поиске, rating, newest; default - рейтинг, review count, id.is_favorite, rating, review_count and preview_photo_url are returned by sheet serializers for client discovery UI.Общий path для четырех доменов:
POST /api/v1/<domain-sheets>/<sheet_id>/events/.*OrderEventSerializer валидирует дату/время, location, products и optional user_card_id.BaseOrderEventService.create() в одной transaction создает event и internal order.BaseEventService.create():
service_location_type;price по snapshot-ценам products;issuer=sheet.provider, client=request.user, status=created;BaseSheetOrderService.create() создает доменный internal order (JobOrder, BringingOrder, ContractOrder, StorageOrder) с валютой sheet и суммой события.user_card_id отсутствует или карта не найдена у пользователя, order получает статус pending_payment_method; иначе остается default created.order.Доменная специфика:
planning_start_time; duration считается как сумма job.duration * count, плюс сохраняется planning_after_job_break.planning_bringing_time; проверяется наличие рабочего дня provider.planning_contract_start_date, planning_contract_end_date, description; price берется от price_minimum.receiving, receiving_time; проверяется поддержка pickup/delivery и минимальное количество product.Общие статусы event: created, issuer_approval, client_time_move_approval, issuer_time_move_approval, pending, in_progress, canceled, done, controversy.
Общие actions:
POST .../events/<id>/client-approve/: client переводит created в pending; для contract переход идет в issuer_approval.POST .../events/<id>/cancel/: client или issuer переводит событие в canceled, сохраняются cancellation_author и cancellation_date.POST .../events/<id>/confirm-payment/: participant confirms payment; order must have a supported FreedomPay-backed user_card, provider payment request is created and order moves to inprocess.POST .../events/<id>/request-refund/: participant requests refund; current base implementation is a placeholder/no-op for provider refund.Доменная логика:
suggest-move: client или issuer предлагает новое planning_start_time; создается/обновляется JobEventMoveSuggestion.confirm-move: противоположная сторона подтверждает перенос, время обновляется, suggestion удаляется, статус возвращается к предыдущему или pending.move: только issuer меняет planning_bringing_time, если статус допускает перенос.issuer-approve: issuer переводит issuer_approval в pending.move: issuer меняет start date, end date пересчитывается по storage_time sheet или старой длительности.confirm-move: participant подтверждает новое receiving_time; отдельного suggest-move endpoint сейчас нет.Публичных endpoint-ов для переходов в in_progress, done, controversy в текущем коде нет.
BaseInternalOrder.user, user_card, amount, currency, status.created, pending_payment_method, pending, inprocess, funds_holded, success, canceled, refunded, error./api/v1/billing/*.POST /billing/cards/bind/ returns order_id and redirect_url;POST /billing/cards/bind/complete/ fetches tokenized card data and creates/updates UserCard;GET /billing/cards/?usage=client|business lists cards;POST /billing/cards/<card_id>/main/ sets main card;DELETE /billing/cards/<card_id>/ removes/unbinds card./billing/webhooks/freedompay/* and update internal order status from provider payloads.funds_holded ежедневная task event_flow.settle_due_events проверяет дату исполнения event.done завершает hold через FreedomPay clearing и получает order success; любой другой event status снимает hold через reverse и получает order canceled.Полное описание: Event Payment Settlement.
POST /api/v1/reviews/ creates a review for base_sheet, with author_name, rating and text.ReviewService recalculates sheet rating and review_count on create/update/delete.GET /api/v1/reviews/?base_sheet=<id> returns reviews for a sheet.POST /api/v1/feedback/ stores authenticated user feedback and is throttled to once per 5 minutes per user.POST /api/v1/push/devices/register registers Firebase/device token metadata.PushNotificationService sends through Firebase only when FIREBASE_ENABLED=1./api/v1/hot-ads/.HotAdService.create() проставляет user=request.user; is_active read-only в serializer.POST /api/v1/hot-ads/<id>/activate/ включает объявление и проверяет лимит MAXIMUM_ACTIVE_FREE_HOT_ADS_FOR_USER=20.POST /api/v1/hot-ads/<id>/freeze/ выключает объявление./api/v1/hot-ads/<hot_ad_id>/photos/.HotAdStatusEnum содержит расширенные статусы, но модель сейчас хранит только boolean is_active.chats, chat_messages и индексы.GET /api/v1/chats возвращает чаты пользователя.POST /api/v1/chats идемпотентно создает 1:1 чат с peer_user_id.GET /api/v1/chats/<chatID>/messages?limit=&before_id= возвращает историю.DJANGO_SECRET_KEY; refresh token не принимается./ws/chats принимает token через Authorization: Bearer ... или query token.chat.create, message.send, message.ack, message.read, ping.message.send требует client_message_id; уникальность (chat_id, sender_id, client_message_id) делает отправку идемпотентной.chat.created, message.sent, message.delivered, message.read в Redis channel chat:events.last_event_id; если после этого id есть сообщения, сервис вернет sync.replayed.chat_bridge создает support user и support chat для новых пользователей через signal post_save.python manage.py ensure_support_chats.chat_bridge документирует /api/v1/uploads/photos, но в текущем Go router handler для этого endpoint не найден.GET /api/schema/.MergedSpectacularAPIView строит стандартную drf-spectacular схему.merge_openapi_fragments() добавляет chat schemas, tags и paths из chat_bridge.openapi.CHAT_OPENAPI_FRAGMENT./api/v1/schema/swagger-ui/./api/v1/schema/redoc/.default, SMSQueue, PaymentsQueue, FirebaseQueue.CELERY_QUEUE; compose поднимает отдельные workers для каждой очереди.authentication.tasks.send_otp_sms_task, base.tasks.healthcheck_task, notifications.tasks.send_push_to_user_task, notifications.tasks.send_push_to_tokens_task, event_flow.tasks.settle_due_events_task.django_celery_beat.schedulers.DatabaseScheduler; расписание управляется через БД/admin.static_data.MEDIA_ROOT или в S3-compatible storage, если заданы AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_STORAGE_BUCKET_NAME, AWS_S3_ENDPOINT_URL. Для production текущий compose/nginx требует S3 или отдельной доработки media volume + /media/ route./api/v1/chats и /ws/chats в around_chat, /static/ отдает из volume, остальное направляет в around_back.wiki.q7m4t2x9b1.auna.kz.IsOwner разрешает safe methods без проверки владельца; write methods требуют authenticated user и owner для parent/object.BaseOrderEventViewSet разрешает только POST actions; list/retrieve event endpoints через эти viewsets фактически не предназначены для чтения.BaseSheetViewSet.nearby требует auth и адрес пользователя.CalendarTemplateSerializer не экспонирует is_default, хотя сервисная логика default template есть.mobile_around.