Skip to content

Commit a551ce8

Browse files
authored
Merge pull request #4145 from Northeastern-Electric-Racing/#4101-sponsor-logo-image-id
#4101 sponsor logo image id in backend
2 parents 933e5fa + dda4bc1 commit a551ce8

5 files changed

Lines changed: 26 additions & 6 deletions

File tree

src/backend/src/controllers/finance.controllers.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ export default class FinanceController {
4343
contactPhone,
4444
contactPosition,
4545
stockDescription,
46-
discountDescription
46+
discountDescription,
47+
req.file
4748
);
4849
res.status(200).json(sponsor);
4950
} catch (error: unknown) {
@@ -383,7 +384,8 @@ export default class FinanceController {
383384
contactPhone,
384385
contactPosition,
385386
stockDescription,
386-
discountDescription
387+
discountDescription,
388+
req.file
387389
);
388390

389391
res.status(200).json(updatedSponsor);

src/backend/src/routes/finance.routes.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,15 @@ import {
99
} from '../utils/validation.utils.js';
1010
import { body } from 'express-validator';
1111
import FinanceController from '../controllers/finance.controllers.js';
12+
import multer, { memoryStorage } from 'multer';
13+
import { MAX_FILE_SIZE } from 'shared';
1214

1315
const financeRouter = express.Router();
16+
const upload = multer({ limits: { fileSize: MAX_FILE_SIZE }, storage: memoryStorage() });
1417

1518
financeRouter.post(
1619
'/sponsor/create',
20+
upload.single('logoImage'),
1721
nonEmptyString(body('name')),
1822
body('activeStatus').isBoolean(),
1923
body('valueTypes').isArray(),
@@ -142,6 +146,7 @@ financeRouter.get('/sponsorTiers', FinanceController.getAllSponsorTiers);
142146

143147
financeRouter.post(
144148
'/sponsor/:sponsorId/edit',
149+
upload.single('logoImage'),
145150
nonEmptyString(body('name')),
146151
body('activeStatus').isBoolean(),
147152
body('valueTypes').isArray(),

src/backend/src/services/finance.services.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
getReimbursementRequestWhereInput
3535
} from '../utils/finance.utils.js';
3636
import { notifySponsorTaskAssignee } from '../utils/slack.utils.js';
37+
import { uploadFile } from '../utils/google-integration.utils.js';
3738
import { isUserFinanceTeamOrHead } from '../utils/reimbursement-requests.utils.js';
3839

3940
export default class FinanceServices {
@@ -56,7 +57,7 @@ export default class FinanceServices {
5657
* @param contactPosition The position of the sponsor contact.
5758
* @param sponsorTasks An array of sponsor tasks associated with the sponsor.
5859
* @param organization The organization for which the sponsor is being created.
59-
*
60+
* @param logoImage An optional logo image file for the sponsor.
6061
* @returns The created sponsor object, including associated tasks.
6162
*
6263
* @throws AccessDeniedAdminOnlyException If the submitter does not have permission to create a sponsor.
@@ -80,7 +81,8 @@ export default class FinanceServices {
8081
contactPhone?: string,
8182
contactPosition?: string,
8283
stockDescription?: string,
83-
discountDescription?: string
84+
discountDescription?: string,
85+
logoImage?: Express.Multer.File
8486
) {
8587
if (!(await userHasPermission(submitter.userId, organization.organizationId, isHead)))
8688
throw new AccessDeniedException('Only heads can create a sponsor');
@@ -104,6 +106,8 @@ export default class FinanceServices {
104106
data: { name: contactName, email: contactEmail, phone: contactPhone, position: contactPosition }
105107
});
106108

109+
const { id: logoImageId } = logoImage ? await uploadFile(logoImage) : { id: undefined };
110+
107111
const sponsor = await prisma.sponsor.create({
108112
data: {
109113
name,
@@ -118,6 +122,7 @@ export default class FinanceServices {
118122
taxExempt,
119123
discountCode,
120124
sponsorNotes,
125+
logoImageId,
121126
contactId: contact.sponsorContactId,
122127
sponsorTasks: {
123128
create: sponsorTasks.map((task) => ({
@@ -1200,6 +1205,8 @@ export default class FinanceServices {
12001205
* @param contactPosition The position of the sponsor contact.
12011206
* @param sponsorTasks An array of sponsor tasks associated with the sponsor.
12021207
* @param organization The organization for which the sponsor is being edited.
1208+
* @param logoImage An optional logo image file for the sponsor.
1209+
*
12031210
* @returns the edited sponsor.
12041211
*/
12051212

@@ -1223,7 +1230,8 @@ export default class FinanceServices {
12231230
contactPhone?: string,
12241231
contactPosition?: string,
12251232
stockDescription?: string,
1226-
discountDescription?: string
1233+
discountDescription?: string,
1234+
logoImage?: Express.Multer.File
12271235
): Promise<Sponsor> {
12281236
if (!(await userHasPermission(submitter.userId, organization.organizationId, isHead)))
12291237
throw new AccessDeniedException('Only heads can edit sponsors.');
@@ -1321,6 +1329,8 @@ export default class FinanceServices {
13211329
data: { name: contactName, email: contactEmail, phone: contactPhone, position: contactPosition }
13221330
});
13231331

1332+
const { id: logoImageId } = logoImage ? await uploadFile(logoImage) : { id: undefined };
1333+
13241334
const updatedSponsor = await prisma.sponsor.update({
13251335
where: { sponsorId: oldSponsor.sponsorId },
13261336
data: {
@@ -1335,7 +1345,8 @@ export default class FinanceServices {
13351345
tier: sponsorTierId ? { connect: { sponsorTierId } } : { disconnect: true },
13361346
taxExempt,
13371347
discountCode,
1338-
sponsorNotes
1348+
sponsorNotes,
1349+
...(logoImageId && { logoImageId })
13391350
},
13401351
...getSponsorQueryArgs(organization.organizationId)
13411352
});

src/backend/src/transformers/finance.transformer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export const sponsorTransformer = (sponsor: Prisma.SponsorGetPayload<SponsorQuer
2626
: undefined,
2727
sponsorNotes: sponsor.sponsorNotes ?? undefined,
2828
discountCode: sponsor.discountCode ?? undefined,
29+
logoImageId: sponsor.logoImageId ?? undefined,
2930
sponsorTasks: sponsor.sponsorTasks.map(sponsorTaskTranformer)
3031
};
3132
};

src/shared/src/types/finance-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export interface Sponsor {
4444
sponsorNotes?: string;
4545
sponsorTasks: SponsorTask[];
4646
tier?: SponsorTier;
47+
logoImageId?: string;
4748
}
4849

4950
export interface SponsorTask {

0 commit comments

Comments
 (0)