Skip to content

Commit 8b565c5

Browse files
committed
#1448-Created-Base-Code
1 parent 7da9c13 commit 8b565c5

4 files changed

Lines changed: 65 additions & 0 deletions

File tree

src/backend/src/controllers/reimbursement-requests.controllers.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,16 @@ export default class ReimbursementRequestsController {
283283
next(error);
284284
}
285285
}
286+
287+
static async editVendor(req: Request, res: Response, next: NextFunction) {
288+
try {
289+
const { vendorId } = req.params;
290+
const { name } = req.body;
291+
const submitter = await getCurrentUser(res);
292+
const editVendors = await ReimbursementRequestService.editVendors(name, vendorId, submitter);
293+
res.status(200).json(editVendors);
294+
} catch (error: unknown) {
295+
next(error);
296+
}
297+
}
286298
}

src/backend/src/routes/reimbursement-requests.routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ reimbursementRequestsRouter.get('/reimbursements/current-user', ReimbursementReq
2424

2525
reimbursementRequestsRouter.get('/reimbursements', ReimbursementRequestController.getAllReimbursements);
2626

27+
reimbursementRequestsRouter.post('/edit-vendors', nonEmptyString(body('name')), ReimbursementRequestController.editVendor);
28+
2729
reimbursementRequestsRouter.post(
2830
'/create',
2931
isDate(body('dateOfExpense')),

src/backend/src/services/reimbursement-requests.services.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,4 +692,31 @@ export default class ReimbursementRequestService {
692692
if (!fileData) throw new NotFoundException('Image File', fileId);
693693
return fileData;
694694
}
695+
696+
/**
697+
* Edits the vendor name
698+
*
699+
* @param name name to change of the vendor
700+
* @param vendorId id of the vedor used to edit the name
701+
* @param submitter the user who is downloading the receipt image
702+
* @returns new vendor with a edited name
703+
*/
704+
static async editVendors(name: string, vendorId: string, submitter: User) {
705+
if (!isAdmin(submitter.role)) throw new AccessDeniedAdminOnlyException('only Admins can edit vendors');
706+
707+
const vendorExists = await prisma.vendor.findUnique({
708+
where: { name }
709+
});
710+
711+
if (vendorExists) throw new HttpException(400, 'vendor name already exists');
712+
713+
const vendor = await prisma.vendor.update({
714+
where: { vendorId },
715+
data: {
716+
name
717+
}
718+
});
719+
720+
return vendor;
721+
}
695722
}

src/backend/tests/reimbursement-requests.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,4 +625,28 @@ describe('Reimbursement Requests', () => {
625625
expect(newReimbursement).toStrictEqual(reimbursementTransformer(reimbursementMock));
626626
});
627627
});
628+
629+
describe('Edit Vendor Tests', () => {
630+
test('Throws error if user isnt an admin', async () => {
631+
await expect(
632+
ReimbursementRequestService.editVendors('I Love Benny', GiveMeMyMoney.vendorId, wonderwoman)
633+
).rejects.toThrow(new AccessDeniedAdminOnlyException('only Admins can edit vendors'));
634+
});
635+
636+
test('Vendor Name already exists', async () => {
637+
await expect(ReimbursementRequestService.editVendors('CHICKEN', GiveMeMyMoney.vendorId, batman)).rejects.toThrow(
638+
new HttpException(400, 'vendor name already exists')
639+
);
640+
});
641+
642+
test('Successfuly changes Vendors name', async () => {
643+
vi.spyOn(prisma.vendor, 'update').mockResolvedValue(PopEyes);
644+
645+
expect(PopEyes.vendorId).toBe('CHICKEN');
646+
647+
ReimbursementRequestService.editVendors('3GreenValleyDrive', PopEyes.vendorId, batman);
648+
649+
expect(PopEyes.vendorId).toBe('3GreenValleyDrive');
650+
});
651+
});
628652
});

0 commit comments

Comments
 (0)