cache unknown beatsaver maps
This commit is contained in:
parent
73b7d17597
commit
c72230a98d
@ -11,20 +11,28 @@ export default class BeatSaverService {
|
||||
public static async getMap(hash: string): Promise<BeatSaverMap | undefined> {
|
||||
let map = await BeatSaverMapModel.findById(hash);
|
||||
if (map != undefined) {
|
||||
return map.toObject() as BeatSaverMap;
|
||||
const toObject = map.toObject() as BeatSaverMap;
|
||||
if (toObject.unknownMap) {
|
||||
return undefined;
|
||||
}
|
||||
return toObject;
|
||||
}
|
||||
|
||||
const token = await beatsaverService.lookupMap(hash);
|
||||
if (token == undefined) {
|
||||
return undefined;
|
||||
}
|
||||
map = await BeatSaverMapModel.create({
|
||||
map = await BeatSaverMapModel.create(
|
||||
token
|
||||
? {
|
||||
_id: hash,
|
||||
bsr: token.id,
|
||||
author: {
|
||||
id: token.uploader.id,
|
||||
},
|
||||
});
|
||||
}
|
||||
: {
|
||||
_id: hash,
|
||||
unknownMap: true,
|
||||
}
|
||||
);
|
||||
return map.toObject() as BeatSaverMap;
|
||||
}
|
||||
}
|
||||
|
@ -91,11 +91,16 @@ export class ScoreService {
|
||||
search: search,
|
||||
});
|
||||
if (leaderboardScores == undefined) {
|
||||
throw new NotFoundError(
|
||||
`No scores found for "${id}", leaderboard "${leaderboardName}", page "${page}", sort "${sort}", search "${search}"`
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
metadata = new Metadata(
|
||||
Math.ceil(leaderboardScores.metadata.total / leaderboardScores.metadata.itemsPerPage),
|
||||
leaderboardScores.metadata.total,
|
||||
leaderboardScores.metadata.page,
|
||||
leaderboardScores.metadata.itemsPerPage
|
||||
);
|
||||
|
||||
for (const token of leaderboardScores.playerScores) {
|
||||
const score = getScoreSaberScoreFromToken(token.score);
|
||||
if (score == undefined) {
|
||||
@ -113,13 +118,6 @@ export class ScoreService {
|
||||
beatSaver: beatSaverMap,
|
||||
});
|
||||
}
|
||||
|
||||
metadata = new Metadata(
|
||||
Math.ceil(leaderboardScores.metadata.total / leaderboardScores.metadata.itemsPerPage),
|
||||
leaderboardScores.metadata.total,
|
||||
leaderboardScores.metadata.page,
|
||||
leaderboardScores.metadata.itemsPerPage
|
||||
);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@ -145,7 +143,7 @@ export class ScoreService {
|
||||
leaderboardName: Leaderboards,
|
||||
id: string,
|
||||
page: number
|
||||
): Promise<LeaderboardScoresResponse<unknown>> {
|
||||
): Promise<LeaderboardScoresResponse<unknown, unknown>> {
|
||||
const scores: Score[] = [];
|
||||
let leaderboard: Leaderboard | undefined;
|
||||
let beatSaverMap: BeatSaverMap | undefined;
|
||||
@ -153,11 +151,6 @@ export class ScoreService {
|
||||
|
||||
switch (leaderboardName) {
|
||||
case "scoresaber": {
|
||||
const leaderboardScores = await scoresaberService.lookupLeaderboardScores(id, page);
|
||||
if (leaderboardScores == undefined) {
|
||||
throw new NotFoundError(`No scores found for "${id}", leaderboard "${leaderboardName}", page "${page}""`);
|
||||
}
|
||||
|
||||
const leaderboardResponse = await LeaderboardService.getLeaderboard(leaderboardName, id);
|
||||
if (leaderboardResponse == undefined) {
|
||||
throw new NotFoundError(`Leaderboard "${leaderboardName}" not found`);
|
||||
@ -165,6 +158,11 @@ export class ScoreService {
|
||||
leaderboard = leaderboardResponse.leaderboard;
|
||||
beatSaverMap = leaderboardResponse.beatsaver;
|
||||
|
||||
const leaderboardScores = await scoresaberService.lookupLeaderboardScores(id, page);
|
||||
if (leaderboardScores == undefined) {
|
||||
break;
|
||||
}
|
||||
|
||||
for (const token of leaderboardScores.scores) {
|
||||
const score = getScoreSaberScoreFromToken(token);
|
||||
if (score == undefined) {
|
||||
|
@ -30,15 +30,21 @@ export class BeatSaverMap {
|
||||
* The bsr code for the map.
|
||||
* @private
|
||||
*/
|
||||
@prop({ required: true })
|
||||
@prop({ required: false })
|
||||
public bsr!: string;
|
||||
|
||||
/**
|
||||
* The author of the map.
|
||||
*/
|
||||
@prop({ required: true, _id: false, type: () => BeatsaverAuthor })
|
||||
@prop({ required: false, _id: false, type: () => BeatsaverAuthor })
|
||||
public author!: BeatsaverAuthor;
|
||||
|
||||
/**
|
||||
* True if the map is unknown on beatsaver.
|
||||
*/
|
||||
@prop({ required: false })
|
||||
public unknownMap?: boolean;
|
||||
|
||||
/**
|
||||
* Exposes `id` as a virtual field mapped from `_id`.
|
||||
*/
|
||||
|
@ -229,6 +229,7 @@ export default function PlayerScores({ initialScoreData, initialSearch, player,
|
||||
))}
|
||||
</motion.div>
|
||||
|
||||
{scores.metadata.totalPages > 1 && (
|
||||
<Pagination
|
||||
mobilePagination={width < 768}
|
||||
page={pageState.page}
|
||||
@ -243,6 +244,7 @@ export default function PlayerScores({ initialScoreData, initialSearch, player,
|
||||
setShouldFetch(true); // Set to true to trigger fetch on page change
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</Card>
|
||||
|
Reference in New Issue
Block a user