From 464136e3011d74d281c8b1534043c3e72a7d51a7 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Mon, 27 Apr 2026 08:32:59 +1000 Subject: [PATCH 01/22] Don't show markup values to copilots --- src/services/ChallengeService.js | 99 ++++++++++++++++++++++++++++-- test/unit/ChallengeService.test.js | 18 ++++++ 2 files changed, 112 insertions(+), 5 deletions(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 079ee88..f1edf52 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -36,6 +36,17 @@ const { } = require("../common/prisma"); const prisma = getClient(); +const BILLING_MARKUP_COPILOT_ROLES = new Set(["copilot", "connect copilot"]); +const BILLING_MARKUP_VISIBLE_ROLES = new Set([ + "administrator", + "connect admin", + "connect manager", + "project manager", + "topcoder project manager", + "talent manager", + "topcoder talent manager", +]); + // Provide aliases for friendlier sortBy query params const sortByAliases = { updated: constants.validChallengeParams.Updated, @@ -78,6 +89,77 @@ function compareStatusSortValues(aStatusValue, bStatusValue) { return normalizedA.localeCompare(normalizedB); } +/** + * Returns normalized role names from the authenticated user payload. + * @param {Object} currentUser the authenticated user + * @returns {Set} lower-cased role names + */ +function getNormalizedUserRoles(currentUser) { + const roles = _.get(currentUser, "roles", []); + const roleValues = Array.isArray(roles) + ? roles + : _.toString(roles) + .split(",") + .map((role) => role.trim()); + + return new Set( + _.map(roleValues, (role) => _.toString(role).trim().toLowerCase()).filter(Boolean), + ); +} + +/** + * Determines whether challenge billing markup should be hidden from the caller. + * @param {Object} currentUser the authenticated user + * @returns {Boolean} true when the caller is copilot-only and should not see markup + */ +function shouldHideBillingMarkupForCopilot(currentUser) { + if (!currentUser || _.get(currentUser, "isMachine", false)) { + return false; + } + + const roles = getNormalizedUserRoles(currentUser); + const hasCopilotRole = [...BILLING_MARKUP_COPILOT_ROLES].some((role) => roles.has(role)); + + if (!hasCopilotRole) { + return false; + } + + return ![...BILLING_MARKUP_VISIBLE_ROLES].some((role) => roles.has(role)); +} + +/** + * Removes raw billing markup from challenge response data for copilot-only callers. + * @param {Object} currentUser the authenticated user + * @param {Object} challenge the challenge response object to sanitize + * @returns {Object} the same challenge object after response sanitization + */ +function sanitizeBillingMarkupForCaller(currentUser, challenge) { + if (shouldHideBillingMarkupForCopilot(currentUser)) { + _.unset(challenge, "billing.markup"); + } + + return challenge; +} + +/** + * Keeps persisted billing markup intact when copilot-only callers submit billing data. + * @param {Object} currentUser the authenticated user + * @param {Object} data incoming update payload + * @param {Object} challenge persisted challenge response shape + * @returns {Object} the update payload with protected billing markup restored + */ +function preserveBillingMarkupForCopilotUpdate(currentUser, data, challenge) { + if ( + shouldHideBillingMarkupForCopilot(currentUser) && + _.has(data, "billing") && + _.has(challenge, "billing.markup") + ) { + _.set(data, "billing.markup", _.get(challenge, "billing.markup")); + } + + return data; +} + // Minimal domain adapter for PhaseAdvancer to fetch phase-specific facts. // For now this returns an empty factResponses array which makes the // PhaseAdvancer default to conservative behavior when such facts are needed. @@ -782,7 +864,10 @@ async function searchChallenges(currentUser, criteria) { } if (!_.isUndefined(criteria.legacyId)) { const result = await searchByLegacyId(currentUser, criteria.legacyId, page, perPage); - return { total: result.length, page, perPage, result }; + const sanitizedResult = result.map((challenge) => + helper.removeNullProperties(sanitizeBillingMarkupForCaller(currentUser, challenge)), + ); + return { total: sanitizedResult.length, page, perPage, result: sanitizedResult }; } const prismaFilter = { @@ -1564,7 +1649,9 @@ async function searchChallenges(currentUser, criteria) { } }); - const sanitizedResult = result.map((challenge) => helper.removeNullProperties(challenge)); + const sanitizedResult = result.map((challenge) => + helper.removeNullProperties(sanitizeBillingMarkupForCaller(currentUser, challenge)), + ); if (searchTimingEnabled) { logger.info( @@ -1987,7 +2074,7 @@ async function createChallenge(currentUser, challenge, userToken) { }) ${buildLogContext()}`, ); - return helper.removeNullProperties(ret); + return helper.removeNullProperties(sanitizeBillingMarkupForCaller(currentUser, ret)); } createChallenge.schema = { currentUser: Joi.any(), @@ -2235,7 +2322,7 @@ async function getChallenge(currentUser, id, checkIfExists) { // Note: numOfRegistrants and numOfSubmissions are no longer calculated here. - return helper.removeNullProperties(challenge); + return helper.removeNullProperties(sanitizeBillingMarkupForCaller(currentUser, challenge)); } getChallenge.schema = { currentUser: Joi.any(), @@ -2755,6 +2842,8 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { delete data.reviews; } + data = preserveBillingMarkupForCopilotUpdate(currentUser, data, challenge); + // Remove fields from data that are not allowed to be updated and that match the existing challenge data = sanitizeData(sanitizeChallenge(data), challenge); const sanitizedIncludesTerms = Object.prototype.hasOwnProperty.call(data, "terms"); @@ -3527,7 +3616,7 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { } } - return helper.removeNullProperties(updatedChallenge); + return helper.removeNullProperties(sanitizeBillingMarkupForCaller(currentUser, updatedChallenge)); } updateChallenge.schema = { diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index 6908fbc..e55cd37 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -544,6 +544,24 @@ describe("challenge service unit tests", () => { } }); + it("get challenge hides billing markup for copilot-only project write users", async () => { + const originalUserHasProjectWriteAccess = helper.userHasProjectWriteAccess; + + helper.userHasProjectWriteAccess = async () => true; + + try { + const result = await service.getChallenge( + { handle: "writer", roles: ["copilot"], userId: "testuser" }, + createdChallengeData.id, + ); + + should.equal(result.billing.billingAccountId, createdChallengeData.billing.billingAccountId); + should.equal(_.isUndefined(result.billing.markup), true); + } finally { + helper.userHasProjectWriteAccess = originalUserHasProjectWriteAccess; + } + }); + it("get challenge hides billing for users without project write access", async () => { const originalUserHasProjectWriteAccess = helper.userHasProjectWriteAccess; const originalListResourcesByMemberAndChallenge = helper.listResourcesByMemberAndChallenge; From 8fca7406aa4ee5f09060d7ee6710ba3696671c29 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Mon, 27 Apr 2026 15:44:25 +1000 Subject: [PATCH 02/22] User whitelist for challenge access - used for MM dev QA and testing. --- packages/challenge-prisma-client/edge.js | 17 +- .../challenge-prisma-client/index-browser.js | 11 + packages/challenge-prisma-client/index.d.ts | 1700 ++++++++++++++++- packages/challenge-prisma-client/index.js | 17 +- packages/challenge-prisma-client/package.json | 2 +- .../challenge-prisma-client/schema.prisma | 16 + packages/challenge-prisma-client/wasm.js | 17 +- .../migration.sql | 16 + prisma/schema.prisma | 16 + src/common/helper.js | 367 ++-- src/controllers/ChallengeController.js | 12 +- src/controllers/ChallengePhaseController.js | 12 +- src/services/AttachmentService.js | 8 +- src/services/ChallengePhaseService.js | 944 ++++----- src/services/ChallengeService.js | 46 +- test/unit/AttachmentService.test.js | 34 + test/unit/ChallengePhaseService.test.js | 147 +- test/unit/ChallengeService.test.js | 227 +++ 18 files changed, 2989 insertions(+), 620 deletions(-) create mode 100644 prisma/migrations/20260427090000_add_challenge_user_whitelist/migration.sql diff --git a/packages/challenge-prisma-client/edge.js b/packages/challenge-prisma-client/edge.js index 1cd1d88..cdb8295 100644 --- a/packages/challenge-prisma-client/edge.js +++ b/packages/challenge-prisma-client/edge.js @@ -130,6 +130,11 @@ exports.Prisma.ChallengeScalarFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistScalarFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeScalarFieldEnum = { id: 'id', name: 'name', @@ -491,6 +496,11 @@ exports.Prisma.ChallengeOrderByRelevanceFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistOrderByRelevanceFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeOrderByRelevanceFieldEnum = { id: 'id', name: 'name', @@ -771,6 +781,7 @@ exports.ReviewOpportunityTypeEnum = exports.$Enums.ReviewOpportunityTypeEnum = { exports.Prisma.ModelName = { Challenge: 'Challenge', + ChallengeUserWhitelist: 'ChallengeUserWhitelist', ChallengeType: 'ChallengeType', ChallengeTrack: 'ChallengeTrack', ChallengeTimelineTemplate: 'ChallengeTimelineTemplate', @@ -852,13 +863,13 @@ const config = { } } }, - "inlineSchema": "datasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/challenge-prisma-client\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\n// Enum for allowed challenge track values (matches app-constants)\nenum ChallengeTrackEnum {\n DESIGN\n DATA_SCIENCE\n DEVELOPMENT\n QUALITY_ASSURANCE\n}\n\nenum ReviewTypeEnum {\n COMMUNITY\n INTERNAL\n SYSTEM\n PROVISIONAL\n EXAMPLE\n}\n\nenum DiscussionTypeEnum {\n CHALLENGE\n}\n\nenum ChallengeStatusEnum {\n NEW\n DRAFT\n APPROVED\n ACTIVE\n COMPLETED\n DELETED\n CANCELLED\n CANCELLED_FAILED_REVIEW\n CANCELLED_FAILED_SCREENING\n CANCELLED_ZERO_SUBMISSIONS\n CANCELLED_WINNER_UNRESPONSIVE\n CANCELLED_CLIENT_REQUEST\n CANCELLED_REQUIREMENTS_INFEASIBLE\n CANCELLED_ZERO_REGISTRATIONS\n CANCELLED_PAYMENT_FAILED\n}\n\nenum PrizeSetTypeEnum {\n PLACEMENT\n COPILOT\n REVIEWER\n PASSED_REVIEW\n CHECKPOINT\n}\n\n// Enum for review opportunity types on reviewers\nenum ReviewOpportunityTypeEnum {\n REGULAR_REVIEW\n COMPONENT_DEV_REVIEW\n SPEC_REVIEW\n ITERATIVE_REVIEW\n SCENARIOS_REVIEW\n}\n\n//////////////////////////////////////////\n// Main Challenge model\n//////////////////////////////////////////\n\nmodel Challenge {\n id String @id @default(uuid())\n name String\n description String?\n privateDescription String?\n challengeSource String?\n descriptionFormat String?\n projectId Int? // frequently queried field\n typeId String\n trackId String // FK for relation in ChallengeTrack\n timelineTemplateId String? // now used as foreign key to ChallengeTimelineTemplate\n overviewTotalPrizes Float? // stored from overview.totalPrizes\n numOfRegistrants Int @default(0)\n numOfSubmissions Int @default(0)\n numOfCheckpointSubmissions Int @default(0)\n currentPhaseNames String[] // current phase names\n\n wiproAllowed Boolean @default(false)\n funChallenge Boolean @default(false)\n\n // simple arrays for tags and groups (PostgreSQL native array type)\n tags String[]\n groups String[]\n\n // Task information (flattened from challenge.task)\n taskIsTask Boolean @default(false)\n taskIsAssigned Boolean @default(false)\n taskMemberId String?\n\n // Dates for challenge lifecycle\n submissionStartDate DateTime?\n submissionEndDate DateTime?\n registrationStartDate DateTime?\n registrationEndDate DateTime?\n startDate DateTime?\n endDate DateTime?\n\n // Normalized billing and legacy information (one-to-one)\n billingRecord ChallengeBilling?\n legacyId Int? // Legacy system ID for searching\n legacyRecord ChallengeLegacy? @relation(\"ChallengeLegacyRelation\")\n\n // Additional fields from createChallenge schema\n status ChallengeStatusEnum @default(NEW) // new challenges default to status \"New\"\n // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge\n constraintRecord ChallengeConstraint?\n\n // Additional normalized relations from createChallenge\n events ChallengeEvent[]\n discussions ChallengeDiscussion[]\n\n // Existing relations (one-to-many) for challenge metadata, phases, prize sets, winners, attachments,\n // terms and skills\n metadata ChallengeMetadata[]\n phases ChallengePhase[]\n prizeSets ChallengePrizeSet[]\n reviewers ChallengeReviewer[]\n winners ChallengeWinner[]\n attachments Attachment[]\n terms ChallengeTerm[]\n skills ChallengeSkill[]\n auditLogs AuditLog[]\n memberAccesses MemberChallengeAccess[]\n\n // Relation to ChallengeType (FK: typeId)\n type ChallengeType @relation(fields: [typeId], references: [id])\n // Relation to ChallengeTrack (FK: trackId)\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n\n // Auditing fields (present in every table)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([projectId])\n @@index([status]) // index added for optimized search by status\n @@index([createdAt])\n @@index([updatedAt])\n @@index([typeId])\n @@index([trackId])\n @@index([groups], type: Gin, map: \"challenge_groups_gin_idx\")\n @@index([submissionStartDate])\n @@index([submissionEndDate])\n @@index([registrationStartDate])\n @@index([registrationEndDate])\n @@index([startDate])\n @@index([endDate])\n @@index([status, startDate])\n @@index([trackId, typeId, status])\n @@index([status, typeId, trackId, createdAt(sort: Desc)], map: \"challenge_status_type_track_created_at_idx\")\n @@index([legacyId])\n @@index([projectId, status])\n}\n\n//////////////////////////////////////////\n// MemberChallengeAccess view – member/challenge pairs from resources schema\n//////////////////////////////////////////\n\nview MemberChallengeAccess {\n challengeId String\n memberId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id])\n\n @@map(\"MemberChallengeAccess\")\n}\n\n//////////////////////////////////////////\n// ChallengeType model\n//////////////////////////////////////////\n\nmodel ChallengeType {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n isTask Boolean @default(false)\n abbreviation String\n legacyId Int?\n isLegacy Boolean @default(false)\n\n challenges Challenge[]\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this type\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([abbreviation])\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTrack model\n//////////////////////////////////////////\n\nmodel ChallengeTrack {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean\n abbreviation String\n legacyId Int? // numeric legacy system id (if provided)\n track ChallengeTrackEnum? // enum value from ChallengeTrackEnum\n isLegacy Boolean @default(false)\n challenges Challenge[]\n // Opposite relation for ChallengeTimelineTemplate\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this track\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTimelineTemplate model\n//////////////////////////////////////////\n\nmodel ChallengeTimelineTemplate {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String // now required per Swagger spec\n\n // Link to the TimelineTemplate model via timelineTemplateId.\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id])\n // Link to the ChallengeTrack model via trackId.\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n // Link to the ChallengeType model via typeId.\n type ChallengeType @relation(fields: [typeId], references: [id])\n\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Composite index to support searches/updates by typeId, trackId and timelineTemplateId.\n @@index([typeId, trackId, timelineTemplateId])\n}\n\n//////////////////////////////////////////\n// AuditLog model – tracks field changes\n//////////////////////////////////////////\n\nmodel AuditLog {\n id String @id @default(uuid())\n challengeId String? // optional association with a challenge\n fieldName String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n createdBy String\n memberId String?\n\n // Relation field to connect AuditLog to Challenge.\n challenge Challenge? @relation(fields: [challengeId], references: [id])\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Attachment model – for challenge attachments\n//////////////////////////////////////////\n\nmodel Attachment {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String\n fileSize Int\n url String\n description String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeMetadata model – key/value metadata\n//////////////////////////////////////////\n\nmodel ChallengeMetadata {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String // name of the metadata\n value String // value stored as string for flexibility\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Prize model – individual prize in a prize set\n//////////////////////////////////////////\n\nmodel Prize {\n id String @id @default(uuid())\n description String?\n prizeSet ChallengePrizeSet @relation(fields: [prizeSetId], references: [id], onDelete: Cascade)\n prizeSetId String\n type String // e.g. \"USD\", \"POINT\" (could also be converted to enum later)\n value Float\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeWinner model – record winners for a challenge\n//////////////////////////////////////////\n\nmodel ChallengeWinner {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n userId Int\n handle String\n placement Int\n type PrizeSetTypeEnum\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type, placement])\n}\n\n//////////////////////////////////////////\n// ChallengeTerm model – association of challenge and terms\n//////////////////////////////////////////\n\nmodel ChallengeTerm {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n termId String // Terms API id\n roleId String // UUID for the associated role\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeSkill model – linking challenges with skills\n//////////////////////////////////////////\n\nmodel ChallengeSkill {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n skillId String // Request provided skillId\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeBilling model – normalized billing info\n//////////////////////////////////////////\n\nmodel ChallengeBilling {\n id String @id @default(uuid())\n billingAccountId String?\n markup Float? // in range [0, 100]\n clientBillingRate Float? // in range [0, 100]. Supporting range on postgres is an open issue with prisma https://github.com/prisma/prisma/issues/3287.\n challengeId String @unique\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeLegacy model – normalized legacy info\n//////////////////////////////////////////\n\nmodel ChallengeLegacy {\n id String @id @default(uuid())\n reviewType ReviewTypeEnum @default(INTERNAL)\n confidentialityType String @default(\"public\")\n forumId Int?\n directProjectId Int?\n screeningScorecardId Int?\n reviewScorecardId Int?\n isTask Boolean @default(false)\n useSchedulingAPI Boolean @default(false)\n pureV5Task Boolean @default(false)\n pureV5 Boolean @default(false)\n selfService Boolean @default(false)\n selfServiceCopilot String?\n track String? // as provided in the legacy object\n subTrack String? // as provided in the legacy object\n legacySystemId Int? // represents the external \"legacyId\"\n challengeId String @unique\n challenge Challenge @relation(\"ChallengeLegacyRelation\", fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeEvent model – normalized challenge events\n//////////////////////////////////////////\n\nmodel ChallengeEvent {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n eventId Int\n name String?\n key String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeDiscussion and associated options – normalized discussion channels\n//////////////////////////////////////////\n\nmodel ChallengeDiscussion {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n discussionId String?\n name String\n type DiscussionTypeEnum // updated to use enum\n provider String\n url String?\n options ChallengeDiscussionOption[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\nmodel ChallengeDiscussionOption {\n id String @id @default(uuid())\n discussion ChallengeDiscussion @relation(fields: [discussionId], references: [id], onDelete: Cascade)\n discussionId String\n optionKey String\n optionValue String\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeConstraint model – top-level challenge constraints (e.g. allowed registrants)\n//////////////////////////////////////////\n\nmodel ChallengeConstraint {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String @unique\n allowedRegistrants String[] @default([])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhase – to capture per-phase info from create/update challenge operations\n// Each phase is linked with a challenge and holds a duration and any custom constraints.\n//////////////////////////////////////////\n\nmodel Phase {\n id String @id @default(uuid())\n name String\n description String?\n isOpen Boolean\n duration Int\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Inverse relation for associated challenge phases\n challengePhases ChallengePhase[]\n ChallengeReviewer ChallengeReviewer[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\nmodel ChallengePhase {\n id String @id @default(uuid())\n challengeId String\n phaseId String // foreign key to Phase\n\n name String // phase name\n description String? // description\n isOpen Boolean? @default(false) // if this phase is open\n predecessor String? // predecessor of this phase\n duration Int? // duration in seconds\n scheduledStartDate DateTime? // when the phase is scheduled to start\n scheduledEndDate DateTime?\n actualStartDate DateTime?\n actualEndDate DateTime? // when the phase actually ended\n constraints ChallengePhaseConstraint[]\n\n // Relation fields\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n phase Phase @relation(fields: [phaseId], references: [id])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, isOpen])\n @@index([challengeId, name])\n @@index([challengeId, isOpen, scheduledEndDate, actualEndDate], map: \"challenge_phase_challenge_open_end_idx\")\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhaseConstraint – to capture custom constraints for each phase\n//////////////////////////////////////////\n\nmodel ChallengePhaseConstraint {\n id String @id @default(uuid())\n challengePhaseId String\n name String // the name/key of the constraint\n value Int // numeric value of the constraint (can be changed to Float if needed)\n\n // Relation to the phase\n challengePhase ChallengePhase @relation(fields: [challengePhaseId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengePhaseId])\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePrizeSet – to group prizes for a challenge\n//////////////////////////////////////////\n\nmodel ChallengePrizeSet {\n id String @id @default(uuid())\n challengeId String\n type PrizeSetTypeEnum // using enum instead of string\n description String?\n prizes Prize[]\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type])\n}\n\n//////////////////////////////////////////\n// ChallengeReviewer model – reviewers for a challenge, both AI and member\n//////////////////////////////////////////\n\nmodel ChallengeReviewer {\n id String @id @default(uuid())\n challengeId String\n\n // Reviewer configuration\n scorecardId String\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseId String\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n type ReviewOpportunityTypeEnum?\n aiWorkflowId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n // Relation to the phase\n phase Phase @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([phaseId])\n @@index([challengeId, phaseId])\n}\n\n//////////////////////////////////////////\n// DefaultChallengeReviewer model – default reviewers by type and track\n//////////////////////////////////////////\n\nmodel DefaultChallengeReviewer {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String?\n // Reviewer configuration (mirrors ChallengeReviewer)\n scorecardId String?\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseName String\n // Optional explicit link to Phase for better fidelity\n phaseId String?\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n opportunityType ReviewOpportunityTypeEnum?\n aiConfigTemplateId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relations\n challengeType ChallengeType @relation(fields: [typeId], references: [id])\n challengeTrack ChallengeTrack @relation(fields: [trackId], references: [id])\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n // Relation to Phase (optional for backward compatibility with phaseName)\n phase Phase? @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([typeId, trackId])\n @@index([typeId, trackId, timelineTemplateId])\n @@index([phaseId])\n}\n\n//////////////////////////////////////////\n// TimelineTemplate model – defines timeline templates\n//////////////////////////////////////////\nmodel TimelineTemplate {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n phases TimelineTemplatePhase[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Opposite relation field, linking back to ChallengeTimelineTemplate.\n challengeTimelineTemplates ChallengeTimelineTemplate[]\n\n // Opposite relation field for Challenge.\n challenges Challenge[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\n//////////////////////////////////////////\n// TimelineTemplatePhase model – phases associated with a timeline template\n//////////////////////////////////////////\nmodel TimelineTemplatePhase {\n id String @id @default(uuid())\n timelineTemplateId String\n phaseId String // identifier for the phase\n predecessor String? // optional predecessor phase id\n defaultDuration Int // duration (in minutes, hours, etc.) as per business rules\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id], onDelete: Cascade)\n\n @@index([timelineTemplateId])\n @@index([timelineTemplateId, phaseId])\n}\n", - "inlineSchemaHash": "013c60d710a175acc08038f512b16e5030bd0c3b8ccf59cb118c7e55c66e6caf", + "inlineSchema": "datasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/challenge-prisma-client\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\n// Enum for allowed challenge track values (matches app-constants)\nenum ChallengeTrackEnum {\n DESIGN\n DATA_SCIENCE\n DEVELOPMENT\n QUALITY_ASSURANCE\n}\n\nenum ReviewTypeEnum {\n COMMUNITY\n INTERNAL\n SYSTEM\n PROVISIONAL\n EXAMPLE\n}\n\nenum DiscussionTypeEnum {\n CHALLENGE\n}\n\nenum ChallengeStatusEnum {\n NEW\n DRAFT\n APPROVED\n ACTIVE\n COMPLETED\n DELETED\n CANCELLED\n CANCELLED_FAILED_REVIEW\n CANCELLED_FAILED_SCREENING\n CANCELLED_ZERO_SUBMISSIONS\n CANCELLED_WINNER_UNRESPONSIVE\n CANCELLED_CLIENT_REQUEST\n CANCELLED_REQUIREMENTS_INFEASIBLE\n CANCELLED_ZERO_REGISTRATIONS\n CANCELLED_PAYMENT_FAILED\n}\n\nenum PrizeSetTypeEnum {\n PLACEMENT\n COPILOT\n REVIEWER\n PASSED_REVIEW\n CHECKPOINT\n}\n\n// Enum for review opportunity types on reviewers\nenum ReviewOpportunityTypeEnum {\n REGULAR_REVIEW\n COMPONENT_DEV_REVIEW\n SPEC_REVIEW\n ITERATIVE_REVIEW\n SCENARIOS_REVIEW\n}\n\n//////////////////////////////////////////\n// Main Challenge model\n//////////////////////////////////////////\n\nmodel Challenge {\n id String @id @default(uuid())\n name String\n description String?\n privateDescription String?\n challengeSource String?\n descriptionFormat String?\n projectId Int? // frequently queried field\n typeId String\n trackId String // FK for relation in ChallengeTrack\n timelineTemplateId String? // now used as foreign key to ChallengeTimelineTemplate\n overviewTotalPrizes Float? // stored from overview.totalPrizes\n numOfRegistrants Int @default(0)\n numOfSubmissions Int @default(0)\n numOfCheckpointSubmissions Int @default(0)\n currentPhaseNames String[] // current phase names\n\n wiproAllowed Boolean @default(false)\n funChallenge Boolean @default(false)\n\n // simple arrays for tags and groups (PostgreSQL native array type)\n tags String[]\n groups String[]\n\n // Task information (flattened from challenge.task)\n taskIsTask Boolean @default(false)\n taskIsAssigned Boolean @default(false)\n taskMemberId String?\n\n // Dates for challenge lifecycle\n submissionStartDate DateTime?\n submissionEndDate DateTime?\n registrationStartDate DateTime?\n registrationEndDate DateTime?\n startDate DateTime?\n endDate DateTime?\n\n // Normalized billing and legacy information (one-to-one)\n billingRecord ChallengeBilling?\n legacyId Int? // Legacy system ID for searching\n legacyRecord ChallengeLegacy? @relation(\"ChallengeLegacyRelation\")\n\n // Additional fields from createChallenge schema\n status ChallengeStatusEnum @default(NEW) // new challenges default to status \"New\"\n // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge\n constraintRecord ChallengeConstraint?\n\n // Additional normalized relations from createChallenge\n events ChallengeEvent[]\n discussions ChallengeDiscussion[]\n\n // Existing relations (one-to-many) for challenge metadata, phases, prize sets, winners, attachments,\n // terms and skills\n metadata ChallengeMetadata[]\n phases ChallengePhase[]\n prizeSets ChallengePrizeSet[]\n reviewers ChallengeReviewer[]\n winners ChallengeWinner[]\n attachments Attachment[]\n terms ChallengeTerm[]\n skills ChallengeSkill[]\n auditLogs AuditLog[]\n memberAccesses MemberChallengeAccess[]\n userWhitelist ChallengeUserWhitelist[]\n\n // Relation to ChallengeType (FK: typeId)\n type ChallengeType @relation(fields: [typeId], references: [id])\n // Relation to ChallengeTrack (FK: trackId)\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n\n // Auditing fields (present in every table)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([projectId])\n @@index([status]) // index added for optimized search by status\n @@index([createdAt])\n @@index([updatedAt])\n @@index([typeId])\n @@index([trackId])\n @@index([groups], type: Gin, map: \"challenge_groups_gin_idx\")\n @@index([submissionStartDate])\n @@index([submissionEndDate])\n @@index([registrationStartDate])\n @@index([registrationEndDate])\n @@index([startDate])\n @@index([endDate])\n @@index([status, startDate])\n @@index([trackId, typeId, status])\n @@index([status, typeId, trackId, createdAt(sort: Desc)], map: \"challenge_status_type_track_created_at_idx\")\n @@index([legacyId])\n @@index([projectId, status])\n}\n\n//////////////////////////////////////////\n// Challenge user whitelist - member/challenge pairs allowed to access restricted challenges\n//////////////////////////////////////////\n\nmodel ChallengeUserWhitelist {\n challengeId String\n userId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n @@id([challengeId, userId])\n @@index([challengeId])\n @@index([userId])\n}\n\n//////////////////////////////////////////\n// MemberChallengeAccess view – member/challenge pairs from resources schema\n//////////////////////////////////////////\n\nview MemberChallengeAccess {\n challengeId String\n memberId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id])\n\n @@map(\"MemberChallengeAccess\")\n}\n\n//////////////////////////////////////////\n// ChallengeType model\n//////////////////////////////////////////\n\nmodel ChallengeType {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n isTask Boolean @default(false)\n abbreviation String\n legacyId Int?\n isLegacy Boolean @default(false)\n\n challenges Challenge[]\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this type\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([abbreviation])\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTrack model\n//////////////////////////////////////////\n\nmodel ChallengeTrack {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean\n abbreviation String\n legacyId Int? // numeric legacy system id (if provided)\n track ChallengeTrackEnum? // enum value from ChallengeTrackEnum\n isLegacy Boolean @default(false)\n challenges Challenge[]\n // Opposite relation for ChallengeTimelineTemplate\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this track\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTimelineTemplate model\n//////////////////////////////////////////\n\nmodel ChallengeTimelineTemplate {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String // now required per Swagger spec\n\n // Link to the TimelineTemplate model via timelineTemplateId.\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id])\n // Link to the ChallengeTrack model via trackId.\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n // Link to the ChallengeType model via typeId.\n type ChallengeType @relation(fields: [typeId], references: [id])\n\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Composite index to support searches/updates by typeId, trackId and timelineTemplateId.\n @@index([typeId, trackId, timelineTemplateId])\n}\n\n//////////////////////////////////////////\n// AuditLog model – tracks field changes\n//////////////////////////////////////////\n\nmodel AuditLog {\n id String @id @default(uuid())\n challengeId String? // optional association with a challenge\n fieldName String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n createdBy String\n memberId String?\n\n // Relation field to connect AuditLog to Challenge.\n challenge Challenge? @relation(fields: [challengeId], references: [id])\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Attachment model – for challenge attachments\n//////////////////////////////////////////\n\nmodel Attachment {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String\n fileSize Int\n url String\n description String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeMetadata model – key/value metadata\n//////////////////////////////////////////\n\nmodel ChallengeMetadata {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String // name of the metadata\n value String // value stored as string for flexibility\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Prize model – individual prize in a prize set\n//////////////////////////////////////////\n\nmodel Prize {\n id String @id @default(uuid())\n description String?\n prizeSet ChallengePrizeSet @relation(fields: [prizeSetId], references: [id], onDelete: Cascade)\n prizeSetId String\n type String // e.g. \"USD\", \"POINT\" (could also be converted to enum later)\n value Float\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeWinner model – record winners for a challenge\n//////////////////////////////////////////\n\nmodel ChallengeWinner {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n userId Int\n handle String\n placement Int\n type PrizeSetTypeEnum\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type, placement])\n}\n\n//////////////////////////////////////////\n// ChallengeTerm model – association of challenge and terms\n//////////////////////////////////////////\n\nmodel ChallengeTerm {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n termId String // Terms API id\n roleId String // UUID for the associated role\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeSkill model – linking challenges with skills\n//////////////////////////////////////////\n\nmodel ChallengeSkill {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n skillId String // Request provided skillId\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeBilling model – normalized billing info\n//////////////////////////////////////////\n\nmodel ChallengeBilling {\n id String @id @default(uuid())\n billingAccountId String?\n markup Float? // in range [0, 100]\n clientBillingRate Float? // in range [0, 100]. Supporting range on postgres is an open issue with prisma https://github.com/prisma/prisma/issues/3287.\n challengeId String @unique\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeLegacy model – normalized legacy info\n//////////////////////////////////////////\n\nmodel ChallengeLegacy {\n id String @id @default(uuid())\n reviewType ReviewTypeEnum @default(INTERNAL)\n confidentialityType String @default(\"public\")\n forumId Int?\n directProjectId Int?\n screeningScorecardId Int?\n reviewScorecardId Int?\n isTask Boolean @default(false)\n useSchedulingAPI Boolean @default(false)\n pureV5Task Boolean @default(false)\n pureV5 Boolean @default(false)\n selfService Boolean @default(false)\n selfServiceCopilot String?\n track String? // as provided in the legacy object\n subTrack String? // as provided in the legacy object\n legacySystemId Int? // represents the external \"legacyId\"\n challengeId String @unique\n challenge Challenge @relation(\"ChallengeLegacyRelation\", fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeEvent model – normalized challenge events\n//////////////////////////////////////////\n\nmodel ChallengeEvent {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n eventId Int\n name String?\n key String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeDiscussion and associated options – normalized discussion channels\n//////////////////////////////////////////\n\nmodel ChallengeDiscussion {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n discussionId String?\n name String\n type DiscussionTypeEnum // updated to use enum\n provider String\n url String?\n options ChallengeDiscussionOption[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\nmodel ChallengeDiscussionOption {\n id String @id @default(uuid())\n discussion ChallengeDiscussion @relation(fields: [discussionId], references: [id], onDelete: Cascade)\n discussionId String\n optionKey String\n optionValue String\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeConstraint model – top-level challenge constraints (e.g. allowed registrants)\n//////////////////////////////////////////\n\nmodel ChallengeConstraint {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String @unique\n allowedRegistrants String[] @default([])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhase – to capture per-phase info from create/update challenge operations\n// Each phase is linked with a challenge and holds a duration and any custom constraints.\n//////////////////////////////////////////\n\nmodel Phase {\n id String @id @default(uuid())\n name String\n description String?\n isOpen Boolean\n duration Int\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Inverse relation for associated challenge phases\n challengePhases ChallengePhase[]\n ChallengeReviewer ChallengeReviewer[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\nmodel ChallengePhase {\n id String @id @default(uuid())\n challengeId String\n phaseId String // foreign key to Phase\n\n name String // phase name\n description String? // description\n isOpen Boolean? @default(false) // if this phase is open\n predecessor String? // predecessor of this phase\n duration Int? // duration in seconds\n scheduledStartDate DateTime? // when the phase is scheduled to start\n scheduledEndDate DateTime?\n actualStartDate DateTime?\n actualEndDate DateTime? // when the phase actually ended\n constraints ChallengePhaseConstraint[]\n\n // Relation fields\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n phase Phase @relation(fields: [phaseId], references: [id])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, isOpen])\n @@index([challengeId, name])\n @@index([challengeId, isOpen, scheduledEndDate, actualEndDate], map: \"challenge_phase_challenge_open_end_idx\")\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhaseConstraint – to capture custom constraints for each phase\n//////////////////////////////////////////\n\nmodel ChallengePhaseConstraint {\n id String @id @default(uuid())\n challengePhaseId String\n name String // the name/key of the constraint\n value Int // numeric value of the constraint (can be changed to Float if needed)\n\n // Relation to the phase\n challengePhase ChallengePhase @relation(fields: [challengePhaseId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengePhaseId])\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePrizeSet – to group prizes for a challenge\n//////////////////////////////////////////\n\nmodel ChallengePrizeSet {\n id String @id @default(uuid())\n challengeId String\n type PrizeSetTypeEnum // using enum instead of string\n description String?\n prizes Prize[]\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type])\n}\n\n//////////////////////////////////////////\n// ChallengeReviewer model – reviewers for a challenge, both AI and member\n//////////////////////////////////////////\n\nmodel ChallengeReviewer {\n id String @id @default(uuid())\n challengeId String\n\n // Reviewer configuration\n scorecardId String\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseId String\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n type ReviewOpportunityTypeEnum?\n aiWorkflowId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n // Relation to the phase\n phase Phase @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([phaseId])\n @@index([challengeId, phaseId])\n}\n\n//////////////////////////////////////////\n// DefaultChallengeReviewer model – default reviewers by type and track\n//////////////////////////////////////////\n\nmodel DefaultChallengeReviewer {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String?\n // Reviewer configuration (mirrors ChallengeReviewer)\n scorecardId String?\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseName String\n // Optional explicit link to Phase for better fidelity\n phaseId String?\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n opportunityType ReviewOpportunityTypeEnum?\n aiConfigTemplateId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relations\n challengeType ChallengeType @relation(fields: [typeId], references: [id])\n challengeTrack ChallengeTrack @relation(fields: [trackId], references: [id])\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n // Relation to Phase (optional for backward compatibility with phaseName)\n phase Phase? @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([typeId, trackId])\n @@index([typeId, trackId, timelineTemplateId])\n @@index([phaseId])\n}\n\n//////////////////////////////////////////\n// TimelineTemplate model – defines timeline templates\n//////////////////////////////////////////\nmodel TimelineTemplate {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n phases TimelineTemplatePhase[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Opposite relation field, linking back to ChallengeTimelineTemplate.\n challengeTimelineTemplates ChallengeTimelineTemplate[]\n\n // Opposite relation field for Challenge.\n challenges Challenge[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\n//////////////////////////////////////////\n// TimelineTemplatePhase model – phases associated with a timeline template\n//////////////////////////////////////////\nmodel TimelineTemplatePhase {\n id String @id @default(uuid())\n timelineTemplateId String\n phaseId String // identifier for the phase\n predecessor String? // optional predecessor phase id\n defaultDuration Int // duration (in minutes, hours, etc.) as per business rules\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id], onDelete: Cascade)\n\n @@index([timelineTemplateId])\n @@index([timelineTemplateId, phaseId])\n}\n", + "inlineSchemaHash": "6753f3f63bc1895caf833af5127cc8a05e8be5541a69a7584ca96249e47fe064", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"Challenge\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privateDescription\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeSource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"descriptionFormat\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"projectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"overviewTotalPrizes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfRegistrants\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfCheckpointSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentPhaseNames\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wiproAllowed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"funChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tags\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"groups\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsAssigned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskMemberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeBilling\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeLegacy\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ChallengeStatusEnum\",\"nativeType\":null,\"default\":\"NEW\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraintRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeConstraint\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeEvent\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"metadata\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeMetadata\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSets\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winners\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeWinner\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attachments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Attachment\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"terms\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTerm\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skills\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeSkill\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"auditLogs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuditLog\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberAccesses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MemberChallengeAccess\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeType\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTrack\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrackEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuditLog\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"newValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Attachment\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileSize\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeMetadata\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Prize\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSet\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[\"prizeSetId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSetId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeWinner\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"handle\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"placement\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTerm\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"termId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeSkill\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skillId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeBilling\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"markup\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientBillingRate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeLegacy\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ReviewTypeEnum\",\"nativeType\":null,\"default\":\"INTERNAL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confidentialityType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"public\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"forumId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"directProjectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"screeningScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"useSchedulingAPI\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5Task\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfService\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfServiceCopilot\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subTrack\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacySystemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeEvent\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussion\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DiscussionTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"options\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussionOption\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussionOption\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussion\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[\"discussionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"allowedRegistrants\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Phase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false},\"ChallengePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraints\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhaseConstraint\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePhaseConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[\"challengePhaseId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePrizeSet\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Prize\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiWorkflowId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DefaultChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opportunityType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiConfigTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeType\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTrack\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplatePhase\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTimelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"TimelineTemplatePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultDuration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"MemberChallengeAccess\":{\"dbName\":\"MemberChallengeAccess\",\"schema\":null,\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"ChallengeTrackEnum\":{\"values\":[{\"name\":\"DESIGN\",\"dbName\":null},{\"name\":\"DATA_SCIENCE\",\"dbName\":null},{\"name\":\"DEVELOPMENT\",\"dbName\":null},{\"name\":\"QUALITY_ASSURANCE\",\"dbName\":null}],\"dbName\":null},\"ReviewTypeEnum\":{\"values\":[{\"name\":\"COMMUNITY\",\"dbName\":null},{\"name\":\"INTERNAL\",\"dbName\":null},{\"name\":\"SYSTEM\",\"dbName\":null},{\"name\":\"PROVISIONAL\",\"dbName\":null},{\"name\":\"EXAMPLE\",\"dbName\":null}],\"dbName\":null},\"DiscussionTypeEnum\":{\"values\":[{\"name\":\"CHALLENGE\",\"dbName\":null}],\"dbName\":null},\"ChallengeStatusEnum\":{\"values\":[{\"name\":\"NEW\",\"dbName\":null},{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"APPROVED\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null},{\"name\":\"DELETED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_REVIEW\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_SCREENING\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_SUBMISSIONS\",\"dbName\":null},{\"name\":\"CANCELLED_WINNER_UNRESPONSIVE\",\"dbName\":null},{\"name\":\"CANCELLED_CLIENT_REQUEST\",\"dbName\":null},{\"name\":\"CANCELLED_REQUIREMENTS_INFEASIBLE\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_REGISTRATIONS\",\"dbName\":null},{\"name\":\"CANCELLED_PAYMENT_FAILED\",\"dbName\":null}],\"dbName\":null},\"PrizeSetTypeEnum\":{\"values\":[{\"name\":\"PLACEMENT\",\"dbName\":null},{\"name\":\"COPILOT\",\"dbName\":null},{\"name\":\"REVIEWER\",\"dbName\":null},{\"name\":\"PASSED_REVIEW\",\"dbName\":null},{\"name\":\"CHECKPOINT\",\"dbName\":null}],\"dbName\":null},\"ReviewOpportunityTypeEnum\":{\"values\":[{\"name\":\"REGULAR_REVIEW\",\"dbName\":null},{\"name\":\"COMPONENT_DEV_REVIEW\",\"dbName\":null},{\"name\":\"SPEC_REVIEW\",\"dbName\":null},{\"name\":\"ITERATIVE_REVIEW\",\"dbName\":null},{\"name\":\"SCENARIOS_REVIEW\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Challenge\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privateDescription\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeSource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"descriptionFormat\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"projectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"overviewTotalPrizes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfRegistrants\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfCheckpointSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentPhaseNames\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wiproAllowed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"funChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tags\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"groups\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsAssigned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskMemberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeBilling\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeLegacy\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ChallengeStatusEnum\",\"nativeType\":null,\"default\":\"NEW\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraintRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeConstraint\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeEvent\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"metadata\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeMetadata\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSets\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winners\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeWinner\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attachments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Attachment\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"terms\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTerm\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skills\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeSkill\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"auditLogs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuditLog\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberAccesses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MemberChallengeAccess\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userWhitelist\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeUserWhitelist\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeUserWhitelist\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeUserWhitelist\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeUserWhitelist\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"challengeId\",\"userId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeType\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTrack\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrackEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuditLog\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"newValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Attachment\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileSize\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeMetadata\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Prize\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSet\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[\"prizeSetId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSetId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeWinner\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"handle\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"placement\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTerm\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"termId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeSkill\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skillId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeBilling\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"markup\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientBillingRate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeLegacy\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ReviewTypeEnum\",\"nativeType\":null,\"default\":\"INTERNAL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confidentialityType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"public\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"forumId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"directProjectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"screeningScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"useSchedulingAPI\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5Task\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfService\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfServiceCopilot\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subTrack\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacySystemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeEvent\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussion\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DiscussionTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"options\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussionOption\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussionOption\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussion\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[\"discussionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"allowedRegistrants\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Phase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false},\"ChallengePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraints\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhaseConstraint\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePhaseConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[\"challengePhaseId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePrizeSet\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Prize\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiWorkflowId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DefaultChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opportunityType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiConfigTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeType\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTrack\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplatePhase\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTimelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"TimelineTemplatePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultDuration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"MemberChallengeAccess\":{\"dbName\":\"MemberChallengeAccess\",\"schema\":null,\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"ChallengeTrackEnum\":{\"values\":[{\"name\":\"DESIGN\",\"dbName\":null},{\"name\":\"DATA_SCIENCE\",\"dbName\":null},{\"name\":\"DEVELOPMENT\",\"dbName\":null},{\"name\":\"QUALITY_ASSURANCE\",\"dbName\":null}],\"dbName\":null},\"ReviewTypeEnum\":{\"values\":[{\"name\":\"COMMUNITY\",\"dbName\":null},{\"name\":\"INTERNAL\",\"dbName\":null},{\"name\":\"SYSTEM\",\"dbName\":null},{\"name\":\"PROVISIONAL\",\"dbName\":null},{\"name\":\"EXAMPLE\",\"dbName\":null}],\"dbName\":null},\"DiscussionTypeEnum\":{\"values\":[{\"name\":\"CHALLENGE\",\"dbName\":null}],\"dbName\":null},\"ChallengeStatusEnum\":{\"values\":[{\"name\":\"NEW\",\"dbName\":null},{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"APPROVED\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null},{\"name\":\"DELETED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_REVIEW\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_SCREENING\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_SUBMISSIONS\",\"dbName\":null},{\"name\":\"CANCELLED_WINNER_UNRESPONSIVE\",\"dbName\":null},{\"name\":\"CANCELLED_CLIENT_REQUEST\",\"dbName\":null},{\"name\":\"CANCELLED_REQUIREMENTS_INFEASIBLE\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_REGISTRATIONS\",\"dbName\":null},{\"name\":\"CANCELLED_PAYMENT_FAILED\",\"dbName\":null}],\"dbName\":null},\"PrizeSetTypeEnum\":{\"values\":[{\"name\":\"PLACEMENT\",\"dbName\":null},{\"name\":\"COPILOT\",\"dbName\":null},{\"name\":\"REVIEWER\",\"dbName\":null},{\"name\":\"PASSED_REVIEW\",\"dbName\":null},{\"name\":\"CHECKPOINT\",\"dbName\":null}],\"dbName\":null},\"ReviewOpportunityTypeEnum\":{\"values\":[{\"name\":\"REGULAR_REVIEW\",\"dbName\":null},{\"name\":\"COMPONENT_DEV_REVIEW\",\"dbName\":null},{\"name\":\"SPEC_REVIEW\",\"dbName\":null},{\"name\":\"ITERATIVE_REVIEW\",\"dbName\":null},{\"name\":\"SCENARIOS_REVIEW\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined config.compilerWasm = undefined diff --git a/packages/challenge-prisma-client/index-browser.js b/packages/challenge-prisma-client/index-browser.js index 24545d3..a5e965e 100644 --- a/packages/challenge-prisma-client/index-browser.js +++ b/packages/challenge-prisma-client/index-browser.js @@ -158,6 +158,11 @@ exports.Prisma.ChallengeScalarFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistScalarFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeScalarFieldEnum = { id: 'id', name: 'name', @@ -519,6 +524,11 @@ exports.Prisma.ChallengeOrderByRelevanceFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistOrderByRelevanceFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeOrderByRelevanceFieldEnum = { id: 'id', name: 'name', @@ -799,6 +809,7 @@ exports.ReviewOpportunityTypeEnum = exports.$Enums.ReviewOpportunityTypeEnum = { exports.Prisma.ModelName = { Challenge: 'Challenge', + ChallengeUserWhitelist: 'ChallengeUserWhitelist', ChallengeType: 'ChallengeType', ChallengeTrack: 'ChallengeTrack', ChallengeTimelineTemplate: 'ChallengeTimelineTemplate', diff --git a/packages/challenge-prisma-client/index.d.ts b/packages/challenge-prisma-client/index.d.ts index c9c10e0..4e1855b 100644 --- a/packages/challenge-prisma-client/index.d.ts +++ b/packages/challenge-prisma-client/index.d.ts @@ -18,6 +18,11 @@ export type PrismaPromise = $Public.PrismaPromise * */ export type Challenge = $Result.DefaultSelection +/** + * Model ChallengeUserWhitelist + * + */ +export type ChallengeUserWhitelist = $Result.DefaultSelection /** * Model ChallengeType * @@ -374,6 +379,16 @@ export class PrismaClient< */ get challenge(): Prisma.ChallengeDelegate; + /** + * `prisma.challengeUserWhitelist`: Exposes CRUD operations for the **ChallengeUserWhitelist** model. + * Example usage: + * ```ts + * // Fetch zero or more ChallengeUserWhitelists + * const challengeUserWhitelists = await prisma.challengeUserWhitelist.findMany() + * ``` + */ + get challengeUserWhitelist(): Prisma.ChallengeUserWhitelistDelegate; + /** * `prisma.challengeType`: Exposes CRUD operations for the **ChallengeType** model. * Example usage: @@ -1065,6 +1080,7 @@ export namespace Prisma { export const ModelName: { Challenge: 'Challenge', + ChallengeUserWhitelist: 'ChallengeUserWhitelist', ChallengeType: 'ChallengeType', ChallengeTrack: 'ChallengeTrack', ChallengeTimelineTemplate: 'ChallengeTimelineTemplate', @@ -1108,7 +1124,7 @@ export namespace Prisma { omit: GlobalOmitOptions } meta: { - modelProps: "challenge" | "challengeType" | "challengeTrack" | "challengeTimelineTemplate" | "auditLog" | "attachment" | "challengeMetadata" | "prize" | "challengeWinner" | "challengeTerm" | "challengeSkill" | "challengeBilling" | "challengeLegacy" | "challengeEvent" | "challengeDiscussion" | "challengeDiscussionOption" | "challengeConstraint" | "phase" | "challengePhase" | "challengePhaseConstraint" | "challengePrizeSet" | "challengeReviewer" | "defaultChallengeReviewer" | "timelineTemplate" | "timelineTemplatePhase" | "memberChallengeAccess" + modelProps: "challenge" | "challengeUserWhitelist" | "challengeType" | "challengeTrack" | "challengeTimelineTemplate" | "auditLog" | "attachment" | "challengeMetadata" | "prize" | "challengeWinner" | "challengeTerm" | "challengeSkill" | "challengeBilling" | "challengeLegacy" | "challengeEvent" | "challengeDiscussion" | "challengeDiscussionOption" | "challengeConstraint" | "phase" | "challengePhase" | "challengePhaseConstraint" | "challengePrizeSet" | "challengeReviewer" | "defaultChallengeReviewer" | "timelineTemplate" | "timelineTemplatePhase" | "memberChallengeAccess" txIsolationLevel: Prisma.TransactionIsolationLevel } model: { @@ -1186,6 +1202,80 @@ export namespace Prisma { } } } + ChallengeUserWhitelist: { + payload: Prisma.$ChallengeUserWhitelistPayload + fields: Prisma.ChallengeUserWhitelistFieldRefs + operations: { + findUnique: { + args: Prisma.ChallengeUserWhitelistFindUniqueArgs + result: $Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.ChallengeUserWhitelistFindUniqueOrThrowArgs + result: $Utils.PayloadToResult + } + findFirst: { + args: Prisma.ChallengeUserWhitelistFindFirstArgs + result: $Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.ChallengeUserWhitelistFindFirstOrThrowArgs + result: $Utils.PayloadToResult + } + findMany: { + args: Prisma.ChallengeUserWhitelistFindManyArgs + result: $Utils.PayloadToResult[] + } + create: { + args: Prisma.ChallengeUserWhitelistCreateArgs + result: $Utils.PayloadToResult + } + createMany: { + args: Prisma.ChallengeUserWhitelistCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.ChallengeUserWhitelistCreateManyAndReturnArgs + result: $Utils.PayloadToResult[] + } + delete: { + args: Prisma.ChallengeUserWhitelistDeleteArgs + result: $Utils.PayloadToResult + } + update: { + args: Prisma.ChallengeUserWhitelistUpdateArgs + result: $Utils.PayloadToResult + } + deleteMany: { + args: Prisma.ChallengeUserWhitelistDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.ChallengeUserWhitelistUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.ChallengeUserWhitelistUpdateManyAndReturnArgs + result: $Utils.PayloadToResult[] + } + upsert: { + args: Prisma.ChallengeUserWhitelistUpsertArgs + result: $Utils.PayloadToResult + } + aggregate: { + args: Prisma.ChallengeUserWhitelistAggregateArgs + result: $Utils.Optional + } + groupBy: { + args: Prisma.ChallengeUserWhitelistGroupByArgs + result: $Utils.Optional[] + } + count: { + args: Prisma.ChallengeUserWhitelistCountArgs + result: $Utils.Optional | number + } + } + } ChallengeType: { payload: Prisma.$ChallengeTypePayload fields: Prisma.ChallengeTypeFieldRefs @@ -3089,6 +3179,7 @@ export namespace Prisma { } export type GlobalOmitConfig = { challenge?: ChallengeOmit + challengeUserWhitelist?: ChallengeUserWhitelistOmit challengeType?: ChallengeTypeOmit challengeTrack?: ChallengeTrackOmit challengeTimelineTemplate?: ChallengeTimelineTemplateOmit @@ -3206,6 +3297,7 @@ export namespace Prisma { skills: number auditLogs: number memberAccesses: number + userWhitelist: number } export type ChallengeCountOutputTypeSelect = { @@ -3221,6 +3313,7 @@ export namespace Prisma { skills?: boolean | ChallengeCountOutputTypeCountSkillsArgs auditLogs?: boolean | ChallengeCountOutputTypeCountAuditLogsArgs memberAccesses?: boolean | ChallengeCountOutputTypeCountMemberAccessesArgs + userWhitelist?: boolean | ChallengeCountOutputTypeCountUserWhitelistArgs } // Custom InputTypes @@ -3318,6 +3411,13 @@ export namespace Prisma { where?: MemberChallengeAccessWhereInput } + /** + * ChallengeCountOutputType without action + */ + export type ChallengeCountOutputTypeCountUserWhitelistArgs = { + where?: ChallengeUserWhitelistWhereInput + } + /** * Count Type ChallengeTypeCountOutputType @@ -4074,6 +4174,7 @@ export namespace Prisma { skills?: boolean | Challenge$skillsArgs auditLogs?: boolean | Challenge$auditLogsArgs memberAccesses?: boolean | Challenge$memberAccessesArgs + userWhitelist?: boolean | Challenge$userWhitelistArgs type?: boolean | ChallengeTypeDefaultArgs track?: boolean | ChallengeTrackDefaultArgs timelineTemplate?: boolean | Challenge$timelineTemplateArgs @@ -4214,6 +4315,7 @@ export namespace Prisma { skills?: boolean | Challenge$skillsArgs auditLogs?: boolean | Challenge$auditLogsArgs memberAccesses?: boolean | Challenge$memberAccessesArgs + userWhitelist?: boolean | Challenge$userWhitelistArgs type?: boolean | ChallengeTypeDefaultArgs track?: boolean | ChallengeTrackDefaultArgs timelineTemplate?: boolean | Challenge$timelineTemplateArgs @@ -4248,6 +4350,7 @@ export namespace Prisma { skills: Prisma.$ChallengeSkillPayload[] auditLogs: Prisma.$AuditLogPayload[] memberAccesses: Prisma.$MemberChallengeAccessPayload[] + userWhitelist: Prisma.$ChallengeUserWhitelistPayload[] type: Prisma.$ChallengeTypePayload track: Prisma.$ChallengeTrackPayload timelineTemplate: Prisma.$TimelineTemplatePayload | null @@ -4696,6 +4799,7 @@ export namespace Prisma { skills = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> auditLogs = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> memberAccesses = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> + userWhitelist = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> type = {}>(args?: Subset>): Prisma__ChallengeTypeClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> track = {}>(args?: Subset>): Prisma__ChallengeTrackClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> timelineTemplate = {}>(args?: Subset>): Prisma__TimelineTemplateClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> @@ -5501,6 +5605,30 @@ export namespace Prisma { distinct?: MemberChallengeAccessScalarFieldEnum | MemberChallengeAccessScalarFieldEnum[] } + /** + * Challenge.userWhitelist + */ + export type Challenge$userWhitelistArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + where?: ChallengeUserWhitelistWhereInput + orderBy?: ChallengeUserWhitelistOrderByWithRelationInput | ChallengeUserWhitelistOrderByWithRelationInput[] + cursor?: ChallengeUserWhitelistWhereUniqueInput + take?: number + skip?: number + distinct?: ChallengeUserWhitelistScalarFieldEnum | ChallengeUserWhitelistScalarFieldEnum[] + } + /** * Challenge.timelineTemplate */ @@ -5539,6 +5667,1025 @@ export namespace Prisma { } + /** + * Model ChallengeUserWhitelist + */ + + export type AggregateChallengeUserWhitelist = { + _count: ChallengeUserWhitelistCountAggregateOutputType | null + _min: ChallengeUserWhitelistMinAggregateOutputType | null + _max: ChallengeUserWhitelistMaxAggregateOutputType | null + } + + export type ChallengeUserWhitelistMinAggregateOutputType = { + challengeId: string | null + userId: string | null + } + + export type ChallengeUserWhitelistMaxAggregateOutputType = { + challengeId: string | null + userId: string | null + } + + export type ChallengeUserWhitelistCountAggregateOutputType = { + challengeId: number + userId: number + _all: number + } + + + export type ChallengeUserWhitelistMinAggregateInputType = { + challengeId?: true + userId?: true + } + + export type ChallengeUserWhitelistMaxAggregateInputType = { + challengeId?: true + userId?: true + } + + export type ChallengeUserWhitelistCountAggregateInputType = { + challengeId?: true + userId?: true + _all?: true + } + + export type ChallengeUserWhitelistAggregateArgs = { + /** + * Filter which ChallengeUserWhitelist to aggregate. + */ + where?: ChallengeUserWhitelistWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeUserWhitelists to fetch. + */ + orderBy?: ChallengeUserWhitelistOrderByWithRelationInput | ChallengeUserWhitelistOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: ChallengeUserWhitelistWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeUserWhitelists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeUserWhitelists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned ChallengeUserWhitelists + **/ + _count?: true | ChallengeUserWhitelistCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: ChallengeUserWhitelistMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: ChallengeUserWhitelistMaxAggregateInputType + } + + export type GetChallengeUserWhitelistAggregateType = { + [P in keyof T & keyof AggregateChallengeUserWhitelist]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : GetScalarType + : GetScalarType + } + + + + + export type ChallengeUserWhitelistGroupByArgs = { + where?: ChallengeUserWhitelistWhereInput + orderBy?: ChallengeUserWhitelistOrderByWithAggregationInput | ChallengeUserWhitelistOrderByWithAggregationInput[] + by: ChallengeUserWhitelistScalarFieldEnum[] | ChallengeUserWhitelistScalarFieldEnum + having?: ChallengeUserWhitelistScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: ChallengeUserWhitelistCountAggregateInputType | true + _min?: ChallengeUserWhitelistMinAggregateInputType + _max?: ChallengeUserWhitelistMaxAggregateInputType + } + + export type ChallengeUserWhitelistGroupByOutputType = { + challengeId: string + userId: string + _count: ChallengeUserWhitelistCountAggregateOutputType | null + _min: ChallengeUserWhitelistMinAggregateOutputType | null + _max: ChallengeUserWhitelistMaxAggregateOutputType | null + } + + type GetChallengeUserWhitelistGroupByPayload = Prisma.PrismaPromise< + Array< + PickEnumerable & + { + [P in ((keyof T) & (keyof ChallengeUserWhitelistGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : GetScalarType + : GetScalarType + } + > + > + + + export type ChallengeUserWhitelistSelect = $Extensions.GetSelect<{ + challengeId?: boolean + userId?: boolean + challenge?: boolean | ChallengeDefaultArgs + }, ExtArgs["result"]["challengeUserWhitelist"]> + + export type ChallengeUserWhitelistSelectCreateManyAndReturn = $Extensions.GetSelect<{ + challengeId?: boolean + userId?: boolean + challenge?: boolean | ChallengeDefaultArgs + }, ExtArgs["result"]["challengeUserWhitelist"]> + + export type ChallengeUserWhitelistSelectUpdateManyAndReturn = $Extensions.GetSelect<{ + challengeId?: boolean + userId?: boolean + challenge?: boolean | ChallengeDefaultArgs + }, ExtArgs["result"]["challengeUserWhitelist"]> + + export type ChallengeUserWhitelistSelectScalar = { + challengeId?: boolean + userId?: boolean + } + + export type ChallengeUserWhitelistOmit = $Extensions.GetOmit<"challengeId" | "userId", ExtArgs["result"]["challengeUserWhitelist"]> + export type ChallengeUserWhitelistInclude = { + challenge?: boolean | ChallengeDefaultArgs + } + export type ChallengeUserWhitelistIncludeCreateManyAndReturn = { + challenge?: boolean | ChallengeDefaultArgs + } + export type ChallengeUserWhitelistIncludeUpdateManyAndReturn = { + challenge?: boolean | ChallengeDefaultArgs + } + + export type $ChallengeUserWhitelistPayload = { + name: "ChallengeUserWhitelist" + objects: { + challenge: Prisma.$ChallengePayload + } + scalars: $Extensions.GetPayloadResult<{ + challengeId: string + userId: string + }, ExtArgs["result"]["challengeUserWhitelist"]> + composites: {} + } + + type ChallengeUserWhitelistGetPayload = $Result.GetResult + + type ChallengeUserWhitelistCountArgs = + Omit & { + select?: ChallengeUserWhitelistCountAggregateInputType | true + } + + export interface ChallengeUserWhitelistDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['ChallengeUserWhitelist'], meta: { name: 'ChallengeUserWhitelist' } } + /** + * Find zero or one ChallengeUserWhitelist that matches the filter. + * @param {ChallengeUserWhitelistFindUniqueArgs} args - Arguments to find a ChallengeUserWhitelist + * @example + * // Get one ChallengeUserWhitelist + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one ChallengeUserWhitelist that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {ChallengeUserWhitelistFindUniqueOrThrowArgs} args - Arguments to find a ChallengeUserWhitelist + * @example + * // Get one ChallengeUserWhitelist + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first ChallengeUserWhitelist that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistFindFirstArgs} args - Arguments to find a ChallengeUserWhitelist + * @example + * // Get one ChallengeUserWhitelist + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first ChallengeUserWhitelist that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistFindFirstOrThrowArgs} args - Arguments to find a ChallengeUserWhitelist + * @example + * // Get one ChallengeUserWhitelist + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more ChallengeUserWhitelists that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all ChallengeUserWhitelists + * const challengeUserWhitelists = await prisma.challengeUserWhitelist.findMany() + * + * // Get first 10 ChallengeUserWhitelists + * const challengeUserWhitelists = await prisma.challengeUserWhitelist.findMany({ take: 10 }) + * + * // Only select the `challengeId` + * const challengeUserWhitelistWithChallengeIdOnly = await prisma.challengeUserWhitelist.findMany({ select: { challengeId: true } }) + * + */ + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> + + /** + * Create a ChallengeUserWhitelist. + * @param {ChallengeUserWhitelistCreateArgs} args - Arguments to create a ChallengeUserWhitelist. + * @example + * // Create one ChallengeUserWhitelist + * const ChallengeUserWhitelist = await prisma.challengeUserWhitelist.create({ + * data: { + * // ... data to create a ChallengeUserWhitelist + * } + * }) + * + */ + create(args: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many ChallengeUserWhitelists. + * @param {ChallengeUserWhitelistCreateManyArgs} args - Arguments to create many ChallengeUserWhitelists. + * @example + * // Create many ChallengeUserWhitelists + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Create many ChallengeUserWhitelists and returns the data saved in the database. + * @param {ChallengeUserWhitelistCreateManyAndReturnArgs} args - Arguments to create many ChallengeUserWhitelists. + * @example + * // Create many ChallengeUserWhitelists + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many ChallengeUserWhitelists and only return the `challengeId` + * const challengeUserWhitelistWithChallengeIdOnly = await prisma.challengeUserWhitelist.createManyAndReturn({ + * select: { challengeId: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a ChallengeUserWhitelist. + * @param {ChallengeUserWhitelistDeleteArgs} args - Arguments to delete one ChallengeUserWhitelist. + * @example + * // Delete one ChallengeUserWhitelist + * const ChallengeUserWhitelist = await prisma.challengeUserWhitelist.delete({ + * where: { + * // ... filter to delete one ChallengeUserWhitelist + * } + * }) + * + */ + delete(args: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one ChallengeUserWhitelist. + * @param {ChallengeUserWhitelistUpdateArgs} args - Arguments to update one ChallengeUserWhitelist. + * @example + * // Update one ChallengeUserWhitelist + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more ChallengeUserWhitelists. + * @param {ChallengeUserWhitelistDeleteManyArgs} args - Arguments to filter ChallengeUserWhitelists to delete. + * @example + * // Delete a few ChallengeUserWhitelists + * const { count } = await prisma.challengeUserWhitelist.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more ChallengeUserWhitelists. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many ChallengeUserWhitelists + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more ChallengeUserWhitelists and returns the data updated in the database. + * @param {ChallengeUserWhitelistUpdateManyAndReturnArgs} args - Arguments to update many ChallengeUserWhitelists. + * @example + * // Update many ChallengeUserWhitelists + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more ChallengeUserWhitelists and only return the `challengeId` + * const challengeUserWhitelistWithChallengeIdOnly = await prisma.challengeUserWhitelist.updateManyAndReturn({ + * select: { challengeId: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one ChallengeUserWhitelist. + * @param {ChallengeUserWhitelistUpsertArgs} args - Arguments to update or create a ChallengeUserWhitelist. + * @example + * // Update or create a ChallengeUserWhitelist + * const challengeUserWhitelist = await prisma.challengeUserWhitelist.upsert({ + * create: { + * // ... data to create a ChallengeUserWhitelist + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the ChallengeUserWhitelist we want to update + * } + * }) + */ + upsert(args: SelectSubset>): Prisma__ChallengeUserWhitelistClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of ChallengeUserWhitelists. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistCountArgs} args - Arguments to filter ChallengeUserWhitelists to count. + * @example + * // Count the number of ChallengeUserWhitelists + * const count = await prisma.challengeUserWhitelist.count({ + * where: { + * // ... the filter for the ChallengeUserWhitelists we want to count + * } + * }) + **/ + count( + args?: Subset, + ): Prisma.PrismaPromise< + T extends $Utils.Record<'select', any> + ? T['select'] extends true + ? number + : GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a ChallengeUserWhitelist. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Subset): Prisma.PrismaPromise> + + /** + * Group by ChallengeUserWhitelist. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeUserWhitelistGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends ChallengeUserWhitelistGroupByArgs, + HasSelectOrTake extends Or< + Extends<'skip', Keys>, + Extends<'take', Keys> + >, + OrderByArg extends True extends HasSelectOrTake + ? { orderBy: ChallengeUserWhitelistGroupByArgs['orderBy'] } + : { orderBy?: ChallengeUserWhitelistGroupByArgs['orderBy'] }, + OrderFields extends ExcludeUnderscoreKeys>>, + ByFields extends MaybeTupleToUnion, + ByValid extends Has, + HavingFields extends GetHavingFields, + HavingValid extends Has, + ByEmpty extends T['by'] extends never[] ? True : False, + InputErrors extends ByEmpty extends True + ? `Error: "by" must not be empty.` + : HavingValid extends False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: SubsetIntersection & InputErrors): {} extends InputErrors ? GetChallengeUserWhitelistGroupByPayload : Prisma.PrismaPromise + /** + * Fields of the ChallengeUserWhitelist model + */ + readonly fields: ChallengeUserWhitelistFieldRefs; + } + + /** + * The delegate class that acts as a "Promise-like" for ChallengeUserWhitelist. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ + export interface Prisma__ChallengeUserWhitelistClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + challenge = {}>(args?: Subset>): Prisma__ChallengeClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): $Utils.JsPromise + } + + + + + /** + * Fields of the ChallengeUserWhitelist model + */ + interface ChallengeUserWhitelistFieldRefs { + readonly challengeId: FieldRef<"ChallengeUserWhitelist", 'String'> + readonly userId: FieldRef<"ChallengeUserWhitelist", 'String'> + } + + + // Custom InputTypes + /** + * ChallengeUserWhitelist findUnique + */ + export type ChallengeUserWhitelistFindUniqueArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * Filter, which ChallengeUserWhitelist to fetch. + */ + where: ChallengeUserWhitelistWhereUniqueInput + } + + /** + * ChallengeUserWhitelist findUniqueOrThrow + */ + export type ChallengeUserWhitelistFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * Filter, which ChallengeUserWhitelist to fetch. + */ + where: ChallengeUserWhitelistWhereUniqueInput + } + + /** + * ChallengeUserWhitelist findFirst + */ + export type ChallengeUserWhitelistFindFirstArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * Filter, which ChallengeUserWhitelist to fetch. + */ + where?: ChallengeUserWhitelistWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeUserWhitelists to fetch. + */ + orderBy?: ChallengeUserWhitelistOrderByWithRelationInput | ChallengeUserWhitelistOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for ChallengeUserWhitelists. + */ + cursor?: ChallengeUserWhitelistWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeUserWhitelists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeUserWhitelists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of ChallengeUserWhitelists. + */ + distinct?: ChallengeUserWhitelistScalarFieldEnum | ChallengeUserWhitelistScalarFieldEnum[] + } + + /** + * ChallengeUserWhitelist findFirstOrThrow + */ + export type ChallengeUserWhitelistFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * Filter, which ChallengeUserWhitelist to fetch. + */ + where?: ChallengeUserWhitelistWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeUserWhitelists to fetch. + */ + orderBy?: ChallengeUserWhitelistOrderByWithRelationInput | ChallengeUserWhitelistOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for ChallengeUserWhitelists. + */ + cursor?: ChallengeUserWhitelistWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeUserWhitelists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeUserWhitelists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of ChallengeUserWhitelists. + */ + distinct?: ChallengeUserWhitelistScalarFieldEnum | ChallengeUserWhitelistScalarFieldEnum[] + } + + /** + * ChallengeUserWhitelist findMany + */ + export type ChallengeUserWhitelistFindManyArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * Filter, which ChallengeUserWhitelists to fetch. + */ + where?: ChallengeUserWhitelistWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeUserWhitelists to fetch. + */ + orderBy?: ChallengeUserWhitelistOrderByWithRelationInput | ChallengeUserWhitelistOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing ChallengeUserWhitelists. + */ + cursor?: ChallengeUserWhitelistWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeUserWhitelists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeUserWhitelists. + */ + skip?: number + distinct?: ChallengeUserWhitelistScalarFieldEnum | ChallengeUserWhitelistScalarFieldEnum[] + } + + /** + * ChallengeUserWhitelist create + */ + export type ChallengeUserWhitelistCreateArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * The data needed to create a ChallengeUserWhitelist. + */ + data: XOR + } + + /** + * ChallengeUserWhitelist createMany + */ + export type ChallengeUserWhitelistCreateManyArgs = { + /** + * The data used to create many ChallengeUserWhitelists. + */ + data: ChallengeUserWhitelistCreateManyInput | ChallengeUserWhitelistCreateManyInput[] + skipDuplicates?: boolean + } + + /** + * ChallengeUserWhitelist createManyAndReturn + */ + export type ChallengeUserWhitelistCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelectCreateManyAndReturn | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * The data used to create many ChallengeUserWhitelists. + */ + data: ChallengeUserWhitelistCreateManyInput | ChallengeUserWhitelistCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistIncludeCreateManyAndReturn | null + } + + /** + * ChallengeUserWhitelist update + */ + export type ChallengeUserWhitelistUpdateArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * The data needed to update a ChallengeUserWhitelist. + */ + data: XOR + /** + * Choose, which ChallengeUserWhitelist to update. + */ + where: ChallengeUserWhitelistWhereUniqueInput + } + + /** + * ChallengeUserWhitelist updateMany + */ + export type ChallengeUserWhitelistUpdateManyArgs = { + /** + * The data used to update ChallengeUserWhitelists. + */ + data: XOR + /** + * Filter which ChallengeUserWhitelists to update + */ + where?: ChallengeUserWhitelistWhereInput + /** + * Limit how many ChallengeUserWhitelists to update. + */ + limit?: number + } + + /** + * ChallengeUserWhitelist updateManyAndReturn + */ + export type ChallengeUserWhitelistUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * The data used to update ChallengeUserWhitelists. + */ + data: XOR + /** + * Filter which ChallengeUserWhitelists to update + */ + where?: ChallengeUserWhitelistWhereInput + /** + * Limit how many ChallengeUserWhitelists to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistIncludeUpdateManyAndReturn | null + } + + /** + * ChallengeUserWhitelist upsert + */ + export type ChallengeUserWhitelistUpsertArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * The filter to search for the ChallengeUserWhitelist to update in case it exists. + */ + where: ChallengeUserWhitelistWhereUniqueInput + /** + * In case the ChallengeUserWhitelist found by the `where` argument doesn't exist, create a new ChallengeUserWhitelist with this data. + */ + create: XOR + /** + * In case the ChallengeUserWhitelist was found with the provided `where` argument, update it with this data. + */ + update: XOR + } + + /** + * ChallengeUserWhitelist delete + */ + export type ChallengeUserWhitelistDeleteArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + /** + * Filter which ChallengeUserWhitelist to delete. + */ + where: ChallengeUserWhitelistWhereUniqueInput + } + + /** + * ChallengeUserWhitelist deleteMany + */ + export type ChallengeUserWhitelistDeleteManyArgs = { + /** + * Filter which ChallengeUserWhitelists to delete + */ + where?: ChallengeUserWhitelistWhereInput + /** + * Limit how many ChallengeUserWhitelists to delete. + */ + limit?: number + } + + /** + * ChallengeUserWhitelist without action + */ + export type ChallengeUserWhitelistDefaultArgs = { + /** + * Select specific fields to fetch from the ChallengeUserWhitelist + */ + select?: ChallengeUserWhitelistSelect | null + /** + * Omit specific fields from the ChallengeUserWhitelist + */ + omit?: ChallengeUserWhitelistOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ChallengeUserWhitelistInclude | null + } + + /** * Model ChallengeType */ @@ -34270,6 +35417,14 @@ export namespace Prisma { export type ChallengeScalarFieldEnum = (typeof ChallengeScalarFieldEnum)[keyof typeof ChallengeScalarFieldEnum] + export const ChallengeUserWhitelistScalarFieldEnum: { + challengeId: 'challengeId', + userId: 'userId' + }; + + export type ChallengeUserWhitelistScalarFieldEnum = (typeof ChallengeUserWhitelistScalarFieldEnum)[keyof typeof ChallengeUserWhitelistScalarFieldEnum] + + export const ChallengeTypeScalarFieldEnum: { id: 'id', name: 'name', @@ -34718,6 +35873,14 @@ export namespace Prisma { export type ChallengeOrderByRelevanceFieldEnum = (typeof ChallengeOrderByRelevanceFieldEnum)[keyof typeof ChallengeOrderByRelevanceFieldEnum] + export const ChallengeUserWhitelistOrderByRelevanceFieldEnum: { + challengeId: 'challengeId', + userId: 'userId' + }; + + export type ChallengeUserWhitelistOrderByRelevanceFieldEnum = (typeof ChallengeUserWhitelistOrderByRelevanceFieldEnum)[keyof typeof ChallengeUserWhitelistOrderByRelevanceFieldEnum] + + export const ChallengeTypeOrderByRelevanceFieldEnum: { id: 'id', name: 'name', @@ -35227,6 +36390,7 @@ export namespace Prisma { skills?: ChallengeSkillListRelationFilter auditLogs?: AuditLogListRelationFilter memberAccesses?: MemberChallengeAccessListRelationFilter + userWhitelist?: ChallengeUserWhitelistListRelationFilter type?: XOR track?: XOR timelineTemplate?: XOR | null @@ -35282,6 +36446,7 @@ export namespace Prisma { skills?: ChallengeSkillOrderByRelationAggregateInput auditLogs?: AuditLogOrderByRelationAggregateInput memberAccesses?: MemberChallengeAccessOrderByRelationAggregateInput + userWhitelist?: ChallengeUserWhitelistOrderByRelationAggregateInput type?: ChallengeTypeOrderByWithRelationInput track?: ChallengeTrackOrderByWithRelationInput timelineTemplate?: TimelineTemplateOrderByWithRelationInput @@ -35341,6 +36506,7 @@ export namespace Prisma { skills?: ChallengeSkillListRelationFilter auditLogs?: AuditLogListRelationFilter memberAccesses?: MemberChallengeAccessListRelationFilter + userWhitelist?: ChallengeUserWhitelistListRelationFilter type?: XOR track?: XOR timelineTemplate?: XOR | null @@ -35428,6 +36594,48 @@ export namespace Prisma { updatedBy?: StringWithAggregatesFilter<"Challenge"> | string } + export type ChallengeUserWhitelistWhereInput = { + AND?: ChallengeUserWhitelistWhereInput | ChallengeUserWhitelistWhereInput[] + OR?: ChallengeUserWhitelistWhereInput[] + NOT?: ChallengeUserWhitelistWhereInput | ChallengeUserWhitelistWhereInput[] + challengeId?: StringFilter<"ChallengeUserWhitelist"> | string + userId?: StringFilter<"ChallengeUserWhitelist"> | string + challenge?: XOR + } + + export type ChallengeUserWhitelistOrderByWithRelationInput = { + challengeId?: SortOrder + userId?: SortOrder + challenge?: ChallengeOrderByWithRelationInput + _relevance?: ChallengeUserWhitelistOrderByRelevanceInput + } + + export type ChallengeUserWhitelistWhereUniqueInput = Prisma.AtLeast<{ + challengeId_userId?: ChallengeUserWhitelistChallengeIdUserIdCompoundUniqueInput + AND?: ChallengeUserWhitelistWhereInput | ChallengeUserWhitelistWhereInput[] + OR?: ChallengeUserWhitelistWhereInput[] + NOT?: ChallengeUserWhitelistWhereInput | ChallengeUserWhitelistWhereInput[] + challengeId?: StringFilter<"ChallengeUserWhitelist"> | string + userId?: StringFilter<"ChallengeUserWhitelist"> | string + challenge?: XOR + }, "challengeId_userId"> + + export type ChallengeUserWhitelistOrderByWithAggregationInput = { + challengeId?: SortOrder + userId?: SortOrder + _count?: ChallengeUserWhitelistCountOrderByAggregateInput + _max?: ChallengeUserWhitelistMaxOrderByAggregateInput + _min?: ChallengeUserWhitelistMinOrderByAggregateInput + } + + export type ChallengeUserWhitelistScalarWhereWithAggregatesInput = { + AND?: ChallengeUserWhitelistScalarWhereWithAggregatesInput | ChallengeUserWhitelistScalarWhereWithAggregatesInput[] + OR?: ChallengeUserWhitelistScalarWhereWithAggregatesInput[] + NOT?: ChallengeUserWhitelistScalarWhereWithAggregatesInput | ChallengeUserWhitelistScalarWhereWithAggregatesInput[] + challengeId?: StringWithAggregatesFilter<"ChallengeUserWhitelist"> | string + userId?: StringWithAggregatesFilter<"ChallengeUserWhitelist"> | string + } + export type ChallengeTypeWhereInput = { AND?: ChallengeTypeWhereInput | ChallengeTypeWhereInput[] OR?: ChallengeTypeWhereInput[] @@ -37591,6 +38799,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -37646,6 +38855,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeUpdateInput = { @@ -37695,6 +38905,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -37750,6 +38961,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateManyInput = { @@ -37860,6 +39072,40 @@ export namespace Prisma { updatedBy?: StringFieldUpdateOperationsInput | string } + export type ChallengeUserWhitelistCreateInput = { + userId: string + challenge: ChallengeCreateNestedOneWithoutUserWhitelistInput + } + + export type ChallengeUserWhitelistUncheckedCreateInput = { + challengeId: string + userId: string + } + + export type ChallengeUserWhitelistUpdateInput = { + userId?: StringFieldUpdateOperationsInput | string + challenge?: ChallengeUpdateOneRequiredWithoutUserWhitelistNestedInput + } + + export type ChallengeUserWhitelistUncheckedUpdateInput = { + challengeId?: StringFieldUpdateOperationsInput | string + userId?: StringFieldUpdateOperationsInput | string + } + + export type ChallengeUserWhitelistCreateManyInput = { + challengeId: string + userId: string + } + + export type ChallengeUserWhitelistUpdateManyMutationInput = { + userId?: StringFieldUpdateOperationsInput | string + } + + export type ChallengeUserWhitelistUncheckedUpdateManyInput = { + challengeId?: StringFieldUpdateOperationsInput | string + userId?: StringFieldUpdateOperationsInput | string + } + export type ChallengeTypeCreateInput = { id?: string name: string @@ -40352,6 +41598,12 @@ export namespace Prisma { none?: MemberChallengeAccessWhereInput } + export type ChallengeUserWhitelistListRelationFilter = { + every?: ChallengeUserWhitelistWhereInput + some?: ChallengeUserWhitelistWhereInput + none?: ChallengeUserWhitelistWhereInput + } + export type ChallengeTypeScalarRelationFilter = { is?: ChallengeTypeWhereInput isNot?: ChallengeTypeWhereInput @@ -40420,6 +41672,10 @@ export namespace Prisma { _count?: SortOrder } + export type ChallengeUserWhitelistOrderByRelationAggregateInput = { + _count?: SortOrder + } + export type ChallengeOrderByRelevanceInput = { fields: ChallengeOrderByRelevanceFieldEnum | ChallengeOrderByRelevanceFieldEnum[] sort: SortOrder @@ -40681,6 +41937,37 @@ export namespace Prisma { _max?: NestedDateTimeFilter<$PrismaModel> } + export type ChallengeScalarRelationFilter = { + is?: ChallengeWhereInput + isNot?: ChallengeWhereInput + } + + export type ChallengeUserWhitelistOrderByRelevanceInput = { + fields: ChallengeUserWhitelistOrderByRelevanceFieldEnum | ChallengeUserWhitelistOrderByRelevanceFieldEnum[] + sort: SortOrder + search: string + } + + export type ChallengeUserWhitelistChallengeIdUserIdCompoundUniqueInput = { + challengeId: string + userId: string + } + + export type ChallengeUserWhitelistCountOrderByAggregateInput = { + challengeId?: SortOrder + userId?: SortOrder + } + + export type ChallengeUserWhitelistMaxOrderByAggregateInput = { + challengeId?: SortOrder + userId?: SortOrder + } + + export type ChallengeUserWhitelistMinOrderByAggregateInput = { + challengeId?: SortOrder + userId?: SortOrder + } + export type ChallengeListRelationFilter = { every?: ChallengeWhereInput some?: ChallengeWhereInput @@ -40937,11 +42224,6 @@ export namespace Prisma { memberId?: SortOrder } - export type ChallengeScalarRelationFilter = { - is?: ChallengeWhereInput - isNot?: ChallengeWhereInput - } - export type AttachmentOrderByRelevanceInput = { fields: AttachmentOrderByRelevanceFieldEnum | AttachmentOrderByRelevanceFieldEnum[] sort: SortOrder @@ -42295,6 +43577,13 @@ export namespace Prisma { connect?: MemberChallengeAccessWhereUniqueInput | MemberChallengeAccessWhereUniqueInput[] } + export type ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput = { + create?: XOR | ChallengeUserWhitelistCreateWithoutChallengeInput[] | ChallengeUserWhitelistUncheckedCreateWithoutChallengeInput[] + connectOrCreate?: ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput | ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput[] + createMany?: ChallengeUserWhitelistCreateManyChallengeInputEnvelope + connect?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + } + export type ChallengeTypeCreateNestedOneWithoutChallengesInput = { create?: XOR connectOrCreate?: ChallengeTypeCreateOrConnectWithoutChallengesInput @@ -42412,6 +43701,13 @@ export namespace Prisma { connect?: MemberChallengeAccessWhereUniqueInput | MemberChallengeAccessWhereUniqueInput[] } + export type ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput = { + create?: XOR | ChallengeUserWhitelistCreateWithoutChallengeInput[] | ChallengeUserWhitelistUncheckedCreateWithoutChallengeInput[] + connectOrCreate?: ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput | ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput[] + createMany?: ChallengeUserWhitelistCreateManyChallengeInputEnvelope + connect?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + } + export type StringFieldUpdateOperationsInput = { set?: string } @@ -42669,6 +43965,20 @@ export namespace Prisma { deleteMany?: MemberChallengeAccessScalarWhereInput | MemberChallengeAccessScalarWhereInput[] } + export type ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput = { + create?: XOR | ChallengeUserWhitelistCreateWithoutChallengeInput[] | ChallengeUserWhitelistUncheckedCreateWithoutChallengeInput[] + connectOrCreate?: ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput | ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput[] + upsert?: ChallengeUserWhitelistUpsertWithWhereUniqueWithoutChallengeInput | ChallengeUserWhitelistUpsertWithWhereUniqueWithoutChallengeInput[] + createMany?: ChallengeUserWhitelistCreateManyChallengeInputEnvelope + set?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + disconnect?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + delete?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + connect?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + update?: ChallengeUserWhitelistUpdateWithWhereUniqueWithoutChallengeInput | ChallengeUserWhitelistUpdateWithWhereUniqueWithoutChallengeInput[] + updateMany?: ChallengeUserWhitelistUpdateManyWithWhereWithoutChallengeInput | ChallengeUserWhitelistUpdateManyWithWhereWithoutChallengeInput[] + deleteMany?: ChallengeUserWhitelistScalarWhereInput | ChallengeUserWhitelistScalarWhereInput[] + } + export type ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput = { create?: XOR connectOrCreate?: ChallengeTypeCreateOrConnectWithoutChallengesInput @@ -42889,6 +44199,34 @@ export namespace Prisma { deleteMany?: MemberChallengeAccessScalarWhereInput | MemberChallengeAccessScalarWhereInput[] } + export type ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput = { + create?: XOR | ChallengeUserWhitelistCreateWithoutChallengeInput[] | ChallengeUserWhitelistUncheckedCreateWithoutChallengeInput[] + connectOrCreate?: ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput | ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput[] + upsert?: ChallengeUserWhitelistUpsertWithWhereUniqueWithoutChallengeInput | ChallengeUserWhitelistUpsertWithWhereUniqueWithoutChallengeInput[] + createMany?: ChallengeUserWhitelistCreateManyChallengeInputEnvelope + set?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + disconnect?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + delete?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + connect?: ChallengeUserWhitelistWhereUniqueInput | ChallengeUserWhitelistWhereUniqueInput[] + update?: ChallengeUserWhitelistUpdateWithWhereUniqueWithoutChallengeInput | ChallengeUserWhitelistUpdateWithWhereUniqueWithoutChallengeInput[] + updateMany?: ChallengeUserWhitelistUpdateManyWithWhereWithoutChallengeInput | ChallengeUserWhitelistUpdateManyWithWhereWithoutChallengeInput[] + deleteMany?: ChallengeUserWhitelistScalarWhereInput | ChallengeUserWhitelistScalarWhereInput[] + } + + export type ChallengeCreateNestedOneWithoutUserWhitelistInput = { + create?: XOR + connectOrCreate?: ChallengeCreateOrConnectWithoutUserWhitelistInput + connect?: ChallengeWhereUniqueInput + } + + export type ChallengeUpdateOneRequiredWithoutUserWhitelistNestedInput = { + create?: XOR + connectOrCreate?: ChallengeCreateOrConnectWithoutUserWhitelistInput + upsert?: ChallengeUpsertWithoutUserWhitelistInput + connect?: ChallengeWhereUniqueInput + update?: XOR, ChallengeUncheckedUpdateWithoutUserWhitelistInput> + } + export type ChallengeCreateNestedManyWithoutTypeInput = { create?: XOR | ChallengeCreateWithoutTypeInput[] | ChallengeUncheckedCreateWithoutTypeInput[] connectOrCreate?: ChallengeCreateOrConnectWithoutTypeInput | ChallengeCreateOrConnectWithoutTypeInput[] @@ -44830,6 +46168,24 @@ export namespace Prisma { challenge?: XOR } + export type ChallengeUserWhitelistCreateWithoutChallengeInput = { + userId: string + } + + export type ChallengeUserWhitelistUncheckedCreateWithoutChallengeInput = { + userId: string + } + + export type ChallengeUserWhitelistCreateOrConnectWithoutChallengeInput = { + where: ChallengeUserWhitelistWhereUniqueInput + create: XOR + } + + export type ChallengeUserWhitelistCreateManyChallengeInputEnvelope = { + data: ChallengeUserWhitelistCreateManyChallengeInput | ChallengeUserWhitelistCreateManyChallengeInput[] + skipDuplicates?: boolean + } + export type ChallengeTypeCreateWithoutChallengesInput = { id?: string name: string @@ -45431,6 +46787,30 @@ export namespace Prisma { memberId?: StringFilter<"MemberChallengeAccess"> | string } + export type ChallengeUserWhitelistUpsertWithWhereUniqueWithoutChallengeInput = { + where: ChallengeUserWhitelistWhereUniqueInput + update: XOR + create: XOR + } + + export type ChallengeUserWhitelistUpdateWithWhereUniqueWithoutChallengeInput = { + where: ChallengeUserWhitelistWhereUniqueInput + data: XOR + } + + export type ChallengeUserWhitelistUpdateManyWithWhereWithoutChallengeInput = { + where: ChallengeUserWhitelistScalarWhereInput + data: XOR + } + + export type ChallengeUserWhitelistScalarWhereInput = { + AND?: ChallengeUserWhitelistScalarWhereInput | ChallengeUserWhitelistScalarWhereInput[] + OR?: ChallengeUserWhitelistScalarWhereInput[] + NOT?: ChallengeUserWhitelistScalarWhereInput | ChallengeUserWhitelistScalarWhereInput[] + challengeId?: StringFilter<"ChallengeUserWhitelist"> | string + userId?: StringFilter<"ChallengeUserWhitelist"> | string + } + export type ChallengeTypeUpsertWithoutChallengesInput = { update: XOR create: XOR @@ -45560,6 +46940,230 @@ export namespace Prisma { DefaultChallengeReviewer?: DefaultChallengeReviewerUncheckedUpdateManyWithoutTimelineTemplateNestedInput } + export type ChallengeCreateWithoutUserWhitelistInput = { + id?: string + name: string + description?: string | null + privateDescription?: string | null + challengeSource?: string | null + descriptionFormat?: string | null + projectId?: number | null + overviewTotalPrizes?: number | null + numOfRegistrants?: number + numOfSubmissions?: number + numOfCheckpointSubmissions?: number + currentPhaseNames?: ChallengeCreatecurrentPhaseNamesInput | string[] + wiproAllowed?: boolean + funChallenge?: boolean + tags?: ChallengeCreatetagsInput | string[] + groups?: ChallengeCreategroupsInput | string[] + taskIsTask?: boolean + taskIsAssigned?: boolean + taskMemberId?: string | null + submissionStartDate?: Date | string | null + submissionEndDate?: Date | string | null + registrationStartDate?: Date | string | null + registrationEndDate?: Date | string | null + startDate?: Date | string | null + endDate?: Date | string | null + legacyId?: number | null + status?: $Enums.ChallengeStatusEnum + createdAt?: Date | string + createdBy: string + updatedAt?: Date | string + updatedBy: string + billingRecord?: ChallengeBillingCreateNestedOneWithoutChallengeInput + legacyRecord?: ChallengeLegacyCreateNestedOneWithoutChallengeInput + constraintRecord?: ChallengeConstraintCreateNestedOneWithoutChallengeInput + events?: ChallengeEventCreateNestedManyWithoutChallengeInput + discussions?: ChallengeDiscussionCreateNestedManyWithoutChallengeInput + metadata?: ChallengeMetadataCreateNestedManyWithoutChallengeInput + phases?: ChallengePhaseCreateNestedManyWithoutChallengeInput + prizeSets?: ChallengePrizeSetCreateNestedManyWithoutChallengeInput + reviewers?: ChallengeReviewerCreateNestedManyWithoutChallengeInput + winners?: ChallengeWinnerCreateNestedManyWithoutChallengeInput + attachments?: AttachmentCreateNestedManyWithoutChallengeInput + terms?: ChallengeTermCreateNestedManyWithoutChallengeInput + skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput + auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput + memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + type: ChallengeTypeCreateNestedOneWithoutChallengesInput + track: ChallengeTrackCreateNestedOneWithoutChallengesInput + timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput + } + + export type ChallengeUncheckedCreateWithoutUserWhitelistInput = { + id?: string + name: string + description?: string | null + privateDescription?: string | null + challengeSource?: string | null + descriptionFormat?: string | null + projectId?: number | null + typeId: string + trackId: string + timelineTemplateId?: string | null + overviewTotalPrizes?: number | null + numOfRegistrants?: number + numOfSubmissions?: number + numOfCheckpointSubmissions?: number + currentPhaseNames?: ChallengeCreatecurrentPhaseNamesInput | string[] + wiproAllowed?: boolean + funChallenge?: boolean + tags?: ChallengeCreatetagsInput | string[] + groups?: ChallengeCreategroupsInput | string[] + taskIsTask?: boolean + taskIsAssigned?: boolean + taskMemberId?: string | null + submissionStartDate?: Date | string | null + submissionEndDate?: Date | string | null + registrationStartDate?: Date | string | null + registrationEndDate?: Date | string | null + startDate?: Date | string | null + endDate?: Date | string | null + legacyId?: number | null + status?: $Enums.ChallengeStatusEnum + createdAt?: Date | string + createdBy: string + updatedAt?: Date | string + updatedBy: string + billingRecord?: ChallengeBillingUncheckedCreateNestedOneWithoutChallengeInput + legacyRecord?: ChallengeLegacyUncheckedCreateNestedOneWithoutChallengeInput + constraintRecord?: ChallengeConstraintUncheckedCreateNestedOneWithoutChallengeInput + events?: ChallengeEventUncheckedCreateNestedManyWithoutChallengeInput + discussions?: ChallengeDiscussionUncheckedCreateNestedManyWithoutChallengeInput + metadata?: ChallengeMetadataUncheckedCreateNestedManyWithoutChallengeInput + phases?: ChallengePhaseUncheckedCreateNestedManyWithoutChallengeInput + prizeSets?: ChallengePrizeSetUncheckedCreateNestedManyWithoutChallengeInput + reviewers?: ChallengeReviewerUncheckedCreateNestedManyWithoutChallengeInput + winners?: ChallengeWinnerUncheckedCreateNestedManyWithoutChallengeInput + attachments?: AttachmentUncheckedCreateNestedManyWithoutChallengeInput + terms?: ChallengeTermUncheckedCreateNestedManyWithoutChallengeInput + skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput + auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput + memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + } + + export type ChallengeCreateOrConnectWithoutUserWhitelistInput = { + where: ChallengeWhereUniqueInput + create: XOR + } + + export type ChallengeUpsertWithoutUserWhitelistInput = { + update: XOR + create: XOR + where?: ChallengeWhereInput + } + + export type ChallengeUpdateToOneWithWhereWithoutUserWhitelistInput = { + where?: ChallengeWhereInput + data: XOR + } + + export type ChallengeUpdateWithoutUserWhitelistInput = { + id?: StringFieldUpdateOperationsInput | string + name?: StringFieldUpdateOperationsInput | string + description?: NullableStringFieldUpdateOperationsInput | string | null + privateDescription?: NullableStringFieldUpdateOperationsInput | string | null + challengeSource?: NullableStringFieldUpdateOperationsInput | string | null + descriptionFormat?: NullableStringFieldUpdateOperationsInput | string | null + projectId?: NullableIntFieldUpdateOperationsInput | number | null + overviewTotalPrizes?: NullableFloatFieldUpdateOperationsInput | number | null + numOfRegistrants?: IntFieldUpdateOperationsInput | number + numOfSubmissions?: IntFieldUpdateOperationsInput | number + numOfCheckpointSubmissions?: IntFieldUpdateOperationsInput | number + currentPhaseNames?: ChallengeUpdatecurrentPhaseNamesInput | string[] + wiproAllowed?: BoolFieldUpdateOperationsInput | boolean + funChallenge?: BoolFieldUpdateOperationsInput | boolean + tags?: ChallengeUpdatetagsInput | string[] + groups?: ChallengeUpdategroupsInput | string[] + taskIsTask?: BoolFieldUpdateOperationsInput | boolean + taskIsAssigned?: BoolFieldUpdateOperationsInput | boolean + taskMemberId?: NullableStringFieldUpdateOperationsInput | string | null + submissionStartDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + submissionEndDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + registrationStartDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + registrationEndDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + startDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + endDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + legacyId?: NullableIntFieldUpdateOperationsInput | number | null + status?: EnumChallengeStatusEnumFieldUpdateOperationsInput | $Enums.ChallengeStatusEnum + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + createdBy?: StringFieldUpdateOperationsInput | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedBy?: StringFieldUpdateOperationsInput | string + billingRecord?: ChallengeBillingUpdateOneWithoutChallengeNestedInput + legacyRecord?: ChallengeLegacyUpdateOneWithoutChallengeNestedInput + constraintRecord?: ChallengeConstraintUpdateOneWithoutChallengeNestedInput + events?: ChallengeEventUpdateManyWithoutChallengeNestedInput + discussions?: ChallengeDiscussionUpdateManyWithoutChallengeNestedInput + metadata?: ChallengeMetadataUpdateManyWithoutChallengeNestedInput + phases?: ChallengePhaseUpdateManyWithoutChallengeNestedInput + prizeSets?: ChallengePrizeSetUpdateManyWithoutChallengeNestedInput + reviewers?: ChallengeReviewerUpdateManyWithoutChallengeNestedInput + winners?: ChallengeWinnerUpdateManyWithoutChallengeNestedInput + attachments?: AttachmentUpdateManyWithoutChallengeNestedInput + terms?: ChallengeTermUpdateManyWithoutChallengeNestedInput + skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput + auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput + memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput + track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput + timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput + } + + export type ChallengeUncheckedUpdateWithoutUserWhitelistInput = { + id?: StringFieldUpdateOperationsInput | string + name?: StringFieldUpdateOperationsInput | string + description?: NullableStringFieldUpdateOperationsInput | string | null + privateDescription?: NullableStringFieldUpdateOperationsInput | string | null + challengeSource?: NullableStringFieldUpdateOperationsInput | string | null + descriptionFormat?: NullableStringFieldUpdateOperationsInput | string | null + projectId?: NullableIntFieldUpdateOperationsInput | number | null + typeId?: StringFieldUpdateOperationsInput | string + trackId?: StringFieldUpdateOperationsInput | string + timelineTemplateId?: NullableStringFieldUpdateOperationsInput | string | null + overviewTotalPrizes?: NullableFloatFieldUpdateOperationsInput | number | null + numOfRegistrants?: IntFieldUpdateOperationsInput | number + numOfSubmissions?: IntFieldUpdateOperationsInput | number + numOfCheckpointSubmissions?: IntFieldUpdateOperationsInput | number + currentPhaseNames?: ChallengeUpdatecurrentPhaseNamesInput | string[] + wiproAllowed?: BoolFieldUpdateOperationsInput | boolean + funChallenge?: BoolFieldUpdateOperationsInput | boolean + tags?: ChallengeUpdatetagsInput | string[] + groups?: ChallengeUpdategroupsInput | string[] + taskIsTask?: BoolFieldUpdateOperationsInput | boolean + taskIsAssigned?: BoolFieldUpdateOperationsInput | boolean + taskMemberId?: NullableStringFieldUpdateOperationsInput | string | null + submissionStartDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + submissionEndDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + registrationStartDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + registrationEndDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + startDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + endDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + legacyId?: NullableIntFieldUpdateOperationsInput | number | null + status?: EnumChallengeStatusEnumFieldUpdateOperationsInput | $Enums.ChallengeStatusEnum + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + createdBy?: StringFieldUpdateOperationsInput | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedBy?: StringFieldUpdateOperationsInput | string + billingRecord?: ChallengeBillingUncheckedUpdateOneWithoutChallengeNestedInput + legacyRecord?: ChallengeLegacyUncheckedUpdateOneWithoutChallengeNestedInput + constraintRecord?: ChallengeConstraintUncheckedUpdateOneWithoutChallengeNestedInput + events?: ChallengeEventUncheckedUpdateManyWithoutChallengeNestedInput + discussions?: ChallengeDiscussionUncheckedUpdateManyWithoutChallengeNestedInput + metadata?: ChallengeMetadataUncheckedUpdateManyWithoutChallengeNestedInput + phases?: ChallengePhaseUncheckedUpdateManyWithoutChallengeNestedInput + prizeSets?: ChallengePrizeSetUncheckedUpdateManyWithoutChallengeNestedInput + reviewers?: ChallengeReviewerUncheckedUpdateManyWithoutChallengeNestedInput + winners?: ChallengeWinnerUncheckedUpdateManyWithoutChallengeNestedInput + attachments?: AttachmentUncheckedUpdateManyWithoutChallengeNestedInput + terms?: ChallengeTermUncheckedUpdateManyWithoutChallengeNestedInput + skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput + auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput + memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + } + export type ChallengeCreateWithoutTypeInput = { id?: string name: string @@ -45607,6 +47211,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput } @@ -45660,6 +47265,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutTypeInput = { @@ -45931,6 +47537,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput } @@ -45984,6 +47591,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutTrackInput = { @@ -46414,6 +48022,7 @@ export namespace Prisma { terms?: ChallengeTermCreateNestedManyWithoutChallengeInput skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -46468,6 +48077,7 @@ export namespace Prisma { terms?: ChallengeTermUncheckedCreateNestedManyWithoutChallengeInput skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutAuditLogsInput = { @@ -46532,6 +48142,7 @@ export namespace Prisma { terms?: ChallengeTermUpdateManyWithoutChallengeNestedInput skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -46586,6 +48197,7 @@ export namespace Prisma { terms?: ChallengeTermUncheckedUpdateManyWithoutChallengeNestedInput skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutAttachmentsInput = { @@ -46634,6 +48246,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -46688,6 +48301,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutAttachmentsInput = { @@ -46752,6 +48366,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -46806,6 +48421,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutMetadataInput = { @@ -46854,6 +48470,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -46908,6 +48525,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutMetadataInput = { @@ -46972,6 +48590,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -47026,6 +48645,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengePrizeSetCreateWithoutPrizesInput = { @@ -47134,6 +48754,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -47188,6 +48809,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutWinnersInput = { @@ -47252,6 +48874,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -47306,6 +48929,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutTermsInput = { @@ -47354,6 +48978,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -47408,6 +49033,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutTermsInput = { @@ -47472,6 +49098,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -47526,6 +49153,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutSkillsInput = { @@ -47574,6 +49202,7 @@ export namespace Prisma { terms?: ChallengeTermCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -47628,6 +49257,7 @@ export namespace Prisma { terms?: ChallengeTermUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutSkillsInput = { @@ -47692,6 +49322,7 @@ export namespace Prisma { terms?: ChallengeTermUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -47746,6 +49377,7 @@ export namespace Prisma { terms?: ChallengeTermUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutBillingRecordInput = { @@ -47794,6 +49426,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -47848,6 +49481,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutBillingRecordInput = { @@ -47912,6 +49546,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -47966,6 +49601,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutLegacyRecordInput = { @@ -48014,6 +49650,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -48068,6 +49705,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutLegacyRecordInput = { @@ -48132,6 +49770,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -48186,6 +49825,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutEventsInput = { @@ -48234,6 +49874,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -48288,6 +49929,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutEventsInput = { @@ -48352,6 +49994,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -48406,6 +50049,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutDiscussionsInput = { @@ -48454,6 +50098,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -48508,6 +50153,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutDiscussionsInput = { @@ -48602,6 +50248,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -48656,6 +50303,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeDiscussionOptionUpsertWithWhereUniqueWithoutDiscussionInput = { @@ -48806,6 +50454,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -48860,6 +50509,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutConstraintRecordInput = { @@ -48924,6 +50574,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -48978,6 +50629,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengePhaseCreateWithoutPhaseInput = { @@ -49250,6 +50902,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -49304,6 +50957,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutPhasesInput = { @@ -49431,6 +51085,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -49485,6 +51140,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type PhaseUpsertWithoutChallengePhasesInput = { @@ -49696,6 +51352,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -49750,6 +51407,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutPrizeSetsInput = { @@ -49845,6 +51503,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -49899,6 +51558,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeCreateWithoutReviewersInput = { @@ -49947,6 +51607,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput timelineTemplate?: TimelineTemplateCreateNestedOneWithoutChallengesInput @@ -50001,6 +51662,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutReviewersInput = { @@ -50098,6 +51760,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput @@ -50152,6 +51815,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type PhaseUpsertWithoutChallengeReviewerInput = { @@ -50616,6 +52280,7 @@ export namespace Prisma { skills?: ChallengeSkillCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistCreateNestedManyWithoutChallengeInput type: ChallengeTypeCreateNestedOneWithoutChallengesInput track: ChallengeTrackCreateNestedOneWithoutChallengesInput } @@ -50669,6 +52334,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedCreateNestedManyWithoutChallengeInput auditLogs?: AuditLogUncheckedCreateNestedManyWithoutChallengeInput memberAccesses?: MemberChallengeAccessUncheckedCreateNestedManyWithoutChallengeInput + userWhitelist?: ChallengeUserWhitelistUncheckedCreateNestedManyWithoutChallengeInput } export type ChallengeCreateOrConnectWithoutTimelineTemplateInput = { @@ -51017,6 +52683,10 @@ export namespace Prisma { memberId?: string | null } + export type ChallengeUserWhitelistCreateManyChallengeInput = { + userId: string + } + export type ChallengeEventUpdateWithoutChallengeInput = { id?: StringFieldUpdateOperationsInput | string eventId?: IntFieldUpdateOperationsInput | number @@ -51438,6 +53108,18 @@ export namespace Prisma { memberId?: StringFieldUpdateOperationsInput | string } + export type ChallengeUserWhitelistUpdateWithoutChallengeInput = { + userId?: StringFieldUpdateOperationsInput | string + } + + export type ChallengeUserWhitelistUncheckedUpdateWithoutChallengeInput = { + userId?: StringFieldUpdateOperationsInput | string + } + + export type ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeInput = { + userId?: StringFieldUpdateOperationsInput | string + } + export type ChallengeCreateManyTypeInput = { id?: string name: string @@ -51553,6 +53235,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput } @@ -51606,6 +53289,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeUncheckedUpdateManyWithoutTypeInput = { @@ -51855,6 +53539,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput timelineTemplate?: TimelineTemplateUpdateOneWithoutChallengesNestedInput } @@ -51908,6 +53593,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeUncheckedUpdateManyWithoutTrackInput = { @@ -52588,6 +54274,7 @@ export namespace Prisma { skills?: ChallengeSkillUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUpdateManyWithoutChallengeNestedInput type?: ChallengeTypeUpdateOneRequiredWithoutChallengesNestedInput track?: ChallengeTrackUpdateOneRequiredWithoutChallengesNestedInput } @@ -52641,6 +54328,7 @@ export namespace Prisma { skills?: ChallengeSkillUncheckedUpdateManyWithoutChallengeNestedInput auditLogs?: AuditLogUncheckedUpdateManyWithoutChallengeNestedInput memberAccesses?: MemberChallengeAccessUncheckedUpdateManyWithoutChallengeNestedInput + userWhitelist?: ChallengeUserWhitelistUncheckedUpdateManyWithoutChallengeNestedInput } export type ChallengeUncheckedUpdateManyWithoutTimelineTemplateInput = { diff --git a/packages/challenge-prisma-client/index.js b/packages/challenge-prisma-client/index.js index f485946..2638355 100644 --- a/packages/challenge-prisma-client/index.js +++ b/packages/challenge-prisma-client/index.js @@ -131,6 +131,11 @@ exports.Prisma.ChallengeScalarFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistScalarFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeScalarFieldEnum = { id: 'id', name: 'name', @@ -492,6 +497,11 @@ exports.Prisma.ChallengeOrderByRelevanceFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistOrderByRelevanceFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeOrderByRelevanceFieldEnum = { id: 'id', name: 'name', @@ -772,6 +782,7 @@ exports.ReviewOpportunityTypeEnum = exports.$Enums.ReviewOpportunityTypeEnum = { exports.Prisma.ModelName = { Challenge: 'Challenge', + ChallengeUserWhitelist: 'ChallengeUserWhitelist', ChallengeType: 'ChallengeType', ChallengeTrack: 'ChallengeTrack', ChallengeTimelineTemplate: 'ChallengeTimelineTemplate', @@ -853,8 +864,8 @@ const config = { } } }, - "inlineSchema": "datasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/challenge-prisma-client\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\n// Enum for allowed challenge track values (matches app-constants)\nenum ChallengeTrackEnum {\n DESIGN\n DATA_SCIENCE\n DEVELOPMENT\n QUALITY_ASSURANCE\n}\n\nenum ReviewTypeEnum {\n COMMUNITY\n INTERNAL\n SYSTEM\n PROVISIONAL\n EXAMPLE\n}\n\nenum DiscussionTypeEnum {\n CHALLENGE\n}\n\nenum ChallengeStatusEnum {\n NEW\n DRAFT\n APPROVED\n ACTIVE\n COMPLETED\n DELETED\n CANCELLED\n CANCELLED_FAILED_REVIEW\n CANCELLED_FAILED_SCREENING\n CANCELLED_ZERO_SUBMISSIONS\n CANCELLED_WINNER_UNRESPONSIVE\n CANCELLED_CLIENT_REQUEST\n CANCELLED_REQUIREMENTS_INFEASIBLE\n CANCELLED_ZERO_REGISTRATIONS\n CANCELLED_PAYMENT_FAILED\n}\n\nenum PrizeSetTypeEnum {\n PLACEMENT\n COPILOT\n REVIEWER\n PASSED_REVIEW\n CHECKPOINT\n}\n\n// Enum for review opportunity types on reviewers\nenum ReviewOpportunityTypeEnum {\n REGULAR_REVIEW\n COMPONENT_DEV_REVIEW\n SPEC_REVIEW\n ITERATIVE_REVIEW\n SCENARIOS_REVIEW\n}\n\n//////////////////////////////////////////\n// Main Challenge model\n//////////////////////////////////////////\n\nmodel Challenge {\n id String @id @default(uuid())\n name String\n description String?\n privateDescription String?\n challengeSource String?\n descriptionFormat String?\n projectId Int? // frequently queried field\n typeId String\n trackId String // FK for relation in ChallengeTrack\n timelineTemplateId String? // now used as foreign key to ChallengeTimelineTemplate\n overviewTotalPrizes Float? // stored from overview.totalPrizes\n numOfRegistrants Int @default(0)\n numOfSubmissions Int @default(0)\n numOfCheckpointSubmissions Int @default(0)\n currentPhaseNames String[] // current phase names\n\n wiproAllowed Boolean @default(false)\n funChallenge Boolean @default(false)\n\n // simple arrays for tags and groups (PostgreSQL native array type)\n tags String[]\n groups String[]\n\n // Task information (flattened from challenge.task)\n taskIsTask Boolean @default(false)\n taskIsAssigned Boolean @default(false)\n taskMemberId String?\n\n // Dates for challenge lifecycle\n submissionStartDate DateTime?\n submissionEndDate DateTime?\n registrationStartDate DateTime?\n registrationEndDate DateTime?\n startDate DateTime?\n endDate DateTime?\n\n // Normalized billing and legacy information (one-to-one)\n billingRecord ChallengeBilling?\n legacyId Int? // Legacy system ID for searching\n legacyRecord ChallengeLegacy? @relation(\"ChallengeLegacyRelation\")\n\n // Additional fields from createChallenge schema\n status ChallengeStatusEnum @default(NEW) // new challenges default to status \"New\"\n // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge\n constraintRecord ChallengeConstraint?\n\n // Additional normalized relations from createChallenge\n events ChallengeEvent[]\n discussions ChallengeDiscussion[]\n\n // Existing relations (one-to-many) for challenge metadata, phases, prize sets, winners, attachments,\n // terms and skills\n metadata ChallengeMetadata[]\n phases ChallengePhase[]\n prizeSets ChallengePrizeSet[]\n reviewers ChallengeReviewer[]\n winners ChallengeWinner[]\n attachments Attachment[]\n terms ChallengeTerm[]\n skills ChallengeSkill[]\n auditLogs AuditLog[]\n memberAccesses MemberChallengeAccess[]\n\n // Relation to ChallengeType (FK: typeId)\n type ChallengeType @relation(fields: [typeId], references: [id])\n // Relation to ChallengeTrack (FK: trackId)\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n\n // Auditing fields (present in every table)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([projectId])\n @@index([status]) // index added for optimized search by status\n @@index([createdAt])\n @@index([updatedAt])\n @@index([typeId])\n @@index([trackId])\n @@index([groups], type: Gin, map: \"challenge_groups_gin_idx\")\n @@index([submissionStartDate])\n @@index([submissionEndDate])\n @@index([registrationStartDate])\n @@index([registrationEndDate])\n @@index([startDate])\n @@index([endDate])\n @@index([status, startDate])\n @@index([trackId, typeId, status])\n @@index([status, typeId, trackId, createdAt(sort: Desc)], map: \"challenge_status_type_track_created_at_idx\")\n @@index([legacyId])\n @@index([projectId, status])\n}\n\n//////////////////////////////////////////\n// MemberChallengeAccess view – member/challenge pairs from resources schema\n//////////////////////////////////////////\n\nview MemberChallengeAccess {\n challengeId String\n memberId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id])\n\n @@map(\"MemberChallengeAccess\")\n}\n\n//////////////////////////////////////////\n// ChallengeType model\n//////////////////////////////////////////\n\nmodel ChallengeType {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n isTask Boolean @default(false)\n abbreviation String\n legacyId Int?\n isLegacy Boolean @default(false)\n\n challenges Challenge[]\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this type\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([abbreviation])\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTrack model\n//////////////////////////////////////////\n\nmodel ChallengeTrack {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean\n abbreviation String\n legacyId Int? // numeric legacy system id (if provided)\n track ChallengeTrackEnum? // enum value from ChallengeTrackEnum\n isLegacy Boolean @default(false)\n challenges Challenge[]\n // Opposite relation for ChallengeTimelineTemplate\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this track\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTimelineTemplate model\n//////////////////////////////////////////\n\nmodel ChallengeTimelineTemplate {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String // now required per Swagger spec\n\n // Link to the TimelineTemplate model via timelineTemplateId.\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id])\n // Link to the ChallengeTrack model via trackId.\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n // Link to the ChallengeType model via typeId.\n type ChallengeType @relation(fields: [typeId], references: [id])\n\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Composite index to support searches/updates by typeId, trackId and timelineTemplateId.\n @@index([typeId, trackId, timelineTemplateId])\n}\n\n//////////////////////////////////////////\n// AuditLog model – tracks field changes\n//////////////////////////////////////////\n\nmodel AuditLog {\n id String @id @default(uuid())\n challengeId String? // optional association with a challenge\n fieldName String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n createdBy String\n memberId String?\n\n // Relation field to connect AuditLog to Challenge.\n challenge Challenge? @relation(fields: [challengeId], references: [id])\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Attachment model – for challenge attachments\n//////////////////////////////////////////\n\nmodel Attachment {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String\n fileSize Int\n url String\n description String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeMetadata model – key/value metadata\n//////////////////////////////////////////\n\nmodel ChallengeMetadata {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String // name of the metadata\n value String // value stored as string for flexibility\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Prize model – individual prize in a prize set\n//////////////////////////////////////////\n\nmodel Prize {\n id String @id @default(uuid())\n description String?\n prizeSet ChallengePrizeSet @relation(fields: [prizeSetId], references: [id], onDelete: Cascade)\n prizeSetId String\n type String // e.g. \"USD\", \"POINT\" (could also be converted to enum later)\n value Float\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeWinner model – record winners for a challenge\n//////////////////////////////////////////\n\nmodel ChallengeWinner {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n userId Int\n handle String\n placement Int\n type PrizeSetTypeEnum\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type, placement])\n}\n\n//////////////////////////////////////////\n// ChallengeTerm model – association of challenge and terms\n//////////////////////////////////////////\n\nmodel ChallengeTerm {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n termId String // Terms API id\n roleId String // UUID for the associated role\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeSkill model – linking challenges with skills\n//////////////////////////////////////////\n\nmodel ChallengeSkill {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n skillId String // Request provided skillId\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeBilling model – normalized billing info\n//////////////////////////////////////////\n\nmodel ChallengeBilling {\n id String @id @default(uuid())\n billingAccountId String?\n markup Float? // in range [0, 100]\n clientBillingRate Float? // in range [0, 100]. Supporting range on postgres is an open issue with prisma https://github.com/prisma/prisma/issues/3287.\n challengeId String @unique\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeLegacy model – normalized legacy info\n//////////////////////////////////////////\n\nmodel ChallengeLegacy {\n id String @id @default(uuid())\n reviewType ReviewTypeEnum @default(INTERNAL)\n confidentialityType String @default(\"public\")\n forumId Int?\n directProjectId Int?\n screeningScorecardId Int?\n reviewScorecardId Int?\n isTask Boolean @default(false)\n useSchedulingAPI Boolean @default(false)\n pureV5Task Boolean @default(false)\n pureV5 Boolean @default(false)\n selfService Boolean @default(false)\n selfServiceCopilot String?\n track String? // as provided in the legacy object\n subTrack String? // as provided in the legacy object\n legacySystemId Int? // represents the external \"legacyId\"\n challengeId String @unique\n challenge Challenge @relation(\"ChallengeLegacyRelation\", fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeEvent model – normalized challenge events\n//////////////////////////////////////////\n\nmodel ChallengeEvent {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n eventId Int\n name String?\n key String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeDiscussion and associated options – normalized discussion channels\n//////////////////////////////////////////\n\nmodel ChallengeDiscussion {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n discussionId String?\n name String\n type DiscussionTypeEnum // updated to use enum\n provider String\n url String?\n options ChallengeDiscussionOption[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\nmodel ChallengeDiscussionOption {\n id String @id @default(uuid())\n discussion ChallengeDiscussion @relation(fields: [discussionId], references: [id], onDelete: Cascade)\n discussionId String\n optionKey String\n optionValue String\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeConstraint model – top-level challenge constraints (e.g. allowed registrants)\n//////////////////////////////////////////\n\nmodel ChallengeConstraint {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String @unique\n allowedRegistrants String[] @default([])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhase – to capture per-phase info from create/update challenge operations\n// Each phase is linked with a challenge and holds a duration and any custom constraints.\n//////////////////////////////////////////\n\nmodel Phase {\n id String @id @default(uuid())\n name String\n description String?\n isOpen Boolean\n duration Int\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Inverse relation for associated challenge phases\n challengePhases ChallengePhase[]\n ChallengeReviewer ChallengeReviewer[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\nmodel ChallengePhase {\n id String @id @default(uuid())\n challengeId String\n phaseId String // foreign key to Phase\n\n name String // phase name\n description String? // description\n isOpen Boolean? @default(false) // if this phase is open\n predecessor String? // predecessor of this phase\n duration Int? // duration in seconds\n scheduledStartDate DateTime? // when the phase is scheduled to start\n scheduledEndDate DateTime?\n actualStartDate DateTime?\n actualEndDate DateTime? // when the phase actually ended\n constraints ChallengePhaseConstraint[]\n\n // Relation fields\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n phase Phase @relation(fields: [phaseId], references: [id])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, isOpen])\n @@index([challengeId, name])\n @@index([challengeId, isOpen, scheduledEndDate, actualEndDate], map: \"challenge_phase_challenge_open_end_idx\")\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhaseConstraint – to capture custom constraints for each phase\n//////////////////////////////////////////\n\nmodel ChallengePhaseConstraint {\n id String @id @default(uuid())\n challengePhaseId String\n name String // the name/key of the constraint\n value Int // numeric value of the constraint (can be changed to Float if needed)\n\n // Relation to the phase\n challengePhase ChallengePhase @relation(fields: [challengePhaseId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengePhaseId])\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePrizeSet – to group prizes for a challenge\n//////////////////////////////////////////\n\nmodel ChallengePrizeSet {\n id String @id @default(uuid())\n challengeId String\n type PrizeSetTypeEnum // using enum instead of string\n description String?\n prizes Prize[]\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type])\n}\n\n//////////////////////////////////////////\n// ChallengeReviewer model – reviewers for a challenge, both AI and member\n//////////////////////////////////////////\n\nmodel ChallengeReviewer {\n id String @id @default(uuid())\n challengeId String\n\n // Reviewer configuration\n scorecardId String\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseId String\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n type ReviewOpportunityTypeEnum?\n aiWorkflowId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n // Relation to the phase\n phase Phase @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([phaseId])\n @@index([challengeId, phaseId])\n}\n\n//////////////////////////////////////////\n// DefaultChallengeReviewer model – default reviewers by type and track\n//////////////////////////////////////////\n\nmodel DefaultChallengeReviewer {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String?\n // Reviewer configuration (mirrors ChallengeReviewer)\n scorecardId String?\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseName String\n // Optional explicit link to Phase for better fidelity\n phaseId String?\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n opportunityType ReviewOpportunityTypeEnum?\n aiConfigTemplateId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relations\n challengeType ChallengeType @relation(fields: [typeId], references: [id])\n challengeTrack ChallengeTrack @relation(fields: [trackId], references: [id])\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n // Relation to Phase (optional for backward compatibility with phaseName)\n phase Phase? @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([typeId, trackId])\n @@index([typeId, trackId, timelineTemplateId])\n @@index([phaseId])\n}\n\n//////////////////////////////////////////\n// TimelineTemplate model – defines timeline templates\n//////////////////////////////////////////\nmodel TimelineTemplate {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n phases TimelineTemplatePhase[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Opposite relation field, linking back to ChallengeTimelineTemplate.\n challengeTimelineTemplates ChallengeTimelineTemplate[]\n\n // Opposite relation field for Challenge.\n challenges Challenge[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\n//////////////////////////////////////////\n// TimelineTemplatePhase model – phases associated with a timeline template\n//////////////////////////////////////////\nmodel TimelineTemplatePhase {\n id String @id @default(uuid())\n timelineTemplateId String\n phaseId String // identifier for the phase\n predecessor String? // optional predecessor phase id\n defaultDuration Int // duration (in minutes, hours, etc.) as per business rules\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id], onDelete: Cascade)\n\n @@index([timelineTemplateId])\n @@index([timelineTemplateId, phaseId])\n}\n", - "inlineSchemaHash": "013c60d710a175acc08038f512b16e5030bd0c3b8ccf59cb118c7e55c66e6caf", + "inlineSchema": "datasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/challenge-prisma-client\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\n// Enum for allowed challenge track values (matches app-constants)\nenum ChallengeTrackEnum {\n DESIGN\n DATA_SCIENCE\n DEVELOPMENT\n QUALITY_ASSURANCE\n}\n\nenum ReviewTypeEnum {\n COMMUNITY\n INTERNAL\n SYSTEM\n PROVISIONAL\n EXAMPLE\n}\n\nenum DiscussionTypeEnum {\n CHALLENGE\n}\n\nenum ChallengeStatusEnum {\n NEW\n DRAFT\n APPROVED\n ACTIVE\n COMPLETED\n DELETED\n CANCELLED\n CANCELLED_FAILED_REVIEW\n CANCELLED_FAILED_SCREENING\n CANCELLED_ZERO_SUBMISSIONS\n CANCELLED_WINNER_UNRESPONSIVE\n CANCELLED_CLIENT_REQUEST\n CANCELLED_REQUIREMENTS_INFEASIBLE\n CANCELLED_ZERO_REGISTRATIONS\n CANCELLED_PAYMENT_FAILED\n}\n\nenum PrizeSetTypeEnum {\n PLACEMENT\n COPILOT\n REVIEWER\n PASSED_REVIEW\n CHECKPOINT\n}\n\n// Enum for review opportunity types on reviewers\nenum ReviewOpportunityTypeEnum {\n REGULAR_REVIEW\n COMPONENT_DEV_REVIEW\n SPEC_REVIEW\n ITERATIVE_REVIEW\n SCENARIOS_REVIEW\n}\n\n//////////////////////////////////////////\n// Main Challenge model\n//////////////////////////////////////////\n\nmodel Challenge {\n id String @id @default(uuid())\n name String\n description String?\n privateDescription String?\n challengeSource String?\n descriptionFormat String?\n projectId Int? // frequently queried field\n typeId String\n trackId String // FK for relation in ChallengeTrack\n timelineTemplateId String? // now used as foreign key to ChallengeTimelineTemplate\n overviewTotalPrizes Float? // stored from overview.totalPrizes\n numOfRegistrants Int @default(0)\n numOfSubmissions Int @default(0)\n numOfCheckpointSubmissions Int @default(0)\n currentPhaseNames String[] // current phase names\n\n wiproAllowed Boolean @default(false)\n funChallenge Boolean @default(false)\n\n // simple arrays for tags and groups (PostgreSQL native array type)\n tags String[]\n groups String[]\n\n // Task information (flattened from challenge.task)\n taskIsTask Boolean @default(false)\n taskIsAssigned Boolean @default(false)\n taskMemberId String?\n\n // Dates for challenge lifecycle\n submissionStartDate DateTime?\n submissionEndDate DateTime?\n registrationStartDate DateTime?\n registrationEndDate DateTime?\n startDate DateTime?\n endDate DateTime?\n\n // Normalized billing and legacy information (one-to-one)\n billingRecord ChallengeBilling?\n legacyId Int? // Legacy system ID for searching\n legacyRecord ChallengeLegacy? @relation(\"ChallengeLegacyRelation\")\n\n // Additional fields from createChallenge schema\n status ChallengeStatusEnum @default(NEW) // new challenges default to status \"New\"\n // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge\n constraintRecord ChallengeConstraint?\n\n // Additional normalized relations from createChallenge\n events ChallengeEvent[]\n discussions ChallengeDiscussion[]\n\n // Existing relations (one-to-many) for challenge metadata, phases, prize sets, winners, attachments,\n // terms and skills\n metadata ChallengeMetadata[]\n phases ChallengePhase[]\n prizeSets ChallengePrizeSet[]\n reviewers ChallengeReviewer[]\n winners ChallengeWinner[]\n attachments Attachment[]\n terms ChallengeTerm[]\n skills ChallengeSkill[]\n auditLogs AuditLog[]\n memberAccesses MemberChallengeAccess[]\n userWhitelist ChallengeUserWhitelist[]\n\n // Relation to ChallengeType (FK: typeId)\n type ChallengeType @relation(fields: [typeId], references: [id])\n // Relation to ChallengeTrack (FK: trackId)\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n\n // Auditing fields (present in every table)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([projectId])\n @@index([status]) // index added for optimized search by status\n @@index([createdAt])\n @@index([updatedAt])\n @@index([typeId])\n @@index([trackId])\n @@index([groups], type: Gin, map: \"challenge_groups_gin_idx\")\n @@index([submissionStartDate])\n @@index([submissionEndDate])\n @@index([registrationStartDate])\n @@index([registrationEndDate])\n @@index([startDate])\n @@index([endDate])\n @@index([status, startDate])\n @@index([trackId, typeId, status])\n @@index([status, typeId, trackId, createdAt(sort: Desc)], map: \"challenge_status_type_track_created_at_idx\")\n @@index([legacyId])\n @@index([projectId, status])\n}\n\n//////////////////////////////////////////\n// Challenge user whitelist - member/challenge pairs allowed to access restricted challenges\n//////////////////////////////////////////\n\nmodel ChallengeUserWhitelist {\n challengeId String\n userId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n @@id([challengeId, userId])\n @@index([challengeId])\n @@index([userId])\n}\n\n//////////////////////////////////////////\n// MemberChallengeAccess view – member/challenge pairs from resources schema\n//////////////////////////////////////////\n\nview MemberChallengeAccess {\n challengeId String\n memberId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id])\n\n @@map(\"MemberChallengeAccess\")\n}\n\n//////////////////////////////////////////\n// ChallengeType model\n//////////////////////////////////////////\n\nmodel ChallengeType {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n isTask Boolean @default(false)\n abbreviation String\n legacyId Int?\n isLegacy Boolean @default(false)\n\n challenges Challenge[]\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this type\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([abbreviation])\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTrack model\n//////////////////////////////////////////\n\nmodel ChallengeTrack {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean\n abbreviation String\n legacyId Int? // numeric legacy system id (if provided)\n track ChallengeTrackEnum? // enum value from ChallengeTrackEnum\n isLegacy Boolean @default(false)\n challenges Challenge[]\n // Opposite relation for ChallengeTimelineTemplate\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this track\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTimelineTemplate model\n//////////////////////////////////////////\n\nmodel ChallengeTimelineTemplate {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String // now required per Swagger spec\n\n // Link to the TimelineTemplate model via timelineTemplateId.\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id])\n // Link to the ChallengeTrack model via trackId.\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n // Link to the ChallengeType model via typeId.\n type ChallengeType @relation(fields: [typeId], references: [id])\n\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Composite index to support searches/updates by typeId, trackId and timelineTemplateId.\n @@index([typeId, trackId, timelineTemplateId])\n}\n\n//////////////////////////////////////////\n// AuditLog model – tracks field changes\n//////////////////////////////////////////\n\nmodel AuditLog {\n id String @id @default(uuid())\n challengeId String? // optional association with a challenge\n fieldName String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n createdBy String\n memberId String?\n\n // Relation field to connect AuditLog to Challenge.\n challenge Challenge? @relation(fields: [challengeId], references: [id])\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Attachment model – for challenge attachments\n//////////////////////////////////////////\n\nmodel Attachment {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String\n fileSize Int\n url String\n description String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeMetadata model – key/value metadata\n//////////////////////////////////////////\n\nmodel ChallengeMetadata {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String // name of the metadata\n value String // value stored as string for flexibility\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Prize model – individual prize in a prize set\n//////////////////////////////////////////\n\nmodel Prize {\n id String @id @default(uuid())\n description String?\n prizeSet ChallengePrizeSet @relation(fields: [prizeSetId], references: [id], onDelete: Cascade)\n prizeSetId String\n type String // e.g. \"USD\", \"POINT\" (could also be converted to enum later)\n value Float\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeWinner model – record winners for a challenge\n//////////////////////////////////////////\n\nmodel ChallengeWinner {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n userId Int\n handle String\n placement Int\n type PrizeSetTypeEnum\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type, placement])\n}\n\n//////////////////////////////////////////\n// ChallengeTerm model – association of challenge and terms\n//////////////////////////////////////////\n\nmodel ChallengeTerm {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n termId String // Terms API id\n roleId String // UUID for the associated role\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeSkill model – linking challenges with skills\n//////////////////////////////////////////\n\nmodel ChallengeSkill {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n skillId String // Request provided skillId\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeBilling model – normalized billing info\n//////////////////////////////////////////\n\nmodel ChallengeBilling {\n id String @id @default(uuid())\n billingAccountId String?\n markup Float? // in range [0, 100]\n clientBillingRate Float? // in range [0, 100]. Supporting range on postgres is an open issue with prisma https://github.com/prisma/prisma/issues/3287.\n challengeId String @unique\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeLegacy model – normalized legacy info\n//////////////////////////////////////////\n\nmodel ChallengeLegacy {\n id String @id @default(uuid())\n reviewType ReviewTypeEnum @default(INTERNAL)\n confidentialityType String @default(\"public\")\n forumId Int?\n directProjectId Int?\n screeningScorecardId Int?\n reviewScorecardId Int?\n isTask Boolean @default(false)\n useSchedulingAPI Boolean @default(false)\n pureV5Task Boolean @default(false)\n pureV5 Boolean @default(false)\n selfService Boolean @default(false)\n selfServiceCopilot String?\n track String? // as provided in the legacy object\n subTrack String? // as provided in the legacy object\n legacySystemId Int? // represents the external \"legacyId\"\n challengeId String @unique\n challenge Challenge @relation(\"ChallengeLegacyRelation\", fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeEvent model – normalized challenge events\n//////////////////////////////////////////\n\nmodel ChallengeEvent {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n eventId Int\n name String?\n key String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeDiscussion and associated options – normalized discussion channels\n//////////////////////////////////////////\n\nmodel ChallengeDiscussion {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n discussionId String?\n name String\n type DiscussionTypeEnum // updated to use enum\n provider String\n url String?\n options ChallengeDiscussionOption[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\nmodel ChallengeDiscussionOption {\n id String @id @default(uuid())\n discussion ChallengeDiscussion @relation(fields: [discussionId], references: [id], onDelete: Cascade)\n discussionId String\n optionKey String\n optionValue String\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeConstraint model – top-level challenge constraints (e.g. allowed registrants)\n//////////////////////////////////////////\n\nmodel ChallengeConstraint {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String @unique\n allowedRegistrants String[] @default([])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhase – to capture per-phase info from create/update challenge operations\n// Each phase is linked with a challenge and holds a duration and any custom constraints.\n//////////////////////////////////////////\n\nmodel Phase {\n id String @id @default(uuid())\n name String\n description String?\n isOpen Boolean\n duration Int\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Inverse relation for associated challenge phases\n challengePhases ChallengePhase[]\n ChallengeReviewer ChallengeReviewer[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\nmodel ChallengePhase {\n id String @id @default(uuid())\n challengeId String\n phaseId String // foreign key to Phase\n\n name String // phase name\n description String? // description\n isOpen Boolean? @default(false) // if this phase is open\n predecessor String? // predecessor of this phase\n duration Int? // duration in seconds\n scheduledStartDate DateTime? // when the phase is scheduled to start\n scheduledEndDate DateTime?\n actualStartDate DateTime?\n actualEndDate DateTime? // when the phase actually ended\n constraints ChallengePhaseConstraint[]\n\n // Relation fields\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n phase Phase @relation(fields: [phaseId], references: [id])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, isOpen])\n @@index([challengeId, name])\n @@index([challengeId, isOpen, scheduledEndDate, actualEndDate], map: \"challenge_phase_challenge_open_end_idx\")\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhaseConstraint – to capture custom constraints for each phase\n//////////////////////////////////////////\n\nmodel ChallengePhaseConstraint {\n id String @id @default(uuid())\n challengePhaseId String\n name String // the name/key of the constraint\n value Int // numeric value of the constraint (can be changed to Float if needed)\n\n // Relation to the phase\n challengePhase ChallengePhase @relation(fields: [challengePhaseId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengePhaseId])\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePrizeSet – to group prizes for a challenge\n//////////////////////////////////////////\n\nmodel ChallengePrizeSet {\n id String @id @default(uuid())\n challengeId String\n type PrizeSetTypeEnum // using enum instead of string\n description String?\n prizes Prize[]\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type])\n}\n\n//////////////////////////////////////////\n// ChallengeReviewer model – reviewers for a challenge, both AI and member\n//////////////////////////////////////////\n\nmodel ChallengeReviewer {\n id String @id @default(uuid())\n challengeId String\n\n // Reviewer configuration\n scorecardId String\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseId String\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n type ReviewOpportunityTypeEnum?\n aiWorkflowId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n // Relation to the phase\n phase Phase @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([phaseId])\n @@index([challengeId, phaseId])\n}\n\n//////////////////////////////////////////\n// DefaultChallengeReviewer model – default reviewers by type and track\n//////////////////////////////////////////\n\nmodel DefaultChallengeReviewer {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String?\n // Reviewer configuration (mirrors ChallengeReviewer)\n scorecardId String?\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseName String\n // Optional explicit link to Phase for better fidelity\n phaseId String?\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n opportunityType ReviewOpportunityTypeEnum?\n aiConfigTemplateId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relations\n challengeType ChallengeType @relation(fields: [typeId], references: [id])\n challengeTrack ChallengeTrack @relation(fields: [trackId], references: [id])\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n // Relation to Phase (optional for backward compatibility with phaseName)\n phase Phase? @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([typeId, trackId])\n @@index([typeId, trackId, timelineTemplateId])\n @@index([phaseId])\n}\n\n//////////////////////////////////////////\n// TimelineTemplate model – defines timeline templates\n//////////////////////////////////////////\nmodel TimelineTemplate {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n phases TimelineTemplatePhase[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Opposite relation field, linking back to ChallengeTimelineTemplate.\n challengeTimelineTemplates ChallengeTimelineTemplate[]\n\n // Opposite relation field for Challenge.\n challenges Challenge[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\n//////////////////////////////////////////\n// TimelineTemplatePhase model – phases associated with a timeline template\n//////////////////////////////////////////\nmodel TimelineTemplatePhase {\n id String @id @default(uuid())\n timelineTemplateId String\n phaseId String // identifier for the phase\n predecessor String? // optional predecessor phase id\n defaultDuration Int // duration (in minutes, hours, etc.) as per business rules\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id], onDelete: Cascade)\n\n @@index([timelineTemplateId])\n @@index([timelineTemplateId, phaseId])\n}\n", + "inlineSchemaHash": "6753f3f63bc1895caf833af5127cc8a05e8be5541a69a7584ca96249e47fe064", "copyEngine": true } @@ -875,7 +886,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Challenge\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privateDescription\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeSource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"descriptionFormat\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"projectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"overviewTotalPrizes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfRegistrants\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfCheckpointSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentPhaseNames\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wiproAllowed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"funChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tags\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"groups\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsAssigned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskMemberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeBilling\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeLegacy\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ChallengeStatusEnum\",\"nativeType\":null,\"default\":\"NEW\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraintRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeConstraint\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeEvent\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"metadata\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeMetadata\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSets\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winners\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeWinner\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attachments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Attachment\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"terms\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTerm\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skills\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeSkill\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"auditLogs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuditLog\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberAccesses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MemberChallengeAccess\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeType\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTrack\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrackEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuditLog\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"newValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Attachment\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileSize\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeMetadata\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Prize\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSet\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[\"prizeSetId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSetId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeWinner\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"handle\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"placement\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTerm\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"termId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeSkill\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skillId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeBilling\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"markup\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientBillingRate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeLegacy\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ReviewTypeEnum\",\"nativeType\":null,\"default\":\"INTERNAL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confidentialityType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"public\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"forumId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"directProjectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"screeningScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"useSchedulingAPI\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5Task\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfService\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfServiceCopilot\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subTrack\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacySystemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeEvent\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussion\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DiscussionTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"options\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussionOption\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussionOption\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussion\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[\"discussionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"allowedRegistrants\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Phase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false},\"ChallengePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraints\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhaseConstraint\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePhaseConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[\"challengePhaseId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePrizeSet\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Prize\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiWorkflowId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DefaultChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opportunityType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiConfigTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeType\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTrack\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplatePhase\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTimelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"TimelineTemplatePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultDuration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"MemberChallengeAccess\":{\"dbName\":\"MemberChallengeAccess\",\"schema\":null,\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"ChallengeTrackEnum\":{\"values\":[{\"name\":\"DESIGN\",\"dbName\":null},{\"name\":\"DATA_SCIENCE\",\"dbName\":null},{\"name\":\"DEVELOPMENT\",\"dbName\":null},{\"name\":\"QUALITY_ASSURANCE\",\"dbName\":null}],\"dbName\":null},\"ReviewTypeEnum\":{\"values\":[{\"name\":\"COMMUNITY\",\"dbName\":null},{\"name\":\"INTERNAL\",\"dbName\":null},{\"name\":\"SYSTEM\",\"dbName\":null},{\"name\":\"PROVISIONAL\",\"dbName\":null},{\"name\":\"EXAMPLE\",\"dbName\":null}],\"dbName\":null},\"DiscussionTypeEnum\":{\"values\":[{\"name\":\"CHALLENGE\",\"dbName\":null}],\"dbName\":null},\"ChallengeStatusEnum\":{\"values\":[{\"name\":\"NEW\",\"dbName\":null},{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"APPROVED\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null},{\"name\":\"DELETED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_REVIEW\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_SCREENING\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_SUBMISSIONS\",\"dbName\":null},{\"name\":\"CANCELLED_WINNER_UNRESPONSIVE\",\"dbName\":null},{\"name\":\"CANCELLED_CLIENT_REQUEST\",\"dbName\":null},{\"name\":\"CANCELLED_REQUIREMENTS_INFEASIBLE\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_REGISTRATIONS\",\"dbName\":null},{\"name\":\"CANCELLED_PAYMENT_FAILED\",\"dbName\":null}],\"dbName\":null},\"PrizeSetTypeEnum\":{\"values\":[{\"name\":\"PLACEMENT\",\"dbName\":null},{\"name\":\"COPILOT\",\"dbName\":null},{\"name\":\"REVIEWER\",\"dbName\":null},{\"name\":\"PASSED_REVIEW\",\"dbName\":null},{\"name\":\"CHECKPOINT\",\"dbName\":null}],\"dbName\":null},\"ReviewOpportunityTypeEnum\":{\"values\":[{\"name\":\"REGULAR_REVIEW\",\"dbName\":null},{\"name\":\"COMPONENT_DEV_REVIEW\",\"dbName\":null},{\"name\":\"SPEC_REVIEW\",\"dbName\":null},{\"name\":\"ITERATIVE_REVIEW\",\"dbName\":null},{\"name\":\"SCENARIOS_REVIEW\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Challenge\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privateDescription\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeSource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"descriptionFormat\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"projectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"overviewTotalPrizes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfRegistrants\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"numOfCheckpointSubmissions\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentPhaseNames\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wiproAllowed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"funChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tags\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"groups\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskIsAssigned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskMemberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"submissionEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"registrationEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeBilling\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeLegacy\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ChallengeStatusEnum\",\"nativeType\":null,\"default\":\"NEW\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraintRecord\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeConstraint\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeEvent\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"metadata\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeMetadata\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSets\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winners\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeWinner\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attachments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Attachment\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"terms\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTerm\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skills\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeSkill\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"auditLogs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuditLog\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberAccesses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MemberChallengeAccess\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userWhitelist\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeUserWhitelist\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeUserWhitelist\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeUserWhitelist\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeUserWhitelist\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"challengeId\",\"userId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeType\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTrack\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrackEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToChallengeType\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuditLog\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"newValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AuditLogToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Attachment\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"AttachmentToChallenge\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileSize\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeMetadata\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeMetadata\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Prize\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSet\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePrizeSet\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[\"prizeSetId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizeSetId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeWinner\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeWinner\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"handle\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"placement\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeTerm\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeTerm\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"termId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeSkill\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeSkill\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"skillId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeBilling\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"billingAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"markup\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientBillingRate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeBilling\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeLegacy\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ReviewTypeEnum\",\"nativeType\":null,\"default\":\"INTERNAL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confidentialityType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"public\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"forumId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"directProjectId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"screeningScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reviewScorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isTask\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"useSchedulingAPI\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5Task\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pureV5\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfService\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"selfServiceCopilot\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"track\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subTrack\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"legacySystemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeLegacyRelation\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeEvent\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeEvent\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussion\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeDiscussion\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DiscussionTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"url\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"options\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussionOption\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeDiscussionOption\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussion\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeDiscussion\",\"nativeType\":null,\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\",\"relationFromFields\":[\"discussionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"optionValue\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeConstraint\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"allowedRegistrants\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Phase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeReviewer\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false},\"ChallengePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"duration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scheduledEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualStartDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actualEndDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"constraints\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhaseConstraint\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePhase\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePhaseConstraint\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengePhase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengePhase\",\"nativeType\":null,\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\",\"relationFromFields\":[\"challengePhaseId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengePrizeSet\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PrizeSetTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"prizes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Prize\",\"nativeType\":null,\"relationName\":\"ChallengePrizeSetToPrize\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengePrizeSet\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiWorkflowId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToChallengeReviewer\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"ChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DefaultChallengeReviewer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"typeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"trackId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opportunityType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ReviewOpportunityTypeEnum\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aiConfigTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"VarChar\",[\"14\"]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeType\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeType\",\"nativeType\":null,\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\",\"relationFromFields\":[\"typeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTrack\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTrack\",\"nativeType\":null,\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\",\"relationFromFields\":[\"trackId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phase\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Phase\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToPhase\",\"relationFromFields\":[\"phaseId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TimelineTemplate\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phases\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplatePhase\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challengeTimelineTemplates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ChallengeTimelineTemplate\",\"nativeType\":null,\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenges\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DefaultChallengeReviewer\",\"nativeType\":null,\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"name\"]}],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"TimelineTemplatePhase\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultDuration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TimelineTemplate\",\"nativeType\":null,\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\",\"relationFromFields\":[\"timelineTemplateId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false,\"documentation\":\"///////////////////////////////////////\\\\n///////////////////////////////////////\"},\"MemberChallengeAccess\":{\"dbName\":\"MemberChallengeAccess\",\"schema\":null,\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"memberId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"challenge\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Challenge\",\"nativeType\":null,\"relationName\":\"ChallengeToMemberChallengeAccess\",\"relationFromFields\":[\"challengeId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"ChallengeTrackEnum\":{\"values\":[{\"name\":\"DESIGN\",\"dbName\":null},{\"name\":\"DATA_SCIENCE\",\"dbName\":null},{\"name\":\"DEVELOPMENT\",\"dbName\":null},{\"name\":\"QUALITY_ASSURANCE\",\"dbName\":null}],\"dbName\":null},\"ReviewTypeEnum\":{\"values\":[{\"name\":\"COMMUNITY\",\"dbName\":null},{\"name\":\"INTERNAL\",\"dbName\":null},{\"name\":\"SYSTEM\",\"dbName\":null},{\"name\":\"PROVISIONAL\",\"dbName\":null},{\"name\":\"EXAMPLE\",\"dbName\":null}],\"dbName\":null},\"DiscussionTypeEnum\":{\"values\":[{\"name\":\"CHALLENGE\",\"dbName\":null}],\"dbName\":null},\"ChallengeStatusEnum\":{\"values\":[{\"name\":\"NEW\",\"dbName\":null},{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"APPROVED\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null},{\"name\":\"DELETED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_REVIEW\",\"dbName\":null},{\"name\":\"CANCELLED_FAILED_SCREENING\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_SUBMISSIONS\",\"dbName\":null},{\"name\":\"CANCELLED_WINNER_UNRESPONSIVE\",\"dbName\":null},{\"name\":\"CANCELLED_CLIENT_REQUEST\",\"dbName\":null},{\"name\":\"CANCELLED_REQUIREMENTS_INFEASIBLE\",\"dbName\":null},{\"name\":\"CANCELLED_ZERO_REGISTRATIONS\",\"dbName\":null},{\"name\":\"CANCELLED_PAYMENT_FAILED\",\"dbName\":null}],\"dbName\":null},\"PrizeSetTypeEnum\":{\"values\":[{\"name\":\"PLACEMENT\",\"dbName\":null},{\"name\":\"COPILOT\",\"dbName\":null},{\"name\":\"REVIEWER\",\"dbName\":null},{\"name\":\"PASSED_REVIEW\",\"dbName\":null},{\"name\":\"CHECKPOINT\",\"dbName\":null}],\"dbName\":null},\"ReviewOpportunityTypeEnum\":{\"values\":[{\"name\":\"REGULAR_REVIEW\",\"dbName\":null},{\"name\":\"COMPONENT_DEV_REVIEW\",\"dbName\":null},{\"name\":\"SPEC_REVIEW\",\"dbName\":null},{\"name\":\"ITERATIVE_REVIEW\",\"dbName\":null},{\"name\":\"SCENARIOS_REVIEW\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined config.compilerWasm = undefined diff --git a/packages/challenge-prisma-client/package.json b/packages/challenge-prisma-client/package.json index b098a5b..9fa6974 100644 --- a/packages/challenge-prisma-client/package.json +++ b/packages/challenge-prisma-client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-e2cf38d434b78ed912a564b65835f204eb8d7146f275867a9db51b0649d6da72", + "name": "prisma-client-e744e9b1efacd7e6351c1e7f027a0b525a969a43ec500294d88aab18d33d9ec0", "main": "index.js", "types": "index.d.ts", "browser": "default.js", diff --git a/packages/challenge-prisma-client/schema.prisma b/packages/challenge-prisma-client/schema.prisma index 9e38a96..2d8e0a4 100644 --- a/packages/challenge-prisma-client/schema.prisma +++ b/packages/challenge-prisma-client/schema.prisma @@ -137,6 +137,7 @@ model Challenge { skills ChallengeSkill[] auditLogs AuditLog[] memberAccesses MemberChallengeAccess[] + userWhitelist ChallengeUserWhitelist[] // Relation to ChallengeType (FK: typeId) type ChallengeType @relation(fields: [typeId], references: [id]) @@ -171,6 +172,21 @@ model Challenge { @@index([projectId, status]) } +////////////////////////////////////////// +// Challenge user whitelist - member/challenge pairs allowed to access restricted challenges +////////////////////////////////////////// + +model ChallengeUserWhitelist { + challengeId String + userId String + + challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade) + + @@id([challengeId, userId]) + @@index([challengeId]) + @@index([userId]) +} + ////////////////////////////////////////// // MemberChallengeAccess view – member/challenge pairs from resources schema ////////////////////////////////////////// diff --git a/packages/challenge-prisma-client/wasm.js b/packages/challenge-prisma-client/wasm.js index 0e47dd7..8cd5d7d 100644 --- a/packages/challenge-prisma-client/wasm.js +++ b/packages/challenge-prisma-client/wasm.js @@ -130,6 +130,11 @@ exports.Prisma.ChallengeScalarFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistScalarFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeScalarFieldEnum = { id: 'id', name: 'name', @@ -491,6 +496,11 @@ exports.Prisma.ChallengeOrderByRelevanceFieldEnum = { updatedBy: 'updatedBy' }; +exports.Prisma.ChallengeUserWhitelistOrderByRelevanceFieldEnum = { + challengeId: 'challengeId', + userId: 'userId' +}; + exports.Prisma.ChallengeTypeOrderByRelevanceFieldEnum = { id: 'id', name: 'name', @@ -771,6 +781,7 @@ exports.ReviewOpportunityTypeEnum = exports.$Enums.ReviewOpportunityTypeEnum = { exports.Prisma.ModelName = { Challenge: 'Challenge', + ChallengeUserWhitelist: 'ChallengeUserWhitelist', ChallengeType: 'ChallengeType', ChallengeTrack: 'ChallengeTrack', ChallengeTimelineTemplate: 'ChallengeTimelineTemplate', @@ -852,13 +863,13 @@ const config = { } } }, - "inlineSchema": "datasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/challenge-prisma-client\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\n// Enum for allowed challenge track values (matches app-constants)\nenum ChallengeTrackEnum {\n DESIGN\n DATA_SCIENCE\n DEVELOPMENT\n QUALITY_ASSURANCE\n}\n\nenum ReviewTypeEnum {\n COMMUNITY\n INTERNAL\n SYSTEM\n PROVISIONAL\n EXAMPLE\n}\n\nenum DiscussionTypeEnum {\n CHALLENGE\n}\n\nenum ChallengeStatusEnum {\n NEW\n DRAFT\n APPROVED\n ACTIVE\n COMPLETED\n DELETED\n CANCELLED\n CANCELLED_FAILED_REVIEW\n CANCELLED_FAILED_SCREENING\n CANCELLED_ZERO_SUBMISSIONS\n CANCELLED_WINNER_UNRESPONSIVE\n CANCELLED_CLIENT_REQUEST\n CANCELLED_REQUIREMENTS_INFEASIBLE\n CANCELLED_ZERO_REGISTRATIONS\n CANCELLED_PAYMENT_FAILED\n}\n\nenum PrizeSetTypeEnum {\n PLACEMENT\n COPILOT\n REVIEWER\n PASSED_REVIEW\n CHECKPOINT\n}\n\n// Enum for review opportunity types on reviewers\nenum ReviewOpportunityTypeEnum {\n REGULAR_REVIEW\n COMPONENT_DEV_REVIEW\n SPEC_REVIEW\n ITERATIVE_REVIEW\n SCENARIOS_REVIEW\n}\n\n//////////////////////////////////////////\n// Main Challenge model\n//////////////////////////////////////////\n\nmodel Challenge {\n id String @id @default(uuid())\n name String\n description String?\n privateDescription String?\n challengeSource String?\n descriptionFormat String?\n projectId Int? // frequently queried field\n typeId String\n trackId String // FK for relation in ChallengeTrack\n timelineTemplateId String? // now used as foreign key to ChallengeTimelineTemplate\n overviewTotalPrizes Float? // stored from overview.totalPrizes\n numOfRegistrants Int @default(0)\n numOfSubmissions Int @default(0)\n numOfCheckpointSubmissions Int @default(0)\n currentPhaseNames String[] // current phase names\n\n wiproAllowed Boolean @default(false)\n funChallenge Boolean @default(false)\n\n // simple arrays for tags and groups (PostgreSQL native array type)\n tags String[]\n groups String[]\n\n // Task information (flattened from challenge.task)\n taskIsTask Boolean @default(false)\n taskIsAssigned Boolean @default(false)\n taskMemberId String?\n\n // Dates for challenge lifecycle\n submissionStartDate DateTime?\n submissionEndDate DateTime?\n registrationStartDate DateTime?\n registrationEndDate DateTime?\n startDate DateTime?\n endDate DateTime?\n\n // Normalized billing and legacy information (one-to-one)\n billingRecord ChallengeBilling?\n legacyId Int? // Legacy system ID for searching\n legacyRecord ChallengeLegacy? @relation(\"ChallengeLegacyRelation\")\n\n // Additional fields from createChallenge schema\n status ChallengeStatusEnum @default(NEW) // new challenges default to status \"New\"\n // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge\n constraintRecord ChallengeConstraint?\n\n // Additional normalized relations from createChallenge\n events ChallengeEvent[]\n discussions ChallengeDiscussion[]\n\n // Existing relations (one-to-many) for challenge metadata, phases, prize sets, winners, attachments,\n // terms and skills\n metadata ChallengeMetadata[]\n phases ChallengePhase[]\n prizeSets ChallengePrizeSet[]\n reviewers ChallengeReviewer[]\n winners ChallengeWinner[]\n attachments Attachment[]\n terms ChallengeTerm[]\n skills ChallengeSkill[]\n auditLogs AuditLog[]\n memberAccesses MemberChallengeAccess[]\n\n // Relation to ChallengeType (FK: typeId)\n type ChallengeType @relation(fields: [typeId], references: [id])\n // Relation to ChallengeTrack (FK: trackId)\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n\n // Auditing fields (present in every table)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([projectId])\n @@index([status]) // index added for optimized search by status\n @@index([createdAt])\n @@index([updatedAt])\n @@index([typeId])\n @@index([trackId])\n @@index([groups], type: Gin, map: \"challenge_groups_gin_idx\")\n @@index([submissionStartDate])\n @@index([submissionEndDate])\n @@index([registrationStartDate])\n @@index([registrationEndDate])\n @@index([startDate])\n @@index([endDate])\n @@index([status, startDate])\n @@index([trackId, typeId, status])\n @@index([status, typeId, trackId, createdAt(sort: Desc)], map: \"challenge_status_type_track_created_at_idx\")\n @@index([legacyId])\n @@index([projectId, status])\n}\n\n//////////////////////////////////////////\n// MemberChallengeAccess view – member/challenge pairs from resources schema\n//////////////////////////////////////////\n\nview MemberChallengeAccess {\n challengeId String\n memberId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id])\n\n @@map(\"MemberChallengeAccess\")\n}\n\n//////////////////////////////////////////\n// ChallengeType model\n//////////////////////////////////////////\n\nmodel ChallengeType {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n isTask Boolean @default(false)\n abbreviation String\n legacyId Int?\n isLegacy Boolean @default(false)\n\n challenges Challenge[]\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this type\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([abbreviation])\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTrack model\n//////////////////////////////////////////\n\nmodel ChallengeTrack {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean\n abbreviation String\n legacyId Int? // numeric legacy system id (if provided)\n track ChallengeTrackEnum? // enum value from ChallengeTrackEnum\n isLegacy Boolean @default(false)\n challenges Challenge[]\n // Opposite relation for ChallengeTimelineTemplate\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this track\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTimelineTemplate model\n//////////////////////////////////////////\n\nmodel ChallengeTimelineTemplate {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String // now required per Swagger spec\n\n // Link to the TimelineTemplate model via timelineTemplateId.\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id])\n // Link to the ChallengeTrack model via trackId.\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n // Link to the ChallengeType model via typeId.\n type ChallengeType @relation(fields: [typeId], references: [id])\n\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Composite index to support searches/updates by typeId, trackId and timelineTemplateId.\n @@index([typeId, trackId, timelineTemplateId])\n}\n\n//////////////////////////////////////////\n// AuditLog model – tracks field changes\n//////////////////////////////////////////\n\nmodel AuditLog {\n id String @id @default(uuid())\n challengeId String? // optional association with a challenge\n fieldName String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n createdBy String\n memberId String?\n\n // Relation field to connect AuditLog to Challenge.\n challenge Challenge? @relation(fields: [challengeId], references: [id])\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Attachment model – for challenge attachments\n//////////////////////////////////////////\n\nmodel Attachment {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String\n fileSize Int\n url String\n description String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeMetadata model – key/value metadata\n//////////////////////////////////////////\n\nmodel ChallengeMetadata {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String // name of the metadata\n value String // value stored as string for flexibility\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Prize model – individual prize in a prize set\n//////////////////////////////////////////\n\nmodel Prize {\n id String @id @default(uuid())\n description String?\n prizeSet ChallengePrizeSet @relation(fields: [prizeSetId], references: [id], onDelete: Cascade)\n prizeSetId String\n type String // e.g. \"USD\", \"POINT\" (could also be converted to enum later)\n value Float\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeWinner model – record winners for a challenge\n//////////////////////////////////////////\n\nmodel ChallengeWinner {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n userId Int\n handle String\n placement Int\n type PrizeSetTypeEnum\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type, placement])\n}\n\n//////////////////////////////////////////\n// ChallengeTerm model – association of challenge and terms\n//////////////////////////////////////////\n\nmodel ChallengeTerm {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n termId String // Terms API id\n roleId String // UUID for the associated role\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeSkill model – linking challenges with skills\n//////////////////////////////////////////\n\nmodel ChallengeSkill {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n skillId String // Request provided skillId\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeBilling model – normalized billing info\n//////////////////////////////////////////\n\nmodel ChallengeBilling {\n id String @id @default(uuid())\n billingAccountId String?\n markup Float? // in range [0, 100]\n clientBillingRate Float? // in range [0, 100]. Supporting range on postgres is an open issue with prisma https://github.com/prisma/prisma/issues/3287.\n challengeId String @unique\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeLegacy model – normalized legacy info\n//////////////////////////////////////////\n\nmodel ChallengeLegacy {\n id String @id @default(uuid())\n reviewType ReviewTypeEnum @default(INTERNAL)\n confidentialityType String @default(\"public\")\n forumId Int?\n directProjectId Int?\n screeningScorecardId Int?\n reviewScorecardId Int?\n isTask Boolean @default(false)\n useSchedulingAPI Boolean @default(false)\n pureV5Task Boolean @default(false)\n pureV5 Boolean @default(false)\n selfService Boolean @default(false)\n selfServiceCopilot String?\n track String? // as provided in the legacy object\n subTrack String? // as provided in the legacy object\n legacySystemId Int? // represents the external \"legacyId\"\n challengeId String @unique\n challenge Challenge @relation(\"ChallengeLegacyRelation\", fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeEvent model – normalized challenge events\n//////////////////////////////////////////\n\nmodel ChallengeEvent {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n eventId Int\n name String?\n key String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeDiscussion and associated options – normalized discussion channels\n//////////////////////////////////////////\n\nmodel ChallengeDiscussion {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n discussionId String?\n name String\n type DiscussionTypeEnum // updated to use enum\n provider String\n url String?\n options ChallengeDiscussionOption[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\nmodel ChallengeDiscussionOption {\n id String @id @default(uuid())\n discussion ChallengeDiscussion @relation(fields: [discussionId], references: [id], onDelete: Cascade)\n discussionId String\n optionKey String\n optionValue String\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeConstraint model – top-level challenge constraints (e.g. allowed registrants)\n//////////////////////////////////////////\n\nmodel ChallengeConstraint {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String @unique\n allowedRegistrants String[] @default([])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhase – to capture per-phase info from create/update challenge operations\n// Each phase is linked with a challenge and holds a duration and any custom constraints.\n//////////////////////////////////////////\n\nmodel Phase {\n id String @id @default(uuid())\n name String\n description String?\n isOpen Boolean\n duration Int\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Inverse relation for associated challenge phases\n challengePhases ChallengePhase[]\n ChallengeReviewer ChallengeReviewer[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\nmodel ChallengePhase {\n id String @id @default(uuid())\n challengeId String\n phaseId String // foreign key to Phase\n\n name String // phase name\n description String? // description\n isOpen Boolean? @default(false) // if this phase is open\n predecessor String? // predecessor of this phase\n duration Int? // duration in seconds\n scheduledStartDate DateTime? // when the phase is scheduled to start\n scheduledEndDate DateTime?\n actualStartDate DateTime?\n actualEndDate DateTime? // when the phase actually ended\n constraints ChallengePhaseConstraint[]\n\n // Relation fields\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n phase Phase @relation(fields: [phaseId], references: [id])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, isOpen])\n @@index([challengeId, name])\n @@index([challengeId, isOpen, scheduledEndDate, actualEndDate], map: \"challenge_phase_challenge_open_end_idx\")\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhaseConstraint – to capture custom constraints for each phase\n//////////////////////////////////////////\n\nmodel ChallengePhaseConstraint {\n id String @id @default(uuid())\n challengePhaseId String\n name String // the name/key of the constraint\n value Int // numeric value of the constraint (can be changed to Float if needed)\n\n // Relation to the phase\n challengePhase ChallengePhase @relation(fields: [challengePhaseId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengePhaseId])\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePrizeSet – to group prizes for a challenge\n//////////////////////////////////////////\n\nmodel ChallengePrizeSet {\n id String @id @default(uuid())\n challengeId String\n type PrizeSetTypeEnum // using enum instead of string\n description String?\n prizes Prize[]\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type])\n}\n\n//////////////////////////////////////////\n// ChallengeReviewer model – reviewers for a challenge, both AI and member\n//////////////////////////////////////////\n\nmodel ChallengeReviewer {\n id String @id @default(uuid())\n challengeId String\n\n // Reviewer configuration\n scorecardId String\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseId String\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n type ReviewOpportunityTypeEnum?\n aiWorkflowId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n // Relation to the phase\n phase Phase @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([phaseId])\n @@index([challengeId, phaseId])\n}\n\n//////////////////////////////////////////\n// DefaultChallengeReviewer model – default reviewers by type and track\n//////////////////////////////////////////\n\nmodel DefaultChallengeReviewer {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String?\n // Reviewer configuration (mirrors ChallengeReviewer)\n scorecardId String?\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseName String\n // Optional explicit link to Phase for better fidelity\n phaseId String?\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n opportunityType ReviewOpportunityTypeEnum?\n aiConfigTemplateId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relations\n challengeType ChallengeType @relation(fields: [typeId], references: [id])\n challengeTrack ChallengeTrack @relation(fields: [trackId], references: [id])\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n // Relation to Phase (optional for backward compatibility with phaseName)\n phase Phase? @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([typeId, trackId])\n @@index([typeId, trackId, timelineTemplateId])\n @@index([phaseId])\n}\n\n//////////////////////////////////////////\n// TimelineTemplate model – defines timeline templates\n//////////////////////////////////////////\nmodel TimelineTemplate {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n phases TimelineTemplatePhase[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Opposite relation field, linking back to ChallengeTimelineTemplate.\n challengeTimelineTemplates ChallengeTimelineTemplate[]\n\n // Opposite relation field for Challenge.\n challenges Challenge[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\n//////////////////////////////////////////\n// TimelineTemplatePhase model – phases associated with a timeline template\n//////////////////////////////////////////\nmodel TimelineTemplatePhase {\n id String @id @default(uuid())\n timelineTemplateId String\n phaseId String // identifier for the phase\n predecessor String? // optional predecessor phase id\n defaultDuration Int // duration (in minutes, hours, etc.) as per business rules\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id], onDelete: Cascade)\n\n @@index([timelineTemplateId])\n @@index([timelineTemplateId, phaseId])\n}\n", - "inlineSchemaHash": "013c60d710a175acc08038f512b16e5030bd0c3b8ccf59cb118c7e55c66e6caf", + "inlineSchema": "datasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/challenge-prisma-client\"\n previewFeatures = [\"fullTextSearchPostgres\", \"postgresqlExtensions\", \"views\"]\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\n// Enum for allowed challenge track values (matches app-constants)\nenum ChallengeTrackEnum {\n DESIGN\n DATA_SCIENCE\n DEVELOPMENT\n QUALITY_ASSURANCE\n}\n\nenum ReviewTypeEnum {\n COMMUNITY\n INTERNAL\n SYSTEM\n PROVISIONAL\n EXAMPLE\n}\n\nenum DiscussionTypeEnum {\n CHALLENGE\n}\n\nenum ChallengeStatusEnum {\n NEW\n DRAFT\n APPROVED\n ACTIVE\n COMPLETED\n DELETED\n CANCELLED\n CANCELLED_FAILED_REVIEW\n CANCELLED_FAILED_SCREENING\n CANCELLED_ZERO_SUBMISSIONS\n CANCELLED_WINNER_UNRESPONSIVE\n CANCELLED_CLIENT_REQUEST\n CANCELLED_REQUIREMENTS_INFEASIBLE\n CANCELLED_ZERO_REGISTRATIONS\n CANCELLED_PAYMENT_FAILED\n}\n\nenum PrizeSetTypeEnum {\n PLACEMENT\n COPILOT\n REVIEWER\n PASSED_REVIEW\n CHECKPOINT\n}\n\n// Enum for review opportunity types on reviewers\nenum ReviewOpportunityTypeEnum {\n REGULAR_REVIEW\n COMPONENT_DEV_REVIEW\n SPEC_REVIEW\n ITERATIVE_REVIEW\n SCENARIOS_REVIEW\n}\n\n//////////////////////////////////////////\n// Main Challenge model\n//////////////////////////////////////////\n\nmodel Challenge {\n id String @id @default(uuid())\n name String\n description String?\n privateDescription String?\n challengeSource String?\n descriptionFormat String?\n projectId Int? // frequently queried field\n typeId String\n trackId String // FK for relation in ChallengeTrack\n timelineTemplateId String? // now used as foreign key to ChallengeTimelineTemplate\n overviewTotalPrizes Float? // stored from overview.totalPrizes\n numOfRegistrants Int @default(0)\n numOfSubmissions Int @default(0)\n numOfCheckpointSubmissions Int @default(0)\n currentPhaseNames String[] // current phase names\n\n wiproAllowed Boolean @default(false)\n funChallenge Boolean @default(false)\n\n // simple arrays for tags and groups (PostgreSQL native array type)\n tags String[]\n groups String[]\n\n // Task information (flattened from challenge.task)\n taskIsTask Boolean @default(false)\n taskIsAssigned Boolean @default(false)\n taskMemberId String?\n\n // Dates for challenge lifecycle\n submissionStartDate DateTime?\n submissionEndDate DateTime?\n registrationStartDate DateTime?\n registrationEndDate DateTime?\n startDate DateTime?\n endDate DateTime?\n\n // Normalized billing and legacy information (one-to-one)\n billingRecord ChallengeBilling?\n legacyId Int? // Legacy system ID for searching\n legacyRecord ChallengeLegacy? @relation(\"ChallengeLegacyRelation\")\n\n // Additional fields from createChallenge schema\n status ChallengeStatusEnum @default(NEW) // new challenges default to status \"New\"\n // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge\n constraintRecord ChallengeConstraint?\n\n // Additional normalized relations from createChallenge\n events ChallengeEvent[]\n discussions ChallengeDiscussion[]\n\n // Existing relations (one-to-many) for challenge metadata, phases, prize sets, winners, attachments,\n // terms and skills\n metadata ChallengeMetadata[]\n phases ChallengePhase[]\n prizeSets ChallengePrizeSet[]\n reviewers ChallengeReviewer[]\n winners ChallengeWinner[]\n attachments Attachment[]\n terms ChallengeTerm[]\n skills ChallengeSkill[]\n auditLogs AuditLog[]\n memberAccesses MemberChallengeAccess[]\n userWhitelist ChallengeUserWhitelist[]\n\n // Relation to ChallengeType (FK: typeId)\n type ChallengeType @relation(fields: [typeId], references: [id])\n // Relation to ChallengeTrack (FK: trackId)\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n\n // Auditing fields (present in every table)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([projectId])\n @@index([status]) // index added for optimized search by status\n @@index([createdAt])\n @@index([updatedAt])\n @@index([typeId])\n @@index([trackId])\n @@index([groups], type: Gin, map: \"challenge_groups_gin_idx\")\n @@index([submissionStartDate])\n @@index([submissionEndDate])\n @@index([registrationStartDate])\n @@index([registrationEndDate])\n @@index([startDate])\n @@index([endDate])\n @@index([status, startDate])\n @@index([trackId, typeId, status])\n @@index([status, typeId, trackId, createdAt(sort: Desc)], map: \"challenge_status_type_track_created_at_idx\")\n @@index([legacyId])\n @@index([projectId, status])\n}\n\n//////////////////////////////////////////\n// Challenge user whitelist - member/challenge pairs allowed to access restricted challenges\n//////////////////////////////////////////\n\nmodel ChallengeUserWhitelist {\n challengeId String\n userId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n @@id([challengeId, userId])\n @@index([challengeId])\n @@index([userId])\n}\n\n//////////////////////////////////////////\n// MemberChallengeAccess view – member/challenge pairs from resources schema\n//////////////////////////////////////////\n\nview MemberChallengeAccess {\n challengeId String\n memberId String\n\n challenge Challenge @relation(fields: [challengeId], references: [id])\n\n @@map(\"MemberChallengeAccess\")\n}\n\n//////////////////////////////////////////\n// ChallengeType model\n//////////////////////////////////////////\n\nmodel ChallengeType {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n isTask Boolean @default(false)\n abbreviation String\n legacyId Int?\n isLegacy Boolean @default(false)\n\n challenges Challenge[]\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this type\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([abbreviation])\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTrack model\n//////////////////////////////////////////\n\nmodel ChallengeTrack {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean\n abbreviation String\n legacyId Int? // numeric legacy system id (if provided)\n track ChallengeTrackEnum? // enum value from ChallengeTrackEnum\n isLegacy Boolean @default(false)\n challenges Challenge[]\n // Opposite relation for ChallengeTimelineTemplate\n timelineTemplates ChallengeTimelineTemplate[]\n // Default reviewer configurations associated with this track\n defaultReviewers DefaultChallengeReviewer[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([legacyId])\n @@index([isLegacy])\n}\n\n//////////////////////////////////////////\n// ChallengeTimelineTemplate model\n//////////////////////////////////////////\n\nmodel ChallengeTimelineTemplate {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String // now required per Swagger spec\n\n // Link to the TimelineTemplate model via timelineTemplateId.\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id])\n // Link to the ChallengeTrack model via trackId.\n track ChallengeTrack @relation(fields: [trackId], references: [id])\n // Link to the ChallengeType model via typeId.\n type ChallengeType @relation(fields: [typeId], references: [id])\n\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Composite index to support searches/updates by typeId, trackId and timelineTemplateId.\n @@index([typeId, trackId, timelineTemplateId])\n}\n\n//////////////////////////////////////////\n// AuditLog model – tracks field changes\n//////////////////////////////////////////\n\nmodel AuditLog {\n id String @id @default(uuid())\n challengeId String? // optional association with a challenge\n fieldName String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n createdBy String\n memberId String?\n\n // Relation field to connect AuditLog to Challenge.\n challenge Challenge? @relation(fields: [challengeId], references: [id])\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Attachment model – for challenge attachments\n//////////////////////////////////////////\n\nmodel Attachment {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String\n fileSize Int\n url String\n description String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeMetadata model – key/value metadata\n//////////////////////////////////////////\n\nmodel ChallengeMetadata {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n name String // name of the metadata\n value String // value stored as string for flexibility\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// Prize model – individual prize in a prize set\n//////////////////////////////////////////\n\nmodel Prize {\n id String @id @default(uuid())\n description String?\n prizeSet ChallengePrizeSet @relation(fields: [prizeSetId], references: [id], onDelete: Cascade)\n prizeSetId String\n type String // e.g. \"USD\", \"POINT\" (could also be converted to enum later)\n value Float\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeWinner model – record winners for a challenge\n//////////////////////////////////////////\n\nmodel ChallengeWinner {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n userId Int\n handle String\n placement Int\n type PrizeSetTypeEnum\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type, placement])\n}\n\n//////////////////////////////////////////\n// ChallengeTerm model – association of challenge and terms\n//////////////////////////////////////////\n\nmodel ChallengeTerm {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n termId String // Terms API id\n roleId String // UUID for the associated role\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeSkill model – linking challenges with skills\n//////////////////////////////////////////\n\nmodel ChallengeSkill {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n skillId String // Request provided skillId\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeBilling model – normalized billing info\n//////////////////////////////////////////\n\nmodel ChallengeBilling {\n id String @id @default(uuid())\n billingAccountId String?\n markup Float? // in range [0, 100]\n clientBillingRate Float? // in range [0, 100]. Supporting range on postgres is an open issue with prisma https://github.com/prisma/prisma/issues/3287.\n challengeId String @unique\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeLegacy model – normalized legacy info\n//////////////////////////////////////////\n\nmodel ChallengeLegacy {\n id String @id @default(uuid())\n reviewType ReviewTypeEnum @default(INTERNAL)\n confidentialityType String @default(\"public\")\n forumId Int?\n directProjectId Int?\n screeningScorecardId Int?\n reviewScorecardId Int?\n isTask Boolean @default(false)\n useSchedulingAPI Boolean @default(false)\n pureV5Task Boolean @default(false)\n pureV5 Boolean @default(false)\n selfService Boolean @default(false)\n selfServiceCopilot String?\n track String? // as provided in the legacy object\n subTrack String? // as provided in the legacy object\n legacySystemId Int? // represents the external \"legacyId\"\n challengeId String @unique\n challenge Challenge @relation(\"ChallengeLegacyRelation\", fields: [challengeId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeEvent model – normalized challenge events\n//////////////////////////////////////////\n\nmodel ChallengeEvent {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n eventId Int\n name String?\n key String?\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\n//////////////////////////////////////////\n// ChallengeDiscussion and associated options – normalized discussion channels\n//////////////////////////////////////////\n\nmodel ChallengeDiscussion {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String\n discussionId String?\n name String\n type DiscussionTypeEnum // updated to use enum\n provider String\n url String?\n options ChallengeDiscussionOption[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n}\n\nmodel ChallengeDiscussionOption {\n id String @id @default(uuid())\n discussion ChallengeDiscussion @relation(fields: [discussionId], references: [id], onDelete: Cascade)\n discussionId String\n optionKey String\n optionValue String\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// ChallengeConstraint model – top-level challenge constraints (e.g. allowed registrants)\n//////////////////////////////////////////\n\nmodel ChallengeConstraint {\n id String @id @default(uuid())\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n challengeId String @unique\n allowedRegistrants String[] @default([])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhase – to capture per-phase info from create/update challenge operations\n// Each phase is linked with a challenge and holds a duration and any custom constraints.\n//////////////////////////////////////////\n\nmodel Phase {\n id String @id @default(uuid())\n name String\n description String?\n isOpen Boolean\n duration Int\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Inverse relation for associated challenge phases\n challengePhases ChallengePhase[]\n ChallengeReviewer ChallengeReviewer[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\nmodel ChallengePhase {\n id String @id @default(uuid())\n challengeId String\n phaseId String // foreign key to Phase\n\n name String // phase name\n description String? // description\n isOpen Boolean? @default(false) // if this phase is open\n predecessor String? // predecessor of this phase\n duration Int? // duration in seconds\n scheduledStartDate DateTime? // when the phase is scheduled to start\n scheduledEndDate DateTime?\n actualStartDate DateTime?\n actualEndDate DateTime? // when the phase actually ended\n constraints ChallengePhaseConstraint[]\n\n // Relation fields\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n phase Phase @relation(fields: [phaseId], references: [id])\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, isOpen])\n @@index([challengeId, name])\n @@index([challengeId, isOpen, scheduledEndDate, actualEndDate], map: \"challenge_phase_challenge_open_end_idx\")\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePhaseConstraint – to capture custom constraints for each phase\n//////////////////////////////////////////\n\nmodel ChallengePhaseConstraint {\n id String @id @default(uuid())\n challengePhaseId String\n name String // the name/key of the constraint\n value Int // numeric value of the constraint (can be changed to Float if needed)\n\n // Relation to the phase\n challengePhase ChallengePhase @relation(fields: [challengePhaseId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengePhaseId])\n}\n\n//////////////////////////////////////////\n// New Model: ChallengePrizeSet – to group prizes for a challenge\n//////////////////////////////////////////\n\nmodel ChallengePrizeSet {\n id String @id @default(uuid())\n challengeId String\n type PrizeSetTypeEnum // using enum instead of string\n description String?\n prizes Prize[]\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([challengeId, type])\n}\n\n//////////////////////////////////////////\n// ChallengeReviewer model – reviewers for a challenge, both AI and member\n//////////////////////////////////////////\n\nmodel ChallengeReviewer {\n id String @id @default(uuid())\n challengeId String\n\n // Reviewer configuration\n scorecardId String\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseId String\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n type ReviewOpportunityTypeEnum?\n aiWorkflowId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relation to the challenge\n challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade)\n // Relation to the phase\n phase Phase @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([challengeId])\n @@index([phaseId])\n @@index([challengeId, phaseId])\n}\n\n//////////////////////////////////////////\n// DefaultChallengeReviewer model – default reviewers by type and track\n//////////////////////////////////////////\n\nmodel DefaultChallengeReviewer {\n id String @id @default(uuid())\n typeId String\n trackId String\n timelineTemplateId String?\n // Reviewer configuration (mirrors ChallengeReviewer)\n scorecardId String?\n isMemberReview Boolean\n memberReviewerCount Int?\n phaseName String\n // Optional explicit link to Phase for better fidelity\n phaseId String?\n fixedAmount Float? @default(0)\n baseCoefficient Float?\n incrementalCoefficient Float?\n opportunityType ReviewOpportunityTypeEnum?\n aiConfigTemplateId String? @db.VarChar(14)\n shouldOpenOpportunity Boolean @default(true)\n\n // Relations\n challengeType ChallengeType @relation(fields: [typeId], references: [id])\n challengeTrack ChallengeTrack @relation(fields: [trackId], references: [id])\n timelineTemplate TimelineTemplate? @relation(fields: [timelineTemplateId], references: [id])\n // Relation to Phase (optional for backward compatibility with phaseName)\n phase Phase? @relation(fields: [phaseId], references: [id])\n\n // Auditing fields\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n @@index([typeId, trackId])\n @@index([typeId, trackId, timelineTemplateId])\n @@index([phaseId])\n}\n\n//////////////////////////////////////////\n// TimelineTemplate model – defines timeline templates\n//////////////////////////////////////////\nmodel TimelineTemplate {\n id String @id @default(uuid())\n name String\n description String?\n isActive Boolean @default(true)\n phases TimelineTemplatePhase[]\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n // Opposite relation field, linking back to ChallengeTimelineTemplate.\n challengeTimelineTemplates ChallengeTimelineTemplate[]\n\n // Opposite relation field for Challenge.\n challenges Challenge[]\n DefaultChallengeReviewer DefaultChallengeReviewer[]\n\n @@unique([name])\n}\n\n//////////////////////////////////////////\n// TimelineTemplatePhase model – phases associated with a timeline template\n//////////////////////////////////////////\nmodel TimelineTemplatePhase {\n id String @id @default(uuid())\n timelineTemplateId String\n phaseId String // identifier for the phase\n predecessor String? // optional predecessor phase id\n defaultDuration Int // duration (in minutes, hours, etc.) as per business rules\n\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String\n\n timelineTemplate TimelineTemplate @relation(fields: [timelineTemplateId], references: [id], onDelete: Cascade)\n\n @@index([timelineTemplateId])\n @@index([timelineTemplateId, phaseId])\n}\n", + "inlineSchemaHash": "6753f3f63bc1895caf833af5127cc8a05e8be5541a69a7584ca96249e47fe064", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"Challenge\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"privateDescription\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeSource\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"descriptionFormat\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"typeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"trackId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"overviewTotalPrizes\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"numOfRegistrants\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"numOfSubmissions\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"numOfCheckpointSubmissions\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"currentPhaseNames\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"wiproAllowed\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"funChallenge\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"tags\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groups\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taskIsTask\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"taskIsAssigned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"taskMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"submissionStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"submissionEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrationStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrationEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"billingRecord\",\"kind\":\"object\",\"type\":\"ChallengeBilling\",\"relationName\":\"ChallengeToChallengeBilling\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"legacyRecord\",\"kind\":\"object\",\"type\":\"ChallengeLegacy\",\"relationName\":\"ChallengeLegacyRelation\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ChallengeStatusEnum\"},{\"name\":\"constraintRecord\",\"kind\":\"object\",\"type\":\"ChallengeConstraint\",\"relationName\":\"ChallengeToChallengeConstraint\"},{\"name\":\"events\",\"kind\":\"object\",\"type\":\"ChallengeEvent\",\"relationName\":\"ChallengeToChallengeEvent\"},{\"name\":\"discussions\",\"kind\":\"object\",\"type\":\"ChallengeDiscussion\",\"relationName\":\"ChallengeToChallengeDiscussion\"},{\"name\":\"metadata\",\"kind\":\"object\",\"type\":\"ChallengeMetadata\",\"relationName\":\"ChallengeToChallengeMetadata\"},{\"name\":\"phases\",\"kind\":\"object\",\"type\":\"ChallengePhase\",\"relationName\":\"ChallengeToChallengePhase\"},{\"name\":\"prizeSets\",\"kind\":\"object\",\"type\":\"ChallengePrizeSet\",\"relationName\":\"ChallengeToChallengePrizeSet\"},{\"name\":\"reviewers\",\"kind\":\"object\",\"type\":\"ChallengeReviewer\",\"relationName\":\"ChallengeToChallengeReviewer\"},{\"name\":\"winners\",\"kind\":\"object\",\"type\":\"ChallengeWinner\",\"relationName\":\"ChallengeToChallengeWinner\"},{\"name\":\"attachments\",\"kind\":\"object\",\"type\":\"Attachment\",\"relationName\":\"AttachmentToChallenge\"},{\"name\":\"terms\",\"kind\":\"object\",\"type\":\"ChallengeTerm\",\"relationName\":\"ChallengeToChallengeTerm\"},{\"name\":\"skills\",\"kind\":\"object\",\"type\":\"ChallengeSkill\",\"relationName\":\"ChallengeToChallengeSkill\"},{\"name\":\"auditLogs\",\"kind\":\"object\",\"type\":\"AuditLog\",\"relationName\":\"AuditLogToChallenge\"},{\"name\":\"memberAccesses\",\"kind\":\"object\",\"type\":\"MemberChallengeAccess\",\"relationName\":\"ChallengeToMemberChallengeAccess\"},{\"name\":\"type\",\"kind\":\"object\",\"type\":\"ChallengeType\",\"relationName\":\"ChallengeToChallengeType\"},{\"name\":\"track\",\"kind\":\"object\",\"type\":\"ChallengeTrack\",\"relationName\":\"ChallengeToChallengeTrack\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"ChallengeToTimelineTemplate\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeType\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isTask\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challenges\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeType\"},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"type\":\"ChallengeTimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToChallengeType\"},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeTrack\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"track\",\"kind\":\"enum\",\"type\":\"ChallengeTrackEnum\"},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challenges\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeTrack\"},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"type\":\"ChallengeTimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\"},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeTimelineTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"typeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"trackId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\"},{\"name\":\"track\",\"kind\":\"object\",\"type\":\"ChallengeTrack\",\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\"},{\"name\":\"type\",\"kind\":\"object\",\"type\":\"ChallengeType\",\"relationName\":\"ChallengeTimelineTemplateToChallengeType\"},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fieldName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"newValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"AuditLogToChallenge\"}],\"dbName\":null},\"Attachment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"AttachmentToChallenge\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fileSize\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeMetadata\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeMetadata\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Prize\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"prizeSet\",\"kind\":\"object\",\"type\":\"ChallengePrizeSet\",\"relationName\":\"ChallengePrizeSetToPrize\"},{\"name\":\"prizeSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeWinner\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeWinner\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"placement\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"PrizeSetTypeEnum\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeTerm\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeTerm\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"termId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeSkill\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeSkill\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"skillId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeBilling\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"billingAccountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"markup\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"clientBillingRate\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeBilling\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeLegacy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"reviewType\",\"kind\":\"enum\",\"type\":\"ReviewTypeEnum\"},{\"name\":\"confidentialityType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"forumId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"directProjectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"screeningScorecardId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"reviewScorecardId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"isTask\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"useSchedulingAPI\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"pureV5Task\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"pureV5\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"selfService\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"selfServiceCopilot\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"track\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"subTrack\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacySystemId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeLegacyRelation\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeEvent\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeEvent\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeDiscussion\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeDiscussion\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"DiscussionTypeEnum\"},{\"name\":\"provider\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"options\",\"kind\":\"object\",\"type\":\"ChallengeDiscussionOption\",\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeDiscussionOption\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"discussion\",\"kind\":\"object\",\"type\":\"ChallengeDiscussion\",\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\"},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"optionKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"optionValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeConstraint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeConstraint\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"allowedRegistrants\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Phase\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"duration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengePhases\",\"kind\":\"object\",\"type\":\"ChallengePhase\",\"relationName\":\"ChallengePhaseToPhase\"},{\"name\":\"ChallengeReviewer\",\"kind\":\"object\",\"type\":\"ChallengeReviewer\",\"relationName\":\"ChallengeReviewerToPhase\"},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"DefaultChallengeReviewerToPhase\"}],\"dbName\":null},\"ChallengePhase\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"duration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scheduledStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scheduledEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actualStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actualEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"constraints\",\"kind\":\"object\",\"type\":\"ChallengePhaseConstraint\",\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengePhase\"},{\"name\":\"phase\",\"kind\":\"object\",\"type\":\"Phase\",\"relationName\":\"ChallengePhaseToPhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengePhaseConstraint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengePhaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"challengePhase\",\"kind\":\"object\",\"type\":\"ChallengePhase\",\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengePrizeSet\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"PrizeSetTypeEnum\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"prizes\",\"kind\":\"object\",\"type\":\"Prize\",\"relationName\":\"ChallengePrizeSetToPrize\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengePrizeSet\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeReviewer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"ReviewOpportunityTypeEnum\"},{\"name\":\"aiWorkflowId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeReviewer\"},{\"name\":\"phase\",\"kind\":\"object\",\"type\":\"Phase\",\"relationName\":\"ChallengeReviewerToPhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"DefaultChallengeReviewer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"typeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"trackId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"phaseName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"opportunityType\",\"kind\":\"enum\",\"type\":\"ReviewOpportunityTypeEnum\"},{\"name\":\"aiConfigTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challengeType\",\"kind\":\"object\",\"type\":\"ChallengeType\",\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\"},{\"name\":\"challengeTrack\",\"kind\":\"object\",\"type\":\"ChallengeTrack\",\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\"},{\"name\":\"phase\",\"kind\":\"object\",\"type\":\"Phase\",\"relationName\":\"DefaultChallengeReviewerToPhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"TimelineTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"phases\",\"kind\":\"object\",\"type\":\"TimelineTemplatePhase\",\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeTimelineTemplates\",\"kind\":\"object\",\"type\":\"ChallengeTimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\"},{\"name\":\"challenges\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToTimelineTemplate\"},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\"}],\"dbName\":null},\"TimelineTemplatePhase\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"defaultDuration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\"}],\"dbName\":null},\"MemberChallengeAccess\":{\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToMemberChallengeAccess\"}],\"dbName\":\"MemberChallengeAccess\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Challenge\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"privateDescription\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeSource\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"descriptionFormat\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"typeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"trackId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"overviewTotalPrizes\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"numOfRegistrants\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"numOfSubmissions\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"numOfCheckpointSubmissions\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"currentPhaseNames\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"wiproAllowed\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"funChallenge\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"tags\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groups\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taskIsTask\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"taskIsAssigned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"taskMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"submissionStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"submissionEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrationStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"registrationEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"billingRecord\",\"kind\":\"object\",\"type\":\"ChallengeBilling\",\"relationName\":\"ChallengeToChallengeBilling\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"legacyRecord\",\"kind\":\"object\",\"type\":\"ChallengeLegacy\",\"relationName\":\"ChallengeLegacyRelation\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ChallengeStatusEnum\"},{\"name\":\"constraintRecord\",\"kind\":\"object\",\"type\":\"ChallengeConstraint\",\"relationName\":\"ChallengeToChallengeConstraint\"},{\"name\":\"events\",\"kind\":\"object\",\"type\":\"ChallengeEvent\",\"relationName\":\"ChallengeToChallengeEvent\"},{\"name\":\"discussions\",\"kind\":\"object\",\"type\":\"ChallengeDiscussion\",\"relationName\":\"ChallengeToChallengeDiscussion\"},{\"name\":\"metadata\",\"kind\":\"object\",\"type\":\"ChallengeMetadata\",\"relationName\":\"ChallengeToChallengeMetadata\"},{\"name\":\"phases\",\"kind\":\"object\",\"type\":\"ChallengePhase\",\"relationName\":\"ChallengeToChallengePhase\"},{\"name\":\"prizeSets\",\"kind\":\"object\",\"type\":\"ChallengePrizeSet\",\"relationName\":\"ChallengeToChallengePrizeSet\"},{\"name\":\"reviewers\",\"kind\":\"object\",\"type\":\"ChallengeReviewer\",\"relationName\":\"ChallengeToChallengeReviewer\"},{\"name\":\"winners\",\"kind\":\"object\",\"type\":\"ChallengeWinner\",\"relationName\":\"ChallengeToChallengeWinner\"},{\"name\":\"attachments\",\"kind\":\"object\",\"type\":\"Attachment\",\"relationName\":\"AttachmentToChallenge\"},{\"name\":\"terms\",\"kind\":\"object\",\"type\":\"ChallengeTerm\",\"relationName\":\"ChallengeToChallengeTerm\"},{\"name\":\"skills\",\"kind\":\"object\",\"type\":\"ChallengeSkill\",\"relationName\":\"ChallengeToChallengeSkill\"},{\"name\":\"auditLogs\",\"kind\":\"object\",\"type\":\"AuditLog\",\"relationName\":\"AuditLogToChallenge\"},{\"name\":\"memberAccesses\",\"kind\":\"object\",\"type\":\"MemberChallengeAccess\",\"relationName\":\"ChallengeToMemberChallengeAccess\"},{\"name\":\"userWhitelist\",\"kind\":\"object\",\"type\":\"ChallengeUserWhitelist\",\"relationName\":\"ChallengeToChallengeUserWhitelist\"},{\"name\":\"type\",\"kind\":\"object\",\"type\":\"ChallengeType\",\"relationName\":\"ChallengeToChallengeType\"},{\"name\":\"track\",\"kind\":\"object\",\"type\":\"ChallengeTrack\",\"relationName\":\"ChallengeToChallengeTrack\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"ChallengeToTimelineTemplate\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeUserWhitelist\":{\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeUserWhitelist\"}],\"dbName\":null},\"ChallengeType\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isTask\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challenges\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeType\"},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"type\":\"ChallengeTimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToChallengeType\"},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeTrack\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"track\",\"kind\":\"enum\",\"type\":\"ChallengeTrackEnum\"},{\"name\":\"isLegacy\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challenges\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeTrack\"},{\"name\":\"timelineTemplates\",\"kind\":\"object\",\"type\":\"ChallengeTimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\"},{\"name\":\"defaultReviewers\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeTimelineTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"typeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"trackId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\"},{\"name\":\"track\",\"kind\":\"object\",\"type\":\"ChallengeTrack\",\"relationName\":\"ChallengeTimelineTemplateToChallengeTrack\"},{\"name\":\"type\",\"kind\":\"object\",\"type\":\"ChallengeType\",\"relationName\":\"ChallengeTimelineTemplateToChallengeType\"},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fieldName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"newValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"AuditLogToChallenge\"}],\"dbName\":null},\"Attachment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"AttachmentToChallenge\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fileSize\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeMetadata\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeMetadata\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Prize\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"prizeSet\",\"kind\":\"object\",\"type\":\"ChallengePrizeSet\",\"relationName\":\"ChallengePrizeSetToPrize\"},{\"name\":\"prizeSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeWinner\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeWinner\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"placement\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"PrizeSetTypeEnum\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeTerm\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeTerm\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"termId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeSkill\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeSkill\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"skillId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeBilling\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"billingAccountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"markup\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"clientBillingRate\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeBilling\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeLegacy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"reviewType\",\"kind\":\"enum\",\"type\":\"ReviewTypeEnum\"},{\"name\":\"confidentialityType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"forumId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"directProjectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"screeningScorecardId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"reviewScorecardId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"isTask\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"useSchedulingAPI\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"pureV5Task\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"pureV5\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"selfService\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"selfServiceCopilot\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"track\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"subTrack\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacySystemId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeLegacyRelation\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeEvent\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeEvent\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeDiscussion\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeDiscussion\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"DiscussionTypeEnum\"},{\"name\":\"provider\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"options\",\"kind\":\"object\",\"type\":\"ChallengeDiscussionOption\",\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeDiscussionOption\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"discussion\",\"kind\":\"object\",\"type\":\"ChallengeDiscussion\",\"relationName\":\"ChallengeDiscussionToChallengeDiscussionOption\"},{\"name\":\"discussionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"optionKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"optionValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeConstraint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeConstraint\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"allowedRegistrants\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Phase\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"duration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengePhases\",\"kind\":\"object\",\"type\":\"ChallengePhase\",\"relationName\":\"ChallengePhaseToPhase\"},{\"name\":\"ChallengeReviewer\",\"kind\":\"object\",\"type\":\"ChallengeReviewer\",\"relationName\":\"ChallengeReviewerToPhase\"},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"DefaultChallengeReviewerToPhase\"}],\"dbName\":null},\"ChallengePhase\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isOpen\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"duration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scheduledStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scheduledEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actualStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actualEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"constraints\",\"kind\":\"object\",\"type\":\"ChallengePhaseConstraint\",\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengePhase\"},{\"name\":\"phase\",\"kind\":\"object\",\"type\":\"Phase\",\"relationName\":\"ChallengePhaseToPhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengePhaseConstraint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengePhaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"challengePhase\",\"kind\":\"object\",\"type\":\"ChallengePhase\",\"relationName\":\"ChallengePhaseToChallengePhaseConstraint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengePrizeSet\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"PrizeSetTypeEnum\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"prizes\",\"kind\":\"object\",\"type\":\"Prize\",\"relationName\":\"ChallengePrizeSetToPrize\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengePrizeSet\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ChallengeReviewer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"ReviewOpportunityTypeEnum\"},{\"name\":\"aiWorkflowId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToChallengeReviewer\"},{\"name\":\"phase\",\"kind\":\"object\",\"type\":\"Phase\",\"relationName\":\"ChallengeReviewerToPhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"DefaultChallengeReviewer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"typeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"trackId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scorecardId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isMemberReview\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"memberReviewerCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"phaseName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fixedAmount\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"baseCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"incrementalCoefficient\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"opportunityType\",\"kind\":\"enum\",\"type\":\"ReviewOpportunityTypeEnum\"},{\"name\":\"aiConfigTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"shouldOpenOpportunity\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"challengeType\",\"kind\":\"object\",\"type\":\"ChallengeType\",\"relationName\":\"ChallengeTypeToDefaultChallengeReviewer\"},{\"name\":\"challengeTrack\",\"kind\":\"object\",\"type\":\"ChallengeTrack\",\"relationName\":\"ChallengeTrackToDefaultChallengeReviewer\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\"},{\"name\":\"phase\",\"kind\":\"object\",\"type\":\"Phase\",\"relationName\":\"DefaultChallengeReviewerToPhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"TimelineTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"phases\",\"kind\":\"object\",\"type\":\"TimelineTemplatePhase\",\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeTimelineTemplates\",\"kind\":\"object\",\"type\":\"ChallengeTimelineTemplate\",\"relationName\":\"ChallengeTimelineTemplateToTimelineTemplate\"},{\"name\":\"challenges\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToTimelineTemplate\"},{\"name\":\"DefaultChallengeReviewer\",\"kind\":\"object\",\"type\":\"DefaultChallengeReviewer\",\"relationName\":\"DefaultChallengeReviewerToTimelineTemplate\"}],\"dbName\":null},\"TimelineTemplatePhase\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplateId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phaseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"predecessor\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"defaultDuration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timelineTemplate\",\"kind\":\"object\",\"type\":\"TimelineTemplate\",\"relationName\":\"TimelineTemplateToTimelineTemplatePhase\"}],\"dbName\":null},\"MemberChallengeAccess\":{\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenge\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeToMemberChallengeAccess\"}],\"dbName\":\"MemberChallengeAccess\"}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = { getRuntime: async () => require('./query_engine_bg.js'), diff --git a/prisma/migrations/20260427090000_add_challenge_user_whitelist/migration.sql b/prisma/migrations/20260427090000_add_challenge_user_whitelist/migration.sql new file mode 100644 index 0000000..eb29322 --- /dev/null +++ b/prisma/migrations/20260427090000_add_challenge_user_whitelist/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "ChallengeUserWhitelist" ( + "challengeId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + + CONSTRAINT "ChallengeUserWhitelist_pkey" PRIMARY KEY ("challengeId", "userId") +); + +-- CreateIndex +CREATE INDEX "ChallengeUserWhitelist_challengeId_idx" ON "ChallengeUserWhitelist"("challengeId"); + +-- CreateIndex +CREATE INDEX "ChallengeUserWhitelist_userId_idx" ON "ChallengeUserWhitelist"("userId"); + +-- AddForeignKey +ALTER TABLE "ChallengeUserWhitelist" ADD CONSTRAINT "ChallengeUserWhitelist_challengeId_fkey" FOREIGN KEY ("challengeId") REFERENCES "Challenge"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0ee5b96..2d1a6a4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -137,6 +137,7 @@ model Challenge { skills ChallengeSkill[] auditLogs AuditLog[] memberAccesses MemberChallengeAccess[] + userWhitelist ChallengeUserWhitelist[] // Relation to ChallengeType (FK: typeId) type ChallengeType @relation(fields: [typeId], references: [id]) @@ -171,6 +172,21 @@ model Challenge { @@index([projectId, status]) } +////////////////////////////////////////// +// Challenge user whitelist - member/challenge pairs allowed to access restricted challenges +////////////////////////////////////////// + +model ChallengeUserWhitelist { + challengeId String + userId String + + challenge Challenge @relation(fields: [challengeId], references: [id], onDelete: Cascade) + + @@id([challengeId, userId]) + @@index([challengeId]) + @@index([userId]) +} + ////////////////////////////////////////// // MemberChallengeAccess view – member/challenge pairs from resources schema ////////////////////////////////////////// diff --git a/src/common/helper.js b/src/common/helper.js index 995f49c..09680e9 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -18,11 +18,13 @@ const logger = require("./logger"); const projectHelper = require("./project-helper"); const m2mHelper = require("./m2m-helper"); const { hasAdminRole } = require("./role-helper"); +const { getClient } = require("./prisma"); const DISABLED_TOPICS = new Set(constants.DisabledTopics || []); const PROJECT_WRITE_ACCESS_ROLES = new Set(["manager", "copilot", "customer", "write"]); const PROJECT_MANAGER_ACCESS_ROLES = new Set(["manager"]); const PROJECT_TASK_VIEW_ACCESS_ROLES = new Set(["manager", "copilot"]); +const prisma = getClient(); // Bus API Client let busApiClient; @@ -110,7 +112,7 @@ function setResHeaders(req, res, result) { if (totalPages > 0) { let link = `<${getPageLink(req, 1)}>; rel="first", <${getPageLink( req, - totalPages + totalPages, )}>; rel="last"`; if (parseInt(result.page, 10) > 1) { link += `, <${getPageLink(req, parseInt(result.page, 10) - 1)}>; rel="prev"`; @@ -136,7 +138,7 @@ function _sanitizeObject(obj) { return `Array(${value.length})`; } return value; - }) + }), ); } catch (e) { return obj; @@ -207,14 +209,14 @@ async function downloadFromFileStack(url) { async function downloadFromS3(bucket, key) { const command = new GetObjectCommand({ Bucket: bucket, Key: key }); const response = await s3Client.send(command); - + // Convert the readable stream to buffer const chunks = []; for await (const chunk of response.Body) { chunks.push(chunk); } const buffer = Buffer.concat(chunks); - + return { data: buffer, mimetype: response.ContentType, @@ -243,7 +245,7 @@ async function getChallengeResources(challengeId, roleId = null) { let page = 1; let result = []; logger.debug( - `helper.getChallengeResources: start challenge ${challengeId}${roleId ? ` role ${roleId}` : ""}` + `helper.getChallengeResources: start challenge ${challengeId}${roleId ? ` role ${roleId}` : ""}`, ); while (true) { const url = `${ @@ -260,16 +262,18 @@ async function getChallengeResources(challengeId, roleId = null) { }); } catch (err) { logger.debug( - `helper.getChallengeResources: error page ${page} for challenge ${challengeId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.getChallengeResources: error page ${page} for challenge ${challengeId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } logger.debug( `helper.getChallengeResources: page ${page} -> status ${res.status}, items ${ _.get(res, "data.length", 0) || 0 - }` + }`, ); if (!res.data || res.data.length === 0) { break; @@ -299,14 +303,16 @@ async function getChallengeResourcesCount(challengeId, roleId = null) { headers: { Authorization: `Bearer ${token}` }, }); logger.debug( - `helper.getChallengeResourcesCount: response status ${res.status} for challenge ${challengeId}` + `helper.getChallengeResourcesCount: response status ${res.status} for challenge ${challengeId}`, ); return res.data; } catch (err) { logger.debug( - `helper.getChallengeResourcesCount: error for challenge ${challengeId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.getChallengeResourcesCount: error for challenge ${challengeId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -350,7 +356,7 @@ axiosRetry(axios, { }, onRetry: (retryCount, error, requestConfig) => logger.info( - `${error.message} while calling: ${requestConfig.url} - retry count: ${retryCount}` + `${error.message} while calling: ${requestConfig.url} - retry count: ${retryCount}`, ), retryDelay: exponentialDelay, }); @@ -409,15 +415,17 @@ async function getProjectPayment(projectId) { logger.debug( `helper.getProjectPayment: response status ${res.status} (records=${ _.get(res, "data.length", 0) || 0 - })` + })`, ); const [payment] = res.data; return payment; } catch (err) { logger.debug( - `helper.getProjectPayment: error for project ${projectId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.getProjectPayment: error for project ${projectId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -441,9 +449,11 @@ async function capturePayment(paymentId) { return res.data; } catch (err) { logger.debug( - `helper.capturePayment: error for payment ${paymentId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.capturePayment: error for payment ${paymentId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -466,9 +476,11 @@ async function cancelPayment(paymentId) { return res.data; } catch (err) { logger.debug( - `helper.cancelPayment: error for payment ${paymentId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.cancelPayment: error for payment ${paymentId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -495,15 +507,17 @@ async function generateChallengePayments(challengeId) { {}, { headers: { Authorization: `Bearer ${token}` }, - } + }, ); logger.debug(`helper.generateChallengePayments: response status ${res.status}`); return res.status >= 200 && res.status < 300; } catch (err) { logger.debug( - `helper.generateChallengePayments: error for challenge ${challengeId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.generateChallengePayments: error for challenge ${challengeId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); return false; } @@ -543,14 +557,16 @@ async function cancelProject(projectId, cancelReason, currentUser) { paymentStatus: payment.status, }, }, - { headers: { Authorization: `Bearer ${token}` } } + { headers: { Authorization: `Bearer ${token}` } }, ); logger.debug(`helper.cancelProject: PATCH success for project ${projectId}`); } catch (err) { logger.debug( - `helper.cancelProject: error for project ${projectId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.cancelProject: error for project ${projectId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -576,7 +592,7 @@ async function activateProject(projectId, currentUser, name, description) { await cancelProject( projectId, `Failed to charge payment ${payment.id} with error: ${e.message}`, - currentUser + currentUser, ); throw new Error(`Failed to charge payment ${payment.id} with error: ${e.message}`); } @@ -601,13 +617,15 @@ async function activateProject(projectId, currentUser, name, description) { paymentStatus: payment.status, }, }, - { headers: { Authorization: `Bearer ${token}` } } + { headers: { Authorization: `Bearer ${token}` } }, ); } catch (err) { logger.debug( - `helper.activateProject: error for project ${projectId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.activateProject: error for project ${projectId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -647,16 +665,16 @@ async function updateSelfServiceProjectInfo(projectId, workItemPlannedEndDate, c workItemPlannedEndDate, }, }, - { headers: { Authorization: `Bearer ${token}` } } - ); - logger.debug( - `helper.updateSelfServiceProjectInfo: PATCH success for project ${projectId}` + { headers: { Authorization: `Bearer ${token}` } }, ); + logger.debug(`helper.updateSelfServiceProjectInfo: PATCH success for project ${projectId}`); } catch (err) { logger.debug( - `helper.updateSelfServiceProjectInfo: error for project ${projectId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.updateSelfServiceProjectInfo: error for project ${projectId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -684,7 +702,7 @@ async function userHasFullAccess(challengeId, userId, challengeResources) { const resourceRoles = await getResourceRoles(); const rolesWithFullAccess = _.map( _.filter(resourceRoles, (r) => r.fullWriteAccess), - "id" + "id", ); if (!challengeResources) { challengeResources = await getChallengeResources(challengeId); @@ -693,7 +711,7 @@ async function userHasFullAccess(challengeId, userId, challengeResources) { _.filter( challengeResources, (r) => - _.toString(r.memberId) === _.toString(userId) && _.includes(rolesWithFullAccess, r.roleId) + _.toString(r.memberId) === _.toString(userId) && _.includes(rolesWithFullAccess, r.roleId), ).length > 0 ); } @@ -715,7 +733,7 @@ async function userHasProjectWriteAccess(projectId, currentUser) { const project = await projectHelper.getProject(projectId, currentUser); const member = _.find( _.get(project, "members", []), - (m) => _.toString(m.userId) === _.toString(currentUser.userId) + (m) => _.toString(m.userId) === _.toString(currentUser.userId), ); const role = _.toLower(_.get(member, "role", "")); return PROJECT_WRITE_ACCESS_ROLES.has(role); @@ -727,7 +745,7 @@ async function userHasProjectWriteAccess(projectId, currentUser) { logger.debug( `helper.userHasProjectWriteAccess: error for project ${projectId} - status ${ status || "n/a" - }: ${err.message}` + }: ${err.message}`, ); return false; } @@ -750,7 +768,7 @@ async function userHasProjectManagerAccess(projectId, currentUser) { const project = await projectHelper.getProject(projectId, currentUser); const member = _.find( _.get(project, "members", []), - (m) => _.toString(m.userId) === _.toString(currentUser.userId) + (m) => _.toString(m.userId) === _.toString(currentUser.userId), ); const role = _.toLower(_.get(member, "role", "")); return PROJECT_MANAGER_ACCESS_ROLES.has(role); @@ -762,7 +780,7 @@ async function userHasProjectManagerAccess(projectId, currentUser) { logger.debug( `helper.userHasProjectManagerAccess: error for project ${projectId} - status ${ status || "n/a" - }: ${err.message}` + }: ${err.message}`, ); return false; } @@ -785,7 +803,7 @@ async function userHasProjectTaskViewAccess(projectId, currentUser) { const project = await projectHelper.getProject(projectId, currentUser); const member = _.find( _.get(project, "members", []), - (m) => _.toString(m.userId) === _.toString(currentUser.userId) + (m) => _.toString(m.userId) === _.toString(currentUser.userId), ); const role = _.toLower(_.get(member, "role", "")); return PROJECT_TASK_VIEW_ACCESS_ROLES.has(role); @@ -797,7 +815,7 @@ async function userHasProjectTaskViewAccess(projectId, currentUser) { logger.debug( `helper.userHasProjectTaskViewAccess: error for project ${projectId} - status ${ status || "n/a" - }: ${err.message}` + }: ${err.message}`, ); return false; } @@ -857,14 +875,16 @@ async function getCompleteUserGroupTreeIds(userId) { logger.debug( `helper.getCompleteUserGroupTreeIds: response status ${result.status} (groups=${ normalizedGroupIds.length - })` + })`, ); return normalizedGroupIds; } catch (err) { logger.debug( - `helper.getCompleteUserGroupTreeIds: error for user ${userId} - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.getCompleteUserGroupTreeIds: error for user ${userId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } @@ -1023,7 +1043,7 @@ function getBusApiClient() { "BUSAPI_URL", "KAFKA_ERROR_TOPIC", "AUTH0_PROXY_SERVER_URL", - ]) + ]), ); } @@ -1053,15 +1073,13 @@ async function postBusEvent(topic, payload, options = {}) { message.key = options.key; } logger.debug( - `helper.postBusEvent: publishing topic ${topic}${options.key ? ` key ${options.key}` : ""}` + `helper.postBusEvent: publishing topic ${topic}${options.key ? ` key ${options.key}` : ""}`, ); try { await client.postEvent(message); logger.debug(`helper.postBusEvent: publish complete for topic ${topic}`); } catch (err) { - logger.debug( - `helper.postBusEvent: error publishing topic ${topic} - ${err.message}` - ); + logger.debug(`helper.postBusEvent: error publishing topic ${topic} - ${err.message}`); throw err; } } @@ -1112,7 +1130,7 @@ async function listResourcesByMemberAndChallenge(memberId, challengeId) { } catch (e) { logger.debug( `Failed to get resources on challenge ${challengeId} that memberId ${memberId} has`, - e + e, ); } const result = response.data || []; @@ -1160,7 +1178,7 @@ function dedupeChallengeTerms(terms = []) { const idKey = _.toString(term.id).trim(); const roleKey = _.isNil(term.roleId) ? "" : _.toString(term.roleId).trim(); return `${idKey}:${roleKey}`; - } + }, ); } @@ -1187,7 +1205,7 @@ async function validateChallengeTerms(terms = []) { } catch (e) { if (_.get(e, "response.status") === HttpStatus.NOT_FOUND) { throw new errors.BadRequestError( - `Terms of use identified by the id ${term.id} does not exist` + `Terms of use identified by the id ${term.id} does not exist`, ); } else { // re-throw other error @@ -1199,6 +1217,115 @@ async function validateChallengeTerms(terms = []) { return listOfTerms; } +/** + * Determine whether challenge whitelist checks apply for a request. + * Interactive users, including admins and anonymous callers, must be evaluated; + * M2M callers are allowed to bypass this user-facing access control. + * + * @param {Object} currentUser the user who performs the operation + * @returns {Boolean} true when whitelist rules should be applied + */ +function shouldApplyChallengeWhitelist(currentUser) { + return !_.get(currentUser, "isMachine", false); +} + +/** + * Build a Prisma filter that hides restricted challenges from interactive + * challenge listing queries. Challenges with no whitelist rows stay visible. + * + * @param {Object} currentUser the user who performs the operation + * @returns {Object|null} Prisma where fragment, or null for M2M callers + */ +function getChallengeWhitelistAccessFilter(currentUser) { + if (!shouldApplyChallengeWhitelist(currentUser)) { + return null; + } + + const userId = _.toString(_.get(currentUser, "userId", "")).trim(); + if (!userId) { + return { + userWhitelist: { + none: {}, + }, + }; + } + + return { + OR: [ + { + userWhitelist: { + none: {}, + }, + }, + { + userWhitelist: { + some: { userId }, + }, + }, + ], + }; +} + +/** + * Evaluate challenge whitelist access for a single direct challenge request. + * A challenge is unrestricted when it has no whitelist rows. Evaluation errors + * fail closed for interactive users. + * + * @param {Object} currentUser the user who performs the operation + * @param {String} challengeId the challenge id to evaluate + * @returns {Promise} true when the caller may access the challenge + */ +async function canAccessChallengeByWhitelist(currentUser, challengeId) { + if (!shouldApplyChallengeWhitelist(currentUser)) { + return true; + } + + if (!challengeId) { + return false; + } + + const userId = _.toString(_.get(currentUser, "userId", "")).trim(); + + try { + const totalRows = await prisma.challengeUserWhitelist.count({ + where: { challengeId }, + }); + + if (totalRows === 0) { + return true; + } + + if (!userId) { + return false; + } + + const matchingRows = await prisma.challengeUserWhitelist.count({ + where: { challengeId, userId }, + }); + return matchingRows > 0; + } catch (err) { + logger.warn( + `helper.canAccessChallengeByWhitelist: failed for challenge ${challengeId}: ${err.message}`, + ); + return false; + } +} + +/** + * Ensure an interactive caller is allowed by the challenge whitelist. + * + * @param {Object} currentUser the user who performs the operation + * @param {String} challengeId the challenge id to evaluate + * @returns {Promise} + * @throws {ForbiddenError} when the whitelist blocks the caller or evaluation fails + */ +async function ensureChallengeWhitelistAccess(currentUser, challengeId) { + const allowed = await canAccessChallengeByWhitelist(currentUser, challengeId); + if (!allowed) { + throw new errors.ForbiddenError(`You don't have access to view this challenge`); + } +} + /** * Filter challenges by groups access * @param {Object} currentUser the user who perform operation @@ -1217,7 +1344,7 @@ async function _filterChallengesByGroupsAccess(currentUser, challenges) { for (const challenge of challenges) { challenge.groups = _.filter( challenge.groups, - (g) => !_.includes(["null", "undefined"], _.toString(g).toLowerCase()) + (g) => !_.includes(["null", "undefined"], _.toString(g).toLowerCase()), ); if ( !challenge.groups || @@ -1247,7 +1374,7 @@ async function ensureAccessibleByGroupsAccess(currentUser, challenge) { const filtered = await _filterChallengesByGroupsAccess(currentUser, [challenge]); if (filtered.length === 0) { throw new errors.ForbiddenError( - "helper ensureAcessibilityToModifiedGroups :: You don't have access to this group!" + "helper ensureAcessibilityToModifiedGroups :: You don't have access to this group!", ); } } @@ -1282,10 +1409,7 @@ async function syncTaskAssignmentFromResources(challenge) { } let isAssigned = taskInfo.isAssigned || !_.isNil(taskInfo.memberId); if (!isAssigned) { - const counts = await getChallengeResourcesCount( - challenge.id, - config.SUBMITTER_ROLE_ID - ); + const counts = await getChallengeResourcesCount(challenge.id, config.SUBMITTER_ROLE_ID); const submitterCount = _.get(counts, config.SUBMITTER_ROLE_ID, 0); if (submitterCount > 0) { isAssigned = true; @@ -1323,18 +1447,17 @@ async function _ensureAccessibleForTaskChallenge(currentUser, challenge) { } const hasProjectTaskViewAccess = await userHasProjectTaskViewAccess( challenge.projectId, - currentUser + currentUser, ); if (hasProjectTaskViewAccess) { return; } const memberResources = await listResourcesByMemberAndChallenge( currentUser.userId, - challenge.id + challenge.id, ); - const copilotRoleIds = _.map( - [].concat(config.COPILOT_RESOURCE_ROLE_IDS || []), - (roleId) => _.toString(roleId) + const copilotRoleIds = _.map([].concat(config.COPILOT_RESOURCE_ROLE_IDS || []), (roleId) => + _.toString(roleId), ); const isCopilotResource = _.some(memberResources, (resource) => { const roleId = _.toString(resource.roleId); @@ -1346,7 +1469,7 @@ async function _ensureAccessibleForTaskChallenge(currentUser, challenge) { } const isSubmitterResource = _.some( memberResources, - (resource) => resource.roleId === config.SUBMITTER_ROLE_ID + (resource) => resource.roleId === config.SUBMITTER_ROLE_ID, ); if (!isSubmitterResource) { throw new errors.ForbiddenError(`You don't have access to view this challenge`); @@ -1361,6 +1484,7 @@ async function _ensureAccessibleForTaskChallenge(currentUser, challenge) { * @param {Object} challenge the challenge to check */ async function ensureUserCanViewChallenge(currentUser, challenge) { + await ensureChallengeWhitelistAccess(currentUser, challenge.id); // check groups authorization await ensureAccessibleByGroupsAccess(currentUser, challenge); // check if user can access a challenge that is a task @@ -1376,35 +1500,33 @@ async function ensureUserCanViewChallenge(currentUser, challenge) { * @returns {Promise} */ async function ensureUserCanModifyChallenge(currentUser, challenge, challengeResources) { + await ensureChallengeWhitelistAccess(currentUser, challenge.id); // check groups authorization await ensureAccessibleByGroupsAccess(currentUser, challenge); // check full access const isUserHasFullAccess = await userHasFullAccess( challenge.id, currentUser.userId, - challengeResources + challengeResources, ); - const challengeCreator = _.isNil(challenge.createdBy) - ? null - : _.toString(challenge.createdBy); + const challengeCreator = _.isNil(challenge.createdBy) ? null : _.toString(challenge.createdBy); const currentUserId = _.isNil(currentUser.userId) ? null : _.toString(currentUser.userId); const currentUserHandle = currentUser.handle ? _.toLower(currentUser.handle) : null; const isChallengeCreator = (!!challengeCreator && !!currentUserId && challengeCreator === currentUserId) || - (!!challengeCreator && !!currentUserHandle && _.toLower(challengeCreator) === currentUserHandle); + (!!challengeCreator && + !!currentUserHandle && + _.toLower(challengeCreator) === currentUserHandle); if ( !currentUser.isMachine && !hasAdminRole(currentUser) && !isChallengeCreator && !isUserHasFullAccess ) { - const hasProjectWriteAccess = await userHasProjectWriteAccess( - challenge.projectId, - currentUser - ); + const hasProjectWriteAccess = await userHasProjectWriteAccess(challenge.projectId, currentUser); if (!hasProjectWriteAccess) { throw new errors.ForbiddenError( - "Only M2M, admin, challenge's copilot, users with full access, or project members with write/full/copilot access can perform modification." + "Only M2M, admin, challenge's copilot, users with full access, or project members with write/full/copilot access can perform modification.", ); } } @@ -1441,9 +1563,12 @@ async function getGroupById(groupId) { const token = await m2mHelper.getM2MToken(); const requestHeaders = { Authorization: `Bearer ${token}` }; try { - const result = await axios.get(`${config.GROUPS_API_URL}/${encodeURIComponent(normalizedGroupId)}`, { - headers: requestHeaders, - }); + const result = await axios.get( + `${config.GROUPS_API_URL}/${encodeURIComponent(normalizedGroupId)}`, + { + headers: requestHeaders, + }, + ); return result.data; } catch (err) { const status = _.get(err, "response.status"); @@ -1514,7 +1639,7 @@ async function getAIReviewConfigByChallengeId(challengeId) { const token = await m2mHelper.getM2MToken(); const reviewsApiBaseUrl = _.trimEnd( config.REVIEWS_API_URL || "https://api.topcoder-dev.com", - "/" + "/", ); try { @@ -1540,13 +1665,16 @@ async function getReviewSummations(challengeId) { let allReviewSummations = []; let page = 1; while (true) { - const result = await axios.get(`${config.REVIEW_SUMMATIONS_API_URL}?challengeId=${challengeId}`, { - headers: { Authorization: `Bearer ${token}` }, - params: { - page, - perPage: 500, + const result = await axios.get( + `${config.REVIEW_SUMMATIONS_API_URL}?challengeId=${challengeId}`, + { + headers: { Authorization: `Bearer ${token}` }, + params: { + page, + perPage: 500, + }, }, - }); + ); const reviewSummations = result.data.data || []; if (reviewSummations.length === 0) { break; @@ -1600,7 +1728,7 @@ async function getMembersByHandles(handles) { `${config.MEMBERS_API_URL}/?fields=handle&handlesLower=["${_.join(handles, '","')}"]`, { headers: { Authorization: `Bearer ${token}` }, - } + }, ); return res.data; } @@ -1638,18 +1766,20 @@ async function getStandSkills(ids) { logger.debug( `helper.getStandSkills: response status ${res.status} (items=${ _.get(res, "data.length", 0) || 0 - })` + })`, ); return res.data; } catch (err) { logger.debug( - `helper.getStandSkills: error fetching skills batch - status ${ - _.get(err, "response.status", "n/a") - }: ${err.message}` + `helper.getStandSkills: error fetching skills batch - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, ); throw err; } - })() + })(), ); } @@ -1698,8 +1828,8 @@ async function sendSelfServiceNotification(type, recipients, data) { * @param {String|Date} at - The date/time when the phase opened/closed */ function buildPhaseChangeEmailData({ challengeId, challengeName, phaseName, operation, at }) { - const isOpen = operation === 'open' || operation === 'reopen'; - const isClose = operation === 'close'; + const isOpen = operation === "open" || operation === "reopen"; + const isClose = operation === "close"; return { challengeURL: `${config.CHALLENGE_URL}/${challengeId}`, @@ -1711,7 +1841,6 @@ function buildPhaseChangeEmailData({ challengeId, challengeName, phaseName, oper }; } - /** * Send phase change notification * @param {String} type the notification type @@ -1729,7 +1858,7 @@ async function sendPhaseChangeNotification(type, recipients, data) { if (!settings.sendgridTemplateId) { logger.debug( - `sendPhaseChangeNotification: sendgridTemplateId not configured for type ${type}` + `sendPhaseChangeNotification: sendgridTemplateId not configured for type ${type}`, ); return; } @@ -1740,16 +1869,14 @@ async function sendPhaseChangeNotification(type, recipients, data) { return; } - await postBusEvent('external.action.email', - { - from: config.EMAIL_FROM, - replyTo: config.EMAIL_FROM, - recipients: safeRecipients, - data: data, - sendgrid_template_id: settings.sendgridTemplateId, - version: 'v3', - }, - ); + await postBusEvent("external.action.email", { + from: config.EMAIL_FROM, + replyTo: config.EMAIL_FROM, + recipients: safeRecipients, + data: data, + sendgrid_template_id: settings.sendgridTemplateId, + version: "v3", + }); } catch (e) { logger.debug(`Failed to post notification ${type}: ${e.message}`); } @@ -1773,7 +1900,7 @@ async function submitZendeskRequest(request) { username: `${request.requester.email}/token`, password: config.ZENDESK_API_TOKEN, }, - } + }, ); return res.data || {}; } catch (e) { @@ -1842,6 +1969,10 @@ module.exports = { getCompleteUserGroupTreeIds, expandWithParentGroups, getResourceRoles, + shouldApplyChallengeWhitelist, + getChallengeWhitelistAccessFilter, + canAccessChallengeByWhitelist, + ensureChallengeWhitelistAccess, ensureAccessibleByGroupsAccess, getTaskInfo, syncTaskAssignmentFromResources, @@ -1875,7 +2006,7 @@ module.exports = { flushInternalCache, removeNullProperties, buildPhaseChangeEmailData, - sendPhaseChangeNotification + sendPhaseChangeNotification, }; logger.buildService(module.exports); diff --git a/src/controllers/ChallengeController.js b/src/controllers/ChallengeController.js index ef4d603..1511aee 100644 --- a/src/controllers/ChallengeController.js +++ b/src/controllers/ChallengeController.js @@ -23,7 +23,7 @@ async function searchChallenges(req, res) { logger.debug(`Staring to get mm challengeId`); const legacyId = await helper.getProjectIdByRoundId(req.query.legacyId); logger.debug(`Get mm challengeId successfully ${legacyId}`); - result = await service.searchChallenges(req, req.authUser, { + result = await service.searchChallenges(req.authUser, { ...req.query, ...req.body, legacyId, @@ -48,7 +48,7 @@ async function searchChallenges(req, res) { */ async function createChallenge(req, res) { logger.debug( - `createChallenge User: ${JSON.stringify(req.authUser)} - Body: ${JSON.stringify(req.body)}` + `createChallenge User: ${JSON.stringify(req.authUser)} - Body: ${JSON.stringify(req.body)}`, ); const result = await service.createChallenge(req.authUser, req.body, req.userToken); res.status(HttpStatus.CREATED).send(result); @@ -73,7 +73,7 @@ async function getChallenge(req, res) { const result = await service.getChallenge( req.authUser, req.params.challengeId, - req.query.checkIfExists + req.query.checkIfExists, ); res.send(result); } @@ -97,7 +97,7 @@ async function updateChallenge(req, res) { logger.debug( `updateChallenge User: ${JSON.stringify(req.authUser)} - ChallengeID: ${ req.params.challengeId - } - Body: ${JSON.stringify(req.body)}` + } - Body: ${JSON.stringify(req.body)}`, ); const result = await service.updateChallenge(req.authUser, req.params.challengeId, req.body); res.send(result); @@ -110,7 +110,7 @@ async function updateChallenge(req, res) { */ async function deleteChallenge(req, res) { logger.debug( - `deleteChallenge User: ${JSON.stringify(req.authUser)} - ChallengeID: ${req.params.challengeId}` + `deleteChallenge User: ${JSON.stringify(req.authUser)} - ChallengeID: ${req.params.challengeId}`, ); const result = await service.deleteChallenge(req.authUser, req.params.challengeId); res.send(result); @@ -132,7 +132,7 @@ async function advancePhase(req, res) { */ async function closeMarathonMatch(req, res) { logger.debug( - `closeMarathonMatch User: ${JSON.stringify(req.authUser)} - ChallengeID: ${req.params.challengeId}` + `closeMarathonMatch User: ${JSON.stringify(req.authUser)} - ChallengeID: ${req.params.challengeId}`, ); const result = await service.closeMarathonMatch(req.authUser, req.params.challengeId); res.send(result); diff --git a/src/controllers/ChallengePhaseController.js b/src/controllers/ChallengePhaseController.js index b38dda3..664c160 100644 --- a/src/controllers/ChallengePhaseController.js +++ b/src/controllers/ChallengePhaseController.js @@ -9,7 +9,7 @@ const service = require("../services/ChallengePhaseService"); * @param {Object} res the response */ async function getAllChallengePhases(req, res) { - const result = await service.getAllChallengePhases(req.params.challengeId); + const result = await service.getAllChallengePhases(req.params.challengeId, req.authUser); res.send(result); } @@ -19,7 +19,11 @@ async function getAllChallengePhases(req, res) { * @param {Object} res the response */ async function getChallengePhase(req, res) { - const result = await service.getChallengePhase(req.params.challengeId, req.params.id); + const result = await service.getChallengePhase( + req.params.challengeId, + req.params.id, + req.authUser, + ); res.send(result); } @@ -33,7 +37,7 @@ async function partiallyUpdateChallengePhase(req, res) { req.authUser, req.params.challengeId, req.params.id, - req.body + req.body, ); res.send(result); } @@ -47,7 +51,7 @@ async function deleteChallengePhase(req, res) { const result = await service.deleteChallengePhase( req.authUser, req.params.challengeId, - req.params.id + req.params.id, ); res.send(result); } diff --git a/src/services/AttachmentService.js b/src/services/AttachmentService.js index 110694c..78950a6 100644 --- a/src/services/AttachmentService.js +++ b/src/services/AttachmentService.js @@ -13,7 +13,7 @@ const { enrichChallengeForResponse } = require("../common/challenge-helper"); const prismaHelper = require("../common/prisma-helper"); const bucketWhitelist = config.AMAZON.BUCKET_WHITELIST.split(",").map((bucketName) => - bucketName.trim() + bucketName.trim(), ); const prisma = require("../common/prisma").getClient(); @@ -46,7 +46,7 @@ async function _getChallengeAttachment(challengeId, attachmentId) { const attachment = await prisma.attachment.findUnique({ where: { id: attachmentId } }); if (!challenge || !challenge.id || !attachment || attachment.challengeId !== challengeId) { throw new errors.NotFoundError( - `Attachment ${attachmentId} not found in challenge ${challengeId}` + `Attachment ${attachmentId} not found in challenge ${challengeId}`, ); } // convert challenge data @@ -91,7 +91,7 @@ createAttachment.schema = { url: Joi.string().uri().required(), fileSize: Joi.fileSize(), description: Joi.string(), - }) + }), ) .required() .min(1), @@ -143,7 +143,7 @@ async function update(currentUser, challengeId, attachmentId, data, isFull) { // post bus event await helper.postBusEvent( constants.Topics.ChallengeAttachmentUpdated, - isFull ? ret : _.assignIn({ id: attachmentId }, data) + isFull ? ret : _.assignIn({ id: attachmentId }, data), ); return ret; } diff --git a/src/services/ChallengePhaseService.js b/src/services/ChallengePhaseService.js index d7389e3..88c2867 100644 --- a/src/services/ChallengePhaseService.js +++ b/src/services/ChallengePhaseService.js @@ -1,261 +1,261 @@ /** * This service provides operations of challenge phases. */ -const _ = require('lodash') -const Joi = require('joi') -const moment = require('moment') -const { Prisma } = require('@prisma/client') -const config = require('config') -const helper = require('../common/helper') -const logger = require('../common/logger') -const errors = require('../common/errors') -const constants = require('../../app-constants') -const { getReviewClient } = require('../common/review-prisma') +const _ = require("lodash"); +const Joi = require("joi"); +const moment = require("moment"); +const { Prisma } = require("@prisma/client"); +const config = require("config"); +const helper = require("../common/helper"); +const logger = require("../common/logger"); +const errors = require("../common/errors"); +const constants = require("../../app-constants"); +const { getReviewClient } = require("../common/review-prisma"); const { indexChallengeAndPostToKafka, - ensureAIScreeningCanBeClosed -} = require('./ChallengeService') + ensureAIScreeningCanBeClosed, +} = require("./ChallengeService"); -const { getClient } = require('../common/prisma') -const prisma = getClient() -const PENDING_REVIEW_STATUSES = Object.freeze(['PENDING', 'IN_PROGRESS', 'DRAFT', 'SUBMITTED']) +const { getClient } = require("../common/prisma"); +const prisma = getClient(); +const PENDING_REVIEW_STATUSES = Object.freeze(["PENDING", "IN_PROGRESS", "DRAFT", "SUBMITTED"]); const REVIEW_PHASE_NAMES = Object.freeze([ - 'checkpoint review', - 'checkpoint screening', - 'screening', - 'review', - 'approval' -]) -const REVIEW_PHASE_NAME_SET = new Set(REVIEW_PHASE_NAMES.map((name) => name.toLowerCase())) + "checkpoint review", + "checkpoint screening", + "screening", + "review", + "approval", +]); +const REVIEW_PHASE_NAME_SET = new Set(REVIEW_PHASE_NAMES.map((name) => name.toLowerCase())); const PHASE_RESOURCE_ROLE_REQUIREMENTS = Object.freeze({ - 'iterative review': 'Iterative Reviewer', - 'checkpoint screening': 'Checkpoint Screener', - screening: 'Screener', - review: 'Reviewer', - approval: 'Approver', - 'checkpoint review': 'Checkpoint Reviewer' -}) + "iterative review": "Iterative Reviewer", + "checkpoint screening": "Checkpoint Screener", + screening: "Screener", + review: "Reviewer", + approval: "Approver", + "checkpoint review": "Checkpoint Reviewer", +}); const normalizePhaseName = (name) => - String(name || '') + String(name || "") .trim() - .toLowerCase() + .toLowerCase(); -function datesAreSame (dateA, dateB) { +function datesAreSame(dateA, dateB) { if (_.isNil(dateA) && _.isNil(dateB)) { - return true + return true; } if (_.isNil(dateA) || _.isNil(dateB)) { - return false + return false; } - return new Date(dateA).getTime() === new Date(dateB).getTime() + return new Date(dateA).getTime() === new Date(dateB).getTime(); } -function dateIsAfter (dateA, dateB) { +function dateIsAfter(dateA, dateB) { if (_.isNil(dateA) || _.isNil(dateB)) { - return false + return false; } - const timeA = new Date(dateA).getTime() - const timeB = new Date(dateB).getTime() + const timeA = new Date(dateA).getTime(); + const timeB = new Date(dateB).getTime(); if (Number.isNaN(timeA) || Number.isNaN(timeB)) { - return false + return false; } - return timeA > timeB + return timeA > timeB; } -function buildPhaseIdentifiers (phase) { - const identifiers = [] +function buildPhaseIdentifiers(phase) { + const identifiers = []; if (phase && phase.id) { - identifiers.push(String(phase.id)) + identifiers.push(String(phase.id)); } if (phase && !_.isNil(phase.phaseId)) { - identifiers.push(String(phase.phaseId)) + identifiers.push(String(phase.phaseId)); } - return identifiers + return identifiers; } -async function recalculateDependentPhaseDates (tx, challengeId, predecessorPhase, currentUserId) { +async function recalculateDependentPhaseDates(tx, challengeId, predecessorPhase, currentUserId) { if (!predecessorPhase || _.isNil(predecessorPhase.scheduledEndDate)) { - return + return; } const phases = await tx.challengePhase.findMany({ - where: { challengeId } - }) + where: { challengeId }, + }); - const successorsByPredecessor = new Map() + const successorsByPredecessor = new Map(); for (const phase of phases) { if (_.isNil(phase.predecessor)) { - continue + continue; } - const key = String(phase.predecessor) + const key = String(phase.predecessor); if (!successorsByPredecessor.has(key)) { - successorsByPredecessor.set(key, []) + successorsByPredecessor.set(key, []); } - successorsByPredecessor.get(key).push(phase) + successorsByPredecessor.get(key).push(phase); } - const queue = [predecessorPhase] - const visited = new Set() + const queue = [predecessorPhase]; + const visited = new Set(); while (queue.length > 0) { - const currentPhase = queue.shift() - const currentEndDate = currentPhase?.scheduledEndDate + const currentPhase = queue.shift(); + const currentEndDate = currentPhase?.scheduledEndDate; if (_.isNil(currentEndDate)) { - continue + continue; } - const predecessorKeys = buildPhaseIdentifiers(currentPhase) + const predecessorKeys = buildPhaseIdentifiers(currentPhase); for (const predecessorKey of predecessorKeys) { - const successors = successorsByPredecessor.get(predecessorKey) || [] + const successors = successorsByPredecessor.get(predecessorKey) || []; for (const successor of successors) { if (visited.has(successor.id)) { - continue + continue; } - let successorForQueue = successor + let successorForQueue = successor; if (_.isNil(successor.actualStartDate)) { - const alignToPredecessorStart = normalizePhaseName(successor.name) === 'iterative review' + const alignToPredecessorStart = normalizePhaseName(successor.name) === "iterative review"; const desiredStartDate = new Date( alignToPredecessorStart && currentPhase.scheduledStartDate ? currentPhase.scheduledStartDate - : currentEndDate - ) - const durationSeconds = Number(successor.duration) + : currentEndDate, + ); + const durationSeconds = Number(successor.duration); if (!Number.isFinite(durationSeconds) || Number.isNaN(desiredStartDate.getTime())) { - visited.add(successor.id) - queue.push(successorForQueue) - continue + visited.add(successor.id); + queue.push(successorForQueue); + continue; } - const desiredEndDate = new Date(desiredStartDate.getTime() + durationSeconds * 1000) - const startChanged = !datesAreSame(successor.scheduledStartDate, desiredStartDate) - const endChanged = !datesAreSame(successor.scheduledEndDate, desiredEndDate) + const desiredEndDate = new Date(desiredStartDate.getTime() + durationSeconds * 1000); + const startChanged = !datesAreSame(successor.scheduledStartDate, desiredStartDate); + const endChanged = !datesAreSame(successor.scheduledEndDate, desiredEndDate); if (startChanged || endChanged) { successorForQueue = await tx.challengePhase.update({ data: { scheduledStartDate: desiredStartDate, scheduledEndDate: desiredEndDate, - updatedBy: currentUserId + updatedBy: currentUserId, }, where: { - id: successor.id - } - }) + id: successor.id, + }, + }); } else { successorForQueue = { ...successor, scheduledStartDate: successor.scheduledStartDate, - scheduledEndDate: successor.scheduledEndDate - } + scheduledEndDate: successor.scheduledEndDate, + }; } } - visited.add(successor.id) - queue.push(successorForQueue) + visited.add(successor.id); + queue.push(successorForQueue); } } } } -async function shiftDependentPhaseDates (tx, challengeId, predecessorPhase, deltaMs, currentUserId) { +async function shiftDependentPhaseDates(tx, challengeId, predecessorPhase, deltaMs, currentUserId) { if (!predecessorPhase || !Number.isFinite(deltaMs) || deltaMs === 0) { - return + return; } const phases = await tx.challengePhase.findMany({ - where: { challengeId } - }) + where: { challengeId }, + }); - const successorsByPredecessor = new Map() + const successorsByPredecessor = new Map(); for (const phase of phases) { if (_.isNil(phase.predecessor)) { - continue + continue; } - const key = String(phase.predecessor) + const key = String(phase.predecessor); if (!successorsByPredecessor.has(key)) { - successorsByPredecessor.set(key, []) + successorsByPredecessor.set(key, []); } - successorsByPredecessor.get(key).push(phase) + successorsByPredecessor.get(key).push(phase); } - const queue = [predecessorPhase] - const visited = new Set() + const queue = [predecessorPhase]; + const visited = new Set(); while (queue.length > 0) { - const currentPhase = queue.shift() - const predecessorKeys = buildPhaseIdentifiers(currentPhase) + const currentPhase = queue.shift(); + const predecessorKeys = buildPhaseIdentifiers(currentPhase); for (const predecessorKey of predecessorKeys) { - const successors = successorsByPredecessor.get(predecessorKey) || [] + const successors = successorsByPredecessor.get(predecessorKey) || []; for (const successor of successors) { if (visited.has(successor.id)) { - continue + continue; } - let successorForQueue = successor + let successorForQueue = successor; if (_.isNil(successor.actualStartDate)) { const scheduledStartTime = successor.scheduledStartDate ? new Date(successor.scheduledStartDate).getTime() - : Number.NaN + : Number.NaN; const scheduledEndTime = successor.scheduledEndDate ? new Date(successor.scheduledEndDate).getTime() - : Number.NaN + : Number.NaN; if (Number.isFinite(scheduledStartTime) && Number.isFinite(scheduledEndTime)) { - const desiredStartDate = new Date(scheduledStartTime + deltaMs) - const desiredEndDate = new Date(scheduledEndTime + deltaMs) - const startChanged = !datesAreSame(successor.scheduledStartDate, desiredStartDate) - const endChanged = !datesAreSame(successor.scheduledEndDate, desiredEndDate) + const desiredStartDate = new Date(scheduledStartTime + deltaMs); + const desiredEndDate = new Date(scheduledEndTime + deltaMs); + const startChanged = !datesAreSame(successor.scheduledStartDate, desiredStartDate); + const endChanged = !datesAreSame(successor.scheduledEndDate, desiredEndDate); if (startChanged || endChanged) { successorForQueue = await tx.challengePhase.update({ data: { scheduledStartDate: desiredStartDate, scheduledEndDate: desiredEndDate, - updatedBy: currentUserId + updatedBy: currentUserId, }, where: { - id: successor.id - } - }) + id: successor.id, + }, + }); } else { successorForQueue = { ...successor, scheduledStartDate: successor.scheduledStartDate, - scheduledEndDate: successor.scheduledEndDate - } + scheduledEndDate: successor.scheduledEndDate, + }; } } } - visited.add(successor.id) - queue.push(successorForQueue) + visited.add(successor.id); + queue.push(successorForQueue); } } } } -async function hasPendingScorecardsForPhase (challengePhaseId) { +async function hasPendingScorecardsForPhase(challengePhaseId) { if (!config.REVIEW_DB_URL) { logger.debug( - `Skipping pending scorecard check for phase ${challengePhaseId} because REVIEW_DB_URL is not configured` - ) - return false + `Skipping pending scorecard check for phase ${challengePhaseId} because REVIEW_DB_URL is not configured`, + ); + return false; } - const reviewPrisma = getReviewClient() - const reviewSchema = config.REVIEW_DB_SCHEMA - const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`) - const statusText = Prisma.raw('"status"::text') + const reviewPrisma = getReviewClient(); + const reviewSchema = config.REVIEW_DB_SCHEMA; + const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`); + const statusText = Prisma.raw('"status"::text'); const pendingStatusClause = PENDING_REVIEW_STATUSES.length > 0 ? Prisma.sql`${statusText} IN (${Prisma.join( - PENDING_REVIEW_STATUSES.map((status) => Prisma.sql`${status}`) + PENDING_REVIEW_STATUSES.map((status) => Prisma.sql`${status}`), )})` - : Prisma.sql`FALSE` + : Prisma.sql`FALSE`; - let rows + let rows; try { rows = await reviewPrisma.$queryRaw( Prisma.sql` @@ -266,54 +266,54 @@ async function hasPendingScorecardsForPhase (challengePhaseId) { "status" IS NULL OR ${pendingStatusClause} ) - ` - ) + `, + ); } catch (err) { logger.error( `Failed to check pending scorecards for phase ${challengePhaseId}: ${err.message}`, - err - ) - throw err + err, + ); + throw err; } - const [{ count = 0 } = {}] = rows || [] - return Number(count) > 0 + const [{ count = 0 } = {}] = rows || []; + return Number(count) > 0; } -async function hasCompletedReviewsForPhase (challengePhaseIdOrIds) { +async function hasCompletedReviewsForPhase(challengePhaseIdOrIds) { if (!config.REVIEW_DB_URL) { logger.debug( - `Skipping completed review check for phase ${challengePhaseIdOrIds} because REVIEW_DB_URL is not configured` - ) - return false + `Skipping completed review check for phase ${challengePhaseIdOrIds} because REVIEW_DB_URL is not configured`, + ); + return false; } const phaseIds = Array.isArray(challengePhaseIdOrIds) ? challengePhaseIdOrIds.filter((id) => !_.isNil(id)) - : [challengePhaseIdOrIds] + : [challengePhaseIdOrIds]; if (phaseIds.length === 0) { - return false + return false; } - const reviewPrisma = getReviewClient() - const reviewSchema = config.REVIEW_DB_SCHEMA - const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`) - const statusText = Prisma.raw('"status"::text') - const completedStatuses = ['IN_PROGRESS', 'COMPLETED'] + const reviewPrisma = getReviewClient(); + const reviewSchema = config.REVIEW_DB_SCHEMA; + const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`); + const statusText = Prisma.raw('"status"::text'); + const completedStatuses = ["IN_PROGRESS", "COMPLETED"]; const phaseIdClause = phaseIds.length === 1 ? Prisma.sql`"phaseId" = ${phaseIds[0]}` : Prisma.sql`"phaseId" IN (${Prisma.join( - phaseIds.map((phaseId) => Prisma.sql`${phaseId}`) - )})` + phaseIds.map((phaseId) => Prisma.sql`${phaseId}`), + )})`; const completedStatusClause = Prisma.sql`${statusText} IN (${Prisma.join( - completedStatuses.map((status) => Prisma.sql`${status}`) - )})` + completedStatuses.map((status) => Prisma.sql`${status}`), + )})`; - let rows + let rows; try { rows = await reviewPrisma.$queryRaw( Prisma.sql` @@ -321,37 +321,37 @@ async function hasCompletedReviewsForPhase (challengePhaseIdOrIds) { FROM ${reviewTable} WHERE ${phaseIdClause} AND ${completedStatusClause} - ` - ) + `, + ); } catch (err) { logger.error( - `Failed to check completed reviews for phase(s) ${phaseIds.join(', ')}: ${err.message}`, - err - ) - throw err + `Failed to check completed reviews for phase(s) ${phaseIds.join(", ")}: ${err.message}`, + err, + ); + throw err; } - const [{ count = 0 } = {}] = rows || [] - return Number(count) > 0 + const [{ count = 0 } = {}] = rows || []; + return Number(count) > 0; } -async function hasSubmittedAppealsForChallenge (challengeId) { +async function hasSubmittedAppealsForChallenge(challengeId) { if (!config.REVIEW_DB_URL) { logger.debug( - `Skipping submitted appeals check for challenge ${challengeId} because REVIEW_DB_URL is not configured` - ) - return false + `Skipping submitted appeals check for challenge ${challengeId} because REVIEW_DB_URL is not configured`, + ); + return false; } - const reviewPrisma = getReviewClient() - const reviewSchema = config.REVIEW_DB_SCHEMA - const appealTable = Prisma.raw(`"${reviewSchema}"."appeal"`) - const reviewItemCommentTable = Prisma.raw(`"${reviewSchema}"."reviewItemComment"`) - const reviewItemTable = Prisma.raw(`"${reviewSchema}"."reviewItem"`) - const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`) - const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`) + const reviewPrisma = getReviewClient(); + const reviewSchema = config.REVIEW_DB_SCHEMA; + const appealTable = Prisma.raw(`"${reviewSchema}"."appeal"`); + const reviewItemCommentTable = Prisma.raw(`"${reviewSchema}"."reviewItemComment"`); + const reviewItemTable = Prisma.raw(`"${reviewSchema}"."reviewItem"`); + const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`); + const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`); - let rows + let rows; try { rows = await reviewPrisma.$queryRaw( Prisma.sql` @@ -369,38 +369,38 @@ async function hasSubmittedAppealsForChallenge (challengeId) { OR (r."legacySubmissionId" IS NOT NULL AND s."legacySubmissionId" = r."legacySubmissionId") ) ) - ` - ) + `, + ); } catch (err) { logger.error( `Failed to check submitted appeals for challenge ${challengeId}: ${err.message}`, - err - ) - throw err + err, + ); + throw err; } - const [{ count = 0 } = {}] = rows || [] - return Number(count) > 0 + const [{ count = 0 } = {}] = rows || []; + return Number(count) > 0; } -async function hasPendingAppealResponsesForChallenge (challengeId) { +async function hasPendingAppealResponsesForChallenge(challengeId) { if (!config.REVIEW_DB_URL) { logger.debug( - `Skipping pending appeal response check for challenge ${challengeId} because REVIEW_DB_URL is not configured` - ) - return false + `Skipping pending appeal response check for challenge ${challengeId} because REVIEW_DB_URL is not configured`, + ); + return false; } - const reviewPrisma = getReviewClient() - const reviewSchema = config.REVIEW_DB_SCHEMA - const appealTable = Prisma.raw(`"${reviewSchema}"."appeal"`) - const appealResponseTable = Prisma.raw(`"${reviewSchema}"."appealResponse"`) - const reviewItemCommentTable = Prisma.raw(`"${reviewSchema}"."reviewItemComment"`) - const reviewItemTable = Prisma.raw(`"${reviewSchema}"."reviewItem"`) - const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`) - const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`) + const reviewPrisma = getReviewClient(); + const reviewSchema = config.REVIEW_DB_SCHEMA; + const appealTable = Prisma.raw(`"${reviewSchema}"."appeal"`); + const appealResponseTable = Prisma.raw(`"${reviewSchema}"."appealResponse"`); + const reviewItemCommentTable = Prisma.raw(`"${reviewSchema}"."reviewItemComment"`); + const reviewItemTable = Prisma.raw(`"${reviewSchema}"."reviewItem"`); + const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`); + const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`); - let rows + let rows; try { rows = await reviewPrisma.$queryRaw( Prisma.sql` @@ -420,35 +420,35 @@ async function hasPendingAppealResponsesForChallenge (challengeId) { OR (r."legacySubmissionId" IS NOT NULL AND s."legacySubmissionId" = r."legacySubmissionId") ) ) - ` - ) + `, + ); } catch (err) { logger.error( `Failed to check pending appeal responses for challenge ${challengeId}: ${err.message}`, - err - ) - throw err + err, + ); + throw err; } - const [{ count = 0 } = {}] = rows || [] - return Number(count) > 0 + const [{ count = 0 } = {}] = rows || []; + return Number(count) > 0; } -async function hasPendingEscalationRequestsForChallenge (challengeId) { +async function hasPendingEscalationRequestsForChallenge(challengeId) { if (!config.REVIEW_DB_URL) { logger.debug( - `Skipping pending escalation request check for challenge ${challengeId} because REVIEW_DB_URL is not configured` - ) - return false + `Skipping pending escalation request check for challenge ${challengeId} because REVIEW_DB_URL is not configured`, + ); + return false; } - const reviewPrisma = getReviewClient() - const reviewSchema = config.REVIEW_DB_SCHEMA - const escalationTable = Prisma.raw(`"${reviewSchema}"."aiReviewDecisionEscalation"`) - const decisionTable = Prisma.raw(`"${reviewSchema}"."aiReviewDecision"`) - const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`) + const reviewPrisma = getReviewClient(); + const reviewSchema = config.REVIEW_DB_SCHEMA; + const escalationTable = Prisma.raw(`"${reviewSchema}"."aiReviewDecisionEscalation"`); + const decisionTable = Prisma.raw(`"${reviewSchema}"."aiReviewDecision"`); + const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`); - let rows + let rows; try { rows = await reviewPrisma.$queryRaw( Prisma.sql` @@ -462,178 +462,196 @@ async function hasPendingEscalationRequestsForChallenge (challengeId) { WHERE s."challengeId" = ${challengeId} AND s."id" = ard."submissionId" ) - ` - ) + `, + ); } catch (err) { logger.error( `Failed to check pending escalation requests for challenge ${challengeId}: ${err.message}`, - err - ) - throw err + err, + ); + throw err; } - const [{ count = 0 } = {}] = rows || [] - return Number(count) > 0 + const [{ count = 0 } = {}] = rows || []; + return Number(count) > 0; } -async function checkChallengeExists (challengeId) { - const challenge = await prisma.challenge.findUnique({ where: { id: challengeId } }) +/** + * Load a challenge for challenge-scoped phase operations. + * @param {String} challengeId the challenge id + * @returns {Object} the challenge with the given id + * @throws {NotFoundError} when the challenge does not exist + */ +async function getChallengeForPhaseAccess(challengeId) { + const challenge = await prisma.challenge.findUnique({ where: { id: challengeId } }); if (!challenge) { - throw new errors.NotFoundError(`Challenge with id: ${challengeId} doesn't exist`) + throw new errors.NotFoundError(`Challenge with id: ${challengeId} doesn't exist`); } + return challenge; } /** * Publish a challenge update event with the latest challenge payload. * @param {String} challengeId the challenge id */ -async function postChallengeUpdatedNotification (challengeId) { +async function postChallengeUpdatedNotification(challengeId) { try { - const challenge = await prisma.challenge.findUnique({ where: { id: challengeId } }) + const challenge = await prisma.challenge.findUnique({ where: { id: challengeId } }); if (!challenge) { - logger.error(`Failed to publish challenge update event: challenge ${challengeId} not found`) - return + logger.error(`Failed to publish challenge update event: challenge ${challengeId} not found`); + return; } - await indexChallengeAndPostToKafka(challenge) + await indexChallengeAndPostToKafka(challenge); } catch (error) { logger.error( `Failed to publish challenge update event for challenge ${challengeId}: ${error.message}`, - error - ) - throw error + error, + ); + throw error; } } -async function ensureRequiredResourcesBeforeOpeningPhase (challengeId, phaseName) { - const normalizedPhaseName = _.toLower(_.trim(phaseName || '')) - const requiredRoleName = PHASE_RESOURCE_ROLE_REQUIREMENTS[normalizedPhaseName] +async function ensureRequiredResourcesBeforeOpeningPhase(challengeId, phaseName) { + const normalizedPhaseName = _.toLower(_.trim(phaseName || "")); + const requiredRoleName = PHASE_RESOURCE_ROLE_REQUIREMENTS[normalizedPhaseName]; if (!requiredRoleName) { - return + return; } - const challengeResources = await helper.getChallengeResources(challengeId) - const requiredRoleNameLower = _.toLower(requiredRoleName) + const challengeResources = await helper.getChallengeResources(challengeId); + const requiredRoleNameLower = _.toLower(requiredRoleName); const hasRequiredRoleByName = (challengeResources || []).some((resource) => { const roleName = resource.roleName || resource.role || - _.get(resource, 'role.name') || - _.get(resource, 'resourceRoleName') || - _.get(resource, 'resourceRole.name') - return roleName && _.toLower(roleName) === requiredRoleNameLower - }) + _.get(resource, "role.name") || + _.get(resource, "resourceRoleName") || + _.get(resource, "resourceRole.name"); + return roleName && _.toLower(roleName) === requiredRoleNameLower; + }); - let hasRequiredRole = hasRequiredRoleByName + let hasRequiredRole = hasRequiredRoleByName; if (!hasRequiredRole) { - const resourceRoles = await helper.getResourceRoles() + const resourceRoles = await helper.getResourceRoles(); const requiredRoleIds = (resourceRoles || []) .filter((role) => role.name && _.toLower(role.name) === requiredRoleNameLower) - .map((role) => _.toString(role.id)) + .map((role) => _.toString(role.id)); if (requiredRoleIds.length > 0) { - const requiredRoleIdSet = new Set(requiredRoleIds) + const requiredRoleIdSet = new Set(requiredRoleIds); hasRequiredRole = (challengeResources || []).some( - (resource) => resource.roleId && requiredRoleIdSet.has(_.toString(resource.roleId)) - ) + (resource) => resource.roleId && requiredRoleIdSet.has(_.toString(resource.roleId)), + ); } } if (!hasRequiredRole) { - const displayPhaseName = phaseName || 'phase' + const displayPhaseName = phaseName || "phase"; throw new errors.BadRequestError( - `Cannot open ${displayPhaseName} phase because the challenge does not have any resource with the ${requiredRoleName} role` - ) + `Cannot open ${displayPhaseName} phase because the challenge does not have any resource with the ${requiredRoleName} role`, + ); } } /** * Get all phase information for that challenge * @param {String} challengeId the challenge id + * @param {Object} [currentUser] the user who performs the operation * @returns {[Object]} the list of challenge phase + * @throws {ForbiddenError} when the current user cannot view the challenge */ -async function getAllChallengePhases (challengeId) { - await checkChallengeExists(challengeId) +async function getAllChallengePhases(challengeId, currentUser) { + const challenge = await getChallengeForPhaseAccess(challengeId); + await helper.ensureUserCanViewChallenge(currentUser, challenge); const result = await prisma.challengePhase.findMany({ where: { challengeId }, - include: { phase: true, constraints: true } - }) + include: { phase: true, constraints: true }, + }); return _.map(result, (obj) => { - const ret = _.omit(obj, constants.auditFields) - ret.phase = _.omit(obj.phase, constants.auditFields) + const ret = _.omit(obj, constants.auditFields); + ret.phase = _.omit(obj.phase, constants.auditFields); ret.constraints = _.map(obj.constraints, (constraint) => - _.omit(constraint, constants.auditFields) - ) - return ret - }) + _.omit(constraint, constants.auditFields), + ); + return ret; + }); } getAllChallengePhases.schema = { - challengeId: Joi.id() -} + challengeId: Joi.id(), + currentUser: Joi.any(), +}; /** * Get challenge phase. * @param {String} challengeId the challenge id * @param {String} id the challenge phase id + * @param {Object} [currentUser] the user who performs the operation * @returns {Object} the challengePhase with given challengeId and id + * @throws {ForbiddenError} when the current user cannot view the challenge */ -async function getChallengePhase (challengeId, id) { - await checkChallengeExists(challengeId) +async function getChallengePhase(challengeId, id, currentUser) { + const challenge = await getChallengeForPhaseAccess(challengeId); + await helper.ensureUserCanViewChallenge(currentUser, challenge); const result = await prisma.challengePhase.findFirst({ where: { challengeId, id }, - include: { phase: true, constraints: true } - }) + include: { phase: true, constraints: true }, + }); if (!result) { throw new errors.NotFoundError( - `ChallengePhase with challengeId: ${challengeId}, phaseId: ${id} doesn't exist` - ) + `ChallengePhase with challengeId: ${challengeId}, phaseId: ${id} doesn't exist`, + ); } - const ret = _.omit(result, constants.auditFields) - ret.phase = _.omit(result.phase, constants.auditFields) - ret.constraints = _.map(result.constraints, (constraint) => _.omit(constraint)) - return ret + const ret = _.omit(result, constants.auditFields); + ret.phase = _.omit(result.phase, constants.auditFields); + ret.constraints = _.map(result.constraints, (constraint) => _.omit(constraint)); + return ret; } getChallengePhase.schema = { challengeId: Joi.id(), - id: Joi.id() -} + id: Joi.id(), + currentUser: Joi.any(), +}; /** * Partially update challenge phase * @param {Object} currentUser the user who perform operation * @param {String} challengeId the challenge id * @param {String} id the phase id + * @param {Object} data the partial phase update * @returns {Object} the updated challengePhase + * @throws {ForbiddenError} when the current user cannot modify the challenge */ -async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data) { - await checkChallengeExists(challengeId) +async function partiallyUpdateChallengePhase(currentUser, challengeId, id, data) { + const challenge = await getChallengeForPhaseAccess(challengeId); + await helper.ensureUserCanModifyChallenge(currentUser, challenge); const challengePhase = await prisma.challengePhase.findFirst({ where: { challengeId, id }, - include: { constraints: true } - }) + include: { constraints: true }, + }); if (!challengePhase) { throw new errors.NotFoundError( - `ChallengePhase with challengeId: ${challengeId}, phaseId: ${id} doesn't exist` - ) + `ChallengePhase with challengeId: ${challengeId}, phaseId: ${id} doesn't exist`, + ); } - const originalScheduledEndDate = challengePhase.scheduledEndDate + const originalScheduledEndDate = challengePhase.scheduledEndDate; const shouldAttemptSuccessorRecalc = Boolean( - data.duration || data.scheduledStartDate || data.scheduledEndDate - ) + data.duration || data.scheduledStartDate || data.scheduledEndDate, + ); // isOpen should be false if it's passed as null - if ('isOpen' in data) { + if ("isOpen" in data) { if (!data.isOpen) { - data.isOpen = false + data.isOpen = false; } } // check ChallengePhase data if (data.phaseId) { - const phase = await prisma.phase.findUnique({ where: { id: data.phaseId } }) + const phase = await prisma.phase.findUnique({ where: { id: data.phaseId } }); if (!phase) { - throw new errors.BadRequestError('phaseId should be a valid phase') + throw new errors.BadRequestError("phaseId should be a valid phase"); } } @@ -641,25 +659,25 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data const predecessor = await prisma.challengePhase.findFirst({ where: { challengeId, - OR: [{ id: data.predecessor }, { phaseId: data.predecessor }] - } - }) + OR: [{ id: data.predecessor }, { phaseId: data.predecessor }], + }, + }); if (!predecessor) { throw new errors.BadRequestError( - `predecessor should be a valid challenge phase in the same challenge: ${challengeId}` - ) + `predecessor should be a valid challenge phase in the same challenge: ${challengeId}`, + ); } } - const isOpeningPhase = 'isOpen' in data && data.isOpen === true - const predecessorId = data.predecessor || challengePhase.predecessor + const isOpeningPhase = "isOpen" in data && data.isOpen === true; + const predecessorId = data.predecessor || challengePhase.predecessor; if (isOpeningPhase && predecessorId) { const predecessorPhase = await prisma.challengePhase.findFirst({ where: { challengeId, - OR: [{ id: predecessorId }, { phaseId: predecessorId }] - } - }) + OR: [{ id: predecessorId }, { phaseId: predecessorId }], + }, + }); if ( !predecessorPhase || @@ -668,44 +686,44 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data _.isNil(predecessorPhase.actualEndDate) ) { throw new errors.BadRequestError( - 'Cannot open phase because predecessor phase must be closed with both actualStartDate and actualEndDate set' - ) + "Cannot open phase because predecessor phase must be closed with both actualStartDate and actualEndDate set", + ); } } if (isOpeningPhase) { - const phaseName = data.name || challengePhase.name - await ensureRequiredResourcesBeforeOpeningPhase(challengeId, phaseName) + const phaseName = data.name || challengePhase.name; + await ensureRequiredResourcesBeforeOpeningPhase(challengeId, phaseName); // Check if this is the Appeals phase - const normalizedPhaseName = normalizePhaseName(phaseName) - if (normalizedPhaseName === 'appeals') { - const hasPendingEscalations = await hasPendingEscalationRequestsForChallenge(challengeId) + const normalizedPhaseName = normalizePhaseName(phaseName); + if (normalizedPhaseName === "appeals") { + const hasPendingEscalations = await hasPendingEscalationRequestsForChallenge(challengeId); if (hasPendingEscalations) { throw new errors.BadRequestError( - 'Cannot open Appeals phase because there are pending escalation requests that need to be resolved first' - ) + "Cannot open Appeals phase because there are pending escalation requests that need to be resolved first", + ); } } } if (data.scheduledStartDate || data.scheduledEndDate) { - const startDate = data.scheduledStartDate || challengePhase.scheduledStartDate - const endDate = data.scheduledEndDate || challengePhase.scheduledEndDate + const startDate = data.scheduledStartDate || challengePhase.scheduledStartDate; + const endDate = data.scheduledEndDate || challengePhase.scheduledEndDate; if (moment(startDate).isAfter(moment(endDate))) { throw new errors.BadRequestError( - `scheduledStartDate: ${startDate.toISOString()} should not be after scheduledEndDate: ${endDate.toISOString()}` - ) + `scheduledStartDate: ${startDate.toISOString()} should not be after scheduledEndDate: ${endDate.toISOString()}`, + ); } } if (data.actualStartDate || data.actualEndDate) { - const startDate = data.actualStartDate || challengePhase.actualStartDate - const endDate = data.actualEndDate || challengePhase.actualEndDate + const startDate = data.actualStartDate || challengePhase.actualStartDate; + const endDate = data.actualEndDate || challengePhase.actualEndDate; if (moment(startDate).isAfter(moment(endDate))) { throw new errors.BadRequestError( - `actualStartDate: ${startDate.toISOString()} should not be after actualEndDate: ${endDate.toISOString()}` - ) + `actualStartDate: ${startDate.toISOString()} should not be after actualEndDate: ${endDate.toISOString()}`, + ); } } @@ -713,183 +731,183 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data for (const constrain of data.constraints) { if (constrain.id && !challengePhase.constraints.some((cst) => cst.id === constrain.id)) { throw new errors.BadRequestError( - `constraint: ${constrain.id} is not exists for the ChallengePhase` - ) + `constraint: ${constrain.id} is not exists for the ChallengePhase`, + ); } } } const isClosingPhase = - 'isOpen' in data && data.isOpen === false && Boolean(challengePhase.isOpen) - const isReopeningPhase = 'isOpen' in data && data.isOpen === true && !challengePhase.isOpen + "isOpen" in data && data.isOpen === false && Boolean(challengePhase.isOpen); + const isReopeningPhase = "isOpen" in data && data.isOpen === true && !challengePhase.isOpen; if (isClosingPhase) { - const closingPhaseName = data.name || challengePhase.name - const normalizedClosingPhaseName = normalizePhaseName(closingPhaseName) - const pendingScorecards = await hasPendingScorecardsForPhase(challengePhase.id) + const closingPhaseName = data.name || challengePhase.name; + const normalizedClosingPhaseName = normalizePhaseName(closingPhaseName); + const pendingScorecards = await hasPendingScorecardsForPhase(challengePhase.id); if (pendingScorecards) { - const phaseName = closingPhaseName || 'phase' + const phaseName = closingPhaseName || "phase"; throw new errors.ForbiddenError( - `Cannot close ${phaseName} because there are still pending scorecards` - ) + `Cannot close ${phaseName} because there are still pending scorecards`, + ); } if ( - normalizedClosingPhaseName === 'review' && + normalizedClosingPhaseName === "review" && (await hasPendingEscalationRequestsForChallenge(challengePhase.challengeId)) ) { throw new errors.BadRequestError( - 'Cannot close Review phase because there are pending escalation requests that need to be resolved first' - ) + "Cannot close Review phase because there are pending escalation requests that need to be resolved first", + ); } if ( - normalizedClosingPhaseName === 'appeals response' && + normalizedClosingPhaseName === "appeals response" && (await hasPendingAppealResponsesForChallenge(challengePhase.challengeId)) ) { throw new errors.BadRequestError( - "Appeals Response phase can't be closed because there are still appeals that haven't been responded to" - ) + "Appeals Response phase can't be closed because there are still appeals that haven't been responded to", + ); } - if (normalizedClosingPhaseName === 'ai screening') { - await ensureAIScreeningCanBeClosed(challengePhase.challengeId) + if (normalizedClosingPhaseName === "ai screening") { + await ensureAIScreeningCanBeClosed(challengePhase.challengeId); } - if (!('actualEndDate' in data) || _.isNil(data.actualEndDate)) { - data.actualEndDate = new Date() + if (!("actualEndDate" in data) || _.isNil(data.actualEndDate)) { + data.actualEndDate = new Date(); } } if (isReopeningPhase) { - const phaseName = challengePhase.name + const phaseName = challengePhase.name; const openPhases = await prisma.challengePhase.findMany({ where: { challengeId: challengePhase.challengeId, - isOpen: true + isOpen: true, }, select: { id: true, phaseId: true, predecessor: true, - name: true - } - }) + name: true, + }, + }); const activeReviewPhase = openPhases.find((phase) => - REVIEW_PHASE_NAME_SET.has(String(phase?.name || '').toLowerCase()) - ) + REVIEW_PHASE_NAME_SET.has(String(phase?.name || "").toLowerCase()), + ); if (activeReviewPhase) { - const hasActiveScorecards = await hasCompletedReviewsForPhase(activeReviewPhase.id) + const hasActiveScorecards = await hasCompletedReviewsForPhase(activeReviewPhase.id); if (hasActiveScorecards) { throw new errors.BadRequestError( - `Cannot reopen ${phaseName} because the currently open phase '${activeReviewPhase.name}' has reviews in progress or completed` - ) + `Cannot reopen ${phaseName} because the currently open phase '${activeReviewPhase.name}' has reviews in progress or completed`, + ); } } - if (phaseName === 'Submission' || phaseName === 'Registration') { - const hasCompletedReviews = await hasCompletedReviewsForPhase(challengePhase.id) + if (phaseName === "Submission" || phaseName === "Registration") { + const hasCompletedReviews = await hasCompletedReviewsForPhase(challengePhase.id); if (hasCompletedReviews) { throw new errors.ForbiddenError( - 'Cannot reopen Submission/Registration phase because reviews are already in progress or completed' - ) + "Cannot reopen Submission/Registration phase because reviews are already in progress or completed", + ); } } - if (phaseName === 'Checkpoint Submission') { + if (phaseName === "Checkpoint Submission") { const checkpointPhases = await prisma.challengePhase.findMany({ where: { challengeId: challengePhase.challengeId, - name: { in: ['Checkpoint Screening', 'Checkpoint Review'] } + name: { in: ["Checkpoint Screening", "Checkpoint Review"] }, }, - select: { id: true } - }) - const checkpointPhaseIds = checkpointPhases.map((cp) => cp.id) + select: { id: true }, + }); + const checkpointPhaseIds = checkpointPhases.map((cp) => cp.id); if (checkpointPhaseIds.length > 0) { - const hasCheckpointReviews = await hasCompletedReviewsForPhase(checkpointPhaseIds) + const hasCheckpointReviews = await hasCompletedReviewsForPhase(checkpointPhaseIds); if (hasCheckpointReviews) { throw new errors.ForbiddenError( - 'Cannot reopen Checkpoint Submission phase because Checkpoint Screening or Checkpoint Review reviews are already in progress or completed' - ) + "Cannot reopen Checkpoint Submission phase because Checkpoint Screening or Checkpoint Review reviews are already in progress or completed", + ); } } } - const hasActualStartDate = !_.isNil(challengePhase.actualStartDate) - const hasActualEndDate = !_.isNil(challengePhase.actualEndDate) + const hasActualStartDate = !_.isNil(challengePhase.actualStartDate); + const hasActualEndDate = !_.isNil(challengePhase.actualEndDate); if (hasActualStartDate && hasActualEndDate && openPhases.length > 0) { - const reopenedPhaseIdentifiers = new Set([String(challengePhase.id)]) + const reopenedPhaseIdentifiers = new Set([String(challengePhase.id)]); if (!_.isNil(challengePhase.phaseId)) { - reopenedPhaseIdentifiers.add(String(challengePhase.phaseId)) + reopenedPhaseIdentifiers.add(String(challengePhase.phaseId)); } const dependentOpenPhases = openPhases.filter((phase) => { if (!phase || _.isNil(phase.predecessor)) { - return false + return false; } - return reopenedPhaseIdentifiers.has(String(phase.predecessor)) - }) + return reopenedPhaseIdentifiers.has(String(phase.predecessor)); + }); if (dependentOpenPhases.length === 0) { throw new errors.ForbiddenError( - `Cannot reopen ${phaseName} because no currently open phase depends on it` - ) + `Cannot reopen ${phaseName} because no currently open phase depends on it`, + ); } const appealsDependentPhaseExists = dependentOpenPhases.some( - (phase) => String(phase.name || '').toLowerCase() === 'appeals' - ) + (phase) => String(phase.name || "").toLowerCase() === "appeals", + ); if (appealsDependentPhaseExists) { const hasSubmittedAppeals = await hasSubmittedAppealsForChallenge( - challengePhase.challengeId - ) + challengePhase.challengeId, + ); if (hasSubmittedAppeals) { throw new errors.ForbiddenError( - `Cannot reopen ${phaseName} because submitted appeals already exist in the Appeals phase` - ) + `Cannot reopen ${phaseName} because submitted appeals already exist in the Appeals phase`, + ); } } } if (hasActualStartDate) { - data.actualStartDate = challengePhase.actualStartDate - } else if (!('actualStartDate' in data) || _.isNil(data.actualStartDate)) { - data.actualStartDate = new Date() + data.actualStartDate = challengePhase.actualStartDate; + } else if (!("actualStartDate" in data) || _.isNil(data.actualStartDate)) { + data.actualStartDate = new Date(); } - data.actualEndDate = null + data.actualEndDate = null; } // Update ChallengePhase - const currentUserId = String(currentUser.userId) - data.updatedBy = currentUserId + const currentUserId = String(currentUser.userId); + data.updatedBy = currentUserId; if (!_.isNil(data.duration)) { const startInput = !_.isNil(data.scheduledStartDate) ? data.scheduledStartDate : !_.isNil(challengePhase.scheduledStartDate) - ? challengePhase.scheduledStartDate - : null + ? challengePhase.scheduledStartDate + : null; if (startInput) { - const startDate = new Date(startInput) + const startDate = new Date(startInput); if (!Number.isNaN(startDate.getTime())) { const recalculatedScheduledEndDate = new Date( - startDate.getTime() + Number(data.duration) * 1000 - ) - data.scheduledEndDate = recalculatedScheduledEndDate + startDate.getTime() + Number(data.duration) * 1000, + ); + data.scheduledEndDate = recalculatedScheduledEndDate; } } } - const dataToUpdate = _.omit(data, 'constraints') + const dataToUpdate = _.omit(data, "constraints"); const shouldRefreshPhaseNames = - Object.prototype.hasOwnProperty.call(data, 'isOpen') || - Object.prototype.hasOwnProperty.call(data, 'name') + Object.prototype.hasOwnProperty.call(data, "isOpen") || + Object.prototype.hasOwnProperty.call(data, "name"); const result = await prisma.$transaction(async (tx) => { const updatedPhase = await tx.challengePhase.update({ data: dataToUpdate, where: { - id: challengePhase.id - } - }) - let scheduleExtended = false + id: challengePhase.id, + }, + }); + let scheduleExtended = false; if (shouldAttemptSuccessorRecalc) { - scheduleExtended = dateIsAfter(updatedPhase.scheduledEndDate, originalScheduledEndDate) + scheduleExtended = dateIsAfter(updatedPhase.scheduledEndDate, originalScheduledEndDate); if (scheduleExtended) { - await recalculateDependentPhaseDates(tx, challengeId, updatedPhase, currentUserId) + await recalculateDependentPhaseDates(tx, challengeId, updatedPhase, currentUserId); } } if ( @@ -900,9 +918,9 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data const shiftBaselineScheduledEndDate = scheduleExtended && !_.isNil(updatedPhase.scheduledEndDate) ? updatedPhase.scheduledEndDate - : originalScheduledEndDate - const scheduledEndTime = new Date(shiftBaselineScheduledEndDate).getTime() - const actualEndTime = new Date(updatedPhase.actualEndDate).getTime() + : originalScheduledEndDate; + const scheduledEndTime = new Date(shiftBaselineScheduledEndDate).getTime(); + const actualEndTime = new Date(updatedPhase.actualEndDate).getTime(); if (Number.isFinite(scheduledEndTime) && Number.isFinite(actualEndTime)) { await shiftDependentPhaseDates( @@ -910,8 +928,8 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data challengeId, updatedPhase, actualEndTime - scheduledEndTime, - currentUserId - ) + currentUserId, + ); } } if (data.constraints) { @@ -921,12 +939,12 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data data: { name: constraint.name, value: constraint.value, - updatedBy: currentUserId + updatedBy: currentUserId, }, where: { - id: constraint.id - } - }) + id: constraint.id, + }, + }); } else { await tx.challengePhaseConstraint.create({ data: { @@ -934,100 +952,100 @@ async function partiallyUpdateChallengePhase (currentUser, challengeId, id, data value: constraint.value, challengePhaseId: updatedPhase.id, createdBy: currentUserId, - updatedBy: currentUserId - } - }) + updatedBy: currentUserId, + }, + }); } } } if (shouldRefreshPhaseNames) { const openPhases = await tx.challengePhase.findMany({ where: { challengeId, isOpen: true }, - select: { name: true } - }) + select: { name: true }, + }); const currentPhaseNames = _.uniq( - openPhases.map((phase) => phase.name).filter((name) => !_.isNil(name)) - ) + openPhases.map((phase) => phase.name).filter((name) => !_.isNil(name)), + ); await tx.challenge.update({ where: { id: challengeId }, data: { currentPhaseNames, - updatedBy: currentUserId - } - }) + updatedBy: currentUserId, + }, + }); } - return updatedPhase - }) - helper.flushInternalCache() + return updatedPhase; + }); + helper.flushInternalCache(); // post bus event await helper.postBusEvent( constants.Topics.ChallengePhaseUpdated, - _.assignIn({ id: result.id }, data) - ) - await postChallengeUpdatedNotification(challengeId) + _.assignIn({ id: result.id }, data), + ); + await postChallengeUpdatedNotification(challengeId); // send notification logic try { - const shouldNotifyClose = Boolean(isClosingPhase) - const shouldNotifyOpen = Boolean(isOpeningPhase) // includes reopen + const shouldNotifyClose = Boolean(isClosingPhase); + const shouldNotifyOpen = Boolean(isOpeningPhase); // includes reopen if (shouldNotifyClose || shouldNotifyOpen) { // Single template - single type - const notificationType = 'PHASE_CHANGE' + const notificationType = "PHASE_CHANGE"; - const operation = shouldNotifyClose ? 'close' : isReopeningPhase ? 'reopen' : 'open' + const operation = shouldNotifyClose ? "close" : isReopeningPhase ? "reopen" : "open"; const at = shouldNotifyClose ? result.actualEndDate || new Date().toISOString() - : result.actualStartDate || new Date().toISOString() + : result.actualStartDate || new Date().toISOString(); // fetch challenge name const challenge = await prisma.challenge.findUnique({ where: { id: challengeId }, - select: { name: true } - }) + select: { name: true }, + }); - const challengeName = challenge?.name + const challengeName = challenge?.name; // build recipients - const resources = await helper.getChallengeResources(challengeId) + const resources = await helper.getChallengeResources(challengeId); const recipients = Array.from( new Set( (resources || []) .map((r) => r?.email || r?.memberEmail) .filter(Boolean) - .map((e) => String(e).trim().toLowerCase()) - ) - ) + .map((e) => String(e).trim().toLowerCase()), + ), + ); if (!recipients.length) { logger.debug( - `phase change notification skipped: no recipients for challenge ${challengeId}` - ) - return _.omit(result, constants.auditFields) + `phase change notification skipped: no recipients for challenge ${challengeId}`, + ); + return _.omit(result, constants.auditFields); } // build payload that matches the SendGrid HTML template - const phaseName = result.name || data.name || challengePhase.name + const phaseName = result.name || data.name || challengePhase.name; const payload = helper.buildPhaseChangeEmailData({ challengeId, challengeName, phaseName, operation, - at - }) + at, + }); - await helper.sendPhaseChangeNotification(notificationType, recipients, payload) + await helper.sendPhaseChangeNotification(notificationType, recipients, payload); } } catch (e) { logger.debug( - `phase change notification failed for challenge ${challengeId}, phase ${id}: ${e.message}` - ) + `phase change notification failed for challenge ${challengeId}, phase ${id}: ${e.message}`, + ); } - return _.omit(result, constants.auditFields) + return _.omit(result, constants.auditFields); } partiallyUpdateChallengePhase.schema = { @@ -1051,12 +1069,12 @@ partiallyUpdateChallengePhase.schema = { Joi.object({ id: Joi.any().optional(), name: Joi.string().required(), - value: Joi.number().integer().min(0).required() - }) + value: Joi.number().integer().min(0).required(), + }), ) - .optional() - }) -} + .optional(), + }), +}; /** * Delete challenge phase. @@ -1064,16 +1082,18 @@ partiallyUpdateChallengePhase.schema = { * @param {String} challengeId the challenge id * @param {String} id the phase id * @returns {Object} the deleted challenge phase + * @throws {ForbiddenError} when the current user cannot modify the challenge */ -async function deleteChallengePhase (currentUser, challengeId, id) { - await checkChallengeExists(challengeId) +async function deleteChallengePhase(currentUser, challengeId, id) { + const challenge = await getChallengeForPhaseAccess(challengeId); + await helper.ensureUserCanModifyChallenge(currentUser, challenge); const result = await prisma.challengePhase.findFirst({ - where: { challengeId, id } - }) + where: { challengeId, id }, + }); if (!result) { throw new errors.NotFoundError( - `ChallengePhase with challengeId: ${challengeId}, phaseId: ${id} doesn't exist` - ) + `ChallengePhase with challengeId: ${challengeId}, phaseId: ${id} doesn't exist`, + ); } await prisma.$transaction(async (tx) => { // recalculates the predecessors @@ -1082,45 +1102,45 @@ async function deleteChallengePhase (currentUser, challengeId, id) { // if result.predecessor exists, update successor's predecessor to predecessor of current challenge phase // otherwise update successor's predecessor to null predecessor: result.predecessor || null, - updatedBy: String(currentUser.userId) + updatedBy: String(currentUser.userId), }, where: { challengeId, - predecessor: result.id - } - }) + predecessor: result.id, + }, + }); // delete challengePhaseConstraint await tx.challengePhaseConstraint.deleteMany({ where: { - challengePhaseId: result.id - } - }) + challengePhaseId: result.id, + }, + }); // delete challengePhase await tx.challengePhase.delete({ where: { - id: result.id - } - }) - }) - helper.flushInternalCache() - const ret = _.omit(result, constants.auditFields) + id: result.id, + }, + }); + }); + helper.flushInternalCache(); + const ret = _.omit(result, constants.auditFields); // post bus event - await helper.postBusEvent(constants.Topics.ChallengePhaseDeleted, ret) - await postChallengeUpdatedNotification(challengeId) - return ret + await helper.postBusEvent(constants.Topics.ChallengePhaseDeleted, ret); + await postChallengeUpdatedNotification(challengeId); + return ret; } deleteChallengePhase.schema = { currentUser: Joi.any(), challengeId: Joi.id(), - id: Joi.id() -} + id: Joi.id(), +}; module.exports = { getAllChallengePhases, getChallengePhase, partiallyUpdateChallengePhase, - deleteChallengePhase -} + deleteChallengePhase, +}; -logger.buildService(module.exports) +logger.buildService(module.exports); diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index f1edf52..65cbba3 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -673,13 +673,28 @@ setDefaultReviewers.schema = { currentUser: Joi.any(), data: Joi.any() }; * @returns {Array} the search result */ async function searchByLegacyId(currentUser, legacyId, page, perPage) { + const whitelistFilter = helper.getChallengeWhitelistAccessFilter(currentUser); + const where = { legacyId }; + if (whitelistFilter) { + where.AND = [whitelistFilter]; + } + // Do not take nested objects, query will be faster - const challenges = await prisma.challenge.findMany({ - take: perPage, - skip: (page - 1) * perPage, - where: { legacyId }, - include: includeReturnFields, - }); + let challenges; + try { + challenges = await prisma.challenge.findMany({ + take: perPage, + skip: (page - 1) * perPage, + where, + include: includeReturnFields, + }); + } catch (err) { + if (helper.shouldApplyChallengeWhitelist(currentUser)) { + logger.warn(`searchByLegacyId whitelist-filtered query failed: ${err.message}`); + return []; + } + throw err; + } _.forEach(challenges, (c) => { prismaHelper.convertModelToResponse(c); @@ -887,6 +902,10 @@ async function searchChallenges(currentUser, criteria) { const _hasAdminRole = hasAdminRole(currentUser); const _isMachineToken = _.get(currentUser, "isMachine", false); + const whitelistFilter = helper.getChallengeWhitelistAccessFilter(currentUser); + if (whitelistFilter) { + prismaFilter.where.AND.push(whitelistFilter); + } const normalizeGroupIdValue = (value) => { if (_.isNil(value)) { @@ -2266,6 +2285,7 @@ async function getChallenge(currentUser, id, checkIfExists) { if (_.isNil(challenge) || _.isNil(challenge.id)) { throw new errors.NotFoundError(`Challenge of id ${id} is not found.`); } + await helper.ensureChallengeWhitelistAccess(currentUser, challenge.id); if (checkIfExists) { return _.pick(challenge, ["id", "legacyId"]); } @@ -2334,9 +2354,18 @@ getChallenge.schema = { * Get challenge statistics * @param {Object} currentUser the user who perform operation * @param {String} id the challenge id - * @returns {Object} the challenge with given id + * @returns {Object} the challenge statistics for the given challenge + * @throws {NotFoundError} when the challenge does not exist + * @throws {ForbiddenError} when the current user cannot view the challenge */ async function getChallengeStatistics(currentUser, id) { + const challenge = await prisma.challenge.findUnique({ + where: { id }, + }); + if (_.isNil(challenge) || _.isNil(challenge.id)) { + throw new errors.NotFoundError(`Challenge of id ${id} is not found.`); + } + await helper.ensureUserCanViewChallenge(currentUser, challenge); // get submissions console.log("Getting challenge submissions for challenge ID: " + id); const submissions = await helper.getChallengeSubmissions(id); @@ -2785,6 +2814,7 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { if (!challenge || !challenge.id) { throw new errors.NotFoundError(`Challenge with id: ${challengeId} doesn't exist`); } + await helper.ensureChallengeWhitelistAccess(currentUser, challenge.id); enrichChallengeForResponse(challenge); prismaHelper.convertModelToResponse(challenge); const originalChallengePhases = _.cloneDeep(challenge.phases || []); @@ -4454,6 +4484,7 @@ async function advancePhase(currentUser, challengeId, data) { if (_.isNil(challenge) || _.isNil(challenge.id)) { throw new errors.NotFoundError(`Challenge with id: ${challengeId} doesn't exist.`); } + await helper.ensureChallengeWhitelistAccess(currentUser, challenge.id); if (challenge.status !== ChallengeStatusEnum.ACTIVE) { throw new errors.BadRequestError(`Challenge with id: ${challengeId} is not in ACTIVE status.`); } @@ -4593,6 +4624,7 @@ async function closeMarathonMatch(currentUser, challengeId) { if (_.isNil(challenge) || _.isNil(challenge.id)) { throw new errors.NotFoundError(`Challenge with id: ${challengeId} doesn't exist.`); } + await helper.ensureChallengeWhitelistAccess(currentUser, challenge.id); if (!challenge.type || challenge.type.name !== "Marathon Match") { throw new errors.BadRequestError( diff --git a/test/unit/AttachmentService.test.js b/test/unit/AttachmentService.test.js index afcf0bd..c45247c 100644 --- a/test/unit/AttachmentService.test.js +++ b/test/unit/AttachmentService.test.js @@ -78,6 +78,40 @@ describe('attachment service unit tests', () => { should.equal(attachmentContent.compare(result.data), 0) }) + it('download attachment enforces challenge user whitelist for interactive users', async () => { + await prisma.challengeUserWhitelist.create({ + data: { + challengeId: data.challenge.id, + userId: 'allowed-user' + } + }) + + try { + try { + await service.downloadAttachment( + { roles: ['administrator'], userId: 'blocked-user' }, + data.challenge.id, + id + ) + } catch (e) { + should.equal(e.name, 'ForbiddenError') + + const result = await service.downloadAttachment( + { isMachine: true, userId: 'machine-user' }, + data.challenge.id, + id + ) + should.equal(result.fileName, 'attachment.txt') + return + } + throw new Error('should not reach here') + } finally { + await prisma.challengeUserWhitelist.deleteMany({ + where: { challengeId: data.challenge.id } + }) + } + }) + it('download attachment - forbidden', async () => { try { await service.downloadAttachment({ roles: ['user'], userId: 678678 }, data.taskChallenge.id, id2) diff --git a/test/unit/ChallengePhaseService.test.js b/test/unit/ChallengePhaseService.test.js index 33d4318..5f527a9 100644 --- a/test/unit/ChallengePhaseService.test.js +++ b/test/unit/ChallengePhaseService.test.js @@ -6,6 +6,8 @@ if (!process.env.REVIEW_DB_URL && process.env.DATABASE_URL) { } require('../../app-bootstrap') +const _ = require('lodash') +const axios = require('axios') const chai = require('chai') const config = require('config') const { Prisma } = require('@prisma/client') @@ -13,6 +15,7 @@ const { v4: uuid } = require('uuid') const challengeService = require('../../src/services/ChallengeService') const { getReviewClient } = require('../../src/common/review-prisma') const prisma = require('../../src/common/prisma').getClient() +const m2mHelper = require('../../src/common/m2m-helper') const originalIndexChallengeAndPostToKafka = challengeService.indexChallengeAndPostToKafka challengeService.indexChallengeAndPostToKafka = async () => {} const service = require('../../src/services/ChallengePhaseService') @@ -23,7 +26,7 @@ const should = chai.should() describe('challenge phase service unit tests', () => { let data - const authUser = { userId: 'testuser' } + const authUser = { userId: 'testuser', roles: ['administrator'] } const reviewSchema = config.get('REVIEW_DB_SCHEMA') const reviewTable = Prisma.raw(`"${reviewSchema}"."review"`) const submissionTable = Prisma.raw(`"${reviewSchema}"."submission"`) @@ -31,6 +34,8 @@ describe('challenge phase service unit tests', () => { const reviewItemCommentTable = Prisma.raw(`"${reviewSchema}"."reviewItemComment"`) const appealTable = Prisma.raw(`"${reviewSchema}"."appeal"`) let reviewClient + let originalAxiosGet + let originalGetM2MToken const shortId = () => uuid().replace(/-/g, '').slice(0, 14) const resetPrimaryChallengePhases = async () => { await prisma.challengePhaseConstraint.update({ @@ -94,6 +99,22 @@ describe('challenge phase service unit tests', () => { await reviewClient.$executeRawUnsafe(`TRUNCATE TABLE "${reviewSchema}"."submission"`) } before(async () => { + originalAxiosGet = axios.get + originalGetM2MToken = m2mHelper.getM2MToken + m2mHelper.getM2MToken = async () => 'test-token' + axios.get = async (url, options) => { + const requestUrl = _.toString(url) + if ( + requestUrl === config.RESOURCE_ROLES_API_URL || + requestUrl.startsWith(config.RESOURCES_API_URL) || + requestUrl.startsWith(`${config.PROJECTS_API_URL}/`) || + requestUrl.includes('/memberGroups/') + ) { + return { data: [], status: 200, headers: {} } + } + return originalAxiosGet(url, options) + } + await testHelper.createData() data = testHelper.getData() reviewClient = getReviewClient() @@ -155,6 +176,8 @@ describe('challenge phase service unit tests', () => { after(async () => { challengeService.indexChallengeAndPostToKafka = originalIndexChallengeAndPostToKafka + axios.get = originalAxiosGet + m2mHelper.getM2MToken = originalGetM2MToken if (reviewClient) { await reviewClient.$executeRawUnsafe(`TRUNCATE TABLE "${reviewSchema}"."appealResponse"`) @@ -188,10 +211,71 @@ describe('challenge phase service unit tests', () => { it('get all challenge phases successfully 2', async () => { const challengeId = data.taskChallenge.id - const result = await service.getAllChallengePhases(challengeId) + const result = await service.getAllChallengePhases(challengeId, { isMachine: true }) should.equal(result.length, 0) }) + it('get challenge phases enforces challenge user whitelist for interactive users', async () => { + await prisma.challengeUserWhitelist.create({ + data: { + challengeId: data.challenge.id, + userId: 'allowed-user' + } + }) + + try { + try { + await service.getAllChallengePhases(data.challenge.id, { + roles: ['administrator'], + userId: 'blocked-user' + }) + } catch (e) { + should.equal(e.name, 'ForbiddenError') + + const allowedPhases = await service.getAllChallengePhases(data.challenge.id, { + roles: ['administrator'], + userId: 'allowed-user' + }) + should.equal(allowedPhases.length, 2) + + const machinePhases = await service.getAllChallengePhases(data.challenge.id, { + isMachine: true, + userId: 'machine-user' + }) + should.equal(machinePhases.length, 2) + return + } + throw new Error('should not reach here') + } finally { + await prisma.challengeUserWhitelist.deleteMany({ + where: { challengeId: data.challenge.id } + }) + } + }) + + it('get all challenge phases enforces challenge group view rules', async () => { + await prisma.challenge.update({ + where: { id: data.challenge.id }, + data: { groups: [uuid()] } + }) + + try { + await service.getAllChallengePhases(data.challenge.id, { + roles: ['Topcoder User'], + userId: 'blocked-group-user' + }) + } catch (e) { + should.equal(e.name, 'ForbiddenError') + return + } finally { + await prisma.challenge.update({ + where: { id: data.challenge.id }, + data: { groups: [] } + }) + } + throw new Error('should not reach here') + }) + it('get all challenge phases - invalid challengeId', async () => { try { await service.getAllChallengePhases('invalid id') @@ -216,7 +300,9 @@ describe('challenge phase service unit tests', () => { it('get challenge phase - not found', async () => { try { - await service.getChallengePhase(data.taskChallenge.id, data.challengePhase2Id) + await service.getChallengePhase(data.taskChallenge.id, data.challengePhase2Id, { + isMachine: true + }) } catch (e) { should.equal( e.message, @@ -227,6 +313,20 @@ describe('challenge phase service unit tests', () => { throw new Error('should not reach here') }) + it('get challenge phase enforces task view rules before loading phase data', async () => { + try { + await service.getChallengePhase(data.taskChallenge.id, data.challengePhase1Id, { + roles: ['Topcoder User'], + userId: 'blocked-task-user' + }) + } catch (e) { + should.equal(e.name, 'ForbiddenError') + should.equal(e.message, "You don't have access to view this challenge") + return + } + throw new Error('should not reach here') + }) + it('get challenge phase - invalid challenge id', async () => { try { await service.getChallengePhase('invalid', data.phase.id) @@ -918,6 +1018,25 @@ describe('challenge phase service unit tests', () => { throw new Error('should not reach here') }) + it('partially update challenge phase blocks editor without challenge modify access', async () => { + try { + await service.partiallyUpdateChallengePhase( + { handle: 'blocked-editor', roles: ['Connect Manager'], userId: 'blocked-editor' }, + data.challenge.id, + data.challengePhase1Id, + { name: 'blocked update' } + ) + } catch (e) { + should.equal(e.name, 'ForbiddenError') + const challengePhase = await prisma.challengePhase.findUnique({ + where: { id: data.challengePhase1Id } + }) + should.equal(challengePhase.name, 'Registration') + return + } + throw new Error('should not reach here') + }) + it('partially update challenge phase - phaseId does not exist', async () => { try { await service.partiallyUpdateChallengePhase( @@ -1647,7 +1766,29 @@ describe('challenge phase service unit tests', () => { }) describe('delete challenge phase tests', () => { + it('delete challenge phase blocks editor without challenge modify access', async () => { + await resetPrimaryChallengePhases() + + try { + await service.deleteChallengePhase( + { handle: 'blocked-editor', roles: ['Connect Manager'], userId: 'blocked-editor' }, + data.challenge.id, + data.challengePhase1Id + ) + } catch (e) { + should.equal(e.name, 'ForbiddenError') + const challengePhase = await prisma.challengePhase.findUnique({ + where: { id: data.challengePhase1Id } + }) + should.exist(challengePhase) + return + } + throw new Error('should not reach here') + }) + it('delete challenge phase successfully', async () => { + await resetPrimaryChallengePhases() + const phases = await service.getAllChallengePhases(data.challenge.id) await service.deleteChallengePhase(authUser, data.challenge.id, data.challengePhase1Id) const remainingPhases = await service.getAllChallengePhases(data.challenge.id) diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index e55cd37..b14a029 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -8,12 +8,14 @@ if (!process.env.REVIEW_DB_URL && process.env.DATABASE_URL) { require("../../app-bootstrap"); const _ = require("lodash"); +const axios = require("axios"); const config = require("config"); const { v4: uuid } = require("uuid"); const chai = require("chai"); const constants = require("../../app-constants"); const service = require("../../src/services/ChallengeService"); const helper = require("../../src/common/helper"); +const m2mHelper = require("../../src/common/m2m-helper"); const challengeHelper = require("../../src/common/challenge-helper"); const projectHelper = require("../../src/common/project-helper"); const testHelper = require("../testHelper"); @@ -582,6 +584,158 @@ describe("challenge service unit tests", () => { } }); + it("get challenge enforces challenge user whitelist for interactive users", async () => { + await prisma.challengeUserWhitelist.create({ + data: { + challengeId: createdChallengeData.id, + userId: "allowed-user", + }, + }); + + try { + const allowed = await service.getChallenge( + { handle: "allowed", roles: ["administrator"], userId: "allowed-user" }, + createdChallengeData.id, + ); + should.equal(allowed.id, createdChallengeData.id); + + const machine = await service.getChallenge( + { isMachine: true, userId: "machine-user" }, + createdChallengeData.id, + ); + should.equal(machine.id, createdChallengeData.id); + + try { + await service.getChallenge( + { handle: "blocked", roles: ["administrator"], userId: "blocked-user" }, + createdChallengeData.id, + ); + } catch (e) { + should.equal(e.name, "ForbiddenError"); + return; + } + throw new Error("should not reach here"); + } finally { + await prisma.challengeUserWhitelist.deleteMany({ + where: { challengeId: createdChallengeData.id }, + }); + } + }); + + it("get challenge statistics enforces challenge user whitelist before loading submissions", async () => { + const originalGetChallengeSubmissions = helper.getChallengeSubmissions; + let loadedSubmissions = false; + + helper.getChallengeSubmissions = async () => { + loadedSubmissions = true; + return []; + }; + + await prisma.challengeUserWhitelist.create({ + data: { + challengeId: data.challenge.id, + userId: "allowed-user", + }, + }); + + try { + try { + await service.getChallengeStatistics( + { handle: "blocked", roles: ["administrator"], userId: "blocked-user" }, + data.challenge.id, + ); + } catch (e) { + should.equal(e.name, "ForbiddenError"); + should.equal(loadedSubmissions, false); + + const allowed = await service.getChallengeStatistics( + { handle: "allowed", roles: ["administrator"], userId: "allowed-user" }, + data.challenge.id, + ); + should.deepEqual(allowed, []); + + const machine = await service.getChallengeStatistics( + { isMachine: true, userId: "machine-user" }, + data.challenge.id, + ); + should.deepEqual(machine, []); + return; + } + throw new Error("should not reach here"); + } finally { + helper.getChallengeSubmissions = originalGetChallengeSubmissions; + await prisma.challengeUserWhitelist.deleteMany({ + where: { challengeId: data.challenge.id }, + }); + } + }); + + it("get challenge statistics returns not found before loading submissions", async () => { + const originalGetChallengeSubmissions = helper.getChallengeSubmissions; + let loadedSubmissions = false; + + helper.getChallengeSubmissions = async () => { + loadedSubmissions = true; + return []; + }; + + try { + await service.getChallengeStatistics({ isMachine: true }, notFoundId); + } catch (e) { + should.equal(e.name, "NotFoundError"); + should.equal(e.message, `Challenge of id ${notFoundId} is not found.`); + should.equal(loadedSubmissions, false); + return; + } finally { + helper.getChallengeSubmissions = originalGetChallengeSubmissions; + } + throw new Error("should not reach here"); + }); + + it("get challenge statistics enforces challenge group view rules before loading submissions", async () => { + const originalGetChallengeSubmissions = helper.getChallengeSubmissions; + const originalAxiosGet = axios.get; + const originalGetM2MToken = m2mHelper.getM2MToken; + let loadedSubmissions = false; + + helper.getChallengeSubmissions = async () => { + loadedSubmissions = true; + return []; + }; + m2mHelper.getM2MToken = async () => "test-token"; + axios.get = async (url, options) => { + if (_.toString(url).includes("/memberGroups/")) { + return { data: [], status: 200, headers: {} }; + } + return originalAxiosGet(url, options); + }; + + await prisma.challenge.update({ + where: { id: data.challenge.id }, + data: { groups: [uuid()] }, + }); + + try { + await service.getChallengeStatistics( + { handle: "blocked", roles: ["Topcoder User"], userId: "blocked-user" }, + data.challenge.id, + ); + } catch (e) { + should.equal(e.name, "ForbiddenError"); + should.equal(loadedSubmissions, false); + return; + } finally { + helper.getChallengeSubmissions = originalGetChallengeSubmissions; + axios.get = originalAxiosGet; + m2mHelper.getM2MToken = originalGetM2MToken; + await prisma.challenge.update({ + where: { id: data.challenge.id }, + data: { groups: [] }, + }); + } + throw new Error("should not reach here"); + }); + it("get challenge - not found", async () => { try { await service.getChallenge({ isMachine: true }, notFoundId); @@ -873,6 +1027,42 @@ describe("challenge service unit tests", () => { should.equal(result.numOfRegistrants, 0); }); + it("search challenges hides whitelisted challenges from blocked interactive users", async () => { + await prisma.challengeUserWhitelist.create({ + data: { + challengeId: data.challenge.id, + userId: "allowed-user", + }, + }); + + try { + const blocked = await service.searchChallenges( + { handle: "blocked", roles: ["administrator"], userId: "blocked-user" }, + { id: data.challenge.id }, + ); + should.equal(blocked.total, 0); + should.equal(blocked.result.length, 0); + + const allowed = await service.searchChallenges( + { handle: "allowed", roles: ["administrator"], userId: "allowed-user" }, + { id: data.challenge.id }, + ); + should.equal(allowed.total, 1); + should.equal(allowed.result[0].id, data.challenge.id); + + const machine = await service.searchChallenges( + { isMachine: true, userId: "machine-user" }, + { id: data.challenge.id }, + ); + should.equal(machine.total, 1); + should.equal(machine.result[0].id, data.challenge.id); + } finally { + await prisma.challengeUserWhitelist.deleteMany({ + where: { challengeId: data.challenge.id }, + }); + } + }); + it("search challenges successfully 2", async () => { const result = await service.searchChallenges({ isMachine: true }, { name: "aaa bbb ccc" }); should.equal(result.total, 0); @@ -1296,6 +1486,43 @@ describe("challenge service unit tests", () => { }, ]; + it("update challenge enforces challenge user whitelist before downstream validation", async () => { + const originalGetChallengeResources = helper.getChallengeResources; + let loadedResources = false; + + helper.getChallengeResources = async () => { + loadedResources = true; + return []; + }; + + await prisma.challengeUserWhitelist.create({ + data: { + challengeId: data.challenge.id, + userId: "allowed-user", + }, + }); + + try { + try { + await service.updateChallenge( + { handle: "blocked", roles: ["administrator"], userId: "blocked-user" }, + data.challenge.id, + { description: "blocked update" }, + ); + } catch (e) { + should.equal(e.name, "ForbiddenError"); + should.equal(loadedResources, false); + return; + } + throw new Error("should not reach here"); + } finally { + helper.getChallengeResources = originalGetChallengeResources; + await prisma.challengeUserWhitelist.deleteMany({ + where: { challengeId: data.challenge.id }, + }); + } + }); + it("update challenge successfully 1", async () => { const challengeData = testChallengeData; const result = await service.updateChallenge( From f27d366bfdb3d096c8e6ede23b79da43005ada85 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Wed, 29 Apr 2026 08:20:55 +1000 Subject: [PATCH 03/22] PM-4957: Trigger finance on challenge cancellation What was broken Cancelled challenges in Appeals Response could be saved in challenge-api-v6 without ever calling tc-finance-api, so reviewer payments were not generated and billing-account ledger rows were not updated. Root cause The challenge update flow only requested finance payment generation for task challenges transitioning to COMPLETED. Cancelled status transitions reused phase-closing logic but had no matching finance trigger. What was changed Added a shared cancelled-status helper in ChallengeService and call finance after a challenge first transitions into any cancelled terminal status. The call runs after the database transaction commits, matching the existing completed-task payment generation pattern. Any added/updated tests Added a ChallengeService unit test that stubs the finance helper and verifies a challenge transitioning to CANCELLED_CLIENT_REQUEST requests payment generation. --- src/services/ChallengeService.js | 55 +++++++++++++++++++++--------- test/unit/ChallengeService.test.js | 31 +++++++++++++++++ 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 65cbba3..315a28a 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -58,6 +58,27 @@ const allowedSortByValues = _.uniq([ ...Object.keys(sortByAliases), ]); +const CANCELLED_CHALLENGE_STATUSES = new Set([ + ChallengeStatusEnum.CANCELLED, + ChallengeStatusEnum.CANCELLED_REQUIREMENTS_INFEASIBLE, + ChallengeStatusEnum.CANCELLED_PAYMENT_FAILED, + ChallengeStatusEnum.CANCELLED_FAILED_REVIEW, + ChallengeStatusEnum.CANCELLED_FAILED_SCREENING, + ChallengeStatusEnum.CANCELLED_ZERO_SUBMISSIONS, + ChallengeStatusEnum.CANCELLED_WINNER_UNRESPONSIVE, + ChallengeStatusEnum.CANCELLED_CLIENT_REQUEST, + ChallengeStatusEnum.CANCELLED_ZERO_REGISTRATIONS, +]); + +/** + * Determines whether a challenge status is one of the terminal cancelled states. + * @param {String} status challenge status from the update payload or stored challenge + * @returns {Boolean} true when the status represents a cancelled challenge + */ +function isCancelledChallengeStatus(status) { + return CANCELLED_CHALLENGE_STATUSES.has(status); +} + function normalizeStatusSortValue(statusValue) { if (_.isNil(statusValue)) { return null; @@ -2792,6 +2813,8 @@ function prepareTaskCompletionData(challenge, challengeResources, data) { /** * Update challenge. + * When a challenge transitions to completed task status or a cancelled status, + * payment generation is requested after the database update commits. * @param {Object} currentUser the user who perform operation * @param {String} challengeId the challenge id * @param {Object} data the challenge data to be updated @@ -3005,6 +3028,8 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { let isChallengeBeingActivated = isStatusChangingToActive; let isChallengeBeingCancelled = false; + const isStatusChangingToCancelled = + isCancelledChallengeStatus(data.status) && !isCancelledChallengeStatus(challenge.status); if (data.status) { if (data.status === ChallengeStatusEnum.ACTIVE) { await validateChallengeActivationBillingAccount({ @@ -3015,22 +3040,7 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { }); } - if ( - _.includes( - [ - ChallengeStatusEnum.CANCELLED, - ChallengeStatusEnum.CANCELLED_REQUIREMENTS_INFEASIBLE, - ChallengeStatusEnum.CANCELLED_PAYMENT_FAILED, - ChallengeStatusEnum.CANCELLED_FAILED_REVIEW, - ChallengeStatusEnum.CANCELLED_FAILED_SCREENING, - ChallengeStatusEnum.CANCELLED_ZERO_SUBMISSIONS, - ChallengeStatusEnum.CANCELLED_WINNER_UNRESPONSIVE, - ChallengeStatusEnum.CANCELLED_CLIENT_REQUEST, - ChallengeStatusEnum.CANCELLED_ZERO_REGISTRATIONS, - ], - data.status, - ) - ) { + if (isCancelledChallengeStatus(data.status)) { isChallengeBeingCancelled = true; } @@ -3584,6 +3594,19 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { logger.error(`Error generating payments for Task challenge ${challengeId}: ${err.message}`); } } + if (isStatusChangingToCancelled) { + logger.info(`Triggering payment generation for cancelled challenge ${challengeId}`); + try { + const paymentSuccess = await helper.generateChallengePayments(challengeId); + if (!paymentSuccess) { + logger.warn(`Failed to generate payments for cancelled challenge ${challengeId}`); + } + } catch (err) { + logger.error( + `Error generating payments for cancelled challenge ${challengeId}: ${err.message}`, + ); + } + } // Re-fetch the challenge outside the transaction to ensure we publish // only after the commit succeeds and using the committed snapshot. if (emitEvent) { diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index b14a029..519d3b4 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -1800,6 +1800,37 @@ describe("challenge service unit tests", () => { } }); + it("update challenge - triggers payments when a challenge is cancelled", async () => { + const originalGetChallengeResources = helper.getChallengeResources; + const originalGenerateChallengePayments = helper.generateChallengePayments; + let generatedPaymentsChallengeId; + const cancelledChallenge = await createActivationChallenge(ChallengeStatusEnum.ACTIVE); + + helper.getChallengeResources = async () => []; + helper.generateChallengePayments = async (challengeId) => { + generatedPaymentsChallengeId = challengeId; + return true; + }; + + try { + const result = await service.updateChallenge( + { isMachine: true, sub: "sub-cancel", userId: 22838965 }, + cancelledChallenge.id, + { + status: ChallengeStatusEnum.CANCELLED_CLIENT_REQUEST, + cancelReason: "QA cancellation coverage", + }, + ); + + should.equal(result.status, ChallengeStatusEnum.CANCELLED_CLIENT_REQUEST); + should.equal(generatedPaymentsChallengeId, cancelledChallenge.id); + } finally { + helper.getChallengeResources = originalGetChallengeResources; + helper.generateChallengePayments = originalGenerateChallengePayments; + await prisma.challenge.deleteMany({ where: { id: cancelledChallenge.id } }); + } + }); + describe("reviewer scorecard changes", () => { const originalScorecardId = "sc-original"; const newScorecardId = "sc-updated"; From e21f84a0c431dd741522b34398177dfdb00d86f7 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Wed, 29 Apr 2026 09:26:28 +1000 Subject: [PATCH 04/22] PM-4951: Lock draft challenge billing budget What was broken Draft challenge saves persisted the challenge and its billing metadata, but they did not write a locked billing-account budget row. The Billing Account Details modal only reads locked and consumed budget rows, so newly saved draft challenge payments were missing from the list. Root cause (if identifiable) The previous PM-4951 fix handled finance-created winning/payment rows in tc-finance-api. QA reproduced the draft challenge editor flow, which saves challenge prize data through challenge-api-v6 and does not create a finance payment row at that point. What was changed challenge-api-v6 now synchronizes a billing-account lock after challenge create/update when the saved challenge is Draft, Approved, or Active. The lock amount uses the persisted member-payment total plus the challenge billing markup and writes a CHALLENGE lock row keyed by the challenge id. Finance can still replace that locked row with the finalized consumed amount when payment generation runs after completion or cancellation. Any added/updated tests Added project-helper coverage for the billing-account lock request and ChallengeService coverage that a saved Draft challenge triggers the billing lock sync with the expected billing account, challenge id, markup, and member-payment amount. --- src/common/project-helper.js | 69 ++++++++++++++++++++++++++++ src/services/ChallengeService.js | 73 ++++++++++++++++++++++++++++++ test/unit/ChallengeService.test.js | 51 +++++++++++++++++++++ test/unit/project-helper.test.js | 43 ++++++++++++++++++ 4 files changed, 236 insertions(+) diff --git a/src/common/project-helper.js b/src/common/project-helper.js index 4bd6f47..a2d5cec 100644 --- a/src/common/project-helper.js +++ b/src/common/project-helper.js @@ -248,6 +248,75 @@ class ProjectHelper { throw err; } } + + /** + * Locks the current challenge member-payment budget against a billing account. + * + * The billing-account ledger stores amounts after markup is applied. This + * helper accepts the member-payment amount from challenge persistence, + * applies the billing markup, and writes one CHALLENGE lock row keyed by the + * challenge id. + * + * @param {object} params Lock request parameters. + * @param {string|number} params.billingAccountId Billing-account identifier. + * @param {string} params.challengeId Challenge id to use as the external reference. + * @param {number|string} params.memberPaymentAmount Challenge member-payment amount before markup. + * @param {number|string|null|undefined} params.markup Billing-account markup as a decimal or percentage. + * @returns {Promise} Billing Accounts API lock response. + * @throws {errors.BadRequestError} When required values are missing or invalid. + * @throws {Error} When the Billing Accounts API rejects the lock request. + */ + async lockChallengeBillingAccountAmount({ + billingAccountId, + challengeId, + memberPaymentAmount, + markup, + }) { + const normalizedBillingAccountId = normalizeOptionalString(billingAccountId); + const normalizedChallengeId = normalizeOptionalString(challengeId); + const amount = normalizeOptionalNumber(memberPaymentAmount); + const normalizedMarkup = normalizeBillingMarkup(markup) || 0; + + if (!normalizedBillingAccountId) { + throw new errors.BadRequestError("Cannot lock challenge budget without a billing account."); + } + + if (!normalizedChallengeId) { + throw new errors.BadRequestError("Cannot lock challenge budget without a challenge id."); + } + + if (_.isNil(amount) || amount < 0) { + throw new errors.BadRequestError("Cannot lock challenge budget with an invalid amount."); + } + + if (normalizedMarkup < 0) { + throw new errors.BadRequestError("Cannot lock challenge budget with an invalid markup."); + } + + const token = await m2mHelper.getM2MToken(); + const lockAmount = Number((amount * (1 + normalizedMarkup)).toFixed(4)); + const url = `${config.BILLING_ACCOUNTS_API_URL}/${encodeURIComponent( + normalizedBillingAccountId + )}/lock-amount`; + logger.debug( + `projectHelper.lockChallengeBillingAccountAmount: PATCH ${url} challengeId=${normalizedChallengeId}` + ); + + const res = await axios.patch( + url, + { + amount: lockAmount, + challengeId: normalizedChallengeId, + externalId: normalizedChallengeId, + externalType: "CHALLENGE", + }, + { + headers: { Authorization: `Bearer ${token}` }, + } + ); + + return res.data; + } } module.exports = new ProjectHelper(); diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 65cbba3..86ca1d0 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -46,6 +46,11 @@ const BILLING_MARKUP_VISIBLE_ROLES = new Set([ "talent manager", "topcoder talent manager", ]); +const CHALLENGE_BILLING_LOCK_STATUSES = new Set([ + ChallengeStatusEnum.DRAFT, + ChallengeStatusEnum.APPROVED, + ChallengeStatusEnum.ACTIVE, +]); // Provide aliases for friendlier sortBy query params const sortByAliases = { @@ -89,6 +94,72 @@ function compareStatusSortValues(aStatusValue, bStatusValue) { return normalizedA.localeCompare(normalizedB); } +/** + * Determines whether the challenge budget should remain locked. + * + * @param {string|undefined|null} status Challenge status from the request or persistence. + * @returns {boolean} True when the challenge should reserve billing-account budget. + */ +function isChallengeBillingLockStatus(status) { + return CHALLENGE_BILLING_LOCK_STATUSES.has(normalizeStatusSortValue(status)); +} + +/** + * Reads the currently persisted challenge prize total. + * + * @param {object} challenge Challenge model or response object. + * @returns {number|undefined} Total member-payment amount before markup. + */ +function getChallengeMemberPaymentAmount(challenge) { + const totalPrizes = _.get( + challenge, + "overview.totalPrizes", + _.get(challenge, "overviewTotalPrizes"), + ); + const amount = _.toNumber(totalPrizes); + + return Number.isFinite(amount) ? amount : undefined; +} + +/** + * Synchronizes the draft/active challenge budget lock to billing accounts. + * + * The challenge service owns the current estimated member-payment amount while + * finance later consumes the finalized payment amount after payment generation. + * This keeps draft challenge rows visible as locked budget in billing-account + * details until finance moves the row to consumed. + * + * @param {object} challenge Challenge model or response object after persistence. + * @returns {Promise} Resolves after the billing-account lock is written or skipped. + * @throws {Error} When the Billing Accounts API rejects the lock request. + */ +async function syncChallengeBillingAccountLock(challenge) { + if (!isChallengeBillingLockStatus(challenge && challenge.status)) { + return; + } + + const billing = _.get(challenge, "billing", _.get(challenge, "billingRecord")); + const billingAccountId = _.get(billing, "billingAccountId"); + const hasBillingAccountId = !_.isNil(billingAccountId) && _.toString(billingAccountId).trim(); + const memberPaymentAmount = getChallengeMemberPaymentAmount(challenge); + + if (!hasBillingAccountId || _.isNil(memberPaymentAmount)) { + logger.warn("Skipping challenge billing lock sync due to missing billing context", { + challengeId: _.get(challenge, "id"), + hasBillingAccountId: Boolean(hasBillingAccountId), + hasMemberPaymentAmount: !_.isNil(memberPaymentAmount), + }); + return; + } + + await projectHelper.lockChallengeBillingAccountAmount({ + billingAccountId, + challengeId: challenge.id, + markup: _.get(billing, "clientBillingRate", _.get(billing, "markup")), + memberPaymentAmount, + }); +} + /** * Returns normalized role names from the authenticated user payload. * @param {Object} currentUser the authenticated user @@ -2046,6 +2117,7 @@ async function createChallenge(currentUser, challenge, userToken) { prismaHelper.convertModelToResponse(ret); await enrichSkillsData(ret); enrichChallengeForResponse(ret, track, type); + await syncChallengeBillingAccountLock(ret); // If the challenge is self-service, add the creating user as the "client manager", *not* the manager // This is necessary for proper handling of the vanilla embed on the self-service work item dashboard @@ -3573,6 +3645,7 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { include: includeReturnFields, }); }); + await syncChallengeBillingAccountLock(updatedChallenge); if (taskCompletionInfo && taskCompletionInfo.shouldTriggerPayments) { logger.info(`Triggering payment generation for Task challenge ${challengeId}`); try { diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index b14a029..938db44 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -48,6 +48,8 @@ describe("challenge service unit tests", () => { let data; let testChallengeData; let createdChallengeData; + let billingLockRequests; + let originalLockChallengeBillingAccountAmount; const notFoundId = uuid(); const authUser = { userId: "testuser", @@ -158,6 +160,19 @@ describe("challenge service unit tests", () => { }; }); + beforeEach(() => { + billingLockRequests = []; + originalLockChallengeBillingAccountAmount = projectHelper.lockChallengeBillingAccountAmount; + projectHelper.lockChallengeBillingAccountAmount = async (request) => { + billingLockRequests.push(_.cloneDeep(request)); + return { locked: true }; + }; + }); + + afterEach(() => { + projectHelper.lockChallengeBillingAccountAmount = originalLockChallengeBillingAccountAmount; + }); + after(async () => { const idsToDelete = _.compact([id, id2]); if (idsToDelete.length > 0) { @@ -243,6 +258,42 @@ describe("challenge service unit tests", () => { should.equal(result.numOfRegistrants, 0); }); + it("locks draft challenge budget when the challenge is saved", async () => { + const challengeData = _.cloneDeep(testChallengeData); + challengeData.status = ChallengeStatusEnum.DRAFT; + challengeData.prizeSets[0].type = PrizeSetTypeEnum.PLACEMENT; + challengeData.prizeSets[0].prizes[0].type = constants.prizeTypes.USD; + challengeData.prizeSets[0].prizes[0].value = 1000; + const originalGetProjectBillingInformation = projectHelper.getProjectBillingInformation; + + projectHelper.getProjectBillingInformation = async () => ({ + billingAccountId: "80001012", + markup: 0.1, + }); + + let result; + try { + result = await service.createChallenge( + { isMachine: true, sub: "sub", userId: "testuser" }, + challengeData, + config.M2M_FULL_ACCESS_TOKEN, + ); + + should.equal(billingLockRequests.length, 1); + billingLockRequests[0].should.deep.equal({ + billingAccountId: "80001012", + challengeId: result.id, + markup: 0.1, + memberPaymentAmount: 1000, + }); + } finally { + projectHelper.getProjectBillingInformation = originalGetProjectBillingInformation; + if (result && result.id) { + await prisma.challenge.deleteMany({ where: { id: result.id } }); + } + } + }); + it("create challenge successfully when project directProjectId is a numeric string", async () => { const challengeData = _.cloneDeep(testChallengeData); const originalGetProject = projectHelper.getProject; diff --git a/test/unit/project-helper.test.js b/test/unit/project-helper.test.js index 285c8b4..7be1a10 100644 --- a/test/unit/project-helper.test.js +++ b/test/unit/project-helper.test.js @@ -8,15 +8,18 @@ chai.should() describe('project helper unit tests', () => { let originalAxiosGet + let originalAxiosPatch let originalGetM2MToken beforeEach(() => { originalAxiosGet = axios.get + originalAxiosPatch = axios.patch originalGetM2MToken = m2mHelper.getM2MToken }) afterEach(() => { axios.get = originalAxiosGet + axios.patch = originalAxiosPatch m2mHelper.getM2MToken = originalGetM2MToken }) @@ -55,4 +58,44 @@ describe('project helper unit tests', () => { markup: 0.58 }) }) + + it('locks challenge billing account budget with markup applied', async () => { + let patchUrl + let patchBody + let patchHeaders + + m2mHelper.getM2MToken = async () => 'test-token' + axios.patch = async (url, body, options) => { + patchUrl = url + patchBody = body + patchHeaders = options.headers + + return { + data: { + externalId: body.externalId, + amount: body.amount + } + } + } + + const result = await projectHelper.lockChallengeBillingAccountAmount({ + billingAccountId: '80001012', + challengeId: 'challenge-id', + memberPaymentAmount: 1000, + markup: 0.1 + }) + + patchUrl.should.equal('http://localhost:4000/v6/billing-accounts/80001012/lock-amount') + patchBody.should.deep.equal({ + amount: 1100, + challengeId: 'challenge-id', + externalId: 'challenge-id', + externalType: 'CHALLENGE' + }) + patchHeaders.should.deep.equal({ Authorization: 'Bearer test-token' }) + result.should.deep.equal({ + externalId: 'challenge-id', + amount: 1100 + }) + }) }) From fd38ea9250113b2388f0c1653ef4f24dac1a6fc2 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Wed, 29 Apr 2026 10:35:19 +1000 Subject: [PATCH 05/22] Better handling of draft challenges and locking --- src/services/ChallengeService.js | 67 ++++++++++++++--- test/unit/ChallengeService.test.js | 117 ++++++++++++++++++++++++++++- 2 files changed, 172 insertions(+), 12 deletions(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 86ca1d0..2874f8a 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -105,12 +105,50 @@ function isChallengeBillingLockStatus(status) { } /** - * Reads the currently persisted challenge prize total. + * Calculates the billable USD prize-set total for a challenge. * * @param {object} challenge Challenge model or response object. - * @returns {number|undefined} Total member-payment amount before markup. + * @returns {number|undefined} USD prize-set member-payment amount before markup, + * or `undefined` when prize sets are not loaded. + */ +function getChallengePrizeSetMemberPaymentAmount(challenge) { + const prizeSets = _.get(challenge, "prizeSets"); + + if (!Array.isArray(prizeSets)) { + return undefined; + } + + return prizeSets.reduce((total, prizeSet) => { + const prizes = Array.isArray(prizeSet && prizeSet.prizes) ? prizeSet.prizes : []; + + return ( + total + + prizes.reduce((prizeTotal, prize) => { + if (_.toString(_.get(prize, "type")).toUpperCase() !== constants.prizeTypes.USD) { + return prizeTotal; + } + + const prizeValue = _.toNumber(_.get(prize, "value")); + + return Number.isFinite(prizeValue) ? prizeTotal + prizeValue : prizeTotal; + }, 0) + ); + }, 0); +} + +/** + * Reads the currently persisted challenge member-payment total. + * + * @param {object} challenge Challenge model or response object. + * @returns {number|undefined} Total USD member-payment amount before markup. */ function getChallengeMemberPaymentAmount(challenge) { + const prizeSetMemberPaymentAmount = getChallengePrizeSetMemberPaymentAmount(challenge); + + if (!_.isNil(prizeSetMemberPaymentAmount)) { + return prizeSetMemberPaymentAmount; + } + const totalPrizes = _.get( challenge, "overview.totalPrizes", @@ -2916,14 +2954,17 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { })`, ); - if (billingAccountId && _.isUndefined(_.get(challenge, "billing.billingAccountId"))) { - // Ensure billingAccountId is a string or null to match Prisma schema - if (billingAccountId !== null && billingAccountId !== undefined) { - _.set(data, "billing.billingAccountId", String(billingAccountId)); - } else { - _.set(data, "billing.billingAccountId", null); - } - _.set(data, "billing.markup", _.isNil(markup) ? 0 : markup); + const existingBillingAccountId = normalizeOptionalString( + _.get(challenge, "billing.billingAccountId"), + ); + const projectBillingAccountId = normalizeOptionalString(billingAccountId); + if (projectBillingAccountId && !existingBillingAccountId) { + data.billing = { + ..._.get(challenge, "billing", {}), + ..._.get(data, "billing", {}), + billingAccountId: projectBillingAccountId, + markup: _.isNil(markup) ? 0 : markup, + }; } // Make sure the user cannot change the direct project ID @@ -4300,7 +4341,11 @@ function sanitizeChallenge(challenge) { ]); } if (challenge.billing) { - sanitized.billing = _.pick(challenge.billing, ["billingAccountId", "markup"]); + sanitized.billing = _.pick(challenge.billing, [ + "billingAccountId", + "markup", + "clientBillingRate", + ]); } if (challenge.metadata) { sanitized.metadata = _.map(challenge.metadata, (meta) => _.pick(meta, ["name", "value"])); diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index 938db44..fdf4dc8 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -608,7 +608,10 @@ describe("challenge service unit tests", () => { createdChallengeData.id, ); - should.equal(result.billing.billingAccountId, createdChallengeData.billing.billingAccountId); + should.equal( + result.billing.billingAccountId, + createdChallengeData.billing.billingAccountId, + ); should.equal(_.isUndefined(result.billing.markup), true); } finally { helper.userHasProjectWriteAccess = originalUserHasProjectWriteAccess; @@ -1656,6 +1659,118 @@ describe("challenge service unit tests", () => { should.equal(testHelper.getDatesDiff(result.startDate, testChallengeData.startDate), 0); }); + it("backfills missing billing and locks draft budget including copilot prizes", async () => { + const challengeData = _.cloneDeep(testChallengeData); + challengeData.name = `${challengeData.name} Billing Lock ${Date.now()}`; + challengeData.legacyId = Math.floor(Math.random() * 1000000); + challengeData.status = ChallengeStatusEnum.NEW; + challengeData.prizeSets = [ + { + type: PrizeSetTypeEnum.PLACEMENT, + description: "placement prizes", + prizes: [ + { + description: "placement 1", + type: constants.prizeTypes.USD, + value: 1000, + }, + ], + }, + { + type: PrizeSetTypeEnum.COPILOT, + description: "copilot payment", + prizes: [ + { + description: "copilot", + type: constants.prizeTypes.USD, + value: 150, + }, + ], + }, + ]; + + const originalGetProject = projectHelper.getProject; + const originalGetProjectBillingInformation = projectHelper.getProjectBillingInformation; + let billingLookupCount = 0; + let createdChallengeId; + + projectHelper.getProject = async () => ({ directProjectId: "33541" }); + projectHelper.getProjectBillingInformation = async () => { + billingLookupCount += 1; + + if (billingLookupCount === 1) { + return { + billingAccountId: null, + markup: null, + }; + } + + return { + billingAccountId: "80001012", + markup: 0.1, + }; + }; + + try { + const created = await service.createChallenge( + { isMachine: true, sub: "sub-billing-lock-create", userId: "testuser" }, + challengeData, + config.M2M_FULL_ACCESS_TOKEN, + ); + createdChallengeId = created.id; + should.equal(billingLockRequests.length, 0); + + const draft = await service.updateChallenge( + { isMachine: true, sub: "sub-billing-lock-update", userId: 22838965 }, + created.id, + { + status: ChallengeStatusEnum.DRAFT, + }, + ); + + should.equal(draft.billing.billingAccountId, "80001012"); + should.equal(billingLockRequests.length, 1); + billingLockRequests[0].should.deep.equal({ + billingAccountId: "80001012", + challengeId: created.id, + markup: 0.1, + memberPaymentAmount: 1150, + }); + + const updatedPrizeSets = _.cloneDeep(draft.prizeSets); + const copilotPrizeSet = _.find( + updatedPrizeSets, + (prizeSet) => _.toString(prizeSet.type).toUpperCase() === PrizeSetTypeEnum.COPILOT, + ); + should.exist(copilotPrizeSet); + copilotPrizeSet.prizes[0].value = 225; + billingLockRequests = []; + + await service.updateChallenge( + { isMachine: true, sub: "sub-billing-lock-prize-update", userId: 22838965 }, + created.id, + { + prizeSets: updatedPrizeSets, + }, + ); + + should.equal(billingLockRequests.length, 1); + billingLockRequests[0].should.deep.equal({ + billingAccountId: "80001012", + challengeId: created.id, + markup: 0.1, + memberPaymentAmount: 1225, + }); + } finally { + projectHelper.getProject = originalGetProject; + projectHelper.getProjectBillingInformation = originalGetProjectBillingInformation; + + if (createdChallengeId) { + await prisma.challenge.deleteMany({ where: { id: createdChallengeId } }); + } + } + }).timeout(10000); + it("preserves existing terms when update payload omits the terms field", async () => { const challengeData = _.cloneDeep(testChallengeData); challengeData.name = `${challengeData.name} Terms ${Date.now()}`; From 5bfdc2f70318f2b67712d50482681f026b8f4671 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Wed, 29 Apr 2026 18:45:46 +1000 Subject: [PATCH 06/22] PM-4951: Include review costs in draft billing locks What was broken Draft challenge billing locks were using the saved prize-set total but did not include estimated member-review payments. The Billing Account Details modal therefore showed a locked draft row, but its member payment amount was lower than the challenge editor's estimated challenge total breakdown. Root cause (if identifiable) The previous follow-up fixed the missing locked row and included copilot prizes, but challenge-api-v6 did not apply the same review-cost calculation that the Work challenge editor uses for draft billing estimates. What was changed The challenge billing-lock amount now adds estimated member-review cost for USD placement challenges, using the existing two-submission estimate and reviewer fixed/coefficient fields before applying billing markup. Point-based challenges continue to skip review-cost billing estimates. Any added/updated tests Updated the draft challenge billing-lock unit coverage to use the QA sample shape: placement prizes, copilot fee, and review cost now produce a member-payment lock amount of 73.10 before markup. --- src/services/ChallengeService.js | 81 +++++++++++++++++++++++++++++- test/unit/ChallengeService.test.js | 45 +++++++++++++++-- 2 files changed, 120 insertions(+), 6 deletions(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 2315e85..0d69bcd 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -51,6 +51,7 @@ const CHALLENGE_BILLING_LOCK_STATUSES = new Set([ ChallengeStatusEnum.APPROVED, ChallengeStatusEnum.ACTIVE, ]); +const DEFAULT_ESTIMATED_SUBMISSIONS_COUNT = 2; // Provide aliases for friendlier sortBy query params const sortByAliases = { @@ -157,17 +158,93 @@ function getChallengePrizeSetMemberPaymentAmount(challenge) { }, 0); } +/** + * Reads the first-place placement prize used by reviewer cost estimates. + * + * @param {object} challenge Challenge model or response object. + * @returns {number|undefined} First-place USD placement prize amount, or undefined when unavailable. + */ +function getFirstPlacePrizeValue(challenge) { + const prizeSets = _.get(challenge, "prizeSets"); + + if (!Array.isArray(prizeSets)) { + return undefined; + } + + const placementPrizeSet = _.find( + prizeSets, + (prizeSet) => _.toString(_.get(prizeSet, "type")).toUpperCase() === PrizeSetTypeEnum.PLACEMENT, + ); + const firstPrize = _.get(placementPrizeSet, "prizes[0]"); + + if (_.toString(_.get(firstPrize, "type")).toUpperCase() !== constants.prizeTypes.USD) { + return undefined; + } + + const prizeValue = _.toNumber(_.get(firstPrize, "value")); + + return Number.isFinite(prizeValue) ? prizeValue : undefined; +} + +/** + * Calculates the estimated member-review payment amount for billing locks. + * + * The work app shows review cost using a two-submission estimate, so draft + * budget locks need the same fixed and coefficient-based reviewer math. + * + * @param {object} challenge Challenge model or response object. + * @returns {number} Estimated member-review payment amount before markup. + */ +function getEstimatedReviewerPaymentAmount(challenge) { + const reviewers = _.get(challenge, "reviewers"); + + if (!Array.isArray(reviewers)) { + return 0; + } + + const firstPlacePrizeValue = getFirstPlacePrizeValue(challenge); + + if (_.isNil(firstPlacePrizeValue)) { + return 0; + } + + return reviewers.reduce((total, reviewer) => { + if (_.get(reviewer, "isMemberReview") === false) { + return total; + } + + const fixedAmount = _.toNumber(_.get(reviewer, "fixedAmount")); + const baseCoefficient = _.toNumber(_.get(reviewer, "baseCoefficient")); + const incrementalCoefficient = _.toNumber(_.get(reviewer, "incrementalCoefficient")); + const memberReviewerCount = Math.max( + 1, + Math.trunc(_.toNumber(_.get(reviewer, "memberReviewerCount")) || 1), + ); + const reviewerPayment = + (Number.isFinite(fixedAmount) ? fixedAmount : 0) + + ((Number.isFinite(baseCoefficient) ? baseCoefficient : 0) + + (Number.isFinite(incrementalCoefficient) ? incrementalCoefficient : 0) * + DEFAULT_ESTIMATED_SUBMISSIONS_COUNT) * + firstPlacePrizeValue; + + return total + reviewerPayment * memberReviewerCount; + }, 0); +} + /** * Reads the currently persisted challenge member-payment total. * * @param {object} challenge Challenge model or response object. - * @returns {number|undefined} Total USD member-payment amount before markup. + * @returns {number|undefined} Total USD member-payment amount before markup, + * including estimated member-review cost when prize sets are loaded. */ function getChallengeMemberPaymentAmount(challenge) { const prizeSetMemberPaymentAmount = getChallengePrizeSetMemberPaymentAmount(challenge); if (!_.isNil(prizeSetMemberPaymentAmount)) { - return prizeSetMemberPaymentAmount; + return Number( + (prizeSetMemberPaymentAmount + getEstimatedReviewerPaymentAmount(challenge)).toFixed(2), + ); } const totalPrizes = _.get( diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index 5f0d62d..da52eb8 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -261,9 +261,46 @@ describe("challenge service unit tests", () => { it("locks draft challenge budget when the challenge is saved", async () => { const challengeData = _.cloneDeep(testChallengeData); challengeData.status = ChallengeStatusEnum.DRAFT; - challengeData.prizeSets[0].type = PrizeSetTypeEnum.PLACEMENT; - challengeData.prizeSets[0].prizes[0].type = constants.prizeTypes.USD; - challengeData.prizeSets[0].prizes[0].value = 1000; + challengeData.prizeSets = [ + { + type: PrizeSetTypeEnum.PLACEMENT, + description: "placement prizes", + prizes: [ + { + description: "placement 1", + type: constants.prizeTypes.USD, + value: 35, + }, + { + description: "placement 2", + type: constants.prizeTypes.USD, + value: 12, + }, + ], + }, + { + type: PrizeSetTypeEnum.COPILOT, + description: "copilot payment", + prizes: [ + { + description: "copilot", + type: constants.prizeTypes.USD, + value: 10, + }, + ], + }, + ]; + challengeData.reviewers = [ + { + scorecardId: "scorecard-id", + isMemberReview: true, + memberReviewerCount: 1, + phaseId: data.phase.id, + fixedAmount: 16.1, + baseCoefficient: 0, + incrementalCoefficient: 0, + }, + ]; const originalGetProjectBillingInformation = projectHelper.getProjectBillingInformation; projectHelper.getProjectBillingInformation = async () => ({ @@ -284,7 +321,7 @@ describe("challenge service unit tests", () => { billingAccountId: "80001012", challengeId: result.id, markup: 0.1, - memberPaymentAmount: 1000, + memberPaymentAmount: 73.1, }); } finally { projectHelper.getProjectBillingInformation = originalGetProjectBillingInformation; From f0a30716f2a5ba497ecba9cbf50cc0f5e0aee211 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Thu, 30 Apr 2026 12:18:31 +1000 Subject: [PATCH 07/22] Fix a bug in the phase advancer SQL --- src/phase-management/PhaseAdvancer.js | 2 +- .../phase-management/PhaseAdvancer.test.js | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/phase-management/PhaseAdvancer.js b/src/phase-management/PhaseAdvancer.js index fc44e3b..110bc29 100644 --- a/src/phase-management/PhaseAdvancer.js +++ b/src/phase-management/PhaseAdvancer.js @@ -395,7 +395,7 @@ class PhaseAdvancer { OR (r."legacySubmissionId" IS NOT NULL AND s."legacySubmissionId" = r."legacySubmissionId") ) WHERE s."challengeId" = ${challengeId} - AND r."status" = ${"COMPLETED"} + AND r."status"::text = ${"COMPLETED"} ` ); diff --git a/test/unit/phase-management/PhaseAdvancer.test.js b/test/unit/phase-management/PhaseAdvancer.test.js index 884c8e0..b0065a0 100644 --- a/test/unit/phase-management/PhaseAdvancer.test.js +++ b/test/unit/phase-management/PhaseAdvancer.test.js @@ -2,6 +2,7 @@ const { expect } = require("chai"); const PhaseAdvancer = require("../../../src/phase-management/PhaseAdvancer"); const { getClient } = require("../../../src/common/prisma"); +const reviewPrisma = require("../../../src/common/review-prisma"); const buildIterativeReviewPhase = () => ({ id: "phase-iterative-review", @@ -91,3 +92,80 @@ describe("PhaseAdvancer Iterative Review gating", () => { expect(phases[0].isOpen).to.be.true; }); }); + +describe("PhaseAdvancer review completion queries", () => { + const prisma = getClient(); + const originalFindUnique = prisma.challenge.findUnique; + const originalGetReviewClient = reviewPrisma.getReviewClient; + const phaseAdvancerPath = require.resolve("../../../src/phase-management/PhaseAdvancer"); + + afterEach(() => { + prisma.challenge.findUnique = originalFindUnique; + reviewPrisma.getReviewClient = originalGetReviewClient; + delete require.cache[phaseAdvancerPath]; + }); + + it("casts review status to text before comparing completed reviews", async () => { + const capturedQueries = []; + + reviewPrisma.getReviewClient = () => ({ + $queryRaw: async (query) => { + capturedQueries.push(query); + return [{ count: 2 }]; + }, + }); + + delete require.cache[phaseAdvancerPath]; + const PhaseAdvancerWithMockedReviewClient = require("../../../src/phase-management/PhaseAdvancer"); + const phaseAdvancer = new PhaseAdvancerWithMockedReviewClient({ + async getPhaseFacts() { + return {}; + }, + }); + + prisma.challenge.findUnique = async () => ({ + numOfSubmissions: 1, + reviewers: [{ isMemberReview: true, memberReviewerCount: 2 }], + }); + + const phases = [ + { + id: "phase-review", + phaseId: "phase-review", + name: "Review", + description: "Review phase", + duration: 86400, + isOpen: true, + predecessor: null, + scheduledStartDate: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), + scheduledEndDate: new Date(Date.now() - 60 * 60 * 1000).toISOString(), + actualStartDate: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), + actualEndDate: null, + constraints: [], + }, + ]; + + const result = await phaseAdvancer.advancePhase( + "challenge-123", + null, + phases, + "close", + "Review" + ); + const [reviewCompletionQuery] = capturedQueries; + const queryText = [ + reviewCompletionQuery.sql, + reviewCompletionQuery.text, + reviewCompletionQuery.statement, + Array.isArray(reviewCompletionQuery.strings) + ? reviewCompletionQuery.strings.join("?") + : "", + ] + .filter(Boolean) + .join("\n"); + + expect(result.success).to.be.true; + expect(queryText).to.contain('r."status"::text ='); + expect(reviewCompletionQuery.values).to.include("COMPLETED"); + }); +}); From 4770fc6d3a393c9309ed6089ce5dfcf9170845b5 Mon Sep 17 00:00:00 2001 From: jmgasper Date: Thu, 30 Apr 2026 12:46:48 +1000 Subject: [PATCH 08/22] Ignore reviewer check when opening review phase, ONLY for marathon matches, since they have a system review --- src/services/ChallengePhaseService.js | 32 ++++++++++++++--- test/unit/ChallengePhaseService.test.js | 48 +++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/services/ChallengePhaseService.js b/src/services/ChallengePhaseService.js index 88c2867..e7857f0 100644 --- a/src/services/ChallengePhaseService.js +++ b/src/services/ChallengePhaseService.js @@ -479,11 +479,14 @@ async function hasPendingEscalationRequestsForChallenge(challengeId) { /** * Load a challenge for challenge-scoped phase operations. * @param {String} challengeId the challenge id - * @returns {Object} the challenge with the given id + * @returns {Object} the challenge with the given id and type metadata * @throws {NotFoundError} when the challenge does not exist */ async function getChallengeForPhaseAccess(challengeId) { - const challenge = await prisma.challenge.findUnique({ where: { id: challengeId } }); + const challenge = await prisma.challenge.findUnique({ + where: { id: challengeId }, + include: { type: true }, + }); if (!challenge) { throw new errors.NotFoundError(`Challenge with id: ${challengeId} doesn't exist`); } @@ -511,13 +514,34 @@ async function postChallengeUpdatedNotification(challengeId) { } } -async function ensureRequiredResourcesBeforeOpeningPhase(challengeId, phaseName) { +/** + * Check whether a challenge is the Marathon Match challenge type. + * @param {Object} challenge challenge data loaded with its type relation + * @returns {Boolean} true when the challenge type name is Marathon Match + */ +function isMarathonMatchChallengeType(challenge) { + const typeName = _.get(challenge, "type.name"); + return _.toLower(_.trim(typeName || "")) === "marathon match"; +} + +/** + * Ensure a challenge has the configured resource role before a phase opens. + * @param {Object} challenge challenge data loaded with its type relation + * @param {String} phaseName phase name being opened + * @throws {BadRequestError} when the challenge is missing the required resource role + */ +async function ensureRequiredResourcesBeforeOpeningPhase(challenge, phaseName) { const normalizedPhaseName = _.toLower(_.trim(phaseName || "")); const requiredRoleName = PHASE_RESOURCE_ROLE_REQUIREMENTS[normalizedPhaseName]; if (!requiredRoleName) { return; } + if (normalizedPhaseName === "review" && isMarathonMatchChallengeType(challenge)) { + return; + } + + const challengeId = challenge.id; const challengeResources = await helper.getChallengeResources(challengeId); const requiredRoleNameLower = _.toLower(requiredRoleName); const hasRequiredRoleByName = (challengeResources || []).some((resource) => { @@ -693,7 +717,7 @@ async function partiallyUpdateChallengePhase(currentUser, challengeId, id, data) if (isOpeningPhase) { const phaseName = data.name || challengePhase.name; - await ensureRequiredResourcesBeforeOpeningPhase(challengeId, phaseName); + await ensureRequiredResourcesBeforeOpeningPhase(challenge, phaseName); // Check if this is the Appeals phase const normalizedPhaseName = normalizePhaseName(phaseName); diff --git a/test/unit/ChallengePhaseService.test.js b/test/unit/ChallengePhaseService.test.js index 5f527a9..25ca132 100644 --- a/test/unit/ChallengePhaseService.test.js +++ b/test/unit/ChallengePhaseService.test.js @@ -1713,6 +1713,54 @@ describe('challenge phase service unit tests', () => { throw new Error('should not reach here') }) + it('partially update challenge phase - opens marathon match review phase without reviewer resource', async () => { + const reviewPhase = await prisma.phase.create({ + data: { + id: uuid(), + name: 'Review', + description: 'desc', + isOpen: false, + duration: 86400, + createdBy: 'admin', + updatedBy: 'admin' + } + }) + const reviewChallengePhaseId = uuid() + await prisma.challengePhase.create({ + data: { + id: reviewChallengePhaseId, + challengeId: data.marathonMatchChallenge.id, + phaseId: reviewPhase.id, + name: 'Review', + isOpen: false, + createdBy: 'admin', + updatedBy: 'admin' + } + }) + + const originalGetChallengeResources = helper.getChallengeResources + const originalGetResourceRoles = helper.getResourceRoles + helper.getChallengeResources = async () => [{ roleId: 'some-other-role-id' }] + helper.getResourceRoles = async () => { + throw new Error('resource role lookup should not be required for Marathon Match Review') + } + + try { + const challengePhase = await service.partiallyUpdateChallengePhase( + authUser, + data.marathonMatchChallenge.id, + reviewChallengePhaseId, + { isOpen: true } + ) + should.equal(challengePhase.isOpen, true) + } finally { + helper.getChallengeResources = originalGetChallengeResources + helper.getResourceRoles = originalGetResourceRoles + await prisma.challengePhase.delete({ where: { id: reviewChallengePhaseId } }) + await prisma.phase.delete({ where: { id: reviewPhase.id } }) + } + }) + it('partially update challenge phase - opens review phase when reviewer resource exists', async () => { const reviewPhase = await prisma.phase.create({ data: { From cd769054637a4b10c13054f0273042ed18845952 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Thu, 30 Apr 2026 07:52:48 +0300 Subject: [PATCH 09/22] PM-4684 - challenge approval flow --- .../migration.sql | 7 + prisma/schema.prisma | 9 ++ src/common/prisma-helper.js | 6 + src/services/ChallengeService.js | 136 ++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 prisma/migrations/20260429123000_add_challenge_approval_status/migration.sql diff --git a/prisma/migrations/20260429123000_add_challenge_approval_status/migration.sql b/prisma/migrations/20260429123000_add_challenge_approval_status/migration.sql new file mode 100644 index 0000000..0e39a1e --- /dev/null +++ b/prisma/migrations/20260429123000_add_challenge_approval_status/migration.sql @@ -0,0 +1,7 @@ +-- Add budget approval workflow fields for challenge launch gating. +CREATE TYPE "ChallengeApprovalStatusEnum" AS ENUM ('PENDING_APPROVAL', 'APPROVED', 'REJECTED'); + +ALTER TABLE "Challenge" +ADD COLUMN "approvalStatus" "ChallengeApprovalStatusEnum" NOT NULL DEFAULT 'PENDING_APPROVAL', +ADD COLUMN "approvalRejectionReason" TEXT, +ADD COLUMN "approvalApprovedBy" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2d1a6a4..e7cab37 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -61,6 +61,12 @@ enum PrizeSetTypeEnum { CHECKPOINT } +enum ChallengeApprovalStatusEnum { + PENDING_APPROVAL + APPROVED + REJECTED +} + // Enum for review opportunity types on reviewers enum ReviewOpportunityTypeEnum { REGULAR_REVIEW @@ -118,6 +124,9 @@ model Challenge { // Additional fields from createChallenge schema status ChallengeStatusEnum @default(NEW) // new challenges default to status "New" + approvalStatus ChallengeApprovalStatusEnum @default(PENDING_APPROVAL) + approvalRejectionReason String? + approvalApprovedBy String? // Normalized top‑level constraints (e.g. allowedRegistrants) for a challenge constraintRecord ChallengeConstraint? diff --git a/src/common/prisma-helper.js b/src/common/prisma-helper.js index e20a8b2..f658f1d 100644 --- a/src/common/prisma-helper.js +++ b/src/common/prisma-helper.js @@ -99,6 +99,9 @@ function convertChallengeSchemaToPrisma(currentUser, challenge) { "numOfRegistrants", "numOfSubmissions", "numOfCheckpointSubmissions", + "approvalStatus", + "approvalRejectionReason", + "approvalApprovedBy", ]); // set legacy data if (!_.isNil(challenge.legacy)) { @@ -208,6 +211,9 @@ function convertChallengeSchemaToPrisma(currentUser, challenge) { if (challenge.status) { result.status = challenge.status.toUpperCase(); } + if (challenge.approvalStatus) { + result.approvalStatus = challenge.approvalStatus.toUpperCase(); + } // terms if (!_.isNil(challenge.terms)) { result.terms = { diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 2315e85..f0527ae 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -51,6 +51,15 @@ const CHALLENGE_BILLING_LOCK_STATUSES = new Set([ ChallengeStatusEnum.APPROVED, ChallengeStatusEnum.ACTIVE, ]); +const CHALLENGE_APPROVAL_STATUS = { + PENDING_APPROVAL: "PENDING_APPROVAL", + APPROVED: "APPROVED", + REJECTED: "REJECTED", +}; +const CHALLENGE_APPROVAL_ACTION_STATUSES = new Set([ + CHALLENGE_APPROVAL_STATUS.APPROVED, + CHALLENGE_APPROVAL_STATUS.REJECTED, +]); // Provide aliases for friendlier sortBy query params const sortByAliases = { @@ -97,6 +106,39 @@ function normalizeStatusSortValue(statusValue) { return normalizedStatus; } +function normalizeApprovalStatus(value) { + if (_.isNil(value)) { + return null; + } + + const normalized = _.toString(value).trim().toUpperCase(); + if (!normalized) { + return null; + } + + if (!Object.values(CHALLENGE_APPROVAL_STATUS).includes(normalized)) { + return null; + } + + return normalized; +} + +async function userCanApproveChallengeBudget(currentUser, challengeOrProjectId) { + if (!currentUser) { + return false; + } + + if (currentUser.isMachine || hasAdminRole(currentUser)) { + return true; + } + + const projectId = _.isObject(challengeOrProjectId) + ? _.get(challengeOrProjectId, "projectId") + : challengeOrProjectId; + + return helper.userHasProjectManagerAccess(projectId, currentUser); +} + function compareStatusSortValues(aStatusValue, bStatusValue) { const normalizedA = normalizeStatusSortValue(aStatusValue); const normalizedB = normalizeStatusSortValue(bStatusValue); @@ -1991,6 +2033,39 @@ async function createChallenge(currentUser, challenge, userToken) { _.set(challenge, "legacy.reviewType", _.toUpper(_.get(challenge, "legacy.reviewType"))); } + const requestedApprovalStatus = normalizeApprovalStatus(challenge.approvalStatus); + const canApproveChallengeBudget = await userCanApproveChallengeBudget(currentUser, challenge); + + if (!requestedApprovalStatus) { + challenge.approvalStatus = CHALLENGE_APPROVAL_STATUS.PENDING_APPROVAL; + } else { + challenge.approvalStatus = requestedApprovalStatus; + } + + if ( + CHALLENGE_APPROVAL_ACTION_STATUSES.has(challenge.approvalStatus) && + !canApproveChallengeBudget + ) { + throw new errors.ForbiddenError( + "Only admins or project managers with full access can approve or reject challenge budgets.", + ); + } + + if (challenge.approvalStatus === CHALLENGE_APPROVAL_STATUS.REJECTED) { + const rejectionReason = _.toString(challenge.approvalRejectionReason || "").trim(); + if (!rejectionReason) { + throw new errors.BadRequestError("Rejection reason is required when rejecting a challenge."); + } + challenge.approvalRejectionReason = rejectionReason; + challenge.approvalApprovedBy = null; + } else if (challenge.approvalStatus === CHALLENGE_APPROVAL_STATUS.APPROVED) { + challenge.approvalRejectionReason = null; + challenge.approvalApprovedBy = _.toString(currentUser.handle || "").trim() || null; + } else { + challenge.approvalRejectionReason = null; + challenge.approvalApprovedBy = null; + } + if (!challenge.status) { challenge.status = ChallengeStatusEnum.NEW; } @@ -2370,6 +2445,11 @@ createChallenge.schema = { }) .optional(), startDate: Joi.date().iso(), + approvalStatus: Joi.string() + .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) + .insensitive(), + approvalRejectionReason: Joi.string().allow(null, ""), + approvalApprovedBy: Joi.string().allow(null, ""), status: Joi.string().valid( ChallengeStatusEnum.ACTIVE, ChallengeStatusEnum.NEW, @@ -3015,6 +3095,49 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { const sanitizedIncludesTerms = Object.prototype.hasOwnProperty.call(data, "terms"); const shouldReplaceTerms = sanitizedIncludesTerms || (payloadIncludesTerms && originalTermsValue === null); + const canApproveChallengeBudget = await userCanApproveChallengeBudget(currentUser, challenge); + const requestedApprovalStatus = normalizeApprovalStatus(data.approvalStatus); + const prizeSetsUpdated = + Array.isArray(data.prizeSets) && isDifferentPrizeSets(data.prizeSets, challenge.prizeSets); + + if (CHALLENGE_APPROVAL_ACTION_STATUSES.has(requestedApprovalStatus) && !canApproveChallengeBudget) { + throw new errors.ForbiddenError( + "Only admins or project managers with full access can approve or reject challenge budgets.", + ); + } + + if (requestedApprovalStatus === CHALLENGE_APPROVAL_STATUS.REJECTED) { + const rejectionReason = _.toString(data.approvalRejectionReason || "").trim(); + if (!rejectionReason) { + throw new errors.BadRequestError("Rejection reason is required when rejecting a challenge."); + } + data.approvalRejectionReason = rejectionReason; + data.approvalApprovedBy = null; + } else if (requestedApprovalStatus === CHALLENGE_APPROVAL_STATUS.APPROVED) { + data.approvalRejectionReason = null; + data.approvalApprovedBy = _.toString(currentUser.handle || "").trim() || null; + } + + if ( + challenge.status === ChallengeStatusEnum.ACTIVE && + prizeSetsUpdated && + !canApproveChallengeBudget + ) { + throw new errors.ForbiddenError( + "Prizes and copilot fee are locked after launch. Contact the Project Manager for updates.", + ); + } + + if (prizeSetsUpdated && challenge.status !== ChallengeStatusEnum.ACTIVE) { + data.approvalStatus = CHALLENGE_APPROVAL_STATUS.PENDING_APPROVAL; + data.approvalRejectionReason = null; + data.approvalApprovedBy = null; + } + + const resolvedApprovalStatus = + normalizeApprovalStatus(data.approvalStatus) || + normalizeApprovalStatus(challenge.approvalStatus) || + CHALLENGE_APPROVAL_STATUS.PENDING_APPROVAL; logger.debug(`Sanitized Data: ${JSON.stringify(data)}`); logger.debug(`updateChallenge(${challengeId}): fetching challenge resources`); @@ -3036,6 +3159,11 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { const isStatusChangingToActive = data.status === ChallengeStatusEnum.ACTIVE && challenge.status !== ChallengeStatusEnum.ACTIVE; + + if (isStatusChangingToActive && resolvedApprovalStatus !== CHALLENGE_APPROVAL_STATUS.APPROVED) { + throw new errors.BadRequestError("Challenge launch is blocked until budget approval is Approved."); + } + let sendActivationEmail = false; let sendSubmittedEmail = false; let sendCompletedEmail = false; @@ -3962,6 +4090,11 @@ updateChallenge.schema = { status: Joi.string() .valid(..._.values(ChallengeStatusEnum)) .insensitive(), + approvalStatus: Joi.string() + .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) + .insensitive(), + approvalRejectionReason: Joi.string().allow(null, ""), + approvalApprovedBy: Joi.string().allow(null, ""), attachments: Joi.array().items( Joi.object().keys({ id: Joi.id(), @@ -4324,6 +4457,9 @@ function sanitizeChallenge(challenge) { "legacyId", "startDate", "status", + "approvalStatus", + "approvalRejectionReason", + "approvalApprovedBy", "task", "groups", "cancelReason", From 54edb0c6a2ffa5ae53a714d590a81c321831ef00 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Thu, 30 Apr 2026 12:58:12 +0300 Subject: [PATCH 10/22] PR feedback --- src/services/ChallengeService.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index f0527ae..4b01097 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -2449,7 +2449,7 @@ createChallenge.schema = { .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) .insensitive(), approvalRejectionReason: Joi.string().allow(null, ""), - approvalApprovedBy: Joi.string().allow(null, ""), + approvalApprovedBy: Joi.any().forbidden(), status: Joi.string().valid( ChallengeStatusEnum.ACTIVE, ChallengeStatusEnum.NEW, @@ -3089,6 +3089,7 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { } data = preserveBillingMarkupForCopilotUpdate(currentUser, data, challenge); + const rawApprovalRejectionReason = _.toString(_.get(data, "approvalRejectionReason", "")); // Remove fields from data that are not allowed to be updated and that match the existing challenge data = sanitizeData(sanitizeChallenge(data), challenge); @@ -3107,7 +3108,7 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { } if (requestedApprovalStatus === CHALLENGE_APPROVAL_STATUS.REJECTED) { - const rejectionReason = _.toString(data.approvalRejectionReason || "").trim(); + const rejectionReason = rawApprovalRejectionReason.trim(); if (!rejectionReason) { throw new errors.BadRequestError("Rejection reason is required when rejecting a challenge."); } @@ -4094,7 +4095,7 @@ updateChallenge.schema = { .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) .insensitive(), approvalRejectionReason: Joi.string().allow(null, ""), - approvalApprovedBy: Joi.string().allow(null, ""), + approvalApprovedBy: Joi.any().forbidden(), attachments: Joi.array().items( Joi.object().keys({ id: Joi.id(), @@ -4458,8 +4459,6 @@ function sanitizeChallenge(challenge) { "startDate", "status", "approvalStatus", - "approvalRejectionReason", - "approvalApprovedBy", "task", "groups", "cancelReason", From 5f53bc0d5b6000e8524c4d29edf8e5ba35da738d Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Thu, 30 Apr 2026 13:17:29 +0300 Subject: [PATCH 11/22] cleanup --- src/services/ChallengeService.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 4b01097..4c5b615 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -3117,6 +3117,9 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { } else if (requestedApprovalStatus === CHALLENGE_APPROVAL_STATUS.APPROVED) { data.approvalRejectionReason = null; data.approvalApprovedBy = _.toString(currentUser.handle || "").trim() || null; + } else if (requestedApprovalStatus === CHALLENGE_APPROVAL_STATUS.PENDING_APPROVAL) { + data.approvalRejectionReason = null; + data.approvalApprovedBy = null; } if ( From 172b99ba82acb2c4eb3e4150d2717aa63d8c60c1 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Thu, 30 Apr 2026 13:51:42 +0300 Subject: [PATCH 12/22] Gatekeep approval status --- src/services/ChallengeService.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 4c5b615..9553f7e 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -3101,9 +3101,13 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { const prizeSetsUpdated = Array.isArray(data.prizeSets) && isDifferentPrizeSets(data.prizeSets, challenge.prizeSets); - if (CHALLENGE_APPROVAL_ACTION_STATUSES.has(requestedApprovalStatus) && !canApproveChallengeBudget) { + if ( + requestedApprovalStatus != null && + requestedApprovalStatus !== challenge.approvalStatus && + !canApproveChallengeBudget + ) { throw new errors.ForbiddenError( - "Only admins or project managers with full access can approve or reject challenge budgets.", + "Only admins or project managers with full access can change the challenge budget approval status.", ); } From 9f8028f425bd3b977c3062c994a49bce5a948792 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 4 May 2026 08:15:17 +0300 Subject: [PATCH 13/22] fix validation --- src/services/ChallengeService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index db4cb9c..8badf54 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -2528,7 +2528,7 @@ createChallenge.schema = { .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) .insensitive(), approvalRejectionReason: Joi.string().allow(null, ""), - approvalApprovedBy: Joi.any().forbidden(), + approvalApprovedBy: Joi.string().allow(null, ""), status: Joi.string().valid( ChallengeStatusEnum.ACTIVE, ChallengeStatusEnum.NEW, From 1159247401b588a6c1ba83f90fffd1103b36dcc0 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 4 May 2026 08:23:22 +0300 Subject: [PATCH 14/22] fix validation --- src/services/ChallengeService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 8badf54..885e478 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -4181,7 +4181,7 @@ updateChallenge.schema = { .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) .insensitive(), approvalRejectionReason: Joi.string().allow(null, ""), - approvalApprovedBy: Joi.any().forbidden(), + approvalApprovedBy: Joi.string().allow(null, ""),, attachments: Joi.array().items( Joi.object().keys({ id: Joi.id(), From a735bead7ad663a84aa2007bf04efdfe963661b4 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 4 May 2026 08:26:57 +0300 Subject: [PATCH 15/22] fix lint --- src/services/ChallengeService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 885e478..9dd592c 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -4181,7 +4181,7 @@ updateChallenge.schema = { .valid(...Object.values(CHALLENGE_APPROVAL_STATUS)) .insensitive(), approvalRejectionReason: Joi.string().allow(null, ""), - approvalApprovedBy: Joi.string().allow(null, ""),, + approvalApprovedBy: Joi.string().allow(null, ""), attachments: Joi.array().items( Joi.object().keys({ id: Joi.id(), From 6320e5f15798a62938d1e209c000f589c188f901 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 4 May 2026 09:11:49 +0300 Subject: [PATCH 16/22] Fix approval status --- src/services/ChallengeService.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 9dd592c..f783427 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -3215,7 +3215,11 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { ); } - if (prizeSetsUpdated && challenge.status !== ChallengeStatusEnum.ACTIVE) { + if ( + prizeSetsUpdated && + challenge.status !== ChallengeStatusEnum.ACTIVE && + (requestedApprovalStatus == null || !canApproveChallengeBudget) + ) { data.approvalStatus = CHALLENGE_APPROVAL_STATUS.PENDING_APPROVAL; data.approvalRejectionReason = null; data.approvalApprovedBy = null; From 02226338a9a7afd263620f5593a80ce1a0b24f43 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 4 May 2026 09:12:15 +0300 Subject: [PATCH 17/22] deploy --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index b61dec4..632368c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -92,6 +92,7 @@ workflows: - develop - PM-4478_add-ai-screening-phase-when-editing-after-launch - review-context + - PM-4684_challenge-approval-flow - "build-qa": context: org-global From 0869f051576519233c89c26699e604bfbd7acb25 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 4 May 2026 09:44:33 +0300 Subject: [PATCH 18/22] Fix prize check --- src/services/ChallengeService.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index f783427..e123855 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -2703,7 +2703,20 @@ getChallengeStatistics.schema = { * @returns {Boolean} true if different, false otherwise */ function isDifferentPrizeSets(prizeSets = [], otherPrizeSets = []) { - return !_.isEqual(_.sortBy(prizeSets, "type"), _.sortBy(otherPrizeSets, "type")); + const buildPrizeKeys = (sets) => + _.sortBy( + _.flatMap(sets || [], (prizeSet) => { + const normalizedType = _.toString(_.get(prizeSet, "type", "")).trim().toUpperCase(); + const prizes = Array.isArray(prizeSet && prizeSet.prizes) ? prizeSet.prizes : []; + + return prizes.map((prize) => { + const normalizedValue = _.toString(_.get(prize, "value", "")).trim(); + return `${normalizedType}:${normalizedValue}`; + }); + }), + ); + + return !_.isEqual(buildPrizeKeys(prizeSets), buildPrizeKeys(otherPrizeSets)); } /** From 5de25eade24d1557efbf89b3c4927c1d60bea016 Mon Sep 17 00:00:00 2001 From: Kiril Kartunov Date: Mon, 4 May 2026 10:21:02 +0300 Subject: [PATCH 19/22] Delete .github/workflows/code_reviewer.yml --- .github/workflows/code_reviewer.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/code_reviewer.yml diff --git a/.github/workflows/code_reviewer.yml b/.github/workflows/code_reviewer.yml deleted file mode 100644 index 82c7862..0000000 --- a/.github/workflows/code_reviewer.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: AI PR Reviewer - -on: - pull_request: - types: - - opened - - synchronize -permissions: - pull-requests: write -jobs: - tc-ai-pr-review: - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v3 - - - name: TC AI PR Reviewer - uses: topcoder-platform/tc-ai-pr-reviewer@master - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # The GITHUB_TOKEN is there by default so you just need to keep it like it is and not necessarily need to add it as secret as it will throw an error. [More Details](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret) - LAB45_API_KEY: ${{ secrets.LAB45_API_KEY }} - exclude: '**/*.json, **/*.md, **/*.jpg, **/*.png, **/*.jpeg, **/*.bmp, **/*.webp' # Optional: exclude patterns separated by commas \ No newline at end of file From 51c36857bc8c36e50c49d4a5eebdc374195979a5 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 5 May 2026 10:37:17 +0300 Subject: [PATCH 20/22] Allow PM to approve budget --- app-constants.js | 1 + src/routes.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app-constants.js b/app-constants.js index c4aa466..fdc998d 100644 --- a/app-constants.js +++ b/app-constants.js @@ -7,6 +7,7 @@ const UserRoles = { Admin: "administrator", Copilot: "copilot", Manager: "Connect Manager", + ProjectManager: "Project Manager", TalentManager: "Talent Manager", User: "Topcoder User", SelfServiceCustomer: "Self-Service Customer", diff --git a/src/routes.js b/src/routes.js index a55bc46..cbcad9b 100644 --- a/src/routes.js +++ b/src/routes.js @@ -11,6 +11,7 @@ const CHALLENGE_EDITOR_ACCESS_ROLES = [ constants.UserRoles.Admin, constants.UserRoles.Copilot, constants.UserRoles.Manager, + constants.UserRoles.ProjectManager, constants.UserRoles.TalentManager, ]; @@ -19,6 +20,7 @@ const CHALLENGE_EDITOR_ACCESS_ROLES_WITH_SELF_SERVICE = [ constants.UserRoles.SelfServiceCustomer, constants.UserRoles.Copilot, constants.UserRoles.Manager, + constants.UserRoles.ProjectManager, constants.UserRoles.TalentManager, ]; From 42440c3cd5468c42c99cc6c7efa0349ca73c44de Mon Sep 17 00:00:00 2001 From: jmgasper Date: Wed, 6 May 2026 10:54:54 +1000 Subject: [PATCH 21/22] PM-5021: Replace challenge skills on update What was broken Draft challenge updates that removed skill chips left the old ChallengeSkill rows in place, so saved drafts still showed removed skills. Root cause The update path converted incoming skills to nested Prisma creates but never deleted existing ChallengeSkill records before creating the replacement set. Empty skill arrays also skipped skill validation, which could bypass the completed-challenge guard once replacement works. What was changed When an update payload includes skills, the API deletes existing ChallengeSkill rows in the same transaction before creating the submitted rows. Skill validation now treats an empty submitted array as an explicit update while still preserving skills when the field is omitted. Any added/updated tests Added unit coverage for replacing persisted challenge skills with a smaller submitted set. --- src/common/challenge-helper.js | 8 ++-- src/services/ChallengeService.js | 6 +-- test/unit/ChallengeService.test.js | 65 ++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/src/common/challenge-helper.js b/src/common/challenge-helper.js index a319c36..896f689 100644 --- a/src/common/challenge-helper.js +++ b/src/common/challenge-helper.js @@ -132,11 +132,13 @@ class ChallengeHelper { /** * Validate Challenge skills. - * @param {Object} challenge the challenge - * @param {oldChallenge} challenge the old challenge data + * @param {Object} challenge the challenge payload. When skills are omitted they are left + * unchanged. + * @param {Object} oldChallenge the old challenge data used to block skill edits on completed + * challenges */ async validateSkills(challenge, oldChallenge) { - if (!challenge.skills || _.isEmpty(challenge.skills)) { + if (!challenge.skills) { return; } diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index e123855..eec2ac6 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -3918,9 +3918,9 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { if (shouldReplaceTerms) { await tx.challengeTerm.deleteMany({ where: { challengeId } }); } - // if (_.isNil(updateData.skills)) { - // await tx.challengeSkill.deleteMany({ where: { challengeId } }); - // } + if (!_.isNil(updateData.skills)) { + await tx.challengeSkill.deleteMany({ where: { challengeId } }); + } return await tx.challenge.update({ data: updateData, diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index da52eb8..e384d6b 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -1906,6 +1906,71 @@ describe("challenge service unit tests", () => { } }).timeout(5000); + it("replaces existing skills when update payload includes skills", async () => { + const challengeData = _.cloneDeep(testChallengeData); + challengeData.name = `${challengeData.name} Skills ${Date.now()}`; + challengeData.legacyId = Math.floor(Math.random() * 1000000); + const originalGetStandSkills = helper.getStandSkills; + const skillId1 = uuid(); + const skillId2 = uuid(); + let challengeWithSkills; + + helper.getStandSkills = async (ids) => + ids.map((skillId) => ({ + id: skillId, + name: `Skill ${skillId}`, + })); + + try { + challengeWithSkills = await service.createChallenge( + { isMachine: true, sub: "sub-skills-create", userId: 22838965 }, + challengeData, + config.M2M_FULL_ACCESS_TOKEN, + ); + + await prisma.challengeSkill.createMany({ + data: [ + { + challengeId: challengeWithSkills.id, + skillId: skillId1, + createdBy: "unit-test", + updatedBy: "unit-test", + }, + { + challengeId: challengeWithSkills.id, + skillId: skillId2, + createdBy: "unit-test", + updatedBy: "unit-test", + }, + ], + }); + + const updated = await service.updateChallenge( + { isMachine: true, sub: "sub-skills-update", userId: 22838965 }, + challengeWithSkills.id, + { + skills: [{ id: skillId2 }], + }, + ); + + should.exist(updated.skills); + should.equal(updated.skills.length, 1); + should.equal(updated.skills[0].id, skillId2); + should.equal(updated.skills[0].name, `Skill ${skillId2}`); + + const persistedSkills = await prisma.challengeSkill.findMany({ + where: { challengeId: challengeWithSkills.id }, + }); + should.equal(persistedSkills.length, 1); + should.equal(persistedSkills[0].skillId, skillId2); + } finally { + helper.getStandSkills = originalGetStandSkills; + if (challengeWithSkills && challengeWithSkills.id) { + await prisma.challenge.delete({ where: { id: challengeWithSkills.id } }); + } + } + }).timeout(5000); + it("update challenge successfully with winners", async () => { const result = await service.updateChallenge( { isMachine: true, sub: "sub3", userId: 22838965 }, From 8b8d89874ed9fbb9b026ea0c6a8151c6312f4b3c Mon Sep 17 00:00:00 2001 From: jmgasper Date: Wed, 6 May 2026 20:09:55 +1000 Subject: [PATCH 22/22] Apply ratings at the end of a challenge --- README.md | 1 + src/common/helper.js | 43 ++++++++++++ src/scripts/add-ai-tags-to-challenges.sql | 86 +++++++++++++++++++++++ src/services/ChallengeService.js | 8 +++ test/unit/ChallengeService.test.js | 4 ++ 5 files changed, 142 insertions(+) create mode 100644 src/scripts/add-ai-tags-to-challenges.sql diff --git a/README.md b/README.md index 37456e7..d047c0e 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ The following parameters can be set in config files or in env variables: - AMAZON.AWS_REGION: The Amazon certificate region to use when connecting. - AMAZON.ATTACHMENT_S3_BUCKET: the AWS S3 bucket to store attachments - FILE_UPLOAD_SIZE_LIMIT: the file upload size limit in bytes +- MEMBERS_API_URL: member-api members base URL; used to trigger challenge submitter rating updates after a challenge is completed - RESOURCES_API_URL: TC resources API base URL - GROUPS_API_URL: TC groups API base URL - PROJECTS_API_URL: TC projects API base URL diff --git a/src/common/helper.js b/src/common/helper.js index 09680e9..8b9bcd4 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -523,6 +523,48 @@ async function generateChallengePayments(challengeId) { } } +/** + * Trigger member-api to rerate all rating dimensions for submitters on a completed challenge. + * Member-api owns the rating dimension selection, including native track/type + * ratings and configured named rating paths such as AI. + * @param {String|Number} challengeId the completed challenge id + * @returns {Boolean} true if member-api accepted the request, false otherwise + */ +async function rerateChallengeSubmitterRatings(challengeId) { + if (!config.MEMBERS_API_URL) { + logger.warn("helper.rerateChallengeSubmitterRatings: MEMBERS_API_URL not configured"); + return false; + } + + const baseUrl = String(config.MEMBERS_API_URL).replace(/\/+$/, ""); + const url = `${baseUrl}/stats/rerate-challenge`; + logger.debug(`helper.rerateChallengeSubmitterRatings: POST ${url}`); + + try { + const token = await m2mHelper.getM2MToken(); + const res = await axios.post( + url, + { challengeId }, + { + headers: { Authorization: `Bearer ${token}` }, + }, + ); + logger.debug( + `helper.rerateChallengeSubmitterRatings: response status ${res.status} for challenge ${challengeId}`, + ); + return res.status >= 200 && res.status < 300; + } catch (err) { + logger.debug( + `helper.rerateChallengeSubmitterRatings: error for challenge ${challengeId} - status ${_.get( + err, + "response.status", + "n/a", + )}: ${err.message}`, + ); + return false; + } +} + /** * Cancel project * @param {String} projectId the project id @@ -1995,6 +2037,7 @@ module.exports = { capturePayment, cancelPayment, generateChallengePayments, + rerateChallengeSubmitterRatings, sendSelfServiceNotification, getMemberByHandle, getMembersByHandles, diff --git a/src/scripts/add-ai-tags-to-challenges.sql b/src/scripts/add-ai-tags-to-challenges.sql new file mode 100644 index 0000000..d5ec9e6 --- /dev/null +++ b/src/scripts/add-ai-tags-to-challenges.sql @@ -0,0 +1,86 @@ +-- Add the "AI" and "AI Exponential League" tags to selected challenges. +-- +-- Replace the ARRAY values below with the challenge IDs to update, then run this +-- against the PostgreSQL database that contains the "challenges" schema. +-- Existing tags are preserved, and either tag is only appended when it is not +-- already present on a challenge. + +BEGIN; + +CREATE TEMP TABLE "_challenge_ai_tag_input" ( + "challengeId" TEXT PRIMARY KEY +) ON COMMIT DROP; + +INSERT INTO "_challenge_ai_tag_input" ("challengeId") +SELECT DISTINCT input."challengeId" +FROM unnest( + ARRAY[ + -- '00000000-0000-0000-0000-000000000000' + ]::text[] +) AS input("challengeId") +WHERE input."challengeId" IS NOT NULL; + +-- IDs from the input array that do not match an existing challenge. +SELECT input."challengeId" AS "missingChallengeId" +FROM "_challenge_ai_tag_input" input +LEFT JOIN "challenges"."Challenge" c + ON c."id" = input."challengeId" +WHERE c."id" IS NULL +ORDER BY input."challengeId"; + +-- Summary before the update. +WITH requested_tags AS ( + SELECT ARRAY['AI', 'AI Exponential League']::text[] AS "tags" +), +matched_challenges AS ( + SELECT + c."id", + c."tags", + requested_tags."tags" AS "requestedTags" + FROM "challenges"."Challenge" c + INNER JOIN "_challenge_ai_tag_input" input + ON input."challengeId" = c."id" + CROSS JOIN requested_tags +) +SELECT + COUNT(*) AS "matchingChallenges", + COUNT(*) FILTER ( + WHERE NOT COALESCE("tags", ARRAY[]::text[]) @> "requestedTags" + ) AS "challengesNeedingUpdate" +FROM matched_challenges; + +WITH requested_tags AS ( + SELECT ARRAY['AI', 'AI Exponential League']::text[] AS "tags" +), +updated AS ( + UPDATE "challenges"."Challenge" c + SET + "tags" = COALESCE(c."tags", ARRAY[]::text[]) || ARRAY( + SELECT requested."tag" + FROM unnest(requested_tags."tags") AS requested("tag") + WHERE NOT requested."tag" = ANY(COALESCE(c."tags", ARRAY[]::text[])) + ), + "updatedAt" = CURRENT_TIMESTAMP, + "updatedBy" = 'add-ai-tags-to-challenges' + FROM "_challenge_ai_tag_input" input + CROSS JOIN requested_tags + WHERE c."id" = input."challengeId" + AND NOT COALESCE(c."tags", ARRAY[]::text[]) @> requested_tags."tags" + RETURNING + c."id", + c."tags" +) +SELECT + COUNT(*) AS "challengesUpdated" +FROM updated; + +-- Spot-check all input challenges after the update. +SELECT + c."id" AS "challengeId", + c."tags" +FROM "challenges"."Challenge" c +INNER JOIN "_challenge_ai_tag_input" input + ON input."challengeId" = c."id" +ORDER BY c."id"; + +COMMIT; diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 2315e85..59568e8 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -3036,6 +3036,9 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { const isStatusChangingToActive = data.status === ChallengeStatusEnum.ACTIVE && challenge.status !== ChallengeStatusEnum.ACTIVE; + const isStatusChangingToCompleted = + data.status === ChallengeStatusEnum.COMPLETED && + challenge.status !== ChallengeStatusEnum.COMPLETED; let sendActivationEmail = false; let sendSubmittedEmail = false; let sendCompletedEmail = false; @@ -3731,6 +3734,11 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) { await indexChallengeAndPostToKafka(committed, track, type); } + if (isStatusChangingToCompleted) { + logger.info(`Triggering member rating updates for completed challenge ${challengeId}`); + void helper.rerateChallengeSubmitterRatings(challengeId); + } + // Convert to response shape before any business-logic checks that expect it prismaHelper.convertModelToResponse(updatedChallenge); await enrichSkillsData(updatedChallenge); diff --git a/test/unit/ChallengeService.test.js b/test/unit/ChallengeService.test.js index 5f0d62d..38738ac 100644 --- a/test/unit/ChallengeService.test.js +++ b/test/unit/ChallengeService.test.js @@ -50,6 +50,7 @@ describe("challenge service unit tests", () => { let createdChallengeData; let billingLockRequests; let originalLockChallengeBillingAccountAmount; + let originalRerateChallengeSubmitterRatings; const notFoundId = uuid(); const authUser = { userId: "testuser", @@ -167,10 +168,13 @@ describe("challenge service unit tests", () => { billingLockRequests.push(_.cloneDeep(request)); return { locked: true }; }; + originalRerateChallengeSubmitterRatings = helper.rerateChallengeSubmitterRatings; + helper.rerateChallengeSubmitterRatings = async () => true; }); afterEach(() => { projectHelper.lockChallengeBillingAccountAmount = originalLockChallengeBillingAccountAmount; + helper.rerateChallengeSubmitterRatings = originalRerateChallengeSubmitterRatings; }); after(async () => {