Браузер не назначает цену
Сервер читает товар и стоимость из каталога. Значение, переданное клиентом, не определяет сумму заказа.
server/commerce.ts · createOrderMK / ENGINEERING NOTES
Разбираю инженерные решения на примере самого MK • DΞV: границы доверия, состояния заказа и восстановление после ошибок.
В интерфейсе — одна кнопка. За ней — проверка условий, серверная цена, отдельный платёжный запрос и выдача только после подтверждения.
01 / STATE MACHINE
Упрощённая локальная модель. Никаких реальных платежей, запросов к провайдерам или выдачи файлов.
Сервер читает товар и стоимость из каталога. Значение, переданное клиентом, не определяет сумму заказа.
server/commerce.ts · createOrderПодтверждение платежа, изменение состояния и постановка выдачи записываются в транзакции. Повтор обрабатывается через уникальные идентификаторы.
server/commerce.ts · confirmНеудачную выдачу можно повторить без повторной оплаты. Поздние и неоднозначные переводы требуют отдельной проверки.
server/jobs.ts · server/commerce.tsАвтотесты проверяют повторы событий, доступ к заказу, неподтверждённые платежи и отсутствие товара. Это проверки логики, а не доказательство боевой нагрузки.
tests/payment.test.mjs02 / THE BUILD
Эта схема описывает текущую реализацию MK • DΞV. Архитектура сторонних кейсов не раскрывается без подтверждения.
03 / DECISIONS, NOT BUZZWORDS
Форма должна сразу объяснять ошибку. Но запрос можно отправить в обход формы, поэтому сервер не доверяет проверке браузера.
Один модуль правил используется в двух местах: перед отправкой и перед записью заявки. Доступ, согласие и ограничение частоты проверяются на сервере.
// server/api.ts
const errors = validateBrief(details);
if (Object.keys(errors).length) {
return json({
error: 'Invalid brief',
fields: Object.keys(errors)
}, 400);
}Общие правила уменьшают расхождение, но не заменяют тесты и серверные ограничения. Не каждую бизнес-проверку стоит переносить в клиентский код.