Skip to content

Commit

Permalink
Merge pull request #372 from pagopa/IOPAE-1118-services-by-institutio…
Browse files Browse the repository at this point in the history
…n-id

[IOPAE-1118] Add institution's services endpoint
  • Loading branch information
adelloste authored May 7, 2024
2 parents 2f910d6 + 9fdaed3 commit bd49946
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 9 deletions.
3 changes: 2 additions & 1 deletion src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ const defaultConfig: IoDevServerConfig = {
featuredItemsSize: 5,
response: {
featuredItemsResponseCode: 200,
institutionsResponseCode: 200
institutionsResponseCode: 200,
servicesByInstitutionIdResponseCode: 200
}
},
allowRandomValues: true
Expand Down
15 changes: 12 additions & 3 deletions src/features/services/payloads/get-featured-items.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { FeaturedItem } from "../../../../generated/definitions/services/Feature
import { FeaturedItems } from "../../../../generated/definitions/services/FeaturedItems";
import { ioDevServerConfig } from "../../../config";
import ServicesDB from "../../../persistence/services";
import { getInstitutionsResponsePayload } from "./get-institutions";
import { getInstitutions } from "../utils/institutions";

const featuredItemsSize = ioDevServerConfig.features.service.featuredItemsSize;

Expand All @@ -21,11 +21,20 @@ export const getFeaturedItemsResponsePayload = (): FeaturedItems => {
3
);
// take some casual institutions
const featuredIntitutions = _.sampleSize(
Array.from(getInstitutionsResponsePayload().institutions),
const selectedInstitutions = _.sampleSize(
pipe(ServicesDB.getAllServices(), getInstitutions),
1
);

const featuredIntitutions = pipe(
selectedInstitutions,
A.map(institution => ({
id: institution.id,
name: institution.name,
fiscal_code: institution.fiscal_code
}))
);

/**
* Map national services to FeaturedService[] (add organization_name for layout testing purpose)
*/
Expand Down
7 changes: 4 additions & 3 deletions src/features/services/payloads/get-institutions.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as A from "fp-ts/lib/Array";
import * as O from "fp-ts/lib/Option";
import { identity, pipe } from "fp-ts/lib/function";
import _ from "lodash";
import { ServiceScopeEnum } from "../../../../generated/definitions/backend/ServiceScope";
Expand Down Expand Up @@ -29,7 +30,7 @@ export const getInstitutionsResponsePayload = (
offset: number = 0,
scope?: ServiceScopeEnum,
search?: string
): InstitutionsResource => {
): O.Option<InstitutionsResource> => {
const filteredInstitutions = pipe(
ServicesDB.getAllServices(),
getInstitutions,
Expand Down Expand Up @@ -65,10 +66,10 @@ export const getInstitutionsResponsePayload = (
const endIndex = offset + limit;
const istitutionList = _.slice(filteredInstitutions, startIndex, endIndex);

return {
return O.some({
institutions: istitutionList,
limit,
offset,
count: totalElements
};
});
};
41 changes: 41 additions & 0 deletions src/features/services/payloads/get-services.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as A from "fp-ts/lib/Array";
import * as O from "fp-ts/lib/Option";
import { pipe } from "fp-ts/lib/function";
import _ from "lodash";
import { InstitutionServicesResource } from "../../../../generated/definitions/services/InstitutionServicesResource";
import { ServiceMinified } from "../../../../generated/definitions/services/ServiceMinified";
import ServicesDB from "../../../persistence/services";

export const getServicesByInstitutionIdResponsePayload = (
institutionId: string,
limit: number = 20,
offset: number = 0
): O.Option<InstitutionServicesResource> => {
const filteredServices: ServiceMinified[] = pipe(
ServicesDB.getAllServices(),
A.filterMap(
({ organization_fiscal_code, service_id, service_name, version }) => {
if (organization_fiscal_code === institutionId) {
return O.some({
id: service_id,
name: service_name,
version
});
}
return O.none;
}
)
);

const totalElements = filteredServices.length;
const startIndex = offset;
const endIndex = offset + limit;
const servicesList = _.slice(filteredServices, startIndex, endIndex);

return O.some({
services: servicesList,
limit,
offset,
count: totalElements
});
};
31 changes: 30 additions & 1 deletion src/features/services/routers/institutions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { ServiceScope } from "../../../../generated/definitions/backend/ServiceS
import { ioDevServerConfig } from "../../../config";
import { addHandler } from "../../../payloads/response";
import { getInstitutionsResponsePayload } from "../payloads/get-institutions";
import { getServicesByInstitutionIdResponsePayload } from "../payloads/get-services";
import { addApiV2Prefix, serviceRouter } from "./router";

const serviceConfig = ioDevServerConfig.features.service;
Expand Down Expand Up @@ -42,7 +43,7 @@ addHandler(serviceRouter, "get", addApiV2Prefix("/institutions"), (req, res) =>
pipe(req.query.search as string, O.fromNullable, O.toUndefined)
)
),
O.map(args => getInstitutionsResponsePayload(...args)),
O.chain(args => getInstitutionsResponsePayload(...args)),
O.fold(
() => res.status(404),
instituitions => res.status(200).json(instituitions)
Expand All @@ -52,3 +53,31 @@ addHandler(serviceRouter, "get", addApiV2Prefix("/institutions"), (req, res) =>
)
)
);

// Find services for institution
addHandler(
serviceRouter,
"get",
addApiV2Prefix("/institutions/:institutionId/services"),
(req, res) =>
pipe(
serviceConfig.response.servicesByInstitutionIdResponseCode,
O.fromPredicate(statusCode => statusCode !== 200),
O.fold(
() =>
pipe(
sequenceT(O.Monad)(
O.fromNullable(req.params.institutionId),
O.of(pipe(req.query.limit, extractQuery)),
O.of(pipe(req.query.offset, extractQuery))
),
O.chain(args => getServicesByInstitutionIdResponsePayload(...args)),
O.fold(
() => res.status(404),
services => res.status(200).json(services)
)
),
statusCode => res.sendStatus(statusCode)
)
)
);
5 changes: 4 additions & 1 deletion src/features/services/types/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ export const ServiceConfiguration = t.type({
response: t.type({
// 200 success with payload
featuredItemsResponseCode: HttpResponseCode,
institutionsResponseCode: HttpResponseCode
// 200 success with payload
institutionsResponseCode: HttpResponseCode,
// 200 success with payload
servicesByInstitutionIdResponseCode: HttpResponseCode
})
});

Expand Down

0 comments on commit bd49946

Please sign in to comment.