@azure-utils/storybooks
Version:
Utils to upload and manage Storybooks via Azure Functions and storage.
174 lines (163 loc) • 5.31 kB
text/typescript
import { app } from "@azure/functions";
import { commonErrorResponses, CONTENT_TYPES } from "../utils/constants";
import { openAPITags, registerOpenAPIPath } from "../utils/openapi-utils";
import type { RouterOptions } from "../utils/types";
import z from "zod";
import { joinUrl } from "../utils/url-utils";
import * as handlers from "../handlers/label-handlers";
import { LabelSlugSchema } from "../models/shared";
import { LabelSchema } from "../models/labels";
const TAG = openAPITags.labels.name;
export function registerLabelsRouter(options: RouterOptions) {
const {
authLevel,
baseRoute,
basePathParamsSchema,
handlerWrapper,
openAPIEnabled,
serviceName,
} = options;
app.get(`${serviceName}-labels-list`, {
authLevel,
route: baseRoute,
handler: handlerWrapper(handlers.listLabels, [
{ resource: "label", action: "read" },
{ resource: "ui", action: "read" },
]),
});
app.post(`${serviceName}-label-create`, {
authLevel,
route: baseRoute,
handler: handlerWrapper(handlers.createLabel, [
{ resource: "label", action: "create" },
]),
});
const routeWithLabel = joinUrl(baseRoute, "{labelSlug}");
app.get(`${serviceName}-label-get`, {
authLevel,
route: routeWithLabel,
handler: handlerWrapper(handlers.getLabel, [
{ resource: "label", action: "read" },
{ resource: "ui", action: "read" },
]),
});
app.patch(`${serviceName}-label-update`, {
authLevel,
route: routeWithLabel,
handler: handlerWrapper(handlers.updateLabel, [
{ resource: "label", action: "update" },
]),
});
app.deleteRequest(`${serviceName}-label-delete`, {
authLevel,
route: routeWithLabel,
handler: handlerWrapper(handlers.deleteLabel, [
{ resource: "label", action: "delete" },
]),
});
const routeWithLabelLatest = joinUrl(routeWithLabel, "latest");
app.get(`${serviceName}-label-latest`, {
authLevel,
route: routeWithLabelLatest,
handler: handlerWrapper(handlers.getLabelLatestBuild, [
{ resource: "label", action: "read" },
]),
});
if (openAPIEnabled) {
const labelPathParameterSchema = basePathParamsSchema.extend({
labelSlug: LabelSlugSchema,
});
registerOpenAPIPath(baseRoute, {
get: {
tags: [TAG],
summary: "List all labels for the project.",
description: "Retrieves a list of labels.",
requestParams: { path: basePathParamsSchema },
responses: {
...commonErrorResponses,
200: {
description: "A list of labels.",
content: {
[CONTENT_TYPES.JSON]: {
schema: LabelSchema.array(),
example: [{ slug: "label-slug", value: "label/slug" }],
},
[CONTENT_TYPES.HTML]: { example: "<!DOCTYPE html>" },
},
},
},
},
post: {
tags: [TAG],
summary: "Create a new label.",
description: "Create a new label with slug and type.",
requestParams: { path: basePathParamsSchema },
responses: {
...commonErrorResponses,
202: {
description: "Data about label",
content: { [CONTENT_TYPES.JSON]: { schema: LabelSchema } },
},
303: {
description: "Label created, redirecting...",
headers: { Location: z.url() },
},
},
},
});
registerOpenAPIPath(routeWithLabel, {
get: {
tags: [TAG],
summary: "Get label details",
description:
"Retrieves the details of a specific label and all builds associated with it.",
requestParams: { path: labelPathParameterSchema },
responses: {
...commonErrorResponses,
200: {
description: "Label details retrieved successfully",
content: {
[CONTENT_TYPES.JSON]: { schema: LabelSchema },
[CONTENT_TYPES.HTML]: { example: "<!DOCTYPE html>" },
},
},
404: { description: "Matching label not found." },
},
},
delete: {
tags: [TAG],
summary: "Delete a label",
description: "Deletes a specific label and builds associated with it.",
requestParams: { path: labelPathParameterSchema },
responses: {
...commonErrorResponses,
204: { description: "Label deleted successfully" },
404: { description: "Matching label not found." },
},
},
});
registerOpenAPIPath(routeWithLabelLatest, {
get: {
tags: [TAG],
summary: "Redirect to latest build for a label",
description:
"Redirects to the latest build associated with a specific label.",
requestParams: { path: labelPathParameterSchema },
responses: {
...commonErrorResponses,
308: {
description: "Redirecting to latest build.",
headers: {
Location: {
content: z
.string()
.meta({ description: "URL of the latest build" }),
},
},
},
404: { description: "Matching label or build not found." },
},
},
});
}
}