From e40211e7c1831357bc448d575d47e619cbe04587 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Fri, 18 Oct 2024 04:09:54 -0700 Subject: feat(graphql): paged badges query --- src/graphql/user/resolvers.ts | 7 +++++++ src/graphql/user/schema.graphql | 1 + src/lib/Database/IDB/tracker.ts | 2 +- src/lib/Database/SB/User/badges.ts | 15 +++++++++++++-- src/lib/Tools/tools.ts | 3 ++- src/stores/settings.ts | 20 ++++++++++---------- 6 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/graphql/user/resolvers.ts b/src/graphql/user/resolvers.ts index 4609108a..731b5f94 100644 --- a/src/graphql/user/resolvers.ts +++ b/src/graphql/user/resolvers.ts @@ -94,6 +94,13 @@ export const resolvers: WithIndex = { preferences: await getUserPreferences(args.id), badgesCount: badges.length }; + }, + badges: async (_, args) => { + if (!args.id) return null; + + const badges = await getUserBadges(args.id, args.page || 0, args.size || 0); + + return badges; } }, Mutation: { diff --git a/src/graphql/user/schema.graphql b/src/graphql/user/schema.graphql index 193b5daf..70ea066a 100644 --- a/src/graphql/user/schema.graphql +++ b/src/graphql/user/schema.graphql @@ -1,5 +1,6 @@ type Query { User(id: Int): User + badges(id: Int!, page: Int, size: Int): [Badge!]! } type Mutation { diff --git a/src/lib/Database/IDB/tracker.ts b/src/lib/Database/IDB/tracker.ts index dc25c8fd..4c3b116a 100644 --- a/src/lib/Database/IDB/tracker.ts +++ b/src/lib/Database/IDB/tracker.ts @@ -13,7 +13,7 @@ export class TrackerDatabase extends Dexie { constructor() { super('tracker'); this.version(1).stores({ - entries: 'id, url, title, progress', + entries: 'id, url, title, progress' }); this.entries = this.table('entries'); diff --git a/src/lib/Database/SB/User/badges.ts b/src/lib/Database/SB/User/badges.ts index be866acc..97f30e64 100644 --- a/src/lib/Database/SB/User/badges.ts +++ b/src/lib/Database/SB/User/badges.ts @@ -15,8 +15,19 @@ export interface Badge { click_count?: number; } -export const getUserBadges = async (userId: number): Promise => { - const { data, error } = await sb.from('user_badges').select('*').eq('user_id', userId); +const getPagination = (page: number, size: number) => { + const from = page ? page * (size ? +size : 3) : 0; + + return { from, to: page ? from + size - 1 : size - 1 }; +}; + +export const getUserBadges = async (userId: number, page = 0, size = -1): Promise => { + const { from, to } = getPagination(page, size); + let query = sb.from('user_badges').select('*').eq('user_id', userId); + + if (size !== -1) query = query.range(from, to); + + const { data, error } = await query; if (error) return []; diff --git a/src/lib/Tools/tools.ts b/src/lib/Tools/tools.ts index 06249ab3..988d7826 100644 --- a/src/lib/Tools/tools.ts +++ b/src/lib/Tools/tools.ts @@ -38,7 +38,8 @@ export const tools: { }, tracker: { name: () => 'Tracker', - description: () => 'Track your anime and manga progress with ease, intended for media that doesn\'t qualify for an AniList entry', + description: () => + "Track your anime and manga progress with ease, intended for media that doesn't qualify for an AniList entry", id: 'tracker', hidden: true }, diff --git a/src/stores/settings.ts b/src/stores/settings.ts index e55eeb0d..9d6b0e3e 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -30,16 +30,16 @@ export interface Settings { displayPlannedAnime: boolean; displayFurigana: boolean; displayAoButa: - | 'kaede' - | 'mai' - | 'mai_2' - | 'nodoka' - | 'rio' - | 'sakuta' - | 'shouko' - | 'tomoe' - | 'random' - | 'none'; + | 'kaede' + | 'mai' + | 'mai_2' + | 'nodoka' + | 'rio' + | 'sakuta' + | 'shouko' + | 'tomoe' + | 'random' + | 'none'; disableManga: boolean; disableAnime: boolean; disableUpcomingAnime: boolean; -- cgit v1.2.3