Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- В кратце:[
- Есть три коллекции:
- пользователи, уровни и сессии. (может быть, добавится рейтинг)
- Играется так: у нас есть пользователь, у пользователя активная сессия.
- Сессия хранит информацию о сделанных ходах и карту.
- Активную сессию можно модифицировать, т.е. сделать ход.
- Всё постарался уложить на REST
- ]
- WORKFLOW:[
- 0. Если надо, создаем новые уровни. Или берем существующий
- POST /api/levels/?level=...
- передавать надо только карту и кол-во задвинутых ящиков для победы. Id запишет сервер
- ОК (200) : уровень создан, записан в БД. В теле получаем id
- 400 : некорректный запрос. Например, ящиков меньше, чем надо для победы, или нет игрока на карте
- 500 : не получилось создать новый уровень. Например коллекция уже забита под завязку
- Уровни хранятся в *коллекция*<gameLevel>
- GET /api/levels (опционально задаем пагинацию: start, count)
- OK(200) : получаем список из count уровней с id, начиная от start.
- Не гарантируется, что id равен положению в этом списке. например запрос start=10&count=3 вполне может вернуть уровни [id=42, id=21, id=64].
- Если start+count превышает размер коллекции, но start лежит в ней, то вернет сколько может.
- Если пагинация не задана, то выводятся первые 10.
- 400: неверно задали пагинацию или тому подобное
- GET /api/levels/id
- OK(200) : получаем json с gameLevel
- 400 : уровня еще нет
- PUT /api/levels/ - не нужно?
- // можно изменить колличество ящиков для победы и тому подобное
- PUT /api/levels/id
- DELETE /api/levels
- DELETE /api/levels/id
- Удаляет уровень из коллекции.
- Если сделаю авторизацию с группами пользователей, то надо будет приписать аннотацию [AuthenticationRequired]
- и кидать 400 ошибку для всех кроме админа
- OK(200) : ...
- 400 : недостаточно прав
- HTTP Status Code: 400
- {"code" : 400, "message": "There are no player on the map"}
- 1. Создаем нового пользователя или получаем существующего по логину.
- POST /api/users/?login="sample"
- ОК (200) : пользователь создан, в теле возвращается его Id
- 400 : пользователь с таким логином уже существует
- Пользователь кидается в *коллекция*<userProfile>
- GET /api/users (опционально задаем пагинацию: start, count)
- по аналогии с уровнями
- GET /api/users/login
- ОК (200) : пользователь найден, в теле возвращается его userProfile
- 400 : пользователь с таким логином не найден
- PUT /api/users/login/?login="new_login"
- ОК (200) : логин изменен
- 400 : логин уже занят
- DELETE /api/users/
- DELETE /api/users/login
- по аналогии с уровнями
- // сессии специально не хранят никаких ссылок на игроков. На случай, если захочется сделать кооператив, например
- // Тогда достаточно будет приписать другому пользователю id уже существующей сессии другого игрока. Но это так, фантазии
- 2. Создаем новую игровую сессию для игрока по его id и номеру уровня. Дальше игра будет происходить в рамках этой сессии
- или восстанавливаем уже начатую из userProfile.userSession
- POST /api/rooms/?usrId=42&level=42
- OK(200) : id созданной сессии записывается в userProfile.userSession заместо предыдущей.
- Предыдущая сессия удаляется из БД.
- В теле получаем id созданной сессии.
- 400 : пользователь из уровень не найдены и сессия не создана
- Игровые сессии хранятся в виде *коллекция*<playerId, gameSession>
- GET /api/rooms/
- GET /api/rooms/id
- Возвращает только основную инфу по сессии: id, запущенный уровень, состояние игры (выиграл/в процессе)
- Чтобы получить карту:
- GET /api/rooms/id/map
- GET /api/rooms/id/map/x/y (просто через /x получить строку нельзя)
- // Модификация только одна - сделать ход
- PUT /api/rooms/id/?turn="Direction"
- OK(200) : ход сделан, в теле возвращается измененная сессия.. или нет?
- Можно, например, возвращать только изменившиеся клетки. Это не совсем по REST'у, но должно быть удобнее.
- 400 : заданно неправильно направление, или ход невозможен (ход в стену, толкание больше одного ящика)
- DELETE /api/rooms/
- DELETE /api/rooms/login
- по аналогии с уровнями
- ]
- DATA:[
- // userProfile
- {
- "userInfo":{
- "id":123,
- "login":"sampleName"
- },
- "userSession":{
- "sessionID":987
- }
- }
- // gameSession
- {
- "id":987,
- "level":gameLevelId,
- "state":"complete", если pushed == level.goal, иначе "play"
- "steps":stepsCount,
- "pushed":pushedBoxesCount,
- "map":[
- таже карта из уровня, только уже модифицированная
- ]
- }
- // gameLevel
- {
- "id":1,
- "goal":5,
- "map":[
- { "type":"Player",
- "x":0,
- "y":0,
- },
- { "type":"Wall",
- "x":1,
- "y":0,
- },
- { "type":"Target",
- "x":2,
- "y":0,
- },
- { "type":"Chest",
- "x":2,
- "y":0,
- },
- // и так далее ...
- ]
- }
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement