From 057d8a7f3b78bc1fc459fab85dd17812fc666ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= <1035145+tut-tuuut@users.noreply.github.com> Date: Sat, 28 Oct 2023 17:36:16 +0200 Subject: [PATCH] API - allow search of a group using its name (#6066) --- server/routes/api/groups/groups.test.ts | 33 +++++++++++++++++++++++++ server/routes/api/groups/groups.ts | 21 ++++++++++++---- server/routes/api/groups/schema.ts | 3 +++ 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/server/routes/api/groups/groups.test.ts b/server/routes/api/groups/groups.test.ts index 1a6147b31..1e396172a 100644 --- a/server/routes/api/groups/groups.test.ts +++ b/server/routes/api/groups/groups.test.ts @@ -258,6 +258,39 @@ describe("#groups.list", () => { .includes(anotherUser.id) ).toBe(true); }); + + it("should allow to find a group by its name", async () => { + const user = await buildUser(); + const group = await buildGroup({ + teamId: user.teamId, + }); + const anotherGroup = await buildGroup({ + teamId: user.teamId, + }); + + const unfilteredRes = await server.post("/api/groups.list", { + body: { + token: user.getJwtToken(), + }, + }); + const body = await unfilteredRes.json(); + + expect(unfilteredRes.status).toEqual(200); + expect(body.data.groups.length).toEqual(2); + expect(body.data.groups[0].id).toEqual(anotherGroup.id); + expect(body.data.groups[1].id).toEqual(group.id); + + const anotherRes = await server.post("/api/groups.list", { + body: { + name: group.name, + token: user.getJwtToken(), + }, + }); + const anotherBody = await anotherRes.json(); + expect(anotherRes.status).toEqual(200); + expect(anotherBody.data.groups.length).toEqual(1); + expect(anotherBody.data.groups[0].id).toEqual(group.id); + }); }); describe("#groups.info", () => { diff --git a/server/routes/api/groups/groups.ts b/server/routes/api/groups/groups.ts index a2114d85f..8fb3a621a 100644 --- a/server/routes/api/groups/groups.ts +++ b/server/routes/api/groups/groups.ts @@ -1,5 +1,5 @@ import Router from "koa-router"; -import { Op } from "sequelize"; +import { Op, WhereOptions } from "sequelize"; import { MAX_AVATAR_DISPLAY } from "@shared/constants"; import auth from "@server/middlewares/authentication"; import { rateLimiter } from "@server/middlewares/rateLimiter"; @@ -25,13 +25,24 @@ router.post( pagination(), validate(T.GroupsListSchema), async (ctx: APIContext) => { - const { direction, sort, userId } = ctx.input.body; + const { direction, sort, userId, name } = ctx.input.body; const { user } = ctx.state.auth; + let where: WhereOptions = { + teamId: user.teamId, + }; + + if (name) { + where = { + ...where, + name: { + [Op.eq]: name, + }, + }; + } + const groups = await Group.filterByMember(userId).findAll({ - where: { - teamId: user.teamId, - }, + where, order: [[sort, direction]], offset: ctx.state.pagination.offset, limit: ctx.state.pagination.limit, diff --git a/server/routes/api/groups/schema.ts b/server/routes/api/groups/schema.ts index cfa65cda0..0fffce3d9 100644 --- a/server/routes/api/groups/schema.ts +++ b/server/routes/api/groups/schema.ts @@ -24,6 +24,9 @@ export const GroupsListSchema = z.object({ /** Only list groups where this user is a member */ userId: z.string().uuid().optional(), + + /** Find group with matching name */ + name: z.string().optional(), }), });