import type { User as DomainUser } from "@cv/auth"; import { AuthorizationService, JwtAuthGuard, VerifiedScopeGuard, } from "@cv/auth"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; import { ImportService } from "../import.service"; import { UserFile as UserFileEntity } from "../user-file.entity"; import { UserFileType } from "./user-file.type"; @Resolver(() => UserFileType) @UseGuards(JwtAuthGuard, VerifiedScopeGuard) export class UserFileResolver { constructor( private readonly importService: ImportService, private readonly authorizationService: AuthorizationService, ) {} @Query(() => UserFileType, { nullable: true }) async userFile( @CurrentUser() user: DomainUser, @Args("id") id: string, ): Promise { const file = await this.importService.findUserFileById(id); if (!file) return null; await this.authorizationService.canView(user, file, UserFileEntity); return UserFileType.fromDomain(file); } @Query(() => [UserFileType]) async myUserFiles(@CurrentUser() user: DomainUser): Promise { const files = await this.importService.findUserFilesForUser(user.id); return files.map((f) => UserFileType.fromDomain(f)); } @Mutation(() => Boolean) async deleteUserFile( @CurrentUser() user: DomainUser, @Args("id") id: string, ): Promise { const file = await this.importService.findUserFileById(id); if (!file) return false; await this.authorizationService.canDelete(user, file, UserFileEntity); await this.importService.deleteUserFile(id); return true; } }