-
Notifications
You must be signed in to change notification settings - Fork 1
/
folder.resolvers.ts
121 lines (101 loc) · 3.45 KB
/
folder.resolvers.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { UseGuards } from '@nestjs/common';
import { Args, Mutation, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql';
import {
CreateFolderInput,
Folder,
FolderService,
Snippet,
SnippetService,
UpdateFolderInput,
User,
UserService,
} from '@snipcode/domain';
import { AuthGuard, UserId } from '../../../configs/auth.guard';
import {
CreateFolderInput as CreateFolderInputBody,
Directory as DirectoryGenerated,
UpdateFolderInput as UpdateFolderInputBody,
} from '../../../types/graphql.schema';
type Directory = Omit<DirectoryGenerated, 'folders' | 'paths' | 'snippets'> & {
folders: Folder[];
paths: Folder[];
snippets: Snippet[];
};
@Resolver('Folder')
export class FolderResolvers {
constructor(
private readonly folderService: FolderService,
private readonly snippetService: SnippetService,
private readonly userService: UserService,
) {}
@Mutation('createFolder')
@UseGuards(AuthGuard)
async createFolder(@UserId() userId: string, @Args('input') input: CreateFolderInputBody): Promise<Folder> {
const { name, parentId } = input;
const createFolderInput = new CreateFolderInput({ name, parentId, userId });
return this.folderService.create(createFolderInput);
}
@Mutation('updateFolder')
@UseGuards(AuthGuard)
async updateFolder(
@UserId() userId: string,
@Args('id') id: string,
@Args('input') input: UpdateFolderInputBody,
): Promise<Folder> {
const updateFolderInput = new UpdateFolderInput({
creatorId: userId,
folderId: id,
name: input.name,
});
return this.folderService.update(updateFolderInput);
}
@Mutation('deleteFolders')
@UseGuards(AuthGuard)
async deleteFolders(@UserId() userId: string, @Args('folderIds') folderIds: string[]): Promise<boolean> {
await this.folderService.deleteMany(folderIds, userId);
return true;
}
@Query('listFolders')
@UseGuards(AuthGuard)
async listFolders(@UserId() userId: string, @Args('folderId') folderId: string): Promise<Folder[]> {
return this.folderService.findSubFolders(userId, folderId);
}
@Query('listDirectory')
@UseGuards(AuthGuard)
async listDirectory(@UserId() userId: string, @Args('folderId') folderId: string): Promise<Directory> {
const folders = await this.folderService.findSubFolders(userId, folderId);
const snippets = await this.snippetService.findByFolder(folderId);
const paths = await this.folderService.generateBreadcrumb(folderId);
return {
folders,
paths,
snippets,
};
}
@Query('findFolder')
@UseGuards(AuthGuard)
async findFolder(@Args('folderId') folderId: string): Promise<Folder> {
return this.folderService.findById(folderId);
}
@ResolveField()
async parent(@Parent() folder: Folder): Promise<Folder | null> {
if (!folder.parentId) {
return null;
}
return this.folderService.findById(folder.parentId);
}
@ResolveField()
async user(@Parent() folder: Folder): Promise<User | null> {
return this.userService.findById(folder.userId);
}
@ResolveField()
async subFolders(@Parent() folder: Folder): Promise<Folder[]> {
return this.folderService.findSubFolders(folder.userId, folder.id);
}
@ResolveField()
async subFoldersCount(@Parent() folder: Folder): Promise<number> {
const folders = await this.folderService.findSubFolders(folder.userId, folder.id);
const snippets = await this.snippetService.findByFolder(folder.id);
return folders.length + snippets.length;
}
}