Some checks failed
Build and publish / build (push) Failing after 17s
Source moved verbatim from mp/cms/ on 2026-04-29; mp was the first concrete adapter consuming the libreshop toolkit. Builds and publishes git.librete.ch/libreshop/cms on every main / v* push via the standard .gitea/workflows/build.yml shared across libreshop components.
750 lines
22 KiB
TypeScript
750 lines
22 KiB
TypeScript
export default ({ env }) => ({
|
|
upload: {
|
|
config: {
|
|
sizeLimit: 50 * 1024 * 1024
|
|
}
|
|
},
|
|
documentation: {
|
|
enabled: false,
|
|
config: {
|
|
openapi: "3.0.1",
|
|
info: {
|
|
version: "1.0.0",
|
|
title: "MUELLERPTINTS. Paperwork",
|
|
description: "API Documentation for MUELLERPRINTS. Paperwork",
|
|
termsOfService: false,
|
|
contact: {
|
|
name: "Michael W. Czechowski",
|
|
email: "mail@dailysh.it",
|
|
url: "https://dailysh.it"
|
|
},
|
|
license: "Copyright (C) 2024 Michael W. Czechowski",
|
|
externalDocs: false
|
|
},
|
|
"x-strapi-config": {
|
|
plugins: [],
|
|
path: "/documentation",
|
|
mutateDocumentation: (draft: any) => {
|
|
// Order endpoints - maintain existing modifications
|
|
// draft.paths["/orders/{uuid}/cart"].get.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/cart"].put.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/generate-delivery-note"].put.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/generate-invoice"].put.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/add-product/{productId}"].put.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/remove-product/{productId}"].put.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/checkout"].post.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/send-invoice"].put.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}/send-delivery-note"].put.parameters[0].schema.type = "string";
|
|
//
|
|
// // Order request body modifications - maintain existing
|
|
// delete draft.paths["/orders/{uuid}/cart"].put.requestBody;
|
|
// delete draft.paths["/orders/{uuid}/add-product/{productId}"].put.requestBody;
|
|
// delete draft.paths["/orders/{uuid}/remove-product/{productId}"].put.requestBody;
|
|
// delete draft.paths["/orders/{uuid}/checkout"].post.requestBody;
|
|
//
|
|
// // Product publish endpoint - existing documentation
|
|
// draft.paths["/products/publish"].post.description = "Publish or unpublish products by filter";
|
|
// draft.paths["/products/publish"].post.requestBody = {
|
|
// required: true,
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// required: ["filters"],
|
|
// properties: {
|
|
// filters: {
|
|
// type: "object",
|
|
// description: "Filters to select products (supports pattern, cover, ruling, pages)"
|
|
// },
|
|
// publish: {
|
|
// type: "boolean",
|
|
// description: "Whether to publish (true) or unpublish (false)",
|
|
// default: true
|
|
// },
|
|
// dryRun: {
|
|
// type: "boolean",
|
|
// description: "If true, no changes will be made but count will be returned",
|
|
// default: false
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
//
|
|
// draft.paths["/products/publish"].post.responses = {
|
|
// "200": {
|
|
// description: "Successfully published/unpublished products",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// published: {
|
|
// type: "integer",
|
|
// description: "Number of products published/unpublished"
|
|
// },
|
|
// dryRun: {
|
|
// type: "boolean",
|
|
// description: "Whether this was a dry run"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// error: {
|
|
// type: "string",
|
|
// description: "Error message"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// // Product allVariants endpoint
|
|
// if (draft.paths["/products/{id}/variants/all"]) {
|
|
// draft.paths["/products/{id}/variants/all"].get.description = "Get all variants for a product";
|
|
// draft.paths["/products/{id}/variants/all"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all variants of the product",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Product"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "404": {
|
|
// description: "Product not found",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// error: {
|
|
// type: "string",
|
|
// description: "Error message"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Product variantsByPattern endpoint
|
|
// if (draft.paths["/products/{id}/variants/pattern"]) {
|
|
// draft.paths["/products/{id}/variants/pattern"].get.description = "Get product variants grouped by pattern";
|
|
// draft.paths["/products/{id}/variants/pattern"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns product variants grouped by pattern",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// allProductPattern: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/ProductPattern"
|
|
// }
|
|
// },
|
|
// productVariants: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Product"
|
|
// }
|
|
// },
|
|
// patterns: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "object",
|
|
// properties: {
|
|
// id: {
|
|
// type: "string"
|
|
// },
|
|
// name: {
|
|
// type: "string"
|
|
// },
|
|
// description: {
|
|
// type: "string"
|
|
// },
|
|
// productVariant: {
|
|
// oneOf: [
|
|
// {
|
|
// $ref: "#/components/schemas/Product"
|
|
// },
|
|
// {
|
|
// type: "null"
|
|
// }
|
|
// ]
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// error: {
|
|
// type: "string",
|
|
// description: "Error message"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Product variants endpoint
|
|
// if (draft.paths["/products/{id}/variants"]) {
|
|
// draft.paths["/products/{id}/variants"].get.description = "Get product variants grouped by pages, cover, and ruling";
|
|
// draft.paths["/products/{id}/variants"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns product variants grouped by pages, cover, and ruling",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// pages: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "object",
|
|
// properties: {
|
|
// id: {
|
|
// type: "string"
|
|
// },
|
|
// name: {
|
|
// type: "string"
|
|
// },
|
|
// productVariant: {
|
|
// oneOf: [
|
|
// {
|
|
// $ref: "#/components/schemas/Product"
|
|
// },
|
|
// {
|
|
// type: "null"
|
|
// }
|
|
// ]
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// cover: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "object",
|
|
// properties: {
|
|
// id: {
|
|
// type: "string"
|
|
// },
|
|
// name: {
|
|
// type: "string"
|
|
// },
|
|
// binding: {
|
|
// type: "string"
|
|
// },
|
|
// price: {
|
|
// type: "number"
|
|
// },
|
|
// productVariant: {
|
|
// oneOf: [
|
|
// {
|
|
// $ref: "#/components/schemas/Product"
|
|
// },
|
|
// {
|
|
// type: "null"
|
|
// }
|
|
// ]
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// ruling: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "object",
|
|
// properties: {
|
|
// id: {
|
|
// type: "string"
|
|
// },
|
|
// name: {
|
|
// type: "string"
|
|
// },
|
|
// productVariant: {
|
|
// oneOf: [
|
|
// {
|
|
// $ref: "#/components/schemas/Product"
|
|
// },
|
|
// {
|
|
// type: "null"
|
|
// }
|
|
// ]
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// error: {
|
|
// type: "string",
|
|
// description: "Error message"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Product Category endpoints
|
|
// if (draft.paths["/product-category"]) {
|
|
// draft.paths["/product-category"].get.description = "Get all product categories";
|
|
// draft.paths["/product-category"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all product categories",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// if (draft.paths["/product-category/corrupt"]) {
|
|
// draft.paths["/product-category/corrupt"].get.description = "Get all corrupted product categories";
|
|
// draft.paths["/product-category/corrupt"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all corrupted product categories",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// if (draft.paths["/product-category/{id}"]) {
|
|
// draft.paths["/product-category/{id}"].get.description = "Get a single product category";
|
|
// draft.paths["/product-category/{id}"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns a single product category",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
//
|
|
// draft.paths["/product-category/{id}"].put.description = "Update a product category";
|
|
// draft.paths["/product-category/{id}"].put.requestBody = {
|
|
// required: true,
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// description: "The data to update the category with"
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// draft.paths["/product-category/{id}"].put.responses = {
|
|
// "200": {
|
|
// description: "Returns the updated product category",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Update endpoint to match the actual route from product-category.ts
|
|
// if (draft.paths["/product-category/bulk"]) {
|
|
// draft.paths["/product-category/bulk"].put.description = "Update multiple product categories";
|
|
// draft.paths["/product-category/bulk"].put.requestBody = {
|
|
// required: true,
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// categories: {
|
|
// type: "array",
|
|
// description: "Array of categories to update"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// draft.paths["/product-category/bulk"].put.responses = {
|
|
// "200": {
|
|
// description: "Returns the updated product categories",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
// }
|
|
// // Remove the incorrect "/product-category/update" documentation since it doesn't exist in routes
|
|
//
|
|
// if (draft.paths["/product-category/fix"]) {
|
|
// draft.paths["/product-category/fix"].put.description = "Fix categories with missing cover or pattern";
|
|
// draft.paths["/product-category/fix"].put.responses = {
|
|
// "200": {
|
|
// description: "Returns information about fixed and failed categories",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// fixed: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// },
|
|
// failed: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/ProductCategory"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// if (draft.paths["/product-category/fix-images"]) {
|
|
// draft.paths["/product-category/fix-images"].put.description = "Fix product images in categories";
|
|
// draft.paths["/product-category/fix-images"].put.responses = {
|
|
// "200": {
|
|
// description: "Returns information about fixed and failed product images",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// properties: {
|
|
// fixed: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "object",
|
|
// properties: {
|
|
// categoryId: {
|
|
// type: "string"
|
|
// },
|
|
// productCount: {
|
|
// type: "integer"
|
|
// },
|
|
// products: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "string"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// failed: {
|
|
// type: "array",
|
|
// items: {
|
|
// type: "object",
|
|
// properties: {
|
|
// categoryId: {
|
|
// type: "string"
|
|
// },
|
|
// reason: {
|
|
// type: "string"
|
|
// },
|
|
// error: {
|
|
// type: "string"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "400": {
|
|
// description: "Bad request"
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Content controller endpoints
|
|
// if (draft.paths["/content"]) {
|
|
// draft.paths["/content"].get.description = "Get all content entries";
|
|
// draft.paths["/content"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all content entries",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Content"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Customer controller endpoints
|
|
// if (draft.paths["/customers"]) {
|
|
// draft.paths["/customers"].get.description = "Get all customers";
|
|
// draft.paths["/customers"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all customers",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Customer"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Legal controller endpoints
|
|
// if (draft.paths["/legal"]) {
|
|
// draft.paths["/legal"].get.description = "Get all legal documents";
|
|
// draft.paths["/legal"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all legal documents",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Legal"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Delivery controller endpoints
|
|
// if (draft.paths["/deliveries"]) {
|
|
// draft.paths["/deliveries"].get.description = "Get all deliveries";
|
|
// draft.paths["/deliveries"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all deliveries",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Delivery"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// // Payment controller endpoints
|
|
// if (draft.paths["/payments"]) {
|
|
// draft.paths["/payments"].get.description = "Get all payments";
|
|
// draft.paths["/payments"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns all payments",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "array",
|
|
// items: {
|
|
// $ref: "#/components/schemas/Payment"
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// if (draft.paths["/orders/{uuid}"]) {
|
|
// draft.paths["/orders/{uuid}"].get.description = "Get order by UUID";
|
|
// draft.paths["/orders/{uuid}"].get.parameters[0].schema.type = "string";
|
|
// draft.paths["/orders/{uuid}"].get.responses = {
|
|
// "200": {
|
|
// description: "Returns order details",
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// $ref: "#/components/schemas/Order"
|
|
// }
|
|
// }
|
|
// }
|
|
// },
|
|
// "404": {
|
|
// description: "Order not found"
|
|
// }
|
|
// };
|
|
// }
|
|
//
|
|
// if (draft.paths["/orders/webhook"]) {
|
|
// draft.paths["/orders/webhook"].post.description = "Handle PayPal webhook events";
|
|
// draft.paths["/orders/webhook"].post.requestBody = {
|
|
// required: true,
|
|
// content: {
|
|
// "application/json": {
|
|
// schema: {
|
|
// type: "object",
|
|
// description: "PayPal webhook event payload"
|
|
// }
|
|
// }
|
|
// }
|
|
// };
|
|
// draft.paths["/orders/webhook"].post.responses = {
|
|
// "200": {
|
|
// description: "Webhook processed successfully"
|
|
// },
|
|
// "500": {
|
|
// description: "Internal server error"
|
|
// }
|
|
// };
|
|
// }
|
|
}
|
|
},
|
|
servers: [
|
|
{
|
|
url: "/api",
|
|
description: "API server"
|
|
}
|
|
],
|
|
security: [
|
|
{
|
|
bearerAuth: []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"strapi-prometheus": {
|
|
enabled: false,
|
|
config: {
|
|
// add prefix to all the prometheus metrics names.
|
|
prefix: "cms",
|
|
|
|
// use full url instead of matched url
|
|
// true => path label: `/api/models/1`
|
|
// false => path label: `/api/models/:id`
|
|
fullURL: false,
|
|
|
|
// include url query in the url label
|
|
// true => path label: `/api/models?limit=1`
|
|
// false => path label: `/api/models`
|
|
includeQuery: false,
|
|
|
|
// metrics that will be enabled, by default they are all enabled.
|
|
enabledMetrics: {
|
|
koa: true, // koa metrics
|
|
process: true, // metrics regarding the running process
|
|
http: true, // http metrics like response time and size
|
|
apollo: false // metrics regarding graphql
|
|
},
|
|
|
|
// interval at which rate metrics are collected in ms
|
|
interval: 30_000,
|
|
|
|
// set custom/default labels to all the prometheus metrics
|
|
customLabels: {
|
|
name: "strapi-prometheus"
|
|
}
|
|
}
|
|
}
|
|
});
|