Skip to content

Commit bf13350

Browse files
committed
requested changes
1 parent af7438f commit bf13350

31 files changed

Lines changed: 403 additions & 442 deletions

File tree

devContainerization/Dockerfile.backend.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:20-slim
1+
FROM node:20
22
WORKDIR /base
33

44
COPY package.json tsconfig.build.json ./

src/backend/src/controllers/organizations.controllers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ export default class OrganizationsController {
182182

183183
static async getPartReviewGuideLink(req: Request, res: Response, next: NextFunction) {
184184
try {
185-
const guideLink = await OrganizationsService.getPartReviewGuideLink(req.organization.organizationId);
185+
const guideLink = await OrganizationsService.getPartReviewGuideLink(req.organization.organizationId, req.currentUser);
186186
res.status(200).json(guideLink);
187187
} catch (error: unknown) {
188188
next(error);

src/backend/src/controllers/part-review.controllers.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default class PartReviewController {
2020
try {
2121
const wbsNumber: WbsNumber = validateWBS(req.params.wbsNum);
2222

23-
const parts = await PartReviewService.getAllPartsForProject(wbsNumber, req.organization);
23+
const parts = await PartReviewService.getAllPartsForProject(wbsNumber, req.organization, req.currentUser);
2424
res.status(200).json(parts);
2525
} catch (error: unknown) {
2626
next(error);
@@ -73,7 +73,7 @@ export default class PartReviewController {
7373
throw new HttpException(400, 'Invalid or undefined file data');
7474
}
7575

76-
const fileId = await PartReviewService.uploadFile(req.file);
76+
const fileId = await PartReviewService.uploadFile(req.file, req.currentUser, req.organization);
7777

7878
res.status(200).json(fileId);
7979
} catch (error: unknown) {
@@ -107,7 +107,7 @@ export default class PartReviewController {
107107
try {
108108
const { partId } = req.params;
109109
await PartReviewService.deletePart(partId, req.currentUser, req.organization.organizationId);
110-
res.status(200).json({ message: `Successfully deleted part #${partId}` });
110+
res.status(204).json({ message: `Successfully deleted part #${partId}` });
111111
} catch (error: unknown) {
112112
next(error);
113113
}
@@ -152,7 +152,7 @@ export default class PartReviewController {
152152
try {
153153
const { reviewId } = req.params;
154154
await PartReviewService.deleteReview(reviewId, req.currentUser, req.organization.organizationId);
155-
res.status(200).json({ message: 'Successfully deleted review' });
155+
res.status(204).json({ message: 'Successfully deleted review' });
156156
} catch (error: unknown) {
157157
next(error);
158158
}
@@ -246,7 +246,7 @@ export default class PartReviewController {
246246
try {
247247
const { partTagId } = req.params;
248248
await PartReviewService.deletePartTag(partTagId, req.currentUser, req.organization.organizationId);
249-
res.status(200).send({ message: 'Successfully deleted part tag' });
249+
res.status(204).send({ message: 'Successfully deleted part tag' });
250250
} catch (error: unknown) {
251251
next(error);
252252
}
@@ -283,7 +283,7 @@ export default class PartReviewController {
283283
try {
284284
const { faqId } = req.params;
285285
const deletedfaq = await PartReviewService.deleteFaq(faqId, req.currentUser, req.organization.organizationId);
286-
res.status(200).json(deletedfaq);
286+
res.status(204).json(deletedfaq);
287287
} catch (error: unknown) {
288288
next(error);
289289
}
@@ -336,7 +336,7 @@ export default class PartReviewController {
336336
try {
337337
const { commonMistakeId } = req.params;
338338
await PartReviewService.deleteCommonMistake(commonMistakeId, req.currentUser, req.organization.organizationId);
339-
res.status(200).json({ message: 'Successfully deleted common mistake' });
339+
res.status(204).json({ message: 'Successfully deleted common mistake' });
340340
} catch (error: unknown) {
341341
next(error);
342342
}
@@ -366,7 +366,7 @@ export default class PartReviewController {
366366

367367
await PartReviewService.deletePartReviewRequest(reviewRequestId, req.currentUser, req.organization.organizationId);
368368

369-
res.status(200).json({ message: 'Successfully deleted review request' });
369+
res.status(204).json({ message: 'Successfully deleted review request' });
370370
} catch (error) {
371371
next(error);
372372
}
@@ -375,7 +375,7 @@ export default class PartReviewController {
375375
static async notifyReviewer(req: Request, res: Response, next: NextFunction) {
376376
try {
377377
const { reviewerId, partId } = req.body;
378-
await PartReviewService.notifyReviewer(reviewerId, partId, req.organization.organizationId);
378+
await PartReviewService.notifyReviewer(reviewerId, partId, req.currentUser, req.organization.organizationId);
379379
res.status(200).json({ message: 'Successfully notified reviewer' });
380380
} catch (error) {
381381
next(error);
@@ -385,7 +385,7 @@ export default class PartReviewController {
385385
static async notifyAssignee(req: Request, res: Response, next: NextFunction) {
386386
try {
387387
const { assigneeId, partId } = req.body;
388-
await PartReviewService.notifyAssignee(assigneeId, partId, req.organization.organizationId);
388+
await PartReviewService.notifyAssignee(assigneeId, partId, req.currentUser, req.organization.organizationId);
389389
res.status(200).json({ message: 'Successfully notified assignee' });
390390
} catch (error) {
391391
next(error);
@@ -442,7 +442,7 @@ export default class PartReviewController {
442442
const { popupId } = req.params;
443443
const organizationID = req.organization.organizationId;
444444
await PartReviewService.deletePartReviewPopup(popupId, user, organizationID);
445-
res.status(200).json({ message: 'Popup deleted successfully' });
445+
res.status(204).json({ message: 'Popup deleted successfully' });
446446
} catch (error) {
447447
next(error);
448448
}
@@ -452,7 +452,7 @@ export default class PartReviewController {
452452
try {
453453
const { fileId } = req.params;
454454

455-
const fileData = await PartReviewService.downloadFile(fileId);
455+
const fileData = await PartReviewService.downloadFile(fileId, req.currentUser, req.organization);
456456

457457
res.setHeader('content-type', String(fileData.type));
458458
res.setHeader('content-disposition', `attachment; filename="file-${fileId}"`);

src/backend/src/prisma-query-args/part-review.query-args.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,26 @@ export type PartSubmissionQueryArgs = ReturnType<typeof getPartSubmissionQueryAr
66
export type PartReviewQueryArgs = ReturnType<typeof getPartReviewQueryArgs>;
77
export type PartReviewRequestQueryArgs = ReturnType<typeof getPartReviewRequestQueryArgs>;
88

9-
export const getPartQueryArgs = (organizationId: string) =>
9+
export const getPartQueryArgs = (organizationId: string, userId: string) =>
1010
Prisma.validator<Prisma.PartDefaultArgs>()({
1111
include: {
1212
tags: true,
13-
submissions: { where: { dateDeleted: null }, ...getPartSubmissionQueryArgs(organizationId) },
13+
submissions: { where: { dateDeleted: null }, ...getPartSubmissionQueryArgs(organizationId, userId) },
1414
reviewRequests: { where: { dateDeleted: null }, ...getPartReviewRequestQueryArgs(organizationId) },
1515
assignees: getUserQueryArgs(organizationId),
16-
userCreated: getUserQueryArgs(organizationId)
16+
userCreated: getUserQueryArgs(organizationId),
17+
project: { include: { wbsElement: true } }
1718
}
1819
});
1920

20-
export const getPartSubmissionQueryArgs = (organizationId: string) =>
21+
export const getPartSubmissionQueryArgs = (organizationId: string, userId: string) =>
2122
Prisma.validator<Prisma.PartSubmissionDefaultArgs>()({
2223
include: {
2324
userCreated: getUserQueryArgs(organizationId),
24-
reviews: { where: { dateDeleted: null }, ...getPartReviewQueryArgs(organizationId) }
25+
reviews: {
26+
where: { dateDeleted: null, OR: [{ NOT: { completedAt: null } }, { userCreatedId: userId }] },
27+
...getPartReviewQueryArgs(organizationId)
28+
}
2529
}
2630
});
2731

src/backend/src/prisma/migrations/20250602143025_part_file_review/migration.sql renamed to src/backend/src/prisma/migrations/20250610205933_part_file_review/migration.sql

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ ADD COLUMN "partReviewSampleImageId" TEXT;
1919
-- AlterTable
2020
ALTER TABLE "Project" ADD COLUMN "abbreviation" TEXT;
2121

22+
-- AlterTable
23+
ALTER TABLE "_Project_TemplateToTeam" ADD CONSTRAINT "_Project_TemplateToTeam_AB_pkey" PRIMARY KEY ("A", "B");
24+
25+
-- DropIndex
26+
DROP INDEX "_Project_TemplateToTeam_AB_unique";
27+
2228
-- CreateTable
2329
CREATE TABLE "Part" (
2430
"partId" TEXT NOT NULL,
@@ -33,7 +39,7 @@ CREATE TABLE "Part" (
3339
"dateDeleted" TIMESTAMP(3),
3440
"userCreatedId" TEXT NOT NULL,
3541
"userDeletedId" TEXT,
36-
42+
3743
CONSTRAINT "Part_pkey" PRIMARY KEY ("partId")
3844
);
3945

@@ -120,35 +126,33 @@ CREATE TABLE "PartReviewCommonMistake" (
120126
"userDeletedId" TEXT,
121127
"dateCreated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
122128
"dateDeleted" TIMESTAMP(3),
123-
"organizationId" TEXT,
129+
"organizationId" TEXT NOT NULL,
124130

125131
CONSTRAINT "PartReviewCommonMistake_pkey" PRIMARY KEY ("partReviewCommonMistakeId")
126132
);
127133

128134
-- CreateTable
129135
CREATE TABLE "_PartToPartTag" (
130136
"A" TEXT NOT NULL,
131-
"B" TEXT NOT NULL
137+
"B" TEXT NOT NULL,
138+
139+
CONSTRAINT "_PartToPartTag_AB_pkey" PRIMARY KEY ("A","B")
132140
);
133141

134142
-- CreateTable
135143
CREATE TABLE "_partAssignees" (
136144
"A" TEXT NOT NULL,
137-
"B" TEXT NOT NULL
145+
"B" TEXT NOT NULL,
146+
147+
CONSTRAINT "_partAssignees_AB_pkey" PRIMARY KEY ("A","B")
138148
);
139149

140150
-- CreateIndex
141151
CREATE UNIQUE INDEX "Part_projectId_index_key" ON "Part"("projectId", "index");
142152

143-
-- CreateIndex
144-
CREATE UNIQUE INDEX "_PartToPartTag_AB_unique" ON "_PartToPartTag"("A", "B");
145-
146153
-- CreateIndex
147154
CREATE INDEX "_PartToPartTag_B_index" ON "_PartToPartTag"("B");
148155

149-
-- CreateIndex
150-
CREATE UNIQUE INDEX "_partAssignees_AB_unique" ON "_partAssignees"("A", "B");
151-
152156
-- CreateIndex
153157
CREATE INDEX "_partAssignees_B_index" ON "_partAssignees"("B");
154158

@@ -207,7 +211,7 @@ ALTER TABLE "PartReviewCommonMistake" ADD CONSTRAINT "PartReviewCommonMistake_us
207211
ALTER TABLE "PartReviewCommonMistake" ADD CONSTRAINT "PartReviewCommonMistake_userDeletedId_fkey" FOREIGN KEY ("userDeletedId") REFERENCES "User"("userId") ON DELETE SET NULL ON UPDATE CASCADE;
208212

209213
-- AddForeignKey
210-
ALTER TABLE "PartReviewCommonMistake" ADD CONSTRAINT "PartReviewCommonMistake_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("organizationId") ON DELETE SET NULL ON UPDATE CASCADE;
214+
ALTER TABLE "PartReviewCommonMistake" ADD CONSTRAINT "PartReviewCommonMistake_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("organizationId") ON DELETE RESTRICT ON UPDATE CASCADE;
211215

212216
-- AddForeignKey
213217
ALTER TABLE "_PartToPartTag" ADD CONSTRAINT "_PartToPartTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Part"("partId") ON DELETE CASCADE ON UPDATE CASCADE;

src/backend/src/prisma/schema.prisma

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ model User {
257257
assignedParts Part[] @relation(name: "partAssignees")
258258
createdCommonMistakes PartReviewCommonMistake[] @relation(name: "commonMistakeCreator")
259259
deletedCommonMistakes PartReviewCommonMistake[] @relation(name: "commonMistakeDeleter")
260-
partReviewRequests PartReviewRequest[] @relation(name: "PartReviewRequestor")
260+
partReviewRequestCreator PartReviewRequest[] @relation(name: "PartReviewRequestor")
261261
partReviewRequested PartReviewRequest[] @relation(name: "PartReviewRequested")
262262
}
263263

@@ -1009,7 +1009,7 @@ model Organization {
10091009
reimbursementReqeusts Reimbursement_Request[]
10101010
usefulLinks Link[]
10111011
frequentlyAskedQuestions FrequentlyAskedQuestion[] @relation(name: "organizationFAQ")
1012-
partReviewFAQ FrequentlyAskedQuestion[]
1012+
partReviewFAQ FrequentlyAskedQuestion[] @relation(name: "partReviewFAQ")
10131013
milestones Milestone[]
10141014
graphCollections Graph_Collection[]
10151015
graphs Graph[]
@@ -1036,7 +1036,7 @@ model FrequentlyAskedQuestion {
10361036
regularFaqOrgId String?
10371037
regularFaqOrg Organization? @relation(fields: [regularFaqOrgId], references: [organizationId], name: "organizationFAQ")
10381038
partReviewFaqOrgId String?
1039-
partReviewFaqOrg Organization? @relation(fields: [partReviewFaqOrgId], references: [organizationId])
1039+
partReviewFaqOrg Organization? @relation(fields: [partReviewFaqOrgId], references: [organizationId], name: "partReviewFAQ")
10401040
}
10411041

10421042
model Milestone {
@@ -1248,16 +1248,16 @@ model Part_Review_Popup {
12481248
}
12491249

12501250
model PartReviewCommonMistake {
1251-
partReviewCommonMistakeId String @id @default(uuid())
1251+
partReviewCommonMistakeId String @id @default(uuid())
12521252
title String
12531253
description String
12541254
starred Boolean
1255-
userCreated User @relation(fields: [userCreatedId], references: [userId], name: "commonMistakeCreator")
1255+
userCreated User @relation(fields: [userCreatedId], references: [userId], name: "commonMistakeCreator")
12561256
userCreatedId String
1257-
userDeleted User? @relation(fields: [userDeletedId], references: [userId], name: "commonMistakeDeleter")
1257+
userDeleted User? @relation(fields: [userDeletedId], references: [userId], name: "commonMistakeDeleter")
12581258
userDeletedId String?
1259-
dateCreated DateTime @default(now())
1259+
dateCreated DateTime @default(now())
12601260
dateDeleted DateTime?
1261-
organization Organization? @relation(fields: [organizationId], references: [organizationId])
1262-
organizationId String?
1261+
organization Organization @relation(fields: [organizationId], references: [organizationId])
1262+
organizationId String
12631263
}

0 commit comments

Comments
 (0)