LeagueStats/server/app/Controllers/Http/SummonersController.ts

164 lines
5.7 KiB
TypeScript
Raw Normal View History

2020-10-04 20:05:44 +00:00
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import Bull from '@ioc:Rocketseat/Bull'
2021-09-11 12:09:10 +00:00
import { getCurrentSeason } from 'App/helpers'
import FetchMatchList from 'App/Jobs/FetchMatchList'
2020-10-05 10:40:02 +00:00
import Summoner from 'App/Models/Summoner'
import MatchRepository from 'App/Repositories/MatchRepository'
import BasicMatchSerializer from 'App/Serializers/BasicMatchSerializer'
import LiveMatchSerializer from 'App/Serializers/LiveMatchSerializer'
2020-10-04 20:05:44 +00:00
import Jax from 'App/Services/Jax'
import MatchService, { MatchListMode } from 'App/Services/MatchService'
2020-10-08 07:51:12 +00:00
import StatsService from 'App/Services/StatsService'
2020-10-04 20:05:44 +00:00
import SummonerService from 'App/Services/SummonerService'
import SummonerBasicValidator from 'App/Validators/SummonerBasicValidator'
2020-10-05 19:33:17 +00:00
import SummonerChampionValidator from 'App/Validators/SummonerChampionValidator'
2020-10-07 20:03:36 +00:00
import SummonerLiveValidator from 'App/Validators/SummonerLiveValidator'
2020-10-08 07:51:12 +00:00
import SummonerOverviewValidator from 'App/Validators/SummonerOverviewValidator'
2020-10-07 15:47:27 +00:00
import SummonerRecordValidator from 'App/Validators/SummonerRecordValidator'
2020-10-04 20:05:44 +00:00
export default class SummonersController {
2022-01-07 23:16:49 +00:00
/**
* Get all played seasons for a summoner
* @param puuid of the summoner
*/
private async getSeasons(puuid: string): Promise<number[]> {
const seasons = await MatchRepository.seasons(puuid)
return seasons.length ? seasons.map((s) => s.season) : [getCurrentSeason()]
}
/**
* POST: get basic summoner data
* @param ctx
*/
public async basic({ request, response }: HttpContextContract) {
console.time('BASIC_REQUEST')
2020-10-05 19:33:17 +00:00
const { summoner, region } = await request.validate(SummonerBasicValidator)
2020-10-04 20:05:44 +00:00
try {
2024-01-14 13:59:54 +00:00
const account = await SummonerService.getSummoner(summoner, region)
2020-10-04 20:05:44 +00:00
// Check if the summoner is found
if (!account) {
return response.json(null)
}
// Summoner in DB
const summonerDB = await Summoner.firstOrCreate({ puuid: account.puuid })
2020-10-04 20:05:44 +00:00
const [names, seasons, gamemodes, current, ranked, recentActivity] = await Promise.all([
2023-09-26 23:24:59 +00:00
SummonerService.getAllSummonerNames(account, summonerDB),
this.getSeasons(account.puuid),
MatchRepository.gamemodes(account.puuid),
Jax.Spectator.summonerID(account.id, region),
SummonerService.getRanked(account.id, region),
MatchRepository.recentActivity(account.puuid),
// Only last 100 matchIds in matchlist
2023-09-26 23:24:59 +00:00
MatchService.updateMatchList(account.puuid, region, MatchListMode.LIGHT),
])
// Add job in 1sec to load entire matchlist in DB (in background)
const matchListMode = summonerDB.$isLocal ? MatchListMode.FIRSTIME : MatchListMode.UPDATE
Bull.schedule(
new FetchMatchList().key,
{ puuid: account.puuid, region, mode: matchListMode },
1000
)
2020-10-04 20:05:44 +00:00
console.timeEnd('BASIC_REQUEST')
return response.json({
account: {
...account,
names,
},
seasons, // All seasons the summoner has played
gamemodes: gamemodes.map((g) => g.gamemode), // All gamemodes the summoner has played
current,
playing: !!current,
ranked,
recentActivity,
})
} catch (e) {
console.log(e)
console.timeEnd('BASIC_REQUEST')
2020-10-04 20:05:44 +00:00
return response.json(null)
}
}
2020-10-05 19:33:17 +00:00
2022-01-07 23:16:49 +00:00
/**
* POST: get overview view summoner data
* @param ctx
*/
public async overview({ request, response }: HttpContextContract) {
console.time('OVERVIEW_REQUEST')
const { puuid, region, season } = await request.validate(SummonerOverviewValidator)
2020-10-08 07:51:12 +00:00
const finalJSON: any = {}
const matchIds = await MatchRepository.getNextMatchIds({ puuid, season })
finalJSON.matchesDetails = await MatchService.getMatches(region, matchIds, puuid)
2020-10-08 07:51:12 +00:00
console.time('STATS')
finalJSON.stats = await StatsService.getSummonerStats(puuid, season)
console.timeEnd('STATS')
console.timeEnd('OVERVIEW_REQUEST')
2020-10-08 07:51:12 +00:00
return response.json(finalJSON)
}
2020-10-05 19:33:17 +00:00
/**
* POST: get champions view summoner data
* @param ctx
2020-10-05 19:33:17 +00:00
*/
public async champions({ request, response }: HttpContextContract) {
2020-10-05 19:33:17 +00:00
console.time('championsRequest')
const { puuid, queue, season } = await request.validate(SummonerChampionValidator)
const championStats = await MatchRepository.championCompleteStats(puuid, queue, season)
const championStatsSerialized = championStats.map((champion) => {
return {
...champion,
champion: BasicMatchSerializer.getChampion(champion.id),
}
})
2020-10-05 19:33:17 +00:00
console.timeEnd('championsRequest')
return response.json(championStatsSerialized)
2020-10-05 19:33:17 +00:00
}
2020-10-07 15:47:27 +00:00
/**
* POST: get records view summoner data
* @param ctx
2020-10-07 15:47:27 +00:00
*/
public async records({ request, response }: HttpContextContract) {
2020-10-07 15:47:27 +00:00
console.time('recordsRequest')
const { puuid, season } = await request.validate(SummonerRecordValidator)
2022-01-07 23:16:49 +00:00
const records = await MatchRepository.records(puuid, season)
const recordsSerialized = records.map((record) => {
return {
...record,
what: record.what.split('.')[1],
champion: BasicMatchSerializer.getChampion(record.champion_id),
}
})
2020-10-07 15:47:27 +00:00
console.timeEnd('recordsRequest')
return response.json(recordsSerialized)
2020-10-07 15:47:27 +00:00
}
2020-10-07 20:03:36 +00:00
/**
* POST - Return live match detail
* @param ctx
2020-10-07 20:03:36 +00:00
*/
public async liveMatchDetails({ request, response }: HttpContextContract) {
2020-10-07 20:03:36 +00:00
console.time('liveMatchDetails')
const { id, region } = await request.validate(SummonerLiveValidator)
// CURRENT GAME
const currentGame = await Jax.Spectator.summonerID(id, region)
2020-10-07 20:03:36 +00:00
if (!currentGame) {
return response.json(null)
}
const currentGameSerialized = await LiveMatchSerializer.serializeOneMatch(currentGame, region)
2020-10-07 20:03:36 +00:00
console.timeEnd('liveMatchDetails')
return response.json(currentGameSerialized)
2020-10-07 20:03:36 +00:00
}
2020-10-04 20:05:44 +00:00
}