Skip to content

Commit

Permalink
Merge pull request #370 from pagopa/IOPAE-1117-featured-items-api-mock
Browse files Browse the repository at this point in the history
[IOPAE-1117] Add services `/featured` api mock
  • Loading branch information
giuseppedipinto authored Apr 24, 2024
2 parents 7f283d3 + f3534dd commit 43e5e73
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,9 @@ const defaultConfig: IoDevServerConfig = {
sessionTTLinMS: 60000
},
service: {
featuredItemsSize: 5,
response: {
featuredItemsResponseCode: 200,
institutionsResponseCode: 200
}
},
Expand Down
67 changes: 67 additions & 0 deletions src/features/services/payloads/get-featured-items.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import * as A from "fp-ts/lib/Array";
import { pipe } from "fp-ts/lib/function";
import _ from "lodash";
import { FeaturedItem } from "../../../../generated/definitions/services/FeaturedItem";
import { FeaturedItems } from "../../../../generated/definitions/services/FeaturedItems";
import { ioDevServerConfig } from "../../../config";
import ServicesDB from "../../../persistence/services";
import { getInstitutionsResponsePayload } from "./get-institutions";

const featuredItemsSize = ioDevServerConfig.features.service.featuredItemsSize;

export const getFeaturedItemsResponsePayload = (): FeaturedItems => {
// take some casual national service
const selectedNationalServices = _.sampleSize(
ServicesDB.getNationalServices(),
1
);
// take some casual special service
const selectedSpecialServices = _.sampleSize(
ServicesDB.getSpecialServices(),
3
);
// take some casual institutions
const featuredIntitutions = _.sampleSize(
Array.from(getInstitutionsResponsePayload().institutions),
1
);

/**
* Map national services to FeaturedService[] (add organization_name for layout testing purpose)
*/
const featuredNationalServices: FeaturedItem[] = pipe(
selectedNationalServices,
A.map(service => ({
id: service.service_id,
name: service.service_name,
version: service.version,
organization_name: service.organization_name
}))
);

/**
* Reduce special services to FeaturedService[]
*/
const featuredSpecialServices: FeaturedItem[] = pipe(
selectedSpecialServices,
A.map(service => ({
id: service.service_id,
name: service.service_name,
version: service.version
}))
);

// returns randomly ordered featured items
const featuredItems = _.sampleSize(
[
...featuredSpecialServices,
...featuredIntitutions,
...featuredNationalServices
],
featuredItemsSize
);

return {
items: featuredItems
};
};
27 changes: 27 additions & 0 deletions src/features/services/routers/featured.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import * as O from "fp-ts/lib/Option";
import { pipe } from "fp-ts/lib/function";
import { ioDevServerConfig } from "../../../config";
import { addHandler } from "../../../payloads/response";
import { getFeaturedItemsResponsePayload } from "../payloads/get-featured-items";
import { addApiV2Prefix, serviceRouter } from "./router";

const serviceConfig = ioDevServerConfig.features.service;

// Retrieve featured items
addHandler(serviceRouter, "get", addApiV2Prefix("/featured"), (_, res) =>
pipe(
serviceConfig.response.featuredItemsResponseCode,
O.fromPredicate(statusCode => statusCode !== 200),
O.fold(
() =>
pipe(
O.of(getFeaturedItemsResponsePayload()),
O.fold(
() => res.status(404),
featuredItems => res.status(200).json(featuredItems)
)
),
statusCode => res.sendStatus(statusCode)
)
)
);
1 change: 1 addition & 0 deletions src/features/services/routers/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import "./featured";
import "./institutions";

export { serviceRouter } from "./router";
8 changes: 6 additions & 2 deletions src/features/services/types/configuration.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { WithinRangeNumber } from "@pagopa/ts-commons/lib/numbers";
import * as t from "io-ts";
import { HttpResponseCode } from "../../../types/httpResponseCode";

export const ServiceConfiguration = t.interface({
export const ServiceConfiguration = t.type({
// configure number of featured items
featuredItemsSize: WithinRangeNumber(0, 6),
// configure some API response error code
response: t.interface({
response: t.type({
// 200 success with payload
featuredItemsResponseCode: HttpResponseCode,
institutionsResponseCode: HttpResponseCode
})
});
Expand Down
4 changes: 4 additions & 0 deletions src/persistence/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ const getAllServices = () => [
];

const getLocalServices = () => localServices.map(ls => ({ ...ls }));
const getNationalServices = () => nationalServices.map(ls => ({ ...ls }));
const getSpecialServices = () => specialServices.map(ls => ({ ...ls }));

const getPreference = (
serviceId: ServiceId
Expand Down Expand Up @@ -166,6 +168,8 @@ export default {
deleteServices,
getAllServices,
getLocalServices,
getNationalServices,
getSpecialServices,
getPreference,
getService,
getSummaries,
Expand Down

0 comments on commit 43e5e73

Please sign in to comment.