Merge branch 'phase/39-school-owners'
ci / server (push) Failing after 3m51s
ci / client (push) Successful in 18s

This commit is contained in:
Leonid Pershin
2026-08-20 09:56:13 +03:00
34 changed files with 1107 additions and 267 deletions
+14 -14
View File
@@ -11,31 +11,31 @@
## Задачи
- [ ] `SimulationOptions.MaxSchools` — слоты **игрока**, умолчание 2.
- [x] `SimulationOptions.MaxSchools` — слоты **игрока**, умолчание 2.
`MaxSchoolsTotal` — воркеры процесса, умолчание 16. Подъём с диска режет по Total, не по
слотам игрока
- [ ] Сейв несёт `owner`. Нет поля — бесхозная. Формат не бампить
- [ ] Create пишет текущего пользователя; отказ: свои слоты кончились (`limit-reached`) или
- [x] Сейв несёт `owner`. Нет поля — бесхозная. Формат не бампить
- [x] Create пишет текущего пользователя; отказ: свои слоты кончились (`limit-reached`) или
сервер полон (`server-full`)
- [ ] `GET /api/schools`: `maxSchools` — слоты игрока, `maxSchoolsTotal`, `schools` — свои,
- [x] `GET /api/schools`: `maxSchools` — слоты игрока, `maxSchoolsTotal`, `schools` — свои,
`others` — чужие и бесхозные (`owner` имя или `null`). Карточка школы несёт `mine`
- [ ] Welcome.`MaxSchools` — слоты игрока (байт тот же, смысл новый)
- [ ] Мутации чужой — HTTP `403` `not-owner`. Бесхозную может удалить любой залогиненный.
- [x] Welcome.`MaxSchools` — слоты игрока (байт тот же, смысл новый)
- [x] Мутации чужой — HTTP `403` `not-owner`. Бесхозную может удалить любой залогиненный.
`OpenSchool` — всем с сессией. Пауза / скорость / пропуск от гостя до работника не доходят.
**Исключение:** `POST .../portrait` — гость генерирует теми же пресетами школы; это не управление
- [ ] Меню: блок «Мои» и блок «Чужие». У бесхозной в чужих — удалить, у чужой с хозяином — нет
- [ ] Внутри чужой школы нет вкладки «Управление» и нет кнопок часов (пауза, скорость, пропуск).
- [x] Меню: блок «Мои» и блок «Чужие». У бесхозной в чужих — удалить, у чужой с хозяином — нет
- [x] Внутри чужой школы нет вкладки «Управление» и нет кнопок часов (пауза, скорость, пропуск).
Карта и люди остаются
- [ ] `docs/protocol.md` — списки и коды ошибок. Версию сокета не бампить
- [x] `docs/protocol.md` — списки и коды ошибок. Версию сокета не бампить
## Тесты, без которых фаза не закрыта
- [ ] Два пользователя: у каждого по две школы, третья своего — `limit-reached`; чужая в
- [x] Два пользователя: у каждого по две школы, третья своего — `limit-reached`; чужая в
`others`, не в `schools`
- [ ] Восьмая школа на сервере с `MaxSchoolsTotal` = 7 — `server-full`, даже если у игрока слот есть
- [ ] Гость: `POST` найма — `403`; `SetRunning` не меняет `running` хозяина
- [ ] Сейв без `owner` поднимается, лежит в `others`, удаляется вторым пользователем
- [ ] Клиентский тест: чужая карточка без кнопки удаления; в чужой школе нет «Управление»
- [x] Восьмая школа на сервере с `MaxSchoolsTotal` = 7 — `server-full`, даже если у игрока слот есть
- [x] Гость: `POST` найма — `403`; `SetRunning` не меняет `running` хозяина
- [x] Сейв без `owner` поднимается, лежит в `others`, удаляется вторым пользователем
- [x] Клиентский тест: чужая карточка без кнопки удаления; в чужой школе нет «Управление»
## Критерий готовности
+1 -1
View File
@@ -175,7 +175,7 @@
| Фаза | Статус | Зачем |
| --- | --- | --- |
| [39. Хозяин школы](39-school-owners.md) | 🔄 | `owner`, 2 слота на игрока, мои / чужие, гость без управления |
| [39. Хозяин школы](39-school-owners.md) | | `owner`, 2 слота на игрока, мои / чужие, гость без управления |
39 стоит на 38.