Skip to content

Commit

Permalink
refactor backend services to export object
Browse files Browse the repository at this point in the history
  • Loading branch information
goemen committed Sep 26, 2024
1 parent da7031f commit 942f6b0
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 38 deletions.
8 changes: 5 additions & 3 deletions backend/src/v1/middlewares/validations/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,18 @@ export type UseValidateOptions = {
schema: ZodSchema;
};

export const useValidate = ({ mode, schema }: UseValidateOptions) => {
export const useValidate = ({ mode, schema, }: UseValidateOptions) => {
return async (req: Request, res: Response, next: NextFunction) => {
try {
const data = req[mode];
const results = await schema.parseAsync(data);
req[mode] = results;
next();
} catch (error) {
logger.error(error);
return next(error);
const { path, method } = req;
const errorMessage = `${method} - ${path} - Data validation failed`;
logger.error(errorMessage, error);
return next({ errorMessage, error });
}
};
};
5 changes: 4 additions & 1 deletion backend/src/v1/routes/analytic-routes.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ jest.mock('../services/analytic-service', () => {
const actual = jest.requireActual('../services/analytic-service');
return {
...actual,
getEmbedInfo: (...args) => mockGetEmbedInfo(...args),
analyticsService: {
...actual.analyticsService,
getEmbedInfo: (...args) => mockGetEmbedInfo(...args),
},
};
});

Expand Down
4 changes: 2 additions & 2 deletions backend/src/v1/routes/analytic-routes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Router, Request, Response } from 'express';
import {
getEmbedInfo,
analyticsService,
PowerBiResourceName,
} from '../services/analytic-service';
import { utils } from '../services/utils-service';
Expand All @@ -23,7 +23,7 @@ router.get(
req: Request<undefined, undefined, undefined, EmbedQueryType>,
res: Response,
) => {
const info = await getEmbedInfo(req.query.resources);
const info = await analyticsService.getEmbedInfo(req.query.resources);

return res.status(200).json(info);
},
Expand Down
4 changes: 2 additions & 2 deletions backend/src/v1/services/analytic-service.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
getEmbedInfo,
analyticsService,
PowerBiEmbedInfo,
PowerBiResourceName,
} from './analytic-service';
Expand Down Expand Up @@ -47,7 +47,7 @@ describe('getEmbedInfo', () => {
],
embedToken: { token: output.accessToken, expiration: output.expiry },
});
const json = await getEmbedInfo([
const json = await analyticsService.getEmbedInfo([
PowerBiResourceName.SubmissionAnalytics,
PowerBiResourceName.DataAnalytics,
]);
Expand Down
62 changes: 32 additions & 30 deletions backend/src/v1/services/analytic-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,36 +32,38 @@ const resourceIds: Record<PowerBiResourceName, ReportInWorkspace> = {
},
};

/**
* Generate embed token and embed urls for PowerBi resources
* @return Details like Embed URL, Access token and Expiry
*/
export async function getEmbedInfo(
resourceNames: PowerBiResourceName[],
): Promise<PowerBiEmbedInfo> {
const powerBi = new PowerBiService(
config.get('powerbi:powerBiUrl'),
config.get('entra:clientId'),
config.get('entra:clientSecret'),
config.get('entra:tenantId'),
);
export const analyticsService = {
/**
* Generate embed token and embed urls for PowerBi resources
* @return Details like Embed URL, Access token and Expiry
*/
async getEmbedInfo(
resourceNames: PowerBiResourceName[],
): Promise<PowerBiEmbedInfo> {
const powerBi = new PowerBiService(
config.get('powerbi:powerBiUrl'),
config.get('entra:clientId'),
config.get('entra:clientSecret'),
config.get('entra:tenantId'),
);

const embedParams = await powerBi.getEmbedParamsForReports(
resourceNames.map((name) => resourceIds[name]),
);
const embedParams = await powerBi.getEmbedParamsForReports(
resourceNames.map((name) => resourceIds[name]),
);

const resources = [];
for (let i = 0; i < resourceNames.length; ++i) {
resources.push({
name: resourceNames[i],
id: embedParams.resources[i].id,
embedUrl: embedParams.resources[i].embedUrl,
});
}
const resources = [];
for (let i = 0; i < resourceNames.length; ++i) {

Check failure

Code scanning / CodeQL

Type confusion through parameter tampering Critical

Potential type confusion as
this HTTP request parameter
may be either an array or a string.
resources.push({
name: resourceNames[i],
id: embedParams.resources[i].id,
embedUrl: embedParams.resources[i].embedUrl,
});
}

return {
resources: resources,
accessToken: embedParams.embedToken.token,
expiry: embedParams.embedToken.expiration,
};
}
return {
resources: resources,
accessToken: embedParams.embedToken.token,
expiry: embedParams.embedToken.expiration,
};
},
};

0 comments on commit 942f6b0

Please sign in to comment.