Files
Salon/backend
mohd ef60218c4c fix: make booking overlap check atomic with select_for_update
Wrap the overlap query and Booking.objects.create() in a single
transaction.atomic() block inside BookingCreateSerializer.create().
Lock the StaffProfile row with select_for_update() so concurrent
requests for the same staff slot are serialized at the DB level;
only one writer can hold the lock at a time, eliminating the race
window between validate() and save().

The early check in validate() is kept for fast user feedback in
the common non-concurrent case. The locked re-check in create()
is the correctness guarantee.

On SQLite (dev/tests) FOR UPDATE is silently ignored but writes
are still serialized. PostgreSQL (production) gets row-level locking.

Update docs/risks.md to mark the race condition as fixed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 00:27:04 +03:00
..
2026-02-28 17:31:03 +03:00
2026-02-27 15:01:06 +03:00
2026-02-28 17:31:03 +03:00
2026-02-28 17:31:03 +03:00

Backend Notes (MVP Readiness)

High-Level Takeaways

  • Authentica OTP integration is implemented; Moyasar capture/refund are TODOs.
  • External calls (OTP, notifications, payment gateway) run synchronously in request/response paths, increasing latency risk.
  • Cross-app coupling (bookings ↔ notifications ↔ accounts/payments) will get harder to evolve without clearer service boundaries.
  • Phone-first auth works, but USERNAME_FIELD is email; align identifier strategy to avoid future auth confusion.

Near-Term Focus

  • Hardening Authentica integration (timeouts, retries, async delivery) and aligning notification provider choices.

Authentica E2E Run the real Authentica OTP flow only when explicitly enabled.

Env vars (in backend/.env or shell):

  • AUTHENTICA_E2E=1
  • AUTHENTICA_API_KEY=...
  • AUTHENTICA_E2E_PHONE=... (must receive OTP)
  • AUTHENTICA_E2E_CODE=... (required; no interactive prompt)

Command:

cd backend
PYTEST_ADDOPTS='' python3 -m pytest apps/accounts/tests -m external

Suggested flow:

  1. Trigger the E2E test to send the OTP, then set AUTHENTICA_E2E_CODE and re-run if needed.
  • Decide and document payment lifecycle scope (capture/refund supported vs explicitly out of scope).
  • Add timeouts/logging for external calls or introduce minimal async jobs for OTP/notifications.
  • Keep booking, payment, and notification orchestration in service layers, not views.