Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 9 additions & 0 deletions src/backend/src/controllers/change-requests.controllers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@ export default class ChangeRequestsController {
}
}

static async getAllGuestChangeRequests(req: Request, res: Response, next: NextFunction) {
try {
const changeRequests = await ChangeRequestsService.getAllGuestChangeRequests(req.organization);
res.status(200).json(changeRequests);
} catch (error: unknown) {
next(error);
}
}

static async getToReviewChangeRequests(req: Request, res: Response, next: NextFunction) {
try {
const changeRequests = await ChangeRequestsService.getToReviewChangeRequests(req.currentUser, req.organization);
Expand Down
45 changes: 45 additions & 0 deletions src/backend/src/prisma-query-args/change-requests.query-args.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,51 @@ export const getManyChangeRequestQueryArgs = (organizationId: string) =>
}
});

export type ChangeRequestGuestQueryArgs = ReturnType<typeof getGuestChangeRequestQueryArgs>;

export const getGuestChangeRequestQueryArgs = (organizationId: string) =>
Prisma.validator<Prisma.Change_RequestDefaultArgs>()({
select: {
crId: true,
identifier: true,
dateSubmitted: true,
type: true,
accepted: true,
dateReviewed: true,
submitter: getUserQueryArgs(organizationId),
reviewer: getUserQueryArgs(organizationId),
changes: { select: { changeId: true } },
wbsElement: {
Comment thread
staysgt marked this conversation as resolved.
select: {
carNumber: true,
projectNumber: true,
workPackageNumber: true,
name: true,
project: {
select: {
wbsElement: { select: { name: true } },
teams: {
select: { teamType: { select: { name: true } } }
}
}
},
workPackage: {
select: {
project: {
select: {
wbsElement: { select: { name: true } },
teams: {
select: { teamType: { select: { name: true } } }
}
}
}
}
}
}
}
}
});

export const getChangeRequestWithProjectAndWorkPackageQueryArgs = (organizationId: string) =>
Prisma.validator<Prisma.Change_RequestDefaultArgs>()({
include: {
Expand Down
4 changes: 2 additions & 2 deletions src/backend/src/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -739,11 +739,11 @@ model Receipt {
model Reimbursement_Request {
reimbursementRequestId String @id @default(uuid())
identifier Int
saboId String? @unique
saboId String? @unique
dateCreated DateTime @default(now())
dateDeleted DateTime?
dateOfExpense DateTime?
description String @default("")
description String @default("")
reimbursementStatuses Reimbursement_Status[]
recipientId String
recipient User @relation(name: "reimbursementRequestRecipient", fields: [recipientId], references: [userId])
Expand Down
1 change: 1 addition & 0 deletions src/backend/src/routes/change-requests.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
const changeRequestsRouter = express.Router();

changeRequestsRouter.get('/', ChangeRequestsController.getAllChangeRequests);
changeRequestsRouter.get('/guest', ChangeRequestsController.getAllGuestChangeRequests);

changeRequestsRouter.get('/to-review', ChangeRequestsController.getToReviewChangeRequests);
changeRequestsRouter.get('/unreviewed', ChangeRequestsController.getUnreviewedChangeRequests);
Expand Down
4 changes: 2 additions & 2 deletions src/backend/src/routes/recruitment.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ recruitmentRouter.post(
recruitmentRouter.delete('/faq/:faqId/delete', RecruitmentController.deleteFaq);

recruitmentRouter.post(
'/guestDefinition/create',
'/guestdefinition/create',
nonEmptyString(body('term')),
nonEmptyString(body('description')),
body('order').isInt(),
Expand All @@ -62,6 +62,6 @@ recruitmentRouter.post(
RecruitmentController.createGuestDefinition
);

recruitmentRouter.get('/guestDefinitions', RecruitmentController.getAllGuestDefintions);
recruitmentRouter.get('/guestdefinitions', RecruitmentController.getAllGuestDefintions);

export default recruitmentRouter;
21 changes: 20 additions & 1 deletion src/backend/src/services/change-requests.services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@ import {
DeletedException,
InvalidOrganizationException
} from '../utils/errors.utils.js';
import changeRequestTransformer, { changeRequestManyTransformer } from '../transformers/change-requests.transformer.js';
import changeRequestTransformer, {
changeRequestManyTransformer,
guestChangeRequestTransformer
} from '../transformers/change-requests.transformer.js';
import {
allChangeRequestsReviewed,
validateProposedChangesFields,
Expand All @@ -55,11 +58,13 @@ import {
ChangeRequestWithProjectAndWorkPackageQueryArgs,
getChangeRequestQueryArgs,
getChangeRequestWithProjectAndWorkPackageQueryArgs,
getGuestChangeRequestQueryArgs,
getManyChangeRequestQueryArgs
} from '../prisma-query-args/change-requests.query-args.js';
import proposedSolutionTransformer from '../transformers/proposed-solutions.transformer.js';
import { getProposedSolutionQueryArgs } from '../prisma-query-args/proposed-solutions.query-args.js';
import { sendCrRequestReviewPopUp, sendCrReviewedPopUp } from '../utils/pop-up.utils.js';
import { GuestChangeRequest } from '../../../shared/src/types/change-request-types.js';

export default class ChangeRequestsService {
/**
Expand Down Expand Up @@ -97,6 +102,20 @@ export default class ChangeRequestsService {
return changeRequests.map(changeRequestManyTransformer);
}

/**
* gets all the change requests in the database for the given organization, tailored to the guest cr page
* @param organization The organization the user is currently in
* @returns All of the change requests
*/
static async getAllGuestChangeRequests(organization: Organization): Promise<GuestChangeRequest[]> {
const changeRequests = await prisma.change_Request.findMany({
where: { dateDeleted: null, organizationId: organization.organizationId },
...getGuestChangeRequestQueryArgs(organization.organizationId)
});

return changeRequests.map(guestChangeRequestTransformer);
}

/**
* Gets a users change requests that they have been requested reviewer for or, if they are leadership, their teams change requests as well
*
Expand Down
43 changes: 42 additions & 1 deletion src/backend/src/transformers/change-requests.transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import {
WorkPackageStage,
BudgetChangeRequest,
isWorkPackageWbs,
LeadershipChangeRequest
LeadershipChangeRequest,
ChangeRequestStatus
} from 'shared';
import { wbsNumOf } from '../utils/utils.js';
import { calculateChangeRequestStatus, convertCRScopeWhyType } from '../utils/change-requests.utils.js';
Expand All @@ -25,10 +26,12 @@ import {
} from '../prisma-query-args/scope-change-requests.query-args.js';
import { HttpException } from '../utils/errors.utils.js';
import {
ChangeRequestGuestQueryArgs,
ChangeRequestManyQueryArgs,
ChangeRequestWithProjectAndWorkPackageQueryArgs
} from '../prisma-query-args/change-requests.query-args.js';
import { accountCodeTransformer, otherProductReasonTransformer } from './reimbursement-requests.transformer.js';
import { GuestChangeRequest } from '../../../shared/src/types/change-request-types.js';

const projectProposedChangesTransformer = (
wbsProposedChanges: Prisma.Wbs_Proposed_ChangesGetPayload<WbsProposedChangeQueryArgs>
Expand Down Expand Up @@ -229,3 +232,41 @@ const changeRequestTransformer = (
};

export default changeRequestTransformer;

export const guestChangeRequestTransformer = (
changeRequest: Prisma.Change_RequestGetPayload<ChangeRequestGuestQueryArgs>
): GuestChangeRequest => {
const status = changeRequest.changes.length
? ChangeRequestStatus.Implemented
: changeRequest.accepted && changeRequest.dateReviewed
? ChangeRequestStatus.Accepted
: changeRequest.dateReviewed
? ChangeRequestStatus.Denied
: ChangeRequestStatus.Open;

const wbsName = changeRequest.wbsElement
? !isWorkPackageWbs(changeRequest.wbsElement)
? changeRequest.wbsElement?.name
: `${changeRequest.wbsElement?.workPackage?.project.wbsElement.name} - ${changeRequest.wbsElement?.name}`
: undefined;

return {
crId: changeRequest.crId,
submitter: userTransformer(changeRequest.submitter),
identifier: changeRequest.identifier,
type: changeRequest.type,
status,
teamTypeNames: changeRequest.wbsElement
? isWorkPackageWbs(changeRequest.wbsElement)
? (changeRequest.wbsElement.workPackage?.project?.teams
.map((team) => team.teamType?.name)
.filter((name) => name !== undefined) ?? [])
: (changeRequest.wbsElement.project?.teams.map((team) => team.teamType?.name).filter((name) => name !== undefined) ??
[])
: [],
accepted: changeRequest.accepted ?? undefined,
reviewer: changeRequest.reviewer ? userTransformer(changeRequest.reviewer) : undefined,
wbsNum: changeRequest.wbsElement ? wbsNumOf(changeRequest.wbsElement) : undefined,
wbsName
};
};
8 changes: 7 additions & 1 deletion src/frontend/src/apis/change-requests.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import axios from '../utils/axios';
import { ChangeRequest, WbsNumber, ChangeRequestType } from 'shared';
import { ChangeRequest, WbsNumber, ChangeRequestType, GuestChangeRequest } from 'shared';
import { apiUrls } from '../utils/urls';
import { changeRequestTransformer } from './transformers/change-requests.transformers';
import { CreateStandardChangeRequestPayload } from '../hooks/change-requests.hooks';
Expand All @@ -18,6 +18,12 @@ export const getAllChangeRequests = () => {
});
};

export const getAllGuestChangeRequests = () => {
return axios.get<GuestChangeRequest[]>(apiUrls.guestChangeRequests(), {
transformResponse: (data) => JSON.parse(data)
});
};

export const getToReviewChangeRequests = () => {
return axios.get<ChangeRequest[]>(apiUrls.toReviewChangeRequests(), {
transformResponse: (data) => JSON.parse(data).map(changeRequestTransformer)
Expand Down
13 changes: 11 additions & 2 deletions src/frontend/src/hooks/change-requests.hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import {
ProposedSolutionCreateArgs,
WbsNumber,
WorkPackageProposedChangesCreateArgs,
LeadershipChangeCreateArgs
LeadershipChangeCreateArgs,
GuestChangeRequest
} from 'shared';
import {
createActivationChangeRequest,
Expand All @@ -28,7 +29,8 @@ import {
getUnreviewedChangeRequests,
getApprovedChangeRequests,
createBudgetChangeRequest,
createLeadershipChangeRequest
createLeadershipChangeRequest,
getAllGuestChangeRequests
} from '../apis/change-requests.api';

/**
Expand All @@ -41,6 +43,13 @@ export const useAllChangeRequests = () => {
});
};

export const useAllGuestChangeRequests = () => {
return useQuery<GuestChangeRequest[], Error>(['guest change requests'], async () => {
const { data } = await getAllGuestChangeRequests();
return data;
});
};

export const useGetToReviewChangeRequests = () => {
return useQuery<ChangeRequest[], Error>(['change requests', 'to-review'], async () => {
const { data } = await getToReviewChangeRequests();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import ChangeRequestsOverview from './ChangeRequestsOverview';
import ChangeRequestsTable from './ChangeRequestsTable';
import PageLayout from '../../components/PageLayout';
import FullPageTabs from '../../components/FullPageTabs';
import GuestChangeRequestsPage from './GuestChangeRequestsPage';

const ChangeRequestsView: React.FC = () => {
const history = useHistory();
Expand All @@ -17,6 +18,9 @@ const ChangeRequestsView: React.FC = () => {
// Default to the "overview" tab
const [tabIndex, setTabIndex] = useState<number>(0);

if (isGuest(user.role)) {
return <GuestChangeRequestsPage />;
}
const headerRight = (
<NERButton
variant="contained"
Expand Down
Loading
Loading