aboutsummaryrefslogtreecommitdiff
path: root/src/graphql
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-10-06 03:49:02 -0700
committerFuwn <[email protected]>2024-10-06 03:49:02 -0700
commitded5e5bf084ce424c05066ad9c6f418672345aac (patch)
treeb620bf9098ad4bb3139a0348cdb5270f2621ac5d /src/graphql
parentfeat(badges): move badge operations to graphql (diff)
downloaddue.moe-ded5e5bf084ce424c05066ad9c6f418672345aac.tar.xz
due.moe-ded5e5bf084ce424c05066ad9c6f418672345aac.zip
feat(badges): use preferences graphql api
Diffstat (limited to 'src/graphql')
-rw-r--r--src/graphql/user/resolvers.ts68
-rw-r--r--src/graphql/user/schema.graphql34
2 files changed, 86 insertions, 16 deletions
diff --git a/src/graphql/user/resolvers.ts b/src/graphql/user/resolvers.ts
index 1e5b9ec0..66e3f1a2 100644
--- a/src/graphql/user/resolvers.ts
+++ b/src/graphql/user/resolvers.ts
@@ -12,6 +12,7 @@ import type { WithIndex } from '../$types';
import type { Resolvers, Badge } from './$types';
import authorisedJson from '$lib/Data/Static/authorised.json';
import type { RequestEvent } from '@sveltejs/kit';
+import { getUserPreferences, setBiography, setCSS, setPinnedBadgeWallCategories, toggleHideAWCBadges, toggleHideMissingBadges, toggleHololiveStreamPinning, togglePinnedBadgeWallCategory, type UserPreferences } from '$lib/Database/SB/User/preferences';
type Context = RequestEvent<Partial<Record<string, string>>, string | null>;
@@ -30,7 +31,7 @@ const auth = async (context: Context) => {
});
};
-const authenticatedOperation = async (
+const authenticatedBadgesOperation = async (
context: Context,
operation: (identity: UserIdentity, authorised: boolean) => void
) => {
@@ -45,29 +46,43 @@ const authenticatedOperation = async (
return await getUserBadges(identity.id);
};
+const authenticatedPreferencesOperation = async (
+ context: Context,
+ operation: (identity: UserIdentity, authorised: boolean) => Promise<UserPreferences | null>
+) => {
+ const identity = await auth(context);
+
+ if (identity instanceof Error) return [];
+
+ const authorised = authorisedJson.includes(identity.id);
+
+ return operation(identity, authorised) as Promise<UserPreferences>
+};
+
export const resolvers: WithIndex<Resolvers> = {
Query: {
User: async (_, args) => {
return {
id: args.id,
- badges: (await getUserBadges(args.id)) as Badge[]
+ badges: (await getUserBadges(args.id)) as Badge[],
+ preferences: await getUserPreferences(args.id)
};
}
},
Mutation: {
shadowHideBadges: async (_, args, context) =>
- await authenticatedOperation(
+ await authenticatedBadgesOperation(
context,
async (_, authorised) => await setShadowHidden(args.userId, authorised)
),
shadowHideBadge: async (_, args, context) =>
- await authenticatedOperation(
+ await authenticatedBadgesOperation(
context,
async () =>
await setShadowHiddenBadge(args.id, args.state == null ? true : args.state)
),
hideBadge: async (_, args, context) =>
- await authenticatedOperation(context, async (identity) => {
+ await authenticatedBadgesOperation(context, async (identity) => {
const allBadges = await getUserBadges(identity.id);
const category = args.category || '';
@@ -89,7 +104,7 @@ export const resolvers: WithIndex<Resolvers> = {
);
}),
updateBadge: async (_, args, context) =>
- await authenticatedOperation(context, async (identity) => {
+ await authenticatedBadgesOperation(context, async (identity) => {
const badge = {
post: args.post || undefined,
image: args.image || undefined,
@@ -108,14 +123,49 @@ export const resolvers: WithIndex<Resolvers> = {
}
}),
deleteBadge: async (_, args, context) =>
- await authenticatedOperation(
+ await authenticatedBadgesOperation(
context,
async (identity) => await removeUserBadge(identity.id, args.id)
),
pruneUserBadges: async (_, context) =>
- await authenticatedOperation(
+ await authenticatedBadgesOperation(
context as Context,
async (identity) => await removeAllUserBadges(identity.id)
- )
+ ),
+ toggleHideMissingBadges: async (_, _args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await toggleHideMissingBadges(identity.id)
+ ) as UserPreferences,
+ toggleHideAWCBadges: async (_, _args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await toggleHideAWCBadges(identity.id)
+ ) as UserPreferences,
+ setBadgeWallCSS: async (_, args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await setCSS(identity.id, args.css)
+ ) as UserPreferences,
+ togglePinnedBadgeWallCategory: async (_, args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await togglePinnedBadgeWallCategory(identity.id, args.category)
+ ) as UserPreferences,
+ setPinnedBadgeWallCategories: async (_, args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await setPinnedBadgeWallCategories(identity.id, args.categories)
+ ) as UserPreferences,
+ setBiography: async (_, args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await setBiography(identity.id, args.biography.slice(0, 3000))
+ ) as UserPreferences,
+ togglePinnedHololiveStream: async (_, args, context) =>
+ await authenticatedPreferencesOperation(
+ context as Context,
+ async (identity) => await toggleHololiveStreamPinning(identity.id, args.stream)
+ ) as UserPreferences,
}
};
diff --git a/src/graphql/user/schema.graphql b/src/graphql/user/schema.graphql
index 1e54f866..d68e7fd9 100644
--- a/src/graphql/user/schema.graphql
+++ b/src/graphql/user/schema.graphql
@@ -19,23 +19,43 @@ type Mutation {
): [Badge]!
deleteBadge(id: Int!): [Badge]!
pruneUserBadges: [Badge]!
+ toggleHideMissingBadges: Preferences
+ toggleHideAWCBadges: Preferences
+ setBadgeWallCSS(css: String!): Preferences
+ togglePinnedBadgeWallCategory(category: String!): Preferences
+ setPinnedBadgeWallCategories(categories: [String!]!): Preferences
+ setBiography(biography: String!): Preferences
+ togglePinnedHololiveStream(stream: String!): Preferences
}
type User {
id: Int!
badges: [Badge]!
+ preferences: Preferences
}
type Badge {
- post: String
- image: String
+ post: String!
+ image: String!
description: String
- id: Int
- time: String
+ id: Int!
+ time: String!
category: String
- hidden: Boolean
+ hidden: Boolean!
source: String
designer: String
- shadow_hidden: Boolean
- click_count: Int
+ shadow_hidden: Boolean!
+ click_count: Int!
+}
+
+type Preferences {
+ created_at: String!
+ updated_at: String!
+ user_id: Int!
+ pinned_hololive_streams: [String]!
+ hide_missing_badges: Boolean!
+ biography: String
+ badge_wall_css: String!
+ hide_awc_badges: Boolean!
+ pinned_badge_wall_categories: [String]!
}