Skip to content

Commit 9df4e5c

Browse files
authored
Merge pull request #4 from bcgov/3236-loadFromPortal-endpoint
ADO-3236 - Add loadFromPortal endpoint
2 parents 5536df8 + acddb17 commit 9df4e5c

File tree

8 files changed

+1060
-0
lines changed

8 files changed

+1060
-0
lines changed

server/api/controllers/communications.controller.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,41 @@ export class CommunicationsController {
152152
}
153153
}
154154

155+
async loadPortalForm(req: Request, res: Response): Promise<void> {
156+
try {
157+
const requestData = req.body;
158+
159+
const authHeader = req.headers.authorization;
160+
const token = authHeader?.startsWith('Bearer ')
161+
? authHeader.substring(7)
162+
: authHeader;
163+
164+
const originalServer = req.headers['x-original-server'] as string;
165+
166+
// TODO: Implement authentication/authorization when available
167+
168+
const result = await ICMService.loadPortalForm(
169+
requestData,
170+
token,
171+
originalServer
172+
);
173+
174+
if (result.success) {
175+
res.status(200).json(result.data);
176+
} else {
177+
res.status(result.status || 500).json({ error: result.error });
178+
}
179+
} catch (error) {
180+
let errorMessage = 'Internal server error';
181+
if (error instanceof Error && error.message) {
182+
errorMessage = error.message;
183+
}
184+
res.status(500).json({
185+
error: errorMessage,
186+
});
187+
}
188+
}
189+
155190
generatePDFFromJson(req: Request, res: Response): void {
156191
res.json({ endpoint: 'generatePDFFromJson', payload: req.body });
157192
}

server/api/controllers/router.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ router.post('/generatePDFFromJson', (req, res) =>
3939
router.post('/generateNewTemplate', (req, res) =>
4040
CommunicationsController.generateNewTemplate(req, res)
4141
);
42+
router.post('/loadPortalForm', (req, res) =>
43+
CommunicationsController.loadPortalForm(req, res)
44+
);
4245

4346
// Kiln Renderer Routes
4447
router.get('/view', (req, res) => RendererController.viewForm(req, res));

server/api/services/icm.client.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,40 @@ export class ICMClient {
251251
return this.handleBlobError(error, 'pdfRender');
252252
}
253253
}
254+
255+
async loadPortalForm(
256+
payload: any,
257+
originalServer?: string
258+
): Promise<ICMJsonResponse> {
259+
try {
260+
const url = process.env.COMM_API_LOAD_PORTAL_FORM_ENDPOINT_URL;
261+
262+
if (!url) {
263+
throw new Error(
264+
'COMM_API_LOAD_PORTAL_FORM_ENDPOINT_URL environment variable is required'
265+
);
266+
}
267+
268+
const timeout = process.env.COMM_API_TIMEOUT
269+
? parseInt(process.env.COMM_API_TIMEOUT, 10)
270+
: 30000;
271+
272+
const headers: Record<string, string> = {
273+
'Content-Type': 'application/json',
274+
};
275+
276+
if (originalServer) {
277+
headers['X-Original-Server'] = originalServer;
278+
}
279+
280+
const response = await axios.post(url, payload, {
281+
headers,
282+
timeout,
283+
});
284+
285+
return this.createJsonResponse(response);
286+
} catch (error) {
287+
return this.handleJsonError(error, 'loadPortalForm');
288+
}
289+
}
254290
}

server/api/services/icm.service.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ interface PdfRenderResult {
9191
status?: number;
9292
}
9393

94+
interface LoadPortalFormRequest {
95+
[key: string]: any;
96+
}
97+
98+
interface LoadPortalFormResult {
99+
success: boolean;
100+
data?: any;
101+
error?: string;
102+
status?: number;
103+
}
104+
94105
export class ICMService {
95106
private icmClient: ICMClient;
96107

@@ -367,6 +378,38 @@ export class ICMService {
367378
) as PdfRenderResult;
368379
}
369380
}
381+
382+
async loadPortalForm(
383+
data: LoadPortalFormRequest,
384+
token?: string,
385+
originalServer?: string
386+
): Promise<LoadPortalFormResult> {
387+
try {
388+
if (!data || Object.keys(data).length === 0) {
389+
return {
390+
success: false,
391+
error: 'Request data is required',
392+
status: 400,
393+
};
394+
}
395+
396+
const payload = {
397+
...data,
398+
...(token && { token }),
399+
};
400+
401+
const response = await this.icmClient.loadPortalForm(
402+
payload,
403+
originalServer
404+
);
405+
return this.handleResponse(
406+
response,
407+
'Error loading portal form. Please try again.'
408+
);
409+
} catch (error) {
410+
return this.handleError(error, 'Failed to load portal form');
411+
}
412+
}
370413
}
371414

372415
export default new ICMService();

server/common/api.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,28 @@ paths:
259259
200:
260260
description: Template generated successfully
261261

262+
/loadPortalForm:
263+
post:
264+
tags:
265+
- Communications Layer
266+
- ICM User Interface
267+
description: Load a portal form
268+
parameters:
269+
- in: body
270+
name: formData
271+
required: true
272+
schema:
273+
type: object
274+
responses:
275+
200:
276+
description: Portal form loaded successfully
277+
400:
278+
description: Bad request - invalid data
279+
404:
280+
description: Portal form not found
281+
500:
282+
description: Internal server error
283+
262284
/examples:
263285
get:
264286
tags:

0 commit comments

Comments
 (0)