record where this project is heading, not just how it works
هر ایجنتِ تازه ساختارِ کد را میبیند ولی نمیداند صاحبِ پروژه دنبالِ چیست: دو ریپو و یک قراردادِ API (نه ادغامِ ریپوها)، حذفِ هر قدمِ دستی از انتشار، محتوای قابلِ ویرایش بدونِ برنامهنویس، و سنجشپذیر بودنِ کیفیتِ پاسخِ AI. بدونِ این، پیشنهادها به سمتی میروند که با مسیرِ پروژه نمیخواند. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
28
CLAUDE.md
28
CLAUDE.md
@@ -64,6 +64,34 @@ API docs: Swagger `/api/docs/`, Redoc `/api/redoc/`, admin `/admin/`.
|
|||||||
|
|
||||||
**Payment (Zarinpal)**: `create_order`/`CreateOrderView` never call Zarinpal directly — `paymentUrl` points at our own `GET /api/payment/orders/{id}/pay` (`PaymentRedirectView`), which calls Zarinpal's PaymentRequest API on first visit (storing `Order.gateway_authority`) and redirects to StartPay; this keeps order creation from depending on Zarinpal's uptime. Zarinpal redirects the user back to `GET /api/payment/zarinpal/callback` (`ZarinpalCallbackView`), which always re-verifies server-to-server via `payment/zarinpal.py::verify_payment` before marking an order paid — a forged `Status=OK` in the query string alone does nothing. Both `payment/zarinpal.py` and `payment/bazaar.py` fail closed (503 / invalid) when their credentials aren't configured, never a fake success.
|
**Payment (Zarinpal)**: `create_order`/`CreateOrderView` never call Zarinpal directly — `paymentUrl` points at our own `GET /api/payment/orders/{id}/pay` (`PaymentRedirectView`), which calls Zarinpal's PaymentRequest API on first visit (storing `Order.gateway_authority`) and redirects to StartPay; this keeps order creation from depending on Zarinpal's uptime. Zarinpal redirects the user back to `GET /api/payment/zarinpal/callback` (`ZarinpalCallbackView`), which always re-verifies server-to-server via `payment/zarinpal.py::verify_payment` before marking an order paid — a forged `Status=OK` in the query string alone does nothing. Both `payment/zarinpal.py` and `payment/bazaar.py` fail closed (503 / invalid) when their credentials aren't configured, never a fake success.
|
||||||
|
|
||||||
|
## Where this is heading (the owner's intent)
|
||||||
|
|
||||||
|
The owner writes this backend; another developer writes the frontend; a third person
|
||||||
|
administers the server. None of them share a machine, and until recently the two halves
|
||||||
|
were built in parallel without a shared contract — which is why reconciling them cost
|
||||||
|
rework. The goal is not to merge the repos. **Two repos, one API contract** is the
|
||||||
|
intended shape, and the contract lives in this repo's OpenAPI schema (`/api/docs/`), not
|
||||||
|
in anyone's head.
|
||||||
|
|
||||||
|
What the owner is steering toward, in rough order:
|
||||||
|
|
||||||
|
1. **Both halves running against each other**, on real content, with nobody hand-editing
|
||||||
|
files on the server. Most of the plumbing for this now exists.
|
||||||
|
2. **Nothing manual in a release.** Adding a dependency, a setting or a service must not
|
||||||
|
add a step someone has to remember. When a change would, fold it into `deploy.sh` or
|
||||||
|
make startup fail loudly and legibly instead.
|
||||||
|
3. **Content editable without a developer** — questions, curriculum, plan copy, all from
|
||||||
|
the admin panel. A management command run over SSH is a last resort, not a workflow.
|
||||||
|
4. **Answer quality measurable**, not assumed: per-question reports, wrong-answer rates,
|
||||||
|
prompt-version feedback. The senior's stated priority is proving the AI actually
|
||||||
|
teaches, especially where students get stuck.
|
||||||
|
5. **Scale without drama** — thousands of concurrent users should be a non-event. Prefer
|
||||||
|
the boring fix (an index, a cache, a cheap guard) over new infrastructure.
|
||||||
|
|
||||||
|
The owner is early in their career and learning the collaboration workflow as they go.
|
||||||
|
Explain the *why* alongside the *what*, flag when something is a product decision rather
|
||||||
|
than a coding one, and never assume a step was done just because it was described.
|
||||||
|
|
||||||
## Frontend ↔ backend (read before wiring the two together)
|
## Frontend ↔ backend (read before wiring the two together)
|
||||||
|
|
||||||
The app is two repos and two domains: the React frontend lives in
|
The app is two repos and two domains: the React frontend lives in
|
||||||
|
|||||||
Reference in New Issue
Block a user