// // AppDataController.swift // App // // Created by Michael Simard on 10/29/21. // // import Fluent import Vapor import Foundation struct AppDataController: RouteCollection { func boot(routes: RoutesBuilder) throws { let matchRoute = routes.grouped("cod-tracker","api") matchRoute.get("config", use: config) } func config(req:Request) -> EventLoopFuture{ let gameModeConfigs = GameMode.query(on: req.db).all().map { gameMode in return gameMode.map { gm in return gm.gameModeConfig } } let gameModeGroupConfigs = GameModeGroup.query(on: req.db).all().map { gameModeGroup in return gameModeGroup.map { gmg in return gmg.gameModeGroupConfig } } let games = Game.query(on: req.db).all() let maps = Map.query(on: req.db).all() let playerConfigs = Player.query(on: req.db).all().map { player in return player.map { p in return p.playerConfig } } let lossReasonConfigs = LossReason.query(on: req.db).all().map { lossReason in return lossReason.map { lr in return lr.lossReasonConfig } } let colourSchemeConfigs = ColourScheme.query(on: req.db).all().map { colourScheme in return colourScheme.map { cs in return cs.colorSchemeConfig } } return (gameModeConfigs.and(gameModeGroupConfigs).and(games).and(maps).and(playerConfigs).and(lossReasonConfigs).and(colourSchemeConfigs)).map { arg -> (Configuration) in let ((((((( gameModeConfigs), gameModeGroupConfigs),games),maps),playerConfigs), lossReasonConfigs),colourSchemeConfigs) = arg var gameConfigs:[GameConfig] = [] gameConfigs = games.map({ game in let mapConfigs = game.mapIds.compactMap { mapId in return maps.first { m in m.mapId == mapId }?.mapConfig } return GameConfig(gameId: game.gameId, name: game.name, maps: mapConfigs, enabled: game.enabled, colours: colourSchemeConfigs.first{game.gameId == "\($0.gameId)"}, shortName: game.shortName, imageName: game.imageName) }) return Configuration(games:gameConfigs, gameModes: gameModeConfigs, gameModeGroups: gameModeGroupConfigs, players: playerConfigs, lossReasons: lossReasonConfigs) } } }