Skip to content

Commit 725705f

Browse files
committed
Allow for filtering by role name
1 parent f441265 commit 725705f

File tree

3 files changed

+43
-29
lines changed

3 files changed

+43
-29
lines changed

src/api/role/role.controller.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class RoleController {
5959
summary: 'Search roles with given parameters',
6060
description: describeAccess({
6161
summary:
62-
'Searches existing roles using optional filter parameters (e.g. subjectId).',
62+
'Searches existing roles using optional filter parameters (e.g., subjectId, roleName).',
6363
jwt: 'Requires a JWT with the `administrator` role.',
6464
m2m: ['read:roles', 'all:roles'],
6565
notes:
@@ -85,6 +85,7 @@ export class RoleController {
8585
const isAdmin = Boolean(user?.isAdmin);
8686
const isMachine = Boolean(user?.isMachine);
8787
let subjectId: number | undefined;
88+
let roleName: string | undefined;
8889

8990
this.logger.debug(`findAll received query: ${JSON.stringify(query)}`);
9091

@@ -95,18 +96,21 @@ export class RoleController {
9596
if (query.filter) {
9697
this.logger.debug(`findAll received filter: ${query.filter}`);
9798
const filterParts = query.filter.split('=');
98-
if (
99-
filterParts.length === 2 &&
100-
filterParts[0].toLowerCase() === 'subjectid'
101-
) {
102-
const parsedId = parseInt(filterParts[1], 10);
103-
// subject id should be > 0 as in v3 java code
104-
if (!isNaN(parsedId) && parsedId > 0) {
105-
subjectId = parsedId;
106-
} else {
107-
throw new BadRequestException(
108-
'Invalid format for subjectId in filter parameter.',
109-
);
99+
if (filterParts.length === 2) {
100+
const key = filterParts[0].toLowerCase();
101+
const value = filterParts[1];
102+
if (key === 'subjectid') {
103+
const parsedId = parseInt(value, 10);
104+
// subject id should be > 0 as in v3 java code
105+
if (!isNaN(parsedId) && parsedId > 0) {
106+
subjectId = parsedId;
107+
} else {
108+
throw new BadRequestException(
109+
'Invalid format for subjectId in filter parameter.',
110+
);
111+
}
112+
} else if (key === 'rolename') {
113+
roleName = value;
110114
}
111115
}
112116
}
@@ -121,7 +125,10 @@ export class RoleController {
121125
);
122126
}
123127

124-
const result = await this.roleService.findAll(subjectId);
128+
const result =
129+
roleName !== undefined
130+
? await this.roleService.findAll(subjectId, roleName)
131+
: await this.roleService.findAll(subjectId);
125132
if (query.selector && query.selector.trim().length > 0) {
126133
const keys = query.selector.split(',');
127134
return CommonUtils.pickArray(result, keys) as RoleResponseDto[];

src/api/role/role.service.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,26 @@ export class RoleService {
128128
return { members: [...pageMembers, ...placeholders], total };
129129
}
130130

131-
async findAll(subjectId?: number): Promise<RoleResponseDto[]> {
132-
this.logger.debug(`Finding all roles, subjectId: ${subjectId}`);
133-
134-
const whereClause: any = subjectId
135-
? {
136-
roleAssignments: {
137-
some: {
138-
subjectId: subjectId,
139-
subjectType: Constants.memberSubjectType,
140-
},
141-
},
142-
}
143-
: {};
131+
async findAll(
132+
subjectId?: number,
133+
roleName?: string,
134+
): Promise<RoleResponseDto[]> {
135+
this.logger.debug(
136+
`Finding all roles, subjectId: ${subjectId}, roleName: ${roleName}`,
137+
);
138+
139+
const whereClause: any = {};
140+
if (subjectId) {
141+
whereClause.roleAssignments = {
142+
some: {
143+
subjectId: subjectId,
144+
subjectType: Constants.memberSubjectType,
145+
},
146+
};
147+
}
148+
if (roleName && roleName.trim().length > 0) {
149+
whereClause.name = roleName;
150+
}
144151

145152
const roles = await this.prismaClient.role.findMany({
146153
where: whereClause,

src/dto/role/role.dto.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ export class RoleMembersQueryDto {
195195
export class RoleQueryDto {
196196
@ApiPropertyOptional({
197197
description:
198-
"Filter criteria (e.g., 'subjectId=12345'). Used by findAll to get roles for a specific subject.",
199-
example: 'subjectId=12345',
198+
"Filter criteria (e.g., 'subjectId=12345' or 'roleName=copilot').",
199+
example: 'roleName=copilot',
200200
})
201201
@IsOptional()
202202
@IsString()

0 commit comments

Comments
 (0)