Skip to content

Commit cde701c

Browse files
committed
#4101 sponsor logo image id in backend
1 parent 933e5fa commit cde701c

5 files changed

Lines changed: 37 additions & 5 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: 26 additions & 3 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 {
@@ -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,15 @@ export default class FinanceServices {
104106
data: { name: contactName, email: contactEmail, phone: contactPhone, position: contactPosition }
105107
});
106108

109+
let logoImageId: string | undefined;
110+
if (logoImage) {
111+
const logoImageData = await uploadFile(logoImage);
112+
if (!logoImageData?.id || !logoImageData?.name) {
113+
throw new HttpException(500, 'Sponsor logo upload failed');
114+
}
115+
logoImageId = logoImageData.id;
116+
}
117+
107118
const sponsor = await prisma.sponsor.create({
108119
data: {
109120
name,
@@ -118,6 +129,7 @@ export default class FinanceServices {
118129
taxExempt,
119130
discountCode,
120131
sponsorNotes,
132+
logoImageId,
121133
contactId: contact.sponsorContactId,
122134
sponsorTasks: {
123135
create: sponsorTasks.map((task) => ({
@@ -1223,7 +1235,8 @@ export default class FinanceServices {
12231235
contactPhone?: string,
12241236
contactPosition?: string,
12251237
stockDescription?: string,
1226-
discountDescription?: string
1238+
discountDescription?: string,
1239+
logoImage?: Express.Multer.File
12271240
): Promise<Sponsor> {
12281241
if (!(await userHasPermission(submitter.userId, organization.organizationId, isHead)))
12291242
throw new AccessDeniedException('Only heads can edit sponsors.');
@@ -1321,6 +1334,15 @@ export default class FinanceServices {
13211334
data: { name: contactName, email: contactEmail, phone: contactPhone, position: contactPosition }
13221335
});
13231336

1337+
let logoImageId: string | undefined;
1338+
if (logoImage) {
1339+
const logoImageData = await uploadFile(logoImage);
1340+
if (!logoImageData?.id || !logoImageData?.name) {
1341+
throw new HttpException(500, 'Sponsor logo upload failed');
1342+
}
1343+
logoImageId = logoImageData.id;
1344+
}
1345+
13241346
const updatedSponsor = await prisma.sponsor.update({
13251347
where: { sponsorId: oldSponsor.sponsorId },
13261348
data: {
@@ -1335,7 +1357,8 @@ export default class FinanceServices {
13351357
tier: sponsorTierId ? { connect: { sponsorTierId } } : { disconnect: true },
13361358
taxExempt,
13371359
discountCode,
1338-
sponsorNotes
1360+
sponsorNotes,
1361+
...(logoImageId && { logoImageId })
13391362
},
13401363
...getSponsorQueryArgs(organization.organizationId)
13411364
});

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)