Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ workflows:
- feat/ai-workflows
- feat/scorecards
- pm-1503
- pm-1585_1
- 'build-prod':
context: org-global
filters:
Expand Down
38 changes: 8 additions & 30 deletions src/api/scorecard/scorecard.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
ScorecardRequestDto,
ScorecardResponseDto,
ScorecardWithGroupResponseDto,
SearchScorecardQuery,
} from 'src/dto/scorecard.dto';
import { ChallengeTrack } from 'src/shared/enums/challengeTrack.enum';
import { ScoreCardService } from './scorecard.service';
Expand Down Expand Up @@ -139,8 +140,6 @@ export class ScorecardController {
}

@Get()
@Roles(UserRole.Admin)
@Scopes(Scope.ReadScorecard)
@ApiOperation({
summary: 'Search scorecards',
description:
Expand Down Expand Up @@ -198,40 +197,19 @@ export class ScorecardController {
})
@UseInterceptors(PaginationHeaderInterceptor)
async searchScorecards(
@Query('challengeTrack') challengeTrack?: ChallengeTrack | ChallengeTrack[],
@Query('challengeType') challengeType?: string | string[],
@Query('status') status?: $Enums.ScorecardStatus | $Enums.ScorecardStatus[],
@Query('scorecardType')
scorecardType?: $Enums.ScorecardType | $Enums.ScorecardType[],
@Query('name') name?: string,
@Query('page') page: number = 1,
@Query('perPage') perPage: number = 10,
@Query() query: SearchScorecardQuery
): Promise<ScorecardPaginatedResponseDto> {
const challengeTrackArray = Array.isArray(challengeTrack)
? challengeTrack
: challengeTrack
? [challengeTrack]
: [];
const challengeTypeArray = Array.isArray(challengeType)
? challengeType
: challengeType
? [challengeType]
: [];
const scorecardTypesArray = Array.isArray(scorecardType)
? scorecardType
: scorecardType
? [scorecardType]
: [];
const statusArray = Array.isArray(status) ? status : status ? [status] : [];
const { challengeTrack = [], challengeType = [], status = [], scorecardType = [], name, page, perPage} = query;


const result = await this.scorecardService.getScoreCards({
challengeTrack: challengeTrackArray,
challengeType: challengeTypeArray,
challengeTrack,
challengeType,
name,
page,
perPage,
scorecardTypesArray,
statusArray,
scorecardType,
status,
});
return result;
}
Expand Down
16 changes: 8 additions & 8 deletions src/api/scorecard/scorecard.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ import {
mapScorecardRequestToDto,
ScorecardGroupBaseDto,
ScorecardPaginatedResponseDto,
ScorecardQueryDto,
ScorecardQuestionBaseDto,
ScorecardRequestDto,
ScorecardResponseDto,
ScorecardSectionBaseDto,
ScorecardWithGroupResponseDto,
SearchScorecardQuery,
} from 'src/dto/scorecard.dto';
import { JwtUser } from 'src/shared/modules/global/jwt.service';
import { PrismaService } from 'src/shared/modules/global/prisma.service';
Expand Down Expand Up @@ -165,15 +165,15 @@ export class ScoreCardService {
* @returns response dto
*/
async getScoreCards(
query: ScorecardQueryDto,
query: SearchScorecardQuery,
): Promise<ScorecardPaginatedResponseDto> {
const {
page = 1,
perPage = 10,
challengeTrack,
challengeType,
scorecardTypesArray,
statusArray,
scorecardType,
status,
name,
} = query;
const skip = (page - 1) * perPage;
Expand All @@ -188,14 +188,14 @@ export class ScoreCardService {
in: challengeType,
},
}),
...(scorecardTypesArray?.length && {
...(scorecardType?.length && {
type: {
in: scorecardTypesArray,
in: scorecardType,
},
}),
...(statusArray?.length && {
...(status?.length && {
status: {
in: statusArray,
in: status,
},
}),
...(name && { name: { contains: name, mode: 'insensitive' } }),
Expand Down
68 changes: 57 additions & 11 deletions src/dto/scorecard.dto.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { ApiProperty } from '@nestjs/swagger';
import { $Enums } from '@prisma/client';
import { Type } from 'class-transformer';
import { Transform, Type } from 'class-transformer';
import {
IsArray,
IsBoolean,
IsEnum,
IsInt,
IsNotEmpty,
IsNumber,
IsOptional,
Expand Down Expand Up @@ -288,6 +289,61 @@ export class ScorecardResponseDto extends ScorecardBaseDto {
id: string;
}

function toArray<T = string>(value: unknown): T[] | undefined {
if (value === undefined || value === null || value === '') return undefined;
const asArray = Array.isArray(value) ? value : [value];
return asArray
.flatMap((v) => String(v).split(','))
.map((s) => s.trim())
.filter(Boolean) as T[];
}

export class SearchScorecardQuery {
@IsOptional()
@Transform(({ value }) => toArray<ChallengeTrack>(value))
@IsArray()
@IsEnum(ChallengeTrack, { each: true })
challengeTrack?: ChallengeTrack[];

@IsOptional()
@Transform(({ value }) => toArray<string>(value))
@IsArray()
@IsString({ each: true })
challengeType?: string[];

@IsOptional()
@Transform(({ value }) => toArray<$Enums.ScorecardStatus>(value))
@IsArray()
@IsEnum($Enums.ScorecardStatus, {
each: true,
message: (args) =>
`Invalid value "${args.value}" for "${args.property}".`
})
status?: $Enums.ScorecardStatus[];

@IsOptional()
@Transform(({ value }) => toArray<$Enums.ScorecardType>(value))
@IsArray()
@IsEnum($Enums.ScorecardType, { each: true })
scorecardType?: $Enums.ScorecardType[];

@IsOptional()
@IsString()
name?: string;

@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
page: number = 1;

@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
perPage: number = 10;
}

export class ScorecardWithGroupResponseDto extends ScorecardBaseDto {
@ApiProperty({ description: 'The ID of the scorecard', example: 'abc123' })
id: string;
Expand Down Expand Up @@ -324,16 +380,6 @@ export class ScorecardPaginatedResponseDto {
scoreCards: ScorecardResponseDto[];
}

export class ScorecardQueryDto {
challengeTrack?: ChallengeTrack[];
challengeType?: string[];
name?: string;
page?: number;
perPage?: number;
statusArray?: $Enums.ScorecardStatus[];
scorecardTypesArray?: $Enums.ScorecardType[];
}

export function mapScorecardRequestForCreate(request: ScorecardRequestDto) {
const userFields = {
...(request.createdBy ? { createdBy: request.createdBy } : {}),
Expand Down