From 279e045ce8df4259705d47d565e33ac0ee19c460 Mon Sep 17 00:00:00 2001 From: AsyncFox Date: Sat, 18 Nov 2023 18:32:13 +0800 Subject: [PATCH] feat(group): add members modify --- src/controllers/group.ts | 26 ++++++++++++++++++++++---- src/routers/group.ts | 14 +++++++++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/controllers/group.ts b/src/controllers/group.ts index ce90fd5..7ae3087 100644 --- a/src/controllers/group.ts +++ b/src/controllers/group.ts @@ -5,13 +5,14 @@ import type { TGroup } from '../serializer/group'; import { groupSerializer } from '../serializer/group'; import { usersToGroups } from '../db/schema/userToGroup'; import { papersToGroups } from '../db/schema/paperToGroup'; +import { LibsqlError } from '@libsql/client'; export class GroupController { async create(newGroup: { - leader: string - members: string[] - papers?: string[] - archived?: boolean + leader: string + members: string[] + papers?: string[] + archived?: boolean }) { const { leader, members, papers, archived } = newGroup; const group = { @@ -60,6 +61,23 @@ export class GroupController { } } + async modifyMembers(groupId: string, newMembers: string[], newLeader: string) { + if (!newMembers.includes(newLeader)) return { success: false, message: '组长需要包含于组员中' }; + if (!(await db.select().from(groups).where(eq(groups.id, groupId))).length) return { success: false, message: '小组id不存在' }; + try { + await db.delete(usersToGroups).where(eq(usersToGroups.groupId, groupId)); + for (const userId of newMembers) { + await db.insert(usersToGroups).values({ userId, groupId }); + } + return { success: true, message: '修改成功' }; + } + catch (err) { + if (err instanceof LibsqlError && err.code === 'SQLITE_CONSTRAINT_FOREIGNKEY') + return { success: false, message: '传入了不存在的用户id' }; + return { success: false, message: '服务器内部错误' }; + } + } + async getContent(id: string) { try { const info = (await db.select().from(groups).where(eq(groups.id, id)))[0]; diff --git a/src/routers/group.ts b/src/routers/group.ts index e222ec8..359ba8a 100644 --- a/src/routers/group.ts +++ b/src/routers/group.ts @@ -48,7 +48,19 @@ export const groupRouter = router({ else return res.res; }), - + modify: protectedProcedure + .input(z.object({ + groupId: z.string().min(1, '不可以传入空ID'), + newMembers: z.array(z.string().min(1, '不可以传入空ID')).nonempty('不可以传入空ID列表'), + newLeader: z.string().min(1, '不可以传入空ID') + })) + .mutation(async ({ ctx, input }) => { + const res = await ctx.groupController.modifyMembers(input.groupId, input.newMembers, input.newLeader); + if (!res.success) + throw new TRPCError({ code: 'BAD_REQUEST', message: res.message }); + else + return res; + }), remove: protectedProcedure .input(z.object({ id: z.string().min(1, '小组id不存在') })) .use(requireRoles(['admin', 'teacher']))