From 2a6eafa19a97f0be01f63c68b63b4abfc4de1409 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Sat, 1 Nov 2025 00:06:54 -0500 Subject: [PATCH] feat(articles): moved articles over to the main server --- app/src/internal/system/routes/stats.ts | 25 +- .../pkg/prodSql/querys/datamart/article.ts | 195 ++++++++++++ package-lock.json | 285 +++++++++++++++++- package.json | 4 + 4 files changed, 493 insertions(+), 16 deletions(-) create mode 100644 app/src/pkg/prodSql/querys/datamart/article.ts diff --git a/app/src/internal/system/routes/stats.ts b/app/src/internal/system/routes/stats.ts index 7c20218..05c6425 100644 --- a/app/src/internal/system/routes/stats.ts +++ b/app/src/internal/system/routes/stats.ts @@ -11,7 +11,30 @@ import { checkBuildUpdate } from "../utlis/checkForBuild.js"; const router = Router(); -// GET /health +/** + * @openapi + * /health: + * get: + * summary: Health check for the API server + * description: Returns basic system stats including memory usage, uptime, and build info. + * responses: + * 200: + * description: OK + * content: + * application/json: + * schema: + * type: object + * properties: + * status: + * type: string + * example: ok + * uptime: + * type: number + * build: + * type: string + * memoryUsage: + * type: string + */ router.get("/", async (req, res) => { const { data, error } = await tryCatch( db.select().from(serverStats).where(eq(serverStats.id, "serverStats")), diff --git a/app/src/pkg/prodSql/querys/datamart/article.ts b/app/src/pkg/prodSql/querys/datamart/article.ts new file mode 100644 index 0000000..e817462 --- /dev/null +++ b/app/src/pkg/prodSql/querys/datamart/article.ts @@ -0,0 +1,195 @@ +export const activeArticle = ` +use AlplaPROD_test1 + +SELECT V_Artikel.IdArtikelvarianten, +V_Artikel.Bezeichnung, +V_Artikel.ArtikelvariantenTypBez, +V_Artikel.PreisEinheitBez, +case when sales.price is null then 0 else sales.price end as salesPrice, +TypeOfMaterial=CASE +WHEN +V_Artikel.ArtikelvariantenTypBez LIKE'%Additive' +Then 'AD' +when V_Artikel.ArtikelvariantenTypBez Like '%Masterbatch' +THEN 'MB' +WHEN V_Artikel.ArtikelvariantenTypBez ='Pallet' or +V_Artikel.ArtikelvariantenTypBez ='Top' or +V_Artikel.ArtikelvariantenTypBez ='Bags' or +V_Artikel.ArtikelvariantenTypBez ='Bag' or +V_Artikel.ArtikelvariantenTypBez ='Stretch Wrap' or +V_Artikel.ArtikelvariantenTypBez ='Stretch Film' or +V_Artikel.ArtikelvariantenTypBez ='Banding Materials' or +V_Artikel.ArtikelvariantenTypBez ='Carton' or +V_Artikel.ArtikelvariantenTypBez ='Re-Shipper Box' or +V_Artikel.ArtikelvariantenTypBez ='Label' or +V_Artikel.ArtikelvariantenTypBez ='Pallet Label' or +V_Artikel.ArtikelvariantenTypBez ='Carton Label' or +V_Artikel.ArtikelvariantenTypBez ='Liner' or +V_Artikel.ArtikelvariantenTypBez ='Dose Cup' or +V_Artikel.ArtikelvariantenTypBez ='Metal Cage' or +V_Artikel.ArtikelvariantenTypBez ='Spout' or +V_Artikel.ArtikelvariantenTypBez = 'Slip Sheet' or +V_Artikel.ArtikelvariantenTypBez = 'Palet' or +V_Artikel.ArtikelvariantenTypBez = 'LID' or +V_Artikel.ArtikelvariantenTypBez= 'Metal' or +V_Artikel.ArtikelvariantenTypBez= 'Corner post' or +V_Artikel.ArtikelvariantenTypBez= 'Bottle Label' or +V_Artikel.ArtikelvariantenTypBez = 'Paper label' or +V_Artikel.ArtikelvariantenTypBez = 'Banding' or +V_Artikel.ArtikelvariantenTypBez = 'Glue' or +V_Artikel.ArtikelvariantenTypBez = 'Top Frame' or +V_Artikel.ArtikelvariantenTypBez = 'IML Label' or +V_Artikel.ArtikelvariantenTypBez = 'Purch EBM Bottle' or +V_Artikel.ArtikelvariantenTypBez = 'Purchased Spout' or +V_Artikel.ArtikelvariantenTypBez = 'Gaylord' or +V_Artikel.ArtikelvariantenTypBez = 'Misc. Packaging' or +V_Artikel.ArtikelvariantenTypBez = 'Sleeve' or +V_Artikel.ArtikelvariantenTypBez = 'Plastic Bag' or +V_Artikel.ArtikelvariantenTypBez = 'Purch Spout' or +V_Artikel.ArtikelvariantenTypBez = 'Seal' or +V_Artikel.ArtikelvariantenTypBez = 'Tape' or +V_Artikel.ArtikelvariantenTypBez = 'Box' or +V_Artikel.ArtikelvariantenTypBez = 'Label IML' or +V_Artikel.ArtikelvariantenTypBez = 'Pallet Runner' +THEN 'PKG' +WHEN V_Artikel.ArtikelvariantenTypBez='HD-PE' or +V_Artikel.ArtikelvariantenTypBez='HD-PE PCR' or +V_Artikel.ArtikelvariantenTypBez='HD-PP' or +V_Artikel.ArtikelvariantenTypBez= 'PP' or +V_Artikel.ArtikelvariantenTypBez LIKE '%PCR' or +V_Artikel.ArtikelvariantenTypBez= 'LDPE' or +V_Artikel.ArtikelvariantenTypBez= 'PP' or +V_Artikel.ArtikelvariantenTypBez= 'HDPE' or +V_Artikel.ArtikelvariantenTypBez= 'PET' or +V_Artikel.ArtikelvariantenTypBez= 'PET-P' +THEN 'MM' +WHEN +V_Artikel.ArtikelvariantenTypBez='HDPE-Waste' or +V_Artikel.ArtikelvariantenTypBez='$Waste Container' or +V_Artikel.ArtikelvariantenTypBez='Mixed-Waste' or +V_Artikel.ArtikelvariantenTypBez LIKE'%-Waste%' +THEN 'Waste' +WHEN +V_Artikel.ArtikelvariantenTypBez = 'Bottle' or +V_Artikel.ArtikelvariantenTypBez = 'SBM Bottle' or +V_Artikel.ArtikelvariantenTypBez = 'EBM Bottle' or +V_Artikel.ArtikelvariantenTypBez = 'ISBM Bottle' or +V_Artikel.ArtikelvariantenTypBez = 'Decorated Bottle' +THEN 'Bottle' +WHEN V_Artikel.ArtikelvariantenTypBez = 'Preform' +Then 'Preform' +When +V_Artikel.ArtikelvariantenTypBez = 'Purchased Preform' or +V_Artikel.ArtikelvariantenTypBez = 'Purchased Caps' or +V_Artikel.ArtikelvariantenTypBez = 'Purchased_preform' +THEN 'Purchased_preform' +When +V_Artikel.ArtikelvariantenTypBez = 'Closures' or +V_Artikel.ArtikelvariantenTypBez = 'Cap' +THEN 'Caps' +When +V_Artikel.ArtikelvariantenTypBez = 'Dummy' +THEN 'Not used' +ELSE 'Item not defined' END +,V_Artikel.IdArtikelvariantenTyp, +Round(V_Artikel.ArtikelGewicht, 3) as Article_Weight, +IdAdresse, +AdressBez, +AdressTypBez, +ProdBereichBez, +FG=case when +V_Artikel.ProdBereichBez = 'SBM' or +V_Artikel.ProdBereichBez = 'IM-Caps' or +V_Artikel.ProdBereichBez = 'IM-PET' or +V_Artikel.ProdBereichBez = 'PRINT OFFICE' or +V_Artikel.ProdBereichBez = 'EBM' or +V_Artikel.ProdBereichBez = 'ISBM' or +V_Artikel.ProdBereichBez = 'IM-Finishing' +Then 'FG' +Else 'not Defined Profit Center' +end, +V_Artikel.Umlaeufe as num_of_cycles, +V_FibuKonten_BASIS.FibuKontoNr as CostsCenterId, +V_FibuKonten_BASIS.Bezeichnung as CostCenterDescription, +sales.[KdArtNr] as CustomerArticleNumber, +sales.[KdArtBez] as CustomerArticleDescription, +round(V_Artikel.Zyklus, 2) as CycleTime, +Sypronummer as salesAgreement, +V_Artikel.ProdArtikelBez as ProductFamily +--,REPLACE(pur.UOM,'UOM:','') +,Case when LEFT( + LTRIM(REPLACE(pur.UOM,'UOM:','')), + CHARINDEX(' ', LTRIM(REPLACE(REPLACE(pur.UOM,'UOM:',''), CHAR(13)+CHAR(10), ' ')) + ' ') - 1 + ) is null then '1' else LEFT( + LTRIM(REPLACE(pur.UOM,'UOM:','')), + CHARINDEX(' ', LTRIM(REPLACE(REPLACE(pur.UOM,'UOM:',''), CHAR(13)+CHAR(10), ' ')) + ' ') - 1 + ) end AS UOM +--,* +FROM dbo.V_Artikel (nolock) + +join +dbo.V_Artikelvarianten (nolock) on dbo.V_Artikel.IdArtikelvarianten = +dbo.V_Artikelvarianten.IdArtikelvarianten + +join +dbo.V_FibuKonten_BASIS (nolock) on dbo.V_Artikelvarianten.IdFibuKonto = +dbo.V_FibuKonten_BASIS.IdFibuKonto + + +-- adding in the sales price +left join +(select * from +(select + ROW_NUMBER() OVER (PARTITION BY IdArtikelvarianten ORDER BY GueltigabDatum DESC) AS RN, + IdArtikelvarianten as av + ,GueltigabDatum as validDate + ,VKPreis as price + ,[KdArtNr] + ,[KdArtBez] + --,* + from dbo.T_HistoryVK (nolock) + where + --GueltigabDatum > getDate() - 120 + --and + Aktiv = 1 + and StandardKunde = 1 -- default address + ) a + where RN = 1) as sales +on dbo.V_Artikel.IdArtikelvarianten = sales.av + +/* adding the purchase price info */ +left join +(select * from +(select + ROW_NUMBER() OVER (PARTITION BY IdArtikelvarianten ORDER BY GueltigabDatum DESC) AS RN, + IdArtikelvarianten as av + ,GueltigabDatum as validDate + ,EKPreis as price + ,LiefArtNr as supplierNr + ,CASE + WHEN Bemerkung IS NOT NULL AND Bemerkung LIKE '%UOM:%' + THEN + -- incase there is something funny going on in the remark well jsut check for new lines and what not + LEFT( + REPLACE(REPLACE(Bemerkung, CHAR(13)+CHAR(10), ' '), CHAR(10), ' '), + CASE + WHEN CHARINDEX(' ', REPLACE(REPLACE(Bemerkung, CHAR(13)+CHAR(10), ' '), CHAR(10), ' ')) > 0 + THEN CHARINDEX(' ', REPLACE(REPLACE(Bemerkung, CHAR(13)+CHAR(10), ' '), CHAR(10), ' ')) - 1 + ELSE LEN(Bemerkung) + END + ) + ELSE 'UOM:1' + END AS UOM + ,Bemerkung + --,* + from dbo.T_HistoryEK (nolock) + where + StandardLieferant = 1 -- default address + ) a + where RN = 1) as pur +on dbo.V_Artikel.IdArtikelvarianten = pur.av + +where V_Artikel.aktiv = 1 --and dbo.V_Artikel.IdArtikelvarianten = 1445 + +order by V_Artikel.IdArtikelvarianten /*, TypeOfMaterial */ +`; diff --git a/package-lock.json b/package-lock.json index 7dd9645..bdf7b63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,8 @@ "pino-pretty": "^13.1.2", "postgres": "^3.4.7", "socket.io": "^4.8.1", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", "zod": "^4.1.12" }, "devDependencies": { @@ -44,6 +46,8 @@ "@types/nodemailer": "^7.0.2", "@types/nodemailer-express-handlebars": "^4.0.5", "@types/pg": "^8.15.5", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", "concurrently": "^9.2.1", "cz-conventional-changelog": "^3.3.0", "standard-version": "^9.5.0", @@ -52,6 +56,50 @@ "typescript": "^5.9.3" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", @@ -2446,6 +2494,12 @@ "integrity": "sha512-3zwefSMwHpu8iVUW8YYz227sIv6UFqO31p1Bf1ZH/Vom7CmNyUsXjDBlnNzcuhmOL1XfxZ3nvND42kR23XlbcQ==", "license": "BSD-3-Clause" }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, "node_modules/@levischuck/tiny-cbor": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz", @@ -2556,6 +2610,13 @@ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@simplewebauthn/browser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.1.2.tgz", @@ -3344,6 +3405,12 @@ "@types/node": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/mime": { "version": "1.3.5", "dev": true, @@ -3476,6 +3543,24 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/swagger-jsdoc": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", + "integrity": "sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/swagger-ui-express": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", + "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/serve-static": "*" + } + }, "node_modules/@typespec/ts-http-runtime": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz", @@ -3628,9 +3713,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0", - "optional": true + "license": "Python-2.0" }, "node_modules/array-ify": { "version": "1.0.0", @@ -3701,7 +3784,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -3905,7 +3987,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4013,6 +4094,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4282,7 +4369,6 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -5124,6 +5210,18 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5685,6 +5783,15 @@ "node": ">=0.8.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "license": "MIT", @@ -5764,6 +5871,7 @@ "node_modules/express": { "version": "5.1.0", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -6159,7 +6267,6 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -6807,7 +6914,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -7228,9 +7334,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", - "optional": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7440,6 +7544,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -7452,6 +7563,13 @@ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", "license": "MIT" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -7502,9 +7620,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -7933,7 +8049,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8285,6 +8400,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -8505,7 +8627,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10057,6 +10178,92 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "license": "MIT", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.30.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.30.1.tgz", + "integrity": "sha512-4mNAUM31sr52K3JcK9qiGbfsFKNh/dm3PkEe+F9FAM31YY/NoRYUgsR/L6d7LLFn6PgZXtBG2ygp8+7UnpUIPg==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -10495,6 +10702,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validator": { + "version": "13.15.20", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.20.tgz", + "integrity": "sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "license": "MIT", @@ -10712,6 +10928,15 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -10762,6 +10987,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "license": "MIT", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/zod": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", diff --git a/package.json b/package.json index 477957d..ab3c4ea 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,8 @@ "pino-pretty": "^13.1.2", "postgres": "^3.4.7", "socket.io": "^4.8.1", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", "zod": "^4.1.12" }, "devDependencies": { @@ -78,6 +80,8 @@ "@types/nodemailer": "^7.0.2", "@types/nodemailer-express-handlebars": "^4.0.5", "@types/pg": "^8.15.5", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", "concurrently": "^9.2.1", "cz-conventional-changelog": "^3.3.0", "standard-version": "^9.5.0",