diff --git a/server/app/Controllers/Http/SummonerController.js b/server/app/Controllers/Http/SummonerController.js index d0b4536..3d546e6 100644 --- a/server/app/Controllers/Http/SummonerController.js +++ b/server/app/Controllers/Http/SummonerController.js @@ -3,6 +3,7 @@ const Match = use('App/Models/Match') const Jax = use('Jax') const MatchTransformer = use('App/Transformers/MatchTransformer') +const MatchHelper = use('App/Helpers/MatchHelper') class SummonerController { @@ -17,30 +18,6 @@ class SummonerController { response.json(data) } - /** - * Get the matchlist of all matches made less than 4 months ago by the Summoner - * @param today - * @param accountId - * @param beginIndex - * @param allMatches - */ - async getMatchList(today, accountId, beginIndex, allMatches) { - const { matches } = await Jax.Matchlist.accountID(accountId, beginIndex) - - allMatches = [...allMatches, ...matches] - - const lastMatch = matches[matches.length - 1].timestamp - const diff = today - lastMatch - console.log(diff) - // More matches to get from Riot API if they are younger than 4 months - if (matches.length === 100 && diff < 10368000000) { - return this.getMatchList(today, accountId, (beginIndex + 100), allMatches) - } else { - console.log('return all matches bro') - return allMatches - } - } - /** * Get all the data about the searched Summoner * @param summoner @@ -72,9 +49,12 @@ class SummonerController { finalJSON.soloQ = soloQ.length ? soloQ[0] : null; console.time('getMatches') - const today = Date.now() - const matches = await this.getMatchList(today, account.accountId, 0, []) - const gameIds = matches.slice(0, 10).map(({ gameId }) => gameId) + + // MATCH LIST + const matchList = await MatchHelper.getFullMatchList(account) + + // MATCHES DETAILS + const gameIds = matchList.slice(0, 10).map(({ gameId }) => gameId) let matchesDetails = [] const matchesToGetFromRiot = [] @@ -93,7 +73,7 @@ class SummonerController { const requests = matchesToGetFromRiot.map(Jax.Match.get) let matchesFromApi = await Promise.all(requests) - /* If we have to same some matches in the db */ + /* If we have to store some matches in the db */ if (matchesFromApi.length !== 0) { const champions = await Jax.DDragon.Champion.list() const runes = await Jax.DDragon.Rune.list() @@ -120,7 +100,7 @@ class SummonerController { matchesDetails.sort((a, b) => (a.date < b.date) ? 1 : -1) finalJSON.matchesDetails = matchesDetails - finalJSON.allMatches = matches + finalJSON.allMatches = matchList console.timeEnd('getMatches') console.timeEnd('all') diff --git a/server/app/Helpers/Match.js b/server/app/Helpers/Match.js deleted file mode 100644 index c3b486c..0000000 --- a/server/app/Helpers/Match.js +++ /dev/null @@ -1,25 +0,0 @@ -class MatchHelper { - getRoleName(timeline) { - if (timeline.lane === 'BOTTOM' && timeline.role.includes('SUPPORT')) { - return 'SUPPORT' - } - return timeline.lane - } - - /** - * Return time in a formatted way - * @param sec : time in seconds to convert - */ - secToTime(sec) { - const min = Math.floor(sec / 60) - const newSec = sec - min * 60 - return min + 'm' + (newSec < 10 ? '0' + newSec : newSec) + 's' - } - - sortTeamByRole(a, b) { - const sortingArr = ['TOP', 'JUNGLE', 'MIDDLE', 'BOTTOM', 'SUPPORT'] - return sortingArr.indexOf(a.role) - sortingArr.indexOf(b.role) - } -} - -module.exports = new MatchHelper() \ No newline at end of file diff --git a/server/app/Helpers/MatchHelper.js b/server/app/Helpers/MatchHelper.js new file mode 100644 index 0000000..1586efe --- /dev/null +++ b/server/app/Helpers/MatchHelper.js @@ -0,0 +1,97 @@ +const Summoner = use('App/Models/Summoner') +const Jax = use('Jax') +const Logger = use('Logger') + +class MatchHelper { + /** + * Get the matchlist of all matches made less than 4 months ago by the Summoner + * @param today timestamp of the day + * @param accountId id of the Summoner + * @param beginIndex index of the first match to fetch + * @param allMatches matchList completing + */ + async getMatchListFourMonths(today, accountId, beginIndex, allMatches) { + const { matches } = await Jax.Matchlist.accountID(accountId, beginIndex) + + allMatches = [...allMatches, ...matches] + + const lastMatch = matches[matches.length - 1].timestamp + const diff = today - lastMatch + console.log(diff) + // More matches to get from Riot API if they are younger than 4 months + if (matches.length === 100 && diff < 10368000000) { + return this.getMatchListFourMonths(today, accountId, (beginIndex + 100), allMatches) + } else { + return allMatches + } + } + + /** + * Return the full MatchList of the summoner (min. 4 months) + * @param account of the summoner + */ + async getFullMatchList(account) { + const today = Date.now() + let matches + + let summonerDB = await Summoner.where({ puuid: account.puuid }).first() + // Summoner has already been searched : we already have a MatchList and we need to update it + if (summonerDB) { + matches = (await Jax.Matchlist.accountID(account.accountId, 0)).matches + let alreadyIn = summonerDB.matchList.some(m => m.gameId === matches[matches.length - 1].gameId) + let index = 100 + while (!alreadyIn) { + let newMatchList = (await Jax.Matchlist.accountID(account.accountId, index)).matches + matches = [...matches, ...newMatchList] + alreadyIn = summonerDB.matchList.some(m => m.gameId === matches[matches.length - 1].gameId) + index += 100 + } + + // Update Summoner + summonerDB.matchList = [...new Set([...summonerDB.matchList, ...matches])] + await summonerDB.save() + Logger.transport('file').info(`Summoner ${account.name} has been updated.`) + } + // First search of the Summoner + else { + matches = await this.getMatchListFourMonths(today, account.accountId, 0, []) + summonerDB = await Summoner.create({ puuid: account.puuid, matchList: matches }) + Logger.transport('file').info(`Summoner ${account.name} has been created.`) + } + + return summonerDB.matchList + } + + /** + * Return the lane of the summoner according to timeline + * @param timeline from Riot Api + */ + getRoleName(timeline) { + if (timeline.lane === 'BOTTOM' && timeline.role.includes('SUPPORT')) { + return 'SUPPORT' + } + return timeline.lane + } + + /** + * Return time in a formatted way + * @param sec time in seconds to convert + */ + secToTime(sec) { + const min = Math.floor(sec / 60) + const newSec = sec - min * 60 + return min + 'm' + (newSec < 10 ? '0' + newSec : newSec) + 's' + } + + /** + * Sort array of Roles according to a specific order + * @param a first role + * @param b second role + */ + sortTeamByRole(a, b) { + const sortingArr = ['TOP', 'JUNGLE', 'MIDDLE', 'BOTTOM', 'SUPPORT'] + return sortingArr.indexOf(a.role) - sortingArr.indexOf(b.role) + } +} + +module.exports = new MatchHelper() diff --git a/server/app/Models/Summoner.js b/server/app/Models/Summoner.js new file mode 100644 index 0000000..693143e --- /dev/null +++ b/server/app/Models/Summoner.js @@ -0,0 +1,9 @@ +'use strict' + +/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ +const Model = use('Model') + +class Summoner extends Model { +} + +module.exports = Summoner diff --git a/server/app/Transformers/MatchTransformer.js b/server/app/Transformers/MatchTransformer.js index 799a87d..f82e20b 100644 --- a/server/app/Transformers/MatchTransformer.js +++ b/server/app/Transformers/MatchTransformer.js @@ -1,7 +1,7 @@ 'use strict' const BumblebeeTransformer = use('Bumblebee/Transformer') -const MatchHelper = use('App/Helpers/Match') +const MatchHelper = use('App/Helpers/MatchHelper') const Logger = use('Logger') /** diff --git a/server/database/migrations/1569778458207_summoner_schema.js b/server/database/migrations/1569778458207_summoner_schema.js new file mode 100644 index 0000000..a0e6784 --- /dev/null +++ b/server/database/migrations/1569778458207_summoner_schema.js @@ -0,0 +1,18 @@ +'use strict' + +/** @type {import('@adonisjs/lucid/src/Schema')} */ +const Schema = use('Schema') + +class SummonerSchema extends Schema { + up () { + this.create('summoners', (collection) => { + collection.index('puuid', {puuid: 1}) + }) + } + + down () { + this.drop('summoners') + } +} + +module.exports = SummonerSchema