-
-
+
+
{user?.player.roles.includes(PlayerRole.admin) &&
}
diff --git a/src/games/views/json/game-to-dto.ts b/src/games/views/json/game-to-dto.ts
index 6829c647..66986175 100644
--- a/src/games/views/json/game-to-dto.ts
+++ b/src/games/views/json/game-to-dto.ts
@@ -1,7 +1,21 @@
import { GameEventType } from '../../../database/models/game-event.model'
import type { GameModel } from '../../../database/models/game.model'
+import type { PickDeep } from 'type-fest'
-export function gameToDto(game: GameModel) {
+type Game = PickDeep<
+ GameModel,
+ | 'number'
+ | 'map'
+ | 'state'
+ | 'score'
+ | 'logsUrl'
+ | 'demoUrl'
+ | 'events'
+ | 'gameServer.name'
+ | 'gameServer.provider'
+>
+
+export function gameToDto(game: Game) {
const endedEvent = game.events.find(e => e.event === GameEventType.gameEnded)
return {
diff --git a/src/routes/api/v1/games/:id/events/index.ts b/src/routes/api/v1/games/:id/events/index.ts
index 643f5a50..20a269ec 100644
--- a/src/routes/api/v1/games/:id/events/index.ts
+++ b/src/routes/api/v1/games/:id/events/index.ts
@@ -14,7 +14,7 @@ export default routes(async app => {
},
},
async (request, reply) => {
- const game = await games.findOne({ number: request.params.id })
+ const game = await games.findOne({ number: request.params.id }, ['number', 'events'])
const events = game.events.map(gameEventToPublicDto).filter(isNotNil)
return reply
diff --git a/src/routes/api/v1/games/:id/index.ts b/src/routes/api/v1/games/:id/index.ts
index fcc7c970..4d162b70 100644
--- a/src/routes/api/v1/games/:id/index.ts
+++ b/src/routes/api/v1/games/:id/index.ts
@@ -13,7 +13,17 @@ export default routes(async app => {
},
},
async (request, reply) => {
- const game = await games.findOne({ number: request.params.id })
+ const game = await games.findOne({ number: request.params.id }, [
+ 'number',
+ 'map',
+ 'state',
+ 'score',
+ 'logsUrl',
+ 'demoUrl',
+ 'events',
+ 'gameServer.name',
+ 'gameServer.provider',
+ ])
return reply.type('application/hal+json').status(200).send(gameToDto(game))
},
)
diff --git a/src/routes/api/v1/games/index.ts b/src/routes/api/v1/games/index.ts
index 3c5fb05e..cf717e64 100644
--- a/src/routes/api/v1/games/index.ts
+++ b/src/routes/api/v1/games/index.ts
@@ -17,7 +17,19 @@ export default routes(async app => {
const filter = state ? { state } : {}
const total = await collections.games.countDocuments(filter)
const gamesList = await collections.games
- .find(filter)
+ .find(filter, {
+ projection: {
+ number: 1,
+ map: 1,
+ state: 1,
+ score: 1,
+ logsUrl: 1,
+ demoUrl: 1,
+ events: 1,
+ 'gameServer.name': 1,
+ 'gameServer.provider': 1,
+ },
+ })
.sort({ number: -1 })
.skip(offset)
.limit(limit)
diff --git a/src/routes/api/v1/players/:steamId/games/index.ts b/src/routes/api/v1/players/:steamId/games/index.ts
index 8da59ce2..cb4f8c02 100644
--- a/src/routes/api/v1/players/:steamId/games/index.ts
+++ b/src/routes/api/v1/players/:steamId/games/index.ts
@@ -35,7 +35,19 @@ export default routes(async app => {
const filter = { 'slots.player': steamId }
const total = await collections.games.countDocuments(filter)
const gamesList = await collections.games
- .find(filter)
+ .find(filter, {
+ projection: {
+ number: 1,
+ map: 1,
+ state: 1,
+ score: 1,
+ logsUrl: 1,
+ demoUrl: 1,
+ events: 1,
+ 'gameServer.name': 1,
+ 'gameServer.provider': 1,
+ },
+ })
.sort({ number: -1 })
.skip(offset)
.limit(limit)
diff --git a/src/routes/games/:number/index.tsx b/src/routes/games/:number/index.tsx
index 77df5fed..663e4c5a 100644
--- a/src/routes/games/:number/index.tsx
+++ b/src/routes/games/:number/index.tsx
@@ -127,7 +127,20 @@ export default routes(async app => {
async (request, reply) => {
const { number } = request.params
const { gameServer } = request.body
- const game = await games.findOne({ number })
+ const game = await games.findOne({ number }, [
+ 'number',
+ 'map',
+ 'state',
+ 'slots',
+ 'events',
+ 'gameServer',
+ 'logsUrl',
+ 'demoUrl',
+ 'score',
+ 'logSecret',
+ 'connectString',
+ 'stvConnectString',
+ ])
await gameServers.assign(game, gameServer, request.user!.player.steamId)
await reply
.trigger({ close: { target: '#choose-game-server-dialog' } })