diff --git a/app/challenges-platform/index.ts b/app/challenges-platform/index.ts index 042382b..c8e8239 100644 --- a/app/challenges-platform/index.ts +++ b/app/challenges-platform/index.ts @@ -1,12 +1,12 @@ export { + AccessibleChallengesService, ChallengesService, ParticipantsService, ReviewsService, SubmissionService, - AccessibleChallengesService, } from "./services"; -import { Transformer } from "./models"; import { transformers } from "../../config/challenges-platform/transformers"; +import { Transformer } from "./models"; import { BaseTransformer } from "./models/Transformer"; class ChallengesPlatform { diff --git a/app/challenges-platform/models/index.ts b/app/challenges-platform/models/index.ts index f6b9bc5..7a8e7a9 100644 --- a/app/challenges-platform/models/index.ts +++ b/app/challenges-platform/models/index.ts @@ -1,4 +1,4 @@ -export { Challenge, Format, Evaluation } from "./Challenge"; +export { Challenge, Evaluation, Format } from "./Challenge"; export { Participant } from "./Participant"; export { Review, Status } from "./Review"; export { Submission } from "./Submission"; diff --git a/app/challenges-platform/services/accessible-challenges-service.ts b/app/challenges-platform/services/accessible-challenges-service.ts index afeb5d7..0e6e2a0 100644 --- a/app/challenges-platform/services/accessible-challenges-service.ts +++ b/app/challenges-platform/services/accessible-challenges-service.ts @@ -1,7 +1,7 @@ -import { accessibleChallenges } from "../../../db/schema"; -import { Ok, Result } from "ts-results"; import { eq } from "drizzle-orm"; +import { Ok, Result } from "ts-results"; import { db } from "../../../db"; +import { accessibleChallenges } from "../../../db/schema"; import { Challenge, Participant } from "../models"; export const count = async ( diff --git a/app/challenges-platform/services/challenges-service.ts b/app/challenges-platform/services/challenges-service.ts index f702638..d17196d 100644 --- a/app/challenges-platform/services/challenges-service.ts +++ b/app/challenges-platform/services/challenges-service.ts @@ -1,10 +1,10 @@ import { eq } from "drizzle-orm"; -import { Ok, Err, Result } from "ts-results"; -import { Challenge, Format, Evaluation } from "../models/Challenge"; +import { Err, Ok, Result } from "ts-results"; +import { uuid } from "../../../app/common"; import { db } from "../../../db"; import { challenges } from "../../../db/schema"; -import { uuid } from "../../../app/common"; import { challengesPlatform } from "../index"; +import { Challenge } from "../models/Challenge"; export const findByUuid = async ( id: string, diff --git a/app/challenges-platform/services/participants-service.ts b/app/challenges-platform/services/participants-service.ts index 07dbe2f..ed9f9d9 100644 --- a/app/challenges-platform/services/participants-service.ts +++ b/app/challenges-platform/services/participants-service.ts @@ -1,9 +1,9 @@ import { eq } from "drizzle-orm"; -import { Ok, Err, Result } from "ts-results"; -import { Participant } from "../models/Participant"; +import { Err, Ok, Result } from "ts-results"; +import { uuid } from "../../../app/common"; import { db } from "../../../db"; import { participants } from "../../../db/schema"; -import { uuid } from "../../../app/common"; +import { Participant } from "../models/Participant"; export const findByUuid = async ( id: string, diff --git a/app/challenges-platform/services/reviews-service.ts b/app/challenges-platform/services/reviews-service.ts index b221159..8feaecb 100644 --- a/app/challenges-platform/services/reviews-service.ts +++ b/app/challenges-platform/services/reviews-service.ts @@ -1,9 +1,9 @@ import { eq } from "drizzle-orm"; -import { Ok, Err, Result } from "ts-results"; -import { Review, Status } from "../models/Review"; +import { Err, Ok, Result } from "ts-results"; +import { uuid } from "../../../app/common"; import { db } from "../../../db"; import { reviews } from "../../../db/schema"; -import { uuid } from "../../../app/common"; +import { Review, Status } from "../models/Review"; export const findByUuid = async ( id: string, @@ -29,7 +29,15 @@ export const create = async ( body: string, ): Promise> => { // TODO: add a check to make sure the submission exists - // TODO: check if submission has already been approved or rejected, handle accordingly + + const check = await db + .select() + .from(reviews) + .where(eq(reviews.submissionId, submissionId)); + + if (check.length > 0) { + return Err(new Error("Submission has already been reviewed")); + } const id = uuid.create(); diff --git a/app/challenges-platform/services/submissions-service.ts b/app/challenges-platform/services/submissions-service.ts index 6fbbf02..55800c2 100644 --- a/app/challenges-platform/services/submissions-service.ts +++ b/app/challenges-platform/services/submissions-service.ts @@ -1,15 +1,15 @@ import { eq } from "drizzle-orm"; -import { Ok, Err, Result } from "ts-results"; +import { Err, Ok, Result } from "ts-results"; +import { challengesPlatform } from ".."; +import { uuid } from "../../../app/common"; import { db } from "../../../db"; import { submissions } from "../../../db/schema"; -import { uuid } from "../../../app/common"; import { Challenge, Participant, Submission } from "../models"; import { AccessibleChallengesService, ChallengesService, ParticipantsService, } from "../services"; -import { challengesPlatform } from ".."; export const findByUuid = async ( id: string, diff --git a/config/challenges-platform/transformers.ts b/config/challenges-platform/transformers.ts index 891de52..dd231a2 100644 --- a/config/challenges-platform/transformers.ts +++ b/config/challenges-platform/transformers.ts @@ -1,7 +1,7 @@ -import { GithubIssueTransformer } from "../../app/event-management/models/GithubIssueChallenge"; +import { Transformer } from "../../app/challenges-platform/models"; import { FlagTransformer } from "../../app/event-management/models/FlagChallenge"; +import { GithubIssueTransformer } from "../../app/event-management/models/GithubIssueChallenge"; import { PhotoTransformer } from "../../app/event-management/models/PhotoChallenge"; -import { Transformer } from "../../app/challenges-platform/models"; export const transformers: { [name: string]: typeof Transformer } = { flag: FlagTransformer, diff --git a/config/express/index.ts b/config/express/index.ts index d69f197..3f2499f 100644 --- a/config/express/index.ts +++ b/config/express/index.ts @@ -1,7 +1,7 @@ -import express, { Express } from "express"; import cors from "cors"; import dotenv from "dotenv"; -import { notFound, errorHandler } from "./middleware"; +import express, { Express } from "express"; +import { errorHandler, notFound } from "./middleware"; import { default as restRouter } from "./router"; dotenv.config(); diff --git a/db/index.ts b/db/index.ts index 66e96a5..0c2ed70 100644 --- a/db/index.ts +++ b/db/index.ts @@ -1,9 +1,9 @@ +import Database from "better-sqlite3"; +import dotenv from "dotenv"; import { drizzle, type BetterSQLite3Database, } from "drizzle-orm/better-sqlite3"; -import Database from "better-sqlite3"; -import dotenv from "dotenv"; import * as schema from "./schema"; diff --git a/drizzle.config.ts b/drizzle.config.ts index 04fcdbf..74f0214 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,5 +1,5 @@ -import type { Config } from "drizzle-kit"; import dotenv from "dotenv"; +import type { Config } from "drizzle-kit"; dotenv.config(); diff --git a/test/challenges-platform/factories/accessible-challenge-factory.ts b/test/challenges-platform/factories/accessible-challenge-factory.ts index c048c9b..1318948 100644 --- a/test/challenges-platform/factories/accessible-challenge-factory.ts +++ b/test/challenges-platform/factories/accessible-challenge-factory.ts @@ -1,11 +1,11 @@ -import { challengeFactory } from "./challenge-factory"; -import { participantFactory } from "./participant-factory"; import { Challenge, Participant, } from "../../../app/challenges-platform/models"; import { db } from "../../../db"; import { accessibleChallenges } from "../../../db/schema"; +import { challengeFactory } from "./challenge-factory"; +import { participantFactory } from "./participant-factory"; export const accessibleChallengeFactory = async ({ challenge, diff --git a/test/challenges-platform/factories/participant-factory.ts b/test/challenges-platform/factories/participant-factory.ts index 5b1c2f2..8d4945e 100644 --- a/test/challenges-platform/factories/participant-factory.ts +++ b/test/challenges-platform/factories/participant-factory.ts @@ -1,5 +1,5 @@ -import { ParticipantsService } from "../../../app/challenges-platform/services"; import { Participant } from "../../../app/challenges-platform/models"; +import { ParticipantsService } from "../../../app/challenges-platform/services"; export const participantFactory = async ( email?: string, diff --git a/test/challenges-platform/factories/submission-factory.ts b/test/challenges-platform/factories/submission-factory.ts index b715f4a..33930fc 100644 --- a/test/challenges-platform/factories/submission-factory.ts +++ b/test/challenges-platform/factories/submission-factory.ts @@ -1,11 +1,11 @@ -import { challengeFactory } from "./challenge-factory"; -import { participantFactory } from "./participant-factory"; +import { SubmissionService } from "../../../app/challenges-platform"; import { Challenge, Participant, Submission, } from "../../../app/challenges-platform/models"; -import { SubmissionService } from "../../../app/challenges-platform"; +import { challengeFactory } from "./challenge-factory"; +import { participantFactory } from "./participant-factory"; export const submissionFactory = async ({ participant, diff --git a/test/challenges-platform/models/Transformer.test.ts b/test/challenges-platform/models/Transformer.test.ts index a2ed3e8..6409700 100644 --- a/test/challenges-platform/models/Transformer.test.ts +++ b/test/challenges-platform/models/Transformer.test.ts @@ -1,9 +1,9 @@ -import { BaseTransformer } from "../../../app/challenges-platform/models/Transformer"; import { Challenge, Evaluation, Format, } from "../../../app/challenges-platform/models"; +import { BaseTransformer } from "../../../app/challenges-platform/models/Transformer"; describe("BaseTransformer", () => { describe("newChallenge", () => { diff --git a/test/challenges-platform/services/accessible-challenges-service.test.ts b/test/challenges-platform/services/accessible-challenges-service.test.ts index 844b2d6..b2cd305 100644 --- a/test/challenges-platform/services/accessible-challenges-service.test.ts +++ b/test/challenges-platform/services/accessible-challenges-service.test.ts @@ -1,7 +1,7 @@ +import { AccessibleChallengesService } from "../../../app/challenges-platform"; +import { accessibleChallengeFactory } from "../factories/accessible-challenge-factory"; import { challengeFactory } from "../factories/challenge-factory"; import { participantFactory } from "../factories/participant-factory"; -import { accessibleChallengeFactory } from "../factories/accessible-challenge-factory"; -import { AccessibleChallengesService } from "../../../app/challenges-platform"; describe("AccessibleChallengesService", () => { describe("count", () => { diff --git a/test/challenges-platform/services/challenges-service.test.ts b/test/challenges-platform/services/challenges-service.test.ts index 9e15a09..fa4c5f5 100644 --- a/test/challenges-platform/services/challenges-service.test.ts +++ b/test/challenges-platform/services/challenges-service.test.ts @@ -1,9 +1,10 @@ -import { ChallengesService } from "../../../app/challenges-platform"; -import { challengeFactory } from "../factories/challenge-factory"; -import { CustomTransformer, CustomChallenge } from "../custom-transformer"; -import { challengesPlatform } from "../../../app/challenges-platform"; -import { desc } from "drizzle-orm"; +import { + ChallengesService, + challengesPlatform, +} from "../../../app/challenges-platform"; import { uuid } from "../../../app/common"; +import { CustomChallenge, CustomTransformer } from "../custom-transformer"; +import { challengeFactory } from "../factories/challenge-factory"; describe("ChallengesService", () => { describe("findByUuid", () => { diff --git a/test/challenges-platform/services/participants-service.test.ts b/test/challenges-platform/services/participants-service.test.ts index 6bbdd58..8fcdf8b 100644 --- a/test/challenges-platform/services/participants-service.test.ts +++ b/test/challenges-platform/services/participants-service.test.ts @@ -1,6 +1,6 @@ import { ParticipantsService } from "../../../app/challenges-platform"; -import { participantFactory } from "../factories/participant-factory"; import { uuid } from "../../../app/common"; +import { participantFactory } from "../factories/participant-factory"; describe("ParticipantsService", () => { describe("create", () => { diff --git a/test/challenges-platform/services/reviews-service.test.ts b/test/challenges-platform/services/reviews-service.test.ts index f891820..235a7ea 100644 --- a/test/challenges-platform/services/reviews-service.test.ts +++ b/test/challenges-platform/services/reviews-service.test.ts @@ -1,11 +1,9 @@ import { ReviewsService } from "../../../app/challenges-platform"; import { Status } from "../../../app/challenges-platform/models"; import { uuid } from "../../../app/common"; +import { accessibleChallengeFactory } from "../factories/accessible-challenge-factory"; import { reviewFactory } from "../factories/review-factory"; -import { challengeFactory } from "../factories/challenge-factory"; -import { participantFactory } from "../factories/participant-factory"; import { submissionFactory } from "../factories/submission-factory"; -import { accessibleChallengeFactory } from "../factories/accessible-challenge-factory"; describe("ReviewsService", () => { describe("create", () => { @@ -29,6 +27,31 @@ describe("ReviewsService", () => { expect(result.val.comment).toBe(body); }); }); + describe("when submission has already been reviewed", () => { + it("returns an error", async () => { + const [challenge, participant] = await accessibleChallengeFactory(); + const submission = await submissionFactory({ + challenge: challenge, + participant: participant, + }); + const body = "Nice work"; + await reviewFactory({ + submission: submission, + body: body, + }); + + const result = await ReviewsService.create( + Status.APPROVED, + submission.id, + body, + ); + + expect(result.err).toBe(true); + expect(result.val.toString()).toBe( + "Error: Submission has already been reviewed", + ); + }); + }); describe("when submission does not exist", () => { it("returns an error", async () => { const invalidId = -1; diff --git a/test/challenges-platform/services/submissions-service.test.ts b/test/challenges-platform/services/submissions-service.test.ts index 6c6132f..a4a4779 100644 --- a/test/challenges-platform/services/submissions-service.test.ts +++ b/test/challenges-platform/services/submissions-service.test.ts @@ -2,10 +2,10 @@ import { ChallengesService, SubmissionService, } from "../../../app/challenges-platform"; +import { uuid } from "../../../app/common"; +import { accessibleChallengeFactory } from "../factories/accessible-challenge-factory"; import { challengeFactory } from "../factories/challenge-factory"; import { participantFactory } from "../factories/participant-factory"; -import { accessibleChallengeFactory } from "../factories/accessible-challenge-factory"; -import { uuid } from "../../../app/common"; describe("SubmissionService", () => { describe("findByUuid", () => { diff --git a/test/event-management/models/FlagChallenge.test.ts b/test/event-management/models/FlagChallenge.test.ts index 0fac1a7..c653853 100644 --- a/test/event-management/models/FlagChallenge.test.ts +++ b/test/event-management/models/FlagChallenge.test.ts @@ -1,7 +1,9 @@ -import { FlagChallenge } from "../../../app/event-management/models/FlagChallenge"; -import { FlagChallengeSubmission } from "../../../app/event-management/models/FlagChallenge"; import { Format } from "../../../app/challenges-platform/models"; -import { FlagTransformer } from "../../../app/event-management/models/FlagChallenge"; +import { + FlagChallenge, + FlagChallengeSubmission, + FlagTransformer, +} from "../../../app/event-management/models/FlagChallenge"; import { challengeFactory } from "../../challenges-platform/factories/challenge-factory"; import { participantFactory } from "../../challenges-platform/factories/participant-factory";