Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
b4348d7
Added add criteria method
NadavMozeson Mar 24, 2025
4dc7fc4
Implemented add criteria method
NadavMozeson Mar 24, 2025
49d59fe
Merge pull request #33 from Groupify-SCE/feature/add-criteria
NadavMozeson Mar 24, 2025
cb0da3b
Added get all criteria route
NadavMozeson Mar 24, 2025
7f4d070
Implemented get all criteria method
NadavMozeson Mar 24, 2025
82ae6b6
ESLint fix
NadavMozeson Mar 24, 2025
0e5e4f3
Merge pull request #34 from Groupify-SCE/feature/get-project-criteria
NadavMozeson Mar 24, 2025
299dac4
Added update criterion method
NadavMozeson Mar 24, 2025
c99b0bf
Implemented update criterion method
NadavMozeson Mar 24, 2025
e55e19b
Merge pull request #35 from Groupify-SCE/feature/update-criterion
NadavMozeson Mar 24, 2025
a5579b2
Added delete criterion route
NadavMozeson Mar 24, 2025
a93dbbb
Implemented delete criterion method
NadavMozeson Mar 24, 2025
8dd9576
Merge pull request #36 from Groupify-SCE/feature/delete-criteria
NadavMozeson Mar 24, 2025
570b490
fixed unnecessary fields
NadavMozeson Mar 24, 2025
1ec73d1
Merge pull request #37 from Groupify-SCE/fix/removed-fields-on-create…
NadavMozeson Mar 24, 2025
d991249
added route of adding participent
MaorMalka Mar 25, 2025
0721d6f
added participants func
MaorMalka Mar 25, 2025
5f88ef2
Merge pull request #38 from Groupify-SCE/feature/add-participent
MaorMalka Mar 25, 2025
78884b7
Update types.ts
MaorMalka Mar 25, 2025
6adae3b
Merge pull request #39 from Groupify-SCE/feature/add-participent
MaorMalka Mar 25, 2025
4e4ebb9
added get route
MaorMalka Mar 30, 2025
9d22f00
added get schema
MaorMalka Mar 30, 2025
1f97b03
added get all participants func
MaorMalka Mar 30, 2025
135aa02
Merge pull request #40 from Groupify-SCE/feature/get-all
MaorMalka Mar 30, 2025
353637f
added get participants schema
MaorMalka Mar 30, 2025
a3e4dca
added get participant criteria route
MaorMalka Mar 30, 2025
dfcdb5f
added get participant criteria func
MaorMalka Mar 30, 2025
db6e2da
Merge pull request #41 from Groupify-SCE/feature/add-criteria-button
MaorMalka Mar 30, 2025
5b8c307
Deleting all data on project delete
NadavMozeson Mar 31, 2025
8c15af6
Update on criteria change
NadavMozeson Mar 31, 2025
f78f9b7
Update on participant add
NadavMozeson Mar 31, 2025
6f1964b
Merge pull request #42 from Groupify-SCE/feature/update-participant-c…
NadavMozeson Mar 31, 2025
daf27ca
Define types for criteria and participants modules
MaorMalka May 15, 2025
e6d58ba
Add participants API with add, get, and criteria update support
MaorMalka May 15, 2025
b82d631
Centralize project logic in projects.manager service
MaorMalka May 15, 2025
227a3c7
Define types for add and update participant routes
MaorMalka May 15, 2025
f76c98b
Merge pull request #43 from Groupify-SCE/Feature/edit-participant-cri…
MaorMalka May 16, 2025
8e52558
Add delete participant route and handler
MaorMalka May 16, 2025
72dbbd1
Merge pull request #44 from Groupify-SCE/Feature/deletion-participants
MaorMalka May 16, 2025
eb01b03
Add updateAllParticipants endpoint and manager logic
MaorMalka May 19, 2025
c61631c
Merge pull request #45 from Groupify-SCE/Feature/save-participants
MaorMalka May 19, 2025
c6248b3
added code to join project
NadavMozeson May 20, 2025
6dde547
Implemented add preferences
NadavMozeson May 20, 2025
b8b5dfc
Merge pull request #46 from Groupify-SCE/feature/preference-form
NadavMozeson May 20, 2025
f1647a2
ESLint fix
NadavMozeson May 20, 2025
0f81e5b
Merge pull request #47 from Groupify-SCE/dev
NadavMozeson May 20, 2025
094f6d0
Merge pull request #48 from Groupify-SCE/feature/preference-form
NadavMozeson May 20, 2025
c16b580
Merge pull request #49 from Groupify-SCE/dev
NadavMozeson May 20, 2025
a8e2d09
feat: Implemented run algorithm route
NadavMozeson May 20, 2025
dcda56c
Added returning groups indicator
NadavMozeson May 20, 2025
13ec690
fixed auth to generation
NadavMozeson May 20, 2025
702aafa
Merge pull request #52 from Groupify-SCE/feature/run-algorithm
NadavMozeson May 20, 2025
35ec232
implemented fetching groups
NadavMozeson May 20, 2025
e1e6d96
fixed errors with fetching groups
NadavMozeson May 20, 2025
02d6715
ESLint fix
NadavMozeson May 20, 2025
f5cffe1
Merge pull request #53 from Groupify-SCE/feature/view-groups
NadavMozeson May 20, 2025
e30d31a
Merge pull request #54 from Groupify-SCE/dev
NadavMozeson May 20, 2025
4e9dfe2
Revert "Finished sprint 6"
NadavMozeson May 20, 2025
b756132
Merge pull request #55 from Groupify-SCE/revert-54-dev
NadavMozeson May 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions src/routes/projects/criteria/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import express, { Router, Request, Response } from 'express';
import { validateAndExtractAuthToken } from '../../../utils/middleware/authToken.middleware';
import projectsManager from '../../../utils/services/projects.manager';
import { validateData } from '../../../utils/middleware/validation.middleware';
import {
projectAddCriterionSchema,
projectDeleteCriterionSchema,
projectGetAllCriteriaSchema,
projectUpdateCriterionData,
projectUpdateCriterionSchema,
} from './types';

const router: Router = express.Router();

router.post(
'/add/:projectId',
validateAndExtractAuthToken(),
validateData(projectAddCriterionSchema, 'params'),
async (req: Request, res: Response) => {
const userId = req.userId;
const projectId = req.params.projectId;

const { status, response } = await projectsManager.addCriterion(
userId ?? '',
projectId
);
res.status(status).send({ response });
}
);

router.get(
'/get-all/:projectId',
validateAndExtractAuthToken(),
validateData(projectGetAllCriteriaSchema, 'params'),
async (req: Request, res: Response) => {
const userId = req.userId;
const projectId = req.params.projectId;

const { status, response } = await projectsManager.getAllCriteria(
userId ?? '',
projectId
);

res.status(status).send({ response });
}
);

router.put(
'/update',
validateAndExtractAuthToken(),
validateData(projectUpdateCriterionSchema),
async (req: Request, res: Response) => {
const userId = req.userId;
const data: projectUpdateCriterionData = req.body;

const { status, response } = await projectsManager.updateCriterion(
userId ?? '',
data
);
res.status(status).send({ response });
}
);

router.delete(
'/delete/:criterionId',
validateAndExtractAuthToken(),
validateData(projectDeleteCriterionSchema, 'params'),
async (req: Request, res: Response) => {
const userId = req.userId;
const criterionId = req.params.criterionId;

const { status, response } = await projectsManager.deleteCriterion(
userId ?? '',
criterionId
);
res.status(status).send({ response });
}
);

export default router;
56 changes: 56 additions & 0 deletions src/routes/projects/criteria/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { z } from 'zod';

export const projectAddCriterionSchema = z.object({
projectId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
});

export type projectAddCriterionData = z.infer<typeof projectAddCriterionSchema>;

export const projectGetAllCriteriaSchema = z.object({
projectId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
});

export type projectGetAllCriteriaData = z.infer<
typeof projectGetAllCriteriaSchema
>;

export const projectUpdateCriterionSchema = z.object({
criterionId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
name: z.string().min(1).max(100).optional(),
range: z.number().min(1).max(1000).optional(),
});

export type projectUpdateCriterionData = z.infer<
typeof projectUpdateCriterionSchema
>;

export const projectDeleteCriterionSchema = z.object({
criterionId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
});

export type projectDeleteCriterionData = z.infer<
typeof projectDeleteCriterionSchema
>;

export const projectGetCriteriaByProjectSchema = z.object({
projectId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
});

export type projectGetCriteriaByProjectData = z.infer<
typeof projectGetCriteriaByProjectSchema
>;
31 changes: 31 additions & 0 deletions src/routes/projects/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,20 @@ import { validateData } from '../../utils/middleware/validation.middleware';
import {
projectDeleteSchema,
projectGetSchema,
projectPreferencesSaveData,
projectPreferencesSaveSchema,
projectSearchSchema,
projectUpdateData,
projectUpdateSchema,
} from './types';
import criteriaRouter from './criteria';
import participantsRouter from './participants';

const router: Router = express.Router();

router.use('/criteria', criteriaRouter);
router.use('/participants', participantsRouter);

router.post(
'/create',
validateAndExtractAuthToken(),
Expand Down Expand Up @@ -84,4 +92,27 @@ router.put(
res.status(status).send({ response });
}
);

router.get(
'/search/:code',
validateData(projectSearchSchema, 'params'),
async (req: Request, res: Response) => {
const code = req.params.code;

const { status, response } = await projectsManager.searchProject(code);
res.status(status).send({ response });
}
);

router.post(
'/preferences/save',
validateData(projectPreferencesSaveSchema),
async (req: Request, res: Response) => {
const data: projectPreferencesSaveData = req.body;

const { status, response } = await projectsManager.savePreferences(data);
res.status(status).send({ response });
}
);

export default router;
120 changes: 120 additions & 0 deletions src/routes/projects/participants/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import express, { Router, Request, Response } from 'express';
import { validateAndExtractAuthToken } from '../../../utils/middleware/authToken.middleware';
import projectsManager from '../../../utils/services/projects.manager';
import { validateData } from '../../../utils/middleware/validation.middleware';
import {
projectAddParticipantSchema,
projectAddParticipantData,
projectGetAllParticipantSchema,
projectGetParticipantIdSchema,
projectUpdateParticipantCriteriaSchema,
projectUpdateParticipantCriteriaData,
} from './types';

const router: Router = express.Router();

router.post(
'/add',
validateAndExtractAuthToken(),
validateData(projectAddParticipantSchema),
async (req: Request, res: Response) => {
const userId = req.userId;
const data: projectAddParticipantData = req.body;

const { status, response } = await projectsManager.addParticipant(
userId ?? '',
data
);
res.status(status).send({ response });
}
);

router.get(
'/get-all/:projectId',
validateAndExtractAuthToken(),
validateData(projectGetAllParticipantSchema, 'params'),
async (req: Request, res: Response) => {
const userId = req.userId;
const projectId = req.params.projectId;

const { status, response } = await projectsManager.getAllParticipants(
userId ?? '',
projectId
);
res.status(status).send({ response });
}
);

router.get(
'/criteria/get/:participantId',
validateAndExtractAuthToken(),
validateData(projectGetParticipantIdSchema, 'params'),
async (req: Request, res: Response) => {
const userId = req.userId;
const participantId = req.params.participantId;

const { status, response } = await projectsManager.getParticipantCriteria(
userId ?? '',
participantId
);
res.status(status).send({ response });
}
);

router.put(
'/criteria/update/:participantId',
validateAndExtractAuthToken(),
validateData(projectUpdateParticipantCriteriaSchema),
async (req: Request, res: Response) => {
const userId = req.userId;
const participantId = req.params.participantId;
const data: projectUpdateParticipantCriteriaData = req.body;

const { status, response } =
await projectsManager.updateParticipantCriteria(
userId ?? '',
participantId,
data.criteria
);

res.status(status).send({ response });
}
);

router.delete(
'/delete/:projectId/:participantId',
validateAndExtractAuthToken(),
validateData(projectGetParticipantIdSchema, 'params'),
async (req: Request, res: Response) => {
const userId = req.userId;
const { projectId, participantId } = req.params;

const { status, response } = await projectsManager.deleteParticipant(
userId ?? '',
projectId,
participantId
);

res.status(status).send({ response });
}
);

router.put(
'/update-all/:projectId',
validateAndExtractAuthToken(),
async (req: Request, res: Response) => {
const userId = req.userId;
const { projectId } = req.params;
const { participants } = req.body;

const { status, response } = await projectsManager.updateAllParticipants(
userId ?? '',
projectId,
participants
);

res.status(status).send({ response });
}
);

export default router;
57 changes: 57 additions & 0 deletions src/routes/projects/participants/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { z } from 'zod';

export const projectAddParticipantSchema = z.object({
projectId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
firstName: z
.string()
.min(1)
.regex(/^[A-Za-z-]+$/, 'First name can only contain letters or dashes')
.optional(),
lastName: z
.string()
.min(1)
.regex(/^[A-Za-z-]+$/, 'Last name can only contain letters or dashes')
.optional(),
tz: z
.string()
.min(9)
.regex(/^\d{9}$/, 'ID must contain 9 digits')
.optional(),
});

export type projectAddParticipantData = z.infer<
typeof projectAddParticipantSchema
>;

export const projectGetAllParticipantSchema = z.object({
projectId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
});

export type projectGetAllParticipantData = z.infer<
typeof projectGetAllParticipantSchema
>;

export const projectGetParticipantIdSchema = z.object({
participantId: z
.string()
.min(1)
.regex(/^[0-9a-fA-F]{24}$/, 'Invalid ObjectId'),
});

export type projectGetParticipantIdData = z.infer<
typeof projectGetParticipantIdSchema
>;

export const projectUpdateParticipantCriteriaSchema = z.object({
criteria: z.record(z.string(), z.number().min(0).max(1000)),
});

export type projectUpdateParticipantCriteriaData = z.infer<
typeof projectUpdateParticipantCriteriaSchema
>;
16 changes: 16 additions & 0 deletions src/routes/projects/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,19 @@ export const projectUpdateSchema = z.object({
});

export type projectUpdateData = z.infer<typeof projectUpdateSchema>;

export const projectSearchSchema = z.object({
code: z.string().length(8),
});

export type projectSearchData = z.infer<typeof projectSearchSchema>;

export const projectPreferencesSaveSchema = z.object({
selectedParticipant: z.string().min(1),
participantId: z.string().min(1),
preferences: z.array(z.string().min(1)),
});

export type projectPreferencesSaveData = z.infer<
typeof projectPreferencesSaveSchema
>;
Loading