DaydreamMods

DaydreamMods

Файлы сборок

Куда кладётся ZIP, как он называется в базе и как его забирает игрок.

Платный архив не лежит в public и не имеет адреса вида /packs/warpgate.zip.

Загрузка из админки

Раздел «Версии». Администратор выбирает сборку, номер, дату выпуска, текст изменений, статус и файл с компьютера. Принимается ZIP. Пока байты идут, полоса показывает процент и «сколько из скольких». На 100% подпись меняется: файл передан, сервер его записывает. Страницу не закрывают.

Успешный ответ содержит storageKey вида local:<имя>.zip, исходное имя и размер. Эти поля подставляются в форму. Кнопку «Сохранить» всё равно нажимают: загрузка кладёт файл на диск, запись версии — отдельно в таблицу project_versions.

Каталог на диске: PACK_STORAGE_DIR, в проде /opt/daydreammods/storage/packs. Имя файла случайное, не исходное. Исходное имя хранится в file_name и уходит в заголовок Content-Disposition.

Лимит маршрута — 512 МБ на сам обработчик и до 1 ГБ на nginx. Файл больше лимита не «зависает молча»: клиент получает текст, что сервер отклонил размер. Оборванная передача файл не оставляет.

Картинки баннеров идут тем же маршрутом, но в public/uploads, лимит 4 МБ, в ответе поле url.

Статусы версии

  • draft — черновик, в кабинете нет.
  • published — видна владельцам доступа.
  • hidden — скрыта, файл на диске может остаться.

Без storageKey версию сохранить можно, но скачивание не найдёт архив. В форме это предупреждение жёлтым.

Выдача игроку

1. Кабинет вызывает account.requestDownload с id версии.

2. Сервер проверяет: версия опубликована; есть подписка active; в plan_entitlements этот тариф связан с проектом версии; срок подписки не истёк по данным статуса.

3. В download_tokens пишется хеш токена и expires_at = сейчас + 10 минут.

4. Браузер открывает https://daydreammods.ru/downloads/<сырой токен>.

5. API находит хеш, отказывает если токен просрочен или уже использован, помечает used_at и отдаёт поток.

Если ключ начинается с local:, читается файл из каталога сборок. Если настроен S3 и ключ обычный — объект бакета. Иначе текстовая заглушка для разработки: это не игровой архив.

Повторно той же ссылкой скачать нельзя. Нужна новая кнопка в кабинете.

CDN в настройках помечен «в разработке» и файлы через него не раздаёт. Предупреждение в разделе «Версии» об этом остаётся, пока бакет не подключён.