because I got bored of customising my CV for every job
1import type { User as DomainUser } from "@cv/auth";
2import {
3 AuthorizationService,
4 JwtAuthGuard,
5 VerifiedScopeGuard,
6} from "@cv/auth";
7import { UseGuards } from "@nestjs/common";
8import { Args, Mutation, Query, Resolver } from "@nestjs/graphql";
9import { CurrentUser } from "@/modules/current-user/current-user.decorator";
10import { ImportService } from "../import.service";
11import { UserFile as UserFileEntity } from "../user-file.entity";
12import { UserFileType } from "./user-file.type";
13
14@Resolver(() => UserFileType)
15@UseGuards(JwtAuthGuard, VerifiedScopeGuard)
16export class UserFileResolver {
17 constructor(
18 private readonly importService: ImportService,
19 private readonly authorizationService: AuthorizationService,
20 ) {}
21
22 @Query(() => UserFileType, { nullable: true })
23 async userFile(
24 @CurrentUser() user: DomainUser,
25 @Args("id") id: string,
26 ): Promise<UserFileType | null> {
27 const file = await this.importService.findUserFileById(id);
28 if (!file) return null;
29
30 await this.authorizationService.canView(user, file, UserFileEntity);
31
32 return UserFileType.fromDomain(file);
33 }
34
35 @Query(() => [UserFileType])
36 async myUserFiles(@CurrentUser() user: DomainUser): Promise<UserFileType[]> {
37 const files = await this.importService.findUserFilesForUser(user.id);
38 return files.map((f) => UserFileType.fromDomain(f));
39 }
40
41 @Mutation(() => Boolean)
42 async deleteUserFile(
43 @CurrentUser() user: DomainUser,
44 @Args("id") id: string,
45 ): Promise<boolean> {
46 const file = await this.importService.findUserFileById(id);
47 if (!file) return false;
48
49 await this.authorizationService.canDelete(user, file, UserFileEntity);
50 await this.importService.deleteUserFile(id);
51
52 return true;
53 }
54}