diff --git a/src/config.ts b/src/config.ts index 977d0981..05262f8c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -193,7 +193,8 @@ const defaultConfig: IoDevServerConfig = { featuredItemsSize: 5, response: { featuredItemsResponseCode: 200, - institutionsResponseCode: 200 + institutionsResponseCode: 200, + servicesByInstitutionIdResponseCode: 200 } }, allowRandomValues: true diff --git a/src/features/services/payloads/get-featured-items.ts b/src/features/services/payloads/get-featured-items.ts index 80a81aed..53314e7d 100644 --- a/src/features/services/payloads/get-featured-items.ts +++ b/src/features/services/payloads/get-featured-items.ts @@ -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; @@ -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) */ diff --git a/src/features/services/payloads/get-institutions.ts b/src/features/services/payloads/get-institutions.ts index cca9673d..20b96950 100644 --- a/src/features/services/payloads/get-institutions.ts +++ b/src/features/services/payloads/get-institutions.ts @@ -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"; @@ -29,7 +30,7 @@ export const getInstitutionsResponsePayload = ( offset: number = 0, scope?: ServiceScopeEnum, search?: string -): InstitutionsResource => { +): O.Option => { const filteredInstitutions = pipe( ServicesDB.getAllServices(), getInstitutions, @@ -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 - }; + }); }; diff --git a/src/features/services/payloads/get-services.ts b/src/features/services/payloads/get-services.ts new file mode 100644 index 00000000..09a36c2c --- /dev/null +++ b/src/features/services/payloads/get-services.ts @@ -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 => { + 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 + }); +}; diff --git a/src/features/services/routers/institutions.ts b/src/features/services/routers/institutions.ts index 544585ef..d4e2c172 100644 --- a/src/features/services/routers/institutions.ts +++ b/src/features/services/routers/institutions.ts @@ -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; @@ -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) @@ -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) + ) + ) +); diff --git a/src/features/services/types/configuration.ts b/src/features/services/types/configuration.ts index a06b1a1c..406f6074 100644 --- a/src/features/services/types/configuration.ts +++ b/src/features/services/types/configuration.ts @@ -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 }) });