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(), }), });