From 5e48f5737f71734e8b378b0596669ea0394fd7e0 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Sun, 1 Feb 2026 19:05:18 -0500 Subject: [PATCH] [FA-misc] Delete novel now authorizes based on group --- .../GraphQL/Mutation.cs | 14 ++------------ fictionarchive-web-astro/src/lib/auth/authStore.ts | 11 ++++++++++- .../src/lib/components/NovelDetailPage.svelte | 5 ++++- .../src/lib/constants/groups.ts | 3 +++ 4 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 fictionarchive-web-astro/src/lib/constants/groups.ts diff --git a/FictionArchive.Service.NovelService/GraphQL/Mutation.cs b/FictionArchive.Service.NovelService/GraphQL/Mutation.cs index 95e669a..af59283 100644 --- a/FictionArchive.Service.NovelService/GraphQL/Mutation.cs +++ b/FictionArchive.Service.NovelService/GraphQL/Mutation.cs @@ -5,6 +5,7 @@ using FictionArchive.Service.NovelService.Models.Novels; using FictionArchive.Service.NovelService.Models.SourceAdapters; using FictionArchive.Service.NovelService.Services; using FictionArchive.Service.NovelService.Services.SourceAdapters; +using FictionArchive.Service.Shared.Constants; using FictionArchive.Service.Shared.Contracts.Events; using HotChocolate.Authorization; using HotChocolate.Types; @@ -21,19 +22,8 @@ public class Mutation return await service.QueueNovelImport(novelUrl); } - [Authorize] - public async Task FetchChapterContents( - Guid importId, - uint novelId, - uint volumeId, - uint chapterOrder, - NovelUpdateService service) - { - return await service.QueueChapterPull(importId, novelId, volumeId, chapterOrder); - } - [Error] - [Authorize] + [Authorize(Roles = [AuthorizationConstants.Roles.Admin])] public async Task DeleteNovel(uint novelId, NovelUpdateService service) { await service.DeleteNovel(novelId); diff --git a/fictionarchive-web-astro/src/lib/auth/authStore.ts b/fictionarchive-web-astro/src/lib/auth/authStore.ts index 862dedb..fe8535c 100644 --- a/fictionarchive-web-astro/src/lib/auth/authStore.ts +++ b/fictionarchive-web-astro/src/lib/auth/authStore.ts @@ -1,4 +1,4 @@ -import { writable, derived } from 'svelte/store'; +import { writable, derived, get } from 'svelte/store'; import type { User } from 'oidc-client-ts'; import { userManager, isOidcConfigured } from './oidcConfig'; @@ -8,6 +8,15 @@ export const isLoading = writable(true); export const isAuthenticated = derived(user, ($user) => $user !== null); export const isConfigured = isOidcConfigured; +export const userGroups = derived(user, ($user) => { + const groups = $user?.profile?.groups; + return Array.isArray(groups) ? (groups as string[]) : []; +}); + +export function hasGroup(groupName: string): boolean { + return get(userGroups).includes(groupName); +} + // Cookie management function setCookieFromUser(u: User) { if (!u?.access_token) return; diff --git a/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte b/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte index d539dbf..a38819a 100644 --- a/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte +++ b/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte @@ -35,7 +35,8 @@ import { onMount } from 'svelte'; import { client } from '$lib/graphql/client'; import { NovelDocument, ImportNovelDocument, DeleteNovelDocument, GetBookmarksDocument } from '$lib/graphql/__generated__/graphql'; - import { isAuthenticated } from '$lib/auth/authStore'; + import { isAuthenticated, hasGroup } from '$lib/auth/authStore'; + import { Groups } from '$lib/constants/groups'; import { Card, CardContent, CardHeader } from '$lib/components/ui/card'; import { Badge } from '$lib/components/ui/badge'; import { Button } from '$lib/components/ui/button'; @@ -483,6 +484,7 @@ {/if} + {#if hasGroup(Groups.Admin)} + {/if} {/if} {#if refreshSuccess} diff --git a/fictionarchive-web-astro/src/lib/constants/groups.ts b/fictionarchive-web-astro/src/lib/constants/groups.ts new file mode 100644 index 0000000..bfa4180 --- /dev/null +++ b/fictionarchive-web-astro/src/lib/constants/groups.ts @@ -0,0 +1,3 @@ +export const Groups = { + Admin: 'admin' +} as const; -- 2.49.1