Skip to content

Commit 6296e96

Browse files
committed
Challenge track consistency
1 parent 8553d8b commit 6296e96

File tree

3 files changed

+65
-8
lines changed

3 files changed

+65
-8
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
Warnings:
3+
4+
- The values [DEVELOP,QA] on the enum `ChallengeTrackEnum` will be removed. If these variants are still used in the database, this will fail.
5+
6+
*/
7+
-- AlterEnum
8+
BEGIN;
9+
CREATE TYPE "ChallengeTrackEnum_new" AS ENUM ('DESIGN', 'DATA_SCIENCE', 'DEVELOPMENT', 'QUALITY_ASSURANCE');
10+
ALTER TABLE "ChallengeTrack" ALTER COLUMN "track" TYPE "ChallengeTrackEnum_new" USING ("track"::text::"ChallengeTrackEnum_new");
11+
ALTER TYPE "ChallengeTrackEnum" RENAME TO "ChallengeTrackEnum_old";
12+
ALTER TYPE "ChallengeTrackEnum_new" RENAME TO "ChallengeTrackEnum";
13+
DROP TYPE "ChallengeTrackEnum_old";
14+
COMMIT;

prisma/schema.prisma

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ generator client {
1010

1111
// Enum for allowed challenge track values (matches app-constants)
1212
enum ChallengeTrackEnum {
13-
DEVELOP
1413
DESIGN
1514
DATA_SCIENCE
16-
QA
15+
DEVELOPMENT
16+
QUALITY_ASSURANCE
1717
}
1818

1919
enum ReviewTypeEnum {

src/services/ChallengeService.js

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ const {
3434
} = require("../common/prisma");
3535
const prisma = getClient();
3636

37+
// Provide aliases for friendlier sortBy query params
38+
const sortByAliases = {
39+
updated: constants.validChallengeParams.Updated,
40+
created: constants.validChallengeParams.Created,
41+
};
42+
43+
const allowedSortByValues = _.uniq([
44+
..._.values(constants.validChallengeParams),
45+
...Object.keys(sortByAliases),
46+
]);
47+
3748
// Minimal domain adapter for PhaseAdvancer to fetch phase-specific facts.
3849
// For now this returns an empty factResponses array which makes the
3950
// PhaseAdvancer default to conservative behavior when such facts are needed.
@@ -371,6 +382,11 @@ async function searchByLegacyId(currentUser, legacyId, page, perPage) {
371382
async function searchChallenges(currentUser, criteria) {
372383
const page = criteria.page || 1;
373384
const perPage = criteria.perPage || 20;
385+
386+
if (criteria.sortBy && sortByAliases[criteria.sortBy]) {
387+
criteria.sortBy = sortByAliases[criteria.sortBy];
388+
}
389+
374390
// Log the requested search filter (omit pagination for brevity)
375391
try {
376392
const filterToLog = _.omit(criteria, ["page", "perPage"]);
@@ -891,12 +907,39 @@ async function searchChallenges(currentUser, criteria) {
891907

892908
const prismaQuery = {
893909
...prismaFilter,
894-
take: criteria.perPage,
895-
skip: (criteria.page - 1) * criteria.perPage,
910+
take: perPage,
911+
skip: (page - 1) * perPage,
896912
orderBy: [sortFilter],
897913
include: includeReturnFields,
898914
};
899915

916+
try {
917+
const logContext = {
918+
where: prismaFilter.where,
919+
orderBy: prismaQuery.orderBy,
920+
pagination: {
921+
page,
922+
perPage,
923+
take: perPage,
924+
skip: (page - 1) * perPage,
925+
},
926+
groupsToFilter,
927+
accessibleGroups,
928+
};
929+
const logPayload = JSON.stringify(logContext, (_key, value) => {
930+
if (typeof value === "bigint") {
931+
return value.toString();
932+
}
933+
if (value instanceof Date) {
934+
return value.toISOString();
935+
}
936+
return value;
937+
});
938+
logger.info(`SearchChallenges prisma query: ${logPayload}`);
939+
} catch (logError) {
940+
logger.warn(`SearchChallenges prisma logging failed: ${logError.message}`);
941+
}
942+
900943
let challenges = [];
901944
let total = 0;
902945
try {
@@ -997,7 +1040,7 @@ searchChallenges.schema = {
9971040
projectId: Joi.number().integer().positive(),
9981041
forumId: Joi.number().integer(),
9991042
legacyId: Joi.number().integer().positive(),
1000-
status: Joi.string().valid(_.values(ChallengeStatusEnum)),
1043+
status: Joi.string().valid(_.values(ChallengeStatusEnum)).insensitive(),
10011044
group: Joi.string(),
10021045
startDateStart: Joi.date(),
10031046
startDateEnd: Joi.date(),
@@ -1020,9 +1063,9 @@ searchChallenges.schema = {
10201063
updatedBy: Joi.string(),
10211064
isLightweight: Joi.boolean().default(false),
10221065
memberId: Joi.string(),
1023-
sortBy: Joi.string().valid(_.values(constants.validChallengeParams)),
1066+
sortBy: Joi.string().valid(...allowedSortByValues),
10241067
sortOrder: Joi.string().valid(["asc", "desc"]),
1025-
groups: Joi.array().items(Joi.optionalId()).unique().min(1),
1068+
groups: Joi.array().items(Joi.optionalId()).unique(),
10261069
ids: Joi.array().items(Joi.optionalId()).unique().min(1),
10271070
isTask: Joi.boolean(),
10281071
taskIsAssigned: Joi.boolean(),
@@ -2437,7 +2480,7 @@ updateChallenge.schema = {
24372480
allowedRegistrants: Joi.array().items(Joi.string().trim().lowercase()).optional(),
24382481
})
24392482
.optional(),
2440-
status: Joi.string().valid(_.values(ChallengeStatusEnum)),
2483+
status: Joi.string().valid(_.values(ChallengeStatusEnum)).insensitive(),
24412484
attachments: Joi.array().items(
24422485
Joi.object().keys({
24432486
id: Joi.id(),

0 commit comments

Comments
 (0)