Skip to content

Commit a208141

Browse files
committed
chore: add backend functionality
1 parent 1828942 commit a208141

File tree

6 files changed

+131
-19
lines changed

6 files changed

+131
-19
lines changed

app/backend/lib/excel_import/template_nine.ts

+56-1
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,60 @@ templateNine.get(
509509
}
510510
);
511511

512+
templateNine.post(
513+
'/api/template-nine/rfi/applicant/:id/:rfiNumber',
514+
limiter,
515+
async (req, res) => {
516+
const authRole = getAuthRole(req);
517+
const pgRole = authRole?.pgRole;
518+
const isRoleAuthorized = pgRole === 'ccbc_auth_user';
519+
if (!isRoleAuthorized) {
520+
return res.status(404).end();
521+
}
522+
523+
const { id, rfiNumber } = req.params;
524+
525+
const applicationId = parseInt(id, 10);
526+
527+
if (!id || !rfiNumber || Number.isNaN(applicationId)) {
528+
return res.status(400).json({ error: 'Invalid parameters' });
529+
}
530+
const errorList = [];
531+
const form = formidable(commonFormidableConfig);
532+
533+
let files;
534+
try {
535+
files = await parseForm(form, req);
536+
} catch (err) {
537+
errorList.push({ level: 'file', error: err });
538+
return res.status(400).json(errorList).end();
539+
}
540+
const filename = Object.keys(files)[0];
541+
const uploadedFilesArray = files[filename] as Array<File>;
542+
const uploaded = uploadedFilesArray?.[0];
543+
544+
if (!uploaded) {
545+
return res.status(400).end();
546+
}
547+
const buf = fs.readFileSync(uploaded.filepath);
548+
const wb = XLSX.read(buf);
549+
let templateNineData;
550+
try {
551+
templateNineData = await loadTemplateNineData(wb);
552+
} catch (err) {
553+
errorList.push({ level: 'file', error: err });
554+
return res.status(400).json(errorList).end();
555+
}
556+
557+
if (templateNineData) {
558+
return res.status(200).json({ templateNineData });
559+
}
560+
return res
561+
.status(400)
562+
.json({ error: 'Unknown error while parsing template nine' });
563+
}
564+
);
565+
512566
templateNine.post(
513567
'/api/template-nine/rfi/:id/:rfiNumber',
514568
limiter,
@@ -518,7 +572,8 @@ templateNine.post(
518572
const isRoleAuthorized =
519573
pgRole === 'ccbc_admin' ||
520574
pgRole === 'super_admin' ||
521-
pgRole === 'ccbc_analyst';
575+
pgRole === 'ccbc_analyst' ||
576+
pgRole === 'ccbc_auth_user';
522577

523578
if (!isRoleAuthorized) {
524579
return res.status(404).end();

app/lib/theme/widgets/FileWidget.tsx

+44-17
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ const FileWidget: React.FC<FileWidgetProps> = ({
7272
const { setTemplateData, rfiNumber } = formContext;
7373
const { showToast, hideToast } = useToast();
7474

75+
const isApplicantPage = router.pathname.includes('applicant');
76+
7577
useEffect(() => {
7678
if (rawErrors?.length > 0) {
7779
setErrors([{ error: 'rjsf_validation' }]);
@@ -109,25 +111,50 @@ const FileWidget: React.FC<FileWidgetProps> = ({
109111
});
110112
}
111113
} else if (templateNumber === 9) {
112-
const response = await fetch(
113-
`/api/template-nine/rfi/${formId}/${rfiNumber}`,
114-
{
115-
method: 'POST',
116-
body: fileFormData,
114+
if (isApplicantPage) {
115+
// fetch for applicant and handle as expected
116+
const response = await fetch(
117+
`/api/template-nine/rfi/applicant/${formId}/${rfiNumber}`,
118+
{
119+
method: 'POST',
120+
body: fileFormData,
121+
}
122+
);
123+
if (response.ok) {
124+
const data = await response.json();
125+
setTemplateData({
126+
templateNumber,
127+
data: data.templateNineData,
128+
templateName: file.name,
129+
});
130+
} else {
131+
isTemplateValid = false;
132+
setTemplateData({
133+
templateNumber,
134+
error: true,
135+
});
117136
}
118-
);
119-
if (response.ok) {
120-
await response.json();
121-
setTemplateData({
122-
templateNumber,
123-
templateName: file.name,
124-
});
125137
} else {
126-
isTemplateValid = false;
127-
setTemplateData({
128-
templateNumber,
129-
error: true,
130-
});
138+
const response = await fetch(
139+
`/api/template-nine/rfi/${formId}/${rfiNumber}`,
140+
{
141+
method: 'POST',
142+
body: fileFormData,
143+
}
144+
);
145+
if (response.ok) {
146+
await response.json();
147+
setTemplateData({
148+
templateNumber,
149+
templateName: file.name,
150+
});
151+
} else {
152+
isTemplateValid = false;
153+
setTemplateData({
154+
templateNumber,
155+
error: true,
156+
});
157+
}
131158
}
132159
}
133160
} catch (error) {

app/pages/applicantportal/form/[id]/rfi/[applicantRfiId].tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,11 @@ const ApplicantRfiPage = ({
349349
onChange={handleChange}
350350
onSubmit={handleSubmit}
351351
noValidate
352-
formContext={{ setTemplateData, skipUnsavedWarning: true }}
352+
formContext={{
353+
setTemplateData,
354+
skipUnsavedWarning: true,
355+
rfiNumber,
356+
}}
353357
>
354358
<Button>Save</Button>
355359
</FormBase>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-- Deploy ccbc:tables/application_form_template_9_data_002_add_auth_user_role_permission to pg
2+
3+
begin;
4+
5+
do
6+
$grant$
7+
begin
8+
9+
perform ccbc_private.grant_permissions('select', 'application_form_template_9_data', 'ccbc_auth_user');
10+
perform ccbc_private.grant_permissions('insert', 'application_form_template_9_data', 'ccbc_auth_user');
11+
perform ccbc_private.grant_permissions('update', 'application_form_template_9_data', 'ccbc_auth_user');
12+
13+
end
14+
$grant$;
15+
16+
commit;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-- Revert ccbc:tables/application_form_template_9_data_002_add_auth_user_role_permission from pg
2+
3+
begin;
4+
5+
revoke select on ccbc_public.application_form_template_9_data from ccbc_auth_user;
6+
revoke insert on ccbc_public.application_form_template_9_data from ccbc_auth_user;
7+
revoke update on ccbc_public.application_form_template_9_data from ccbc_auth_user;
8+
9+
commit;

db/sqitch.plan

+1
Original file line numberDiff line numberDiff line change
@@ -801,3 +801,4 @@ tables/application_map_data 2025-01-28T17:53:59Z Rafael Solorzano <61289255+rafa
801801
@1.235.0 2025-02-03T16:58:59Z CCBC Service Account <[email protected]> # release v1.235.0
802802
@1.235.1 2025-02-03T22:52:39Z CCBC Service Account <[email protected]> # release v1.235.1
803803
@1.236.0 2025-02-04T16:28:48Z CCBC Service Account <[email protected]> # release v1.236.0
804+
tables/application_form_template_9_data_002_add_auth_user_role_permission 2025-02-05T15:11:34Z Anthony Bushara <[email protected]> # Adds permissions for an applicant to insert and read template 9 data

0 commit comments

Comments
 (0)