commit 65f033adbcfba5c1af2550a91b2adf4f73004ffa Author: DATAEXPRESS\4734 Date: Tue Jan 6 18:24:42 2026 +0800 First Commit diff --git a/.env b/.env new file mode 100644 index 0000000..cb14268 --- /dev/null +++ b/.env @@ -0,0 +1,26 @@ +# --- Server 系統設定 --- +PORT=5060 +NODE_ENV=development + +# --- MariaDB 資料庫連線設定 --- +DB_HOST=localhost +DB_PORT=3306 +DB_USER=root +DB_PASSWORD="1qazCDE#" +DB_NAME=eis_demo + +# --- Mail 寄送設定 (以 Gmail 為例) --- +# 注意:若使用 Gmail,請務必開啟「兩步驟驗證」並申請「應用程式密碼」 +MAIL_USER=kylinsys@gmail.com +MAIL_PASS=owgj hajw iuum txjm + +# --- 檔案上傳設定 --- +UPLOAD_PATH=./public/upload +# 限制上傳大小 (100MB) +MAX_FILE_SIZE=104857600 + +# SSL 設定 (只有在 Node.js 直接處理 HTTPS 時需要) +ENABLE_HTTPS=true +SSL_KEY_PATH=./ssl/private.key +SSL_CRT_PATH=./ssl/certificate.crt +HTTPS_PORT=8033 \ No newline at end of file diff --git a/mariadb-v2-260106.zip b/mariadb-v2-260106.zip new file mode 100644 index 0000000..e5587ec Binary files /dev/null and b/mariadb-v2-260106.zip differ diff --git a/mariadb-v2.bat b/mariadb-v2.bat new file mode 100644 index 0000000..2141885 --- /dev/null +++ b/mariadb-v2.bat @@ -0,0 +1,7 @@ +Rem ************************************************ +Rem 執行 Node.js 的 mysql Server 端程式 +Rem ************************************************ + +cd C:\api\mariadb-v2 +node server.js +pause diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f4724f3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1914 @@ +{ + "name": "mariadb-v2", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mariadb-v2", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "dotenv": "^17.2.3", + "express": "^5.2.1", + "helmet": "^8.1.0", + "morgan": "^1.10.1", + "multer": "^2.0.2", + "mysql2": "^3.16.0", + "node-schedule": "^2.1.1", + "nodemailer": "^7.0.12", + "winston": "^3.19.0", + "winston-daily-rotate-file": "^5.0.0" + }, + "devDependencies": { + "nodemon": "^3.1.11" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", + "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "license": "MIT" + }, + "node_modules/lru.min": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz", + "integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql2": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.16.0.tgz", + "integrity": "sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-schedule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "license": "MIT", + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nodemailer": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.12.tgz", + "integrity": "sha512-H+rnK5bX2Pi/6ms3sN4/jRQvYSMltV6vqup/0SFOrxYYY/qoNvhXPlYq3e+Pm9RFJRwrMGbMIwi81M4dxpomhA==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "license": "MIT" + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-5.0.0.tgz", + "integrity": "sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==", + "license": "MIT", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^3.0.0", + "triple-beam": "^1.4.1", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f79d1ef --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "mariadb-v2", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js", + "dev": "nodemon server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "dependencies": { + "cors": "^2.8.5", + "dotenv": "^17.2.3", + "express": "^5.2.1", + "helmet": "^8.1.0", + "morgan": "^1.10.1", + "multer": "^2.0.2", + "mysql2": "^3.16.0", + "node-schedule": "^2.1.1", + "nodemailer": "^7.0.12", + "winston": "^3.19.0", + "winston-daily-rotate-file": "^5.0.0" + }, + "devDependencies": { + "nodemon": "^3.1.11" + } +} diff --git a/public/upload/eis_demo/files/R14-%C3%A7%C2%94%C2%A2%C3%A5%C2%93%C2%81.pdf b/public/upload/eis_demo/files/R14-%C3%A7%C2%94%C2%A2%C3%A5%C2%93%C2%81.pdf new file mode 100644 index 0000000..a811843 Binary files /dev/null and b/public/upload/eis_demo/files/R14-%C3%A7%C2%94%C2%A2%C3%A5%C2%93%C2%81.pdf differ diff --git a/public/upload/eis_demo/images/%C3%A7%C2%8D%C2%A8%C3%A8%C2%A7%C2%92%C3%A7%C2%8D%C2%B8-01.png b/public/upload/eis_demo/images/%C3%A7%C2%8D%C2%A8%C3%A8%C2%A7%C2%92%C3%A7%C2%8D%C2%B8-01.png new file mode 100644 index 0000000..7063e7a Binary files /dev/null and b/public/upload/eis_demo/images/%C3%A7%C2%8D%C2%A8%C3%A8%C2%A7%C2%92%C3%A7%C2%8D%C2%B8-01.png differ diff --git a/public/upload/eis_demo/images/Wiki_js_002-1757645493970.jpg b/public/upload/eis_demo/images/Wiki_js_002-1757645493970.jpg new file mode 100644 index 0000000..e85adad Binary files /dev/null and b/public/upload/eis_demo/images/Wiki_js_002-1757645493970.jpg differ diff --git a/public/upload/eis_demo/images/Wiki_js_002.jpg b/public/upload/eis_demo/images/Wiki_js_002.jpg new file mode 100644 index 0000000..e85adad Binary files /dev/null and b/public/upload/eis_demo/images/Wiki_js_002.jpg differ diff --git a/public/upload/eis_demo/images/image002.png b/public/upload/eis_demo/images/image002.png new file mode 100644 index 0000000..2200bb9 Binary files /dev/null and b/public/upload/eis_demo/images/image002.png differ diff --git a/public/upload/eis_demo/images/scaled_21f91341-f001-4b78-ac46-d49399684d1f7610395375701228693.jpg b/public/upload/eis_demo/images/scaled_21f91341-f001-4b78-ac46-d49399684d1f7610395375701228693.jpg new file mode 100644 index 0000000..c923378 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_21f91341-f001-4b78-ac46-d49399684d1f7610395375701228693.jpg differ diff --git a/public/upload/eis_demo/images/scaled_354703f3-4059-4852-892c-5275d15e56246170724533503916784.jpg b/public/upload/eis_demo/images/scaled_354703f3-4059-4852-892c-5275d15e56246170724533503916784.jpg new file mode 100644 index 0000000..95efcb5 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_354703f3-4059-4852-892c-5275d15e56246170724533503916784.jpg differ diff --git a/public/upload/eis_demo/images/scaled_42cc2e57-ed62-4dbc-9d04-820b378f78184610973902748151719.jpg b/public/upload/eis_demo/images/scaled_42cc2e57-ed62-4dbc-9d04-820b378f78184610973902748151719.jpg new file mode 100644 index 0000000..ccdafd1 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_42cc2e57-ed62-4dbc-9d04-820b378f78184610973902748151719.jpg differ diff --git a/public/upload/eis_demo/images/scaled_50f9e8b3-1cf4-48b6-bbf4-1ed97c349a117733946402831387524.jpg b/public/upload/eis_demo/images/scaled_50f9e8b3-1cf4-48b6-bbf4-1ed97c349a117733946402831387524.jpg new file mode 100644 index 0000000..7b4ed33 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_50f9e8b3-1cf4-48b6-bbf4-1ed97c349a117733946402831387524.jpg differ diff --git a/public/upload/eis_demo/images/scaled_5a999043-72fd-47f9-9efd-a4ccdd59c0a03981339923591133534.jpg b/public/upload/eis_demo/images/scaled_5a999043-72fd-47f9-9efd-a4ccdd59c0a03981339923591133534.jpg new file mode 100644 index 0000000..a9d5f27 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_5a999043-72fd-47f9-9efd-a4ccdd59c0a03981339923591133534.jpg differ diff --git a/public/upload/eis_demo/images/scaled_60aa6b94-2b8a-45eb-b5d5-c7842dc0b4676637751394876252109.jpg b/public/upload/eis_demo/images/scaled_60aa6b94-2b8a-45eb-b5d5-c7842dc0b4676637751394876252109.jpg new file mode 100644 index 0000000..2560e80 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_60aa6b94-2b8a-45eb-b5d5-c7842dc0b4676637751394876252109.jpg differ diff --git a/public/upload/eis_demo/images/scaled_7c5f8f24-2c04-4290-a5dd-50c8de7ff1246930067392261916159.jpg b/public/upload/eis_demo/images/scaled_7c5f8f24-2c04-4290-a5dd-50c8de7ff1246930067392261916159.jpg new file mode 100644 index 0000000..bb4a61b Binary files /dev/null and b/public/upload/eis_demo/images/scaled_7c5f8f24-2c04-4290-a5dd-50c8de7ff1246930067392261916159.jpg differ diff --git a/public/upload/eis_demo/images/scaled_8f236429-934d-4d44-b4f9-ebe321430c335674418758209680189.jpg b/public/upload/eis_demo/images/scaled_8f236429-934d-4d44-b4f9-ebe321430c335674418758209680189.jpg new file mode 100644 index 0000000..aa9cc4e Binary files /dev/null and b/public/upload/eis_demo/images/scaled_8f236429-934d-4d44-b4f9-ebe321430c335674418758209680189.jpg differ diff --git a/public/upload/eis_demo/images/scaled_b6299fa9-1a89-492a-a5c4-61f3aa11102a4076602915121187820.jpg b/public/upload/eis_demo/images/scaled_b6299fa9-1a89-492a-a5c4-61f3aa11102a4076602915121187820.jpg new file mode 100644 index 0000000..e2fa491 Binary files /dev/null and b/public/upload/eis_demo/images/scaled_b6299fa9-1a89-492a-a5c4-61f3aa11102a4076602915121187820.jpg differ diff --git a/public/upload/eis_demo/images/scaled_ea2587ba-8ec0-4e1a-b1eb-e85fb61afb13767050662126637242.jpg b/public/upload/eis_demo/images/scaled_ea2587ba-8ec0-4e1a-b1eb-e85fb61afb13767050662126637242.jpg new file mode 100644 index 0000000..bac436f Binary files /dev/null and b/public/upload/eis_demo/images/scaled_ea2587ba-8ec0-4e1a-b1eb-e85fb61afb13767050662126637242.jpg differ diff --git a/public/upload/eis_demo/images/scaled_f12adcc8-7aa9-40ab-8332-c334c93a4cfe1322112868721617494.jpg b/public/upload/eis_demo/images/scaled_f12adcc8-7aa9-40ab-8332-c334c93a4cfe1322112868721617494.jpg new file mode 100644 index 0000000..2e93a0f Binary files /dev/null and b/public/upload/eis_demo/images/scaled_f12adcc8-7aa9-40ab-8332-c334c93a4cfe1322112868721617494.jpg differ diff --git a/public/upload/eis_demo/images/scaled_f90b43d2-b8fb-4bf9-a362-8bf26081e5f08791582126824221473.jpg b/public/upload/eis_demo/images/scaled_f90b43d2-b8fb-4bf9-a362-8bf26081e5f08791582126824221473.jpg new file mode 100644 index 0000000..3b6ed9e Binary files /dev/null and b/public/upload/eis_demo/images/scaled_f90b43d2-b8fb-4bf9-a362-8bf26081e5f08791582126824221473.jpg differ diff --git a/public/upload/eis_demo/images/wiki_js-010.png b/public/upload/eis_demo/images/wiki_js-010.png new file mode 100644 index 0000000..2f20130 Binary files /dev/null and b/public/upload/eis_demo/images/wiki_js-010.png differ diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..8202ae0 --- /dev/null +++ b/readme.txt @@ -0,0 +1,41 @@ +/my-api-v2 + 念岸岸 .env # 虐噫 (DB 勻, Mail 勻) + 念岸岸 server.js # 翋最宒 (Entry Point) + 念岸岸 src/ + 岫 念岸岸 config/ + 岫 岫 弩岸岸 db.js # MariaDB 窣喀偞隅 + 岫 念岸岸 services/ + 岫 岫 念岸岸 ormService.js # 瞄陑 ORM 鷂 SP + 岫 岫 念岸岸 uploadService.js # n偶奻曫 + 岫 岫 弩岸岸 mailService.js # 赩璃鷂齬最 + 岫 弩岸岸 utils/ + 岫 弩岸岸 helper.js # 籵蚚馱撿滲宒 (quotstr, date format) + 弩岸岸 public/upload # n偶奻鷵蹂 + +>> https://gemini.google.com/app/57091040afbd48e1 + + +# 1. 場宎趙 npm ㄟ (蠖倛昐) +npm init -y + +# 2. 假娊瞄陑 Web 遺殤鷂假屏袧 +npm install express cors helmet dotenv + +# 3. 假娊揃蹋曒 (MariaDB/MySQL) +npm install mysql2 + +# 4. 假娊n偶燴鷂奻齂袧 +npm install multer + +# 5. 假娊赩璃鷂齬最杶璃 +npm install nodemailer node-schedule + +# 6. 假娊筳蕆 Log 奪燴炵緙 +npm install morgan winston winston-daily-rotate-file + +# 7. (腢蚚) 假娊嶱追虐噫赻衱Ⅰ冗 +npm install --save-dev nodemon + + + + diff --git a/server.js b/server.js new file mode 100644 index 0000000..2ead2a9 --- /dev/null +++ b/server.js @@ -0,0 +1,98 @@ +const express = require('express'); +const cors = require('cors'); +const helmet = require('helmet'); +const fs = require('fs'); +const http = require('http'); +const https = require('https'); +const morgan = require('morgan'); +const logger = require('./src/utils/logger'); + +require('dotenv').config(); + +const ormService = require('./src/services/ormService'); +const mailService = require('./src/services/mailService'); +const upload = require('./src/services/uploadService'); + +const app = express(); + +// 整合 Morgan 到 Winston +app.use(morgan('combined', { + stream: { write: message => logger.info(message.trim()) } +})); + +// --- Middleware --- +const corsOptions = { + origin: [ + 'https://app.gex.com.tw', // 您的正式環境前端 + 'http://localhost:3000' // 本地開發測試用 + ], + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + allowedHeaders: ['Content-Type', 'Authorization', 'token'], // 確保 token 能被傳送 + credentials: true, // 如果需要帶 Cookie + optionsSuccessStatus: 200 +}; + +app.use(cors(corsOptions)); + +app.use(helmet()); +app.use(express.json({ limit: '100mb' })); +app.use(express.urlencoded({ extended: true, limit: '100mb' })); +//app.use('/static', express.static('public')); +app.use(express.static(__dirname + '/public')); //Serves resources from public folder + +// 啟動郵件排程 +mailService.initAutoMail().then(() => console.log('?? Mail Scheduler Started.')); + +// --- Routes (保持不變) --- +// 支援 v1 (舊版) 與 v3 (新版) +const ormRoutes = ['/xapi/v1/:dbname/:name/:dsNo', '/xapi/v2/:dbname/:name/:dsNo', '/xapi/v3/:dbname/:name/:dsNo']; + +app.post(ormRoutes, async (req, res, next) => { + try { + const params = ormService.prepareOrmPayload(req); + // 增加一個 log 觀察是哪個路徑進來的 + logger.info(`Incoming Request: ${req.url} -> SP: ${req.params.name}`); + // logger.info(`Calling SP: ${req.params.name} by User: ${req.body.token || 'Guest'}`); + + const result = await ormService.executeSp(req.params.name, params, req.params.dsNo); + res.json(result); + } catch (err) { + logger.error(`API Error on ${req.params.name}: ${err.message}`); + next(err); + } +}); + +app.post('/upload/:dbname/:typeid', upload.single('file'), (req, res) => { + if (!req.file) return res.status(400).json({ status: 400, msg: 'No file' }); + const fileUrl = `/static/upload/${req.params.dbname}/${req.params.typeid}/${req.file.filename}`; + res.json({ status: 0, data: { value: fileUrl, url: fileUrl }, msg: 'success' }); +}); + +// 全域錯誤處理 +app.use((err, req, res, next) => { + res.status(err.status || 500).json({ status: err.status || 500, msg: err.message }); +}); + +// --- Server 啟動邏輯 --- +const HTTP_PORT = process.env.PORT || 5050; + +// 啟動標準 HTTP +http.createServer(app).listen(HTTP_PORT, () => { + console.log(`?? HTTP Server running on http://localhost:${HTTP_PORT}`); +}); + +// 根據 .env 決定是否啟動 HTTPS +if (process.env.ENABLE_HTTPS === 'true') { + try { + const options = { + key: fs.readFileSync(process.env.SSL_KEY_PATH), + cert: fs.readFileSync(process.env.SSL_CRT_PATH) + }; + const HTTPS_PORT = process.env.HTTPS_PORT || 5443; + https.createServer(options, app).listen(HTTPS_PORT, () => { + console.log(`?? HTTPS Server running on https://localhost:${HTTPS_PORT}`); + }); + } catch (error) { + console.error('? Failed to start HTTPS server (Check SSL paths):', error.message); + } +} \ No newline at end of file diff --git a/src/config/db.js b/src/config/db.js new file mode 100644 index 0000000..24a8729 --- /dev/null +++ b/src/config/db.js @@ -0,0 +1,27 @@ +const mysql = require('mysql2/promise'); +require('dotenv').config(); + +const pool = mysql.createPool({ + host: process.env.DB_HOST, + port: process.env.DB_PORT || 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + waitForConnections: true, + connectionLimit: 15, // 憓雿萇潸賢 + queueLimit: 0, + multipleStatements: true, + timezone: '+08:00' // 撘瑕嗆銝 +}); + +// 皜祈岫 +pool.getConnection() + .then(conn => { + console.log(' MariaDB Connected Successfully.'); + conn.release(); + }) + .catch(err => { + console.error(' MariaDB Connection Failed:', err.message); + }); + +module.exports = pool; \ No newline at end of file diff --git a/src/services/mailService.js b/src/services/mailService.js new file mode 100644 index 0000000..ab60362 --- /dev/null +++ b/src/services/mailService.js @@ -0,0 +1,49 @@ +const nodemailer = require('nodemailer'); +const schedule = require('node-schedule'); +const db = require('../config/db'); +const logger = require('../utils/logger'); // 必須引入! + +class MailService { + constructor() { + this.transporter = nodemailer.createTransport({ + host: "smtp.gmail.com", + port: 465, + secure: true, + auth: { user: process.env.MAIL_USER, pass: process.env.MAIL_PASS } + }); + } + + async initAutoMail() { + // 每 30 秒執行一次 + schedule.scheduleJob('*/30 * * * * *', async () => { + try { + // 增加一個簡單的連線檢查,避免資料庫掛掉時噴錯 + const [rows] = await db.query('SELECT * FROM zen_mail_list WHERE mail_status = 0 LIMIT 10'); + + if (rows.length > 0) { + logger.info(`AutoMail: Processing ${rows.length} messages.`); + } + + for (let row of rows) { + try { + await this.transporter.sendMail({ + from: process.env.MAIL_USER, + to: row.recipient, + subject: row.mail_subject, + html: row.content + }); + await db.query('UPDATE zen_mail_list SET mail_status = 1, sent_at = NOW() WHERE id = ?', [row.id]); + } catch (mailErr) { + logger.error(`Mail ID ${row.id} failed: ${mailErr.message}`); + await db.query('UPDATE zen_mail_list SET mail_status = 9, error_log = ? WHERE id = ?', [mailErr.message, row.id]); + } + } + } catch (dbErr) { + // 這裡現在可以正確使用 logger 了 + logger.error(`AutoMail Job DB Failure: ${dbErr.message}`); + } + }); + } +} + +module.exports = new MailService(); \ No newline at end of file diff --git a/src/services/ormService.js b/src/services/ormService.js new file mode 100644 index 0000000..02c4c6e --- /dev/null +++ b/src/services/ormService.js @@ -0,0 +1,516 @@ +/** + * ORM Service for MariaDB + * 踝 amis 隢瘙詻閫詨 ORM 頛胯澆 MariaDB Stored Procedures + * Author: Senior Engineer Refactor + */ + +const db = require('../config/db'); +const logger = require('../utils/logger'); + +class OrmService { + /** + * 瑁 Stored Procedure 銝血 amis 摰澆 + * @param {string} spName - SP 蝔 + * @param {Array} params - 賊 + * @param {number|string} dsNo - 單澆隞 (2, 3, 8, 20) + */ + async executeSp(spName, params, dsNo) { + if (spName === "orm_api") { + spName = "orm_api_v2" + } + + // 1. 撘瑕嗥Ⅱ靽 params 舫嚗踹 null.map undefined.map 撠渡嗆 + const safeParams = Array.isArray(params) ? params : []; + + // MariaDB SP 澆怨瘜: CALL sp_name(?, ?, ...) + const placeholders = safeParams.map(() => '?').join(','); + const sql = (safeParams.length > 0 || spName != "zen_null") + ? `CALL ${spName}(${placeholders})` + : `CALL ${spName}()`; // ∪豢鋆銝祈 + + // debug & hard code + /*if (spName === "zen_null") { + sql = `CALL ${spName}()`; + }*/ + // amis 寞瑁 js 澆 api, dsNo=11 嚗撠梁湔 return + if (dsNo === 11 || spName === "zen_null") { + /*return { + status: 0, + code: 0, + msg: 'ok', + data: '' + };*/ + return true; + } + + // --- 日 Log --- + const startTime = Date.now(); + // 撠貉箏銝脫嫣噶憿舐內嚗交舫瑕銝(JSON)芣瑟摰游 + const paramsDebug = JSON.stringify(params); + logger.info(`[SQL EXECUTE] Query: ${sql} | Params: ${paramsDebug}`); + // -------------------- + + try { + const [resultSets] = await db.query(sql, params); + const duration = Date.now() - startTime; + + // 敺蝯 (MariaDB 單澆) + const status = resultSets[0] && resultSets[0][0] ? resultSets[0][0] : { code: 0, msg: 'Success', recno: 0 }; + const dataSet = resultSets[1] || []; + + logger.info(`[SQL SUCCESS] SP: ${spName} | Time: ${duration}ms | Status: ${status.code}`); + + // 寞 dsNo 澆喳批捆蝯血蝡 amis + const dsNoInt = parseInt(dsNo); + switch (dsNoInt) { + //啣 0,8,9 賣舐箔 amis 澆瘙, 0 航亦撘瑁, genCode, 9 舐箔憿舐內 json + case 0: // CRUD 銵冽澆 + return { + status: status.code, + code: status.code, + msg: status.msg, + data: dataSet[0] ? (typeof dataSet[0].jsoncode === 'string' ? JSON.parse(dataSet[0].jsoncode) : dataSet[0].jsoncode) : {} + }; + + case 1: // 憪蝯 + return resultSets; + + case 3: // CRUD 銵冽澆 + return { + status: status.code === 0 ? 0 : status.code, + code: status.code === 0 ? 0 : status.code, + msg: status.msg, + data: { + items: dataSet, + total: status.recno || dataSet.length + } + }; + + case 5: // Get 雿輻, 箏 xValue + return { + status: status.code, + code: status.code, + msg: status.msg, + data: { + "xValue": dataSet[0] ? dataSet[0].xValue : null + } + }; + + case 6: // options + //const field6 = returnField || 'options'; + const field6 = 'options'; + return { + status: status.code, + code: status.code, + msg: status.msg, + data: { + [field6]: dataSet[0] ? (typeof dataSet[0].jsoncode === 'string' ? JSON.parse(dataSet[0].jsoncode) : dataSet[0].jsoncode) : [] + } + }; + + case 7: // Query Report 雿輻 + return { + status: status.code, + code: status.code, + msg: status.msg, + data: { + "count": status.recno, + "items": dataSet[0] ? (typeof dataSet[0].query === 'string' ? JSON.parse(dataSet[0].query) : dataSet[0].query) : [] + } + }; + + case 8: // Options 賊澆 (Select/Checkboxes) + return { + status: 0, + code: 0, + msg: status.msg, + data: { options: dataSet } + }; + + case 9: // config + //const field9 = returnField || 'config'; + const field9 = 'config'; + return { + status: status.code, + code: status.code, + msg: status.msg, + data: { + [field9]: dataSet[0] ? (typeof dataSet[0].jsoncode === 'string' ? JSON.parse(dataSet[0].jsoncode) : dataSet[0].jsoncode) : {} + } + }; + + case 20: // 桃鞈澆 (Form Edit) + return { + status: 0, + code: 0, + msg: status.msg, + data: dataSet[0] || {} + }; + + case 2: // 璅皞澆 + default: + return { + status: 0, + code: 0, + msg: status.msg, + recno: status.recno, + data: dataSet + }; + } + } catch (err) { + logger.error(`[SQL ERROR] SP: ${spName} | Error: ${err.message} | Params: ${JSON.stringify(params)}`); + return { status: 500, msg: `DB Error: ${err.message}`, data: null }; + } + } + + /** + * 閫詨 ORM 頛 (雿喳 index.js 抒摮銝脣脤典) + * 撠 ^ 蝚西頧 MariaDB 潸 JSON 澆 + */ + // 靽格寧箸交 req 拐辣嚗隞乩噶 IP + prepareOrmPayload(req) { + const body = req.body; + let spName = req.params.name; + + // --- 瘜 A: 箏澆 orm_api checklogin --- + if (spName === 'orm_api' || spName === 'orm_api_v2') { + logger.info(`[MODE] Fixed Mapping for ${spName}`); + spName = 'orm_api_v2'; + + // 澆 orm_kernel 敺敺 orm_data + let ret_orm_data = this.orm_kernel(req); + logger.info(`[ret_orm_data] ${ret_orm_data}`); + + // 5 貊策 CALL orm_api(?,?,?,?,?) + return [ + body.token || '', + body._$_tableName || '', + body._$_pk || '', + body._$_action || '', + ret_orm_data // 撠望舐洵 5 body.paras + ]; + } + + // For Excel Import(TBD) + if (spName === 'sys_excel_import') { + const importDbname = req.body.db_name || dbname; + const orm_table = req.body.table_name; + const orm_pk = req.body.pk; + const orm_action = 'C'; + const orm_data = JSON.stringify(req.body); + + spName = 'orm_api_v2'; + + return [ + body.token || '', + orm_table, + orm_pk, + orm_action, + orm_data // 撠望舐洵 5 body.paras + ]; + } + + // --- 瘜 B: 澆思遙 SP (豢芋撘) --- + // 斗蝟餌絞靽摮嚗隞 _$_ 剜孵蝔梧嚗拐券冽摨喳 SP + // --- 1. 蝚砌箏: token --- + const paraKeys = Object.keys(body).filter(key => { + return key !== 'token' && !key.startsWith('_$_'); + }); + + // 摮瘥摨蝣箔摨銝 (para01 -> para02) + paraKeys.sort(); + const orderedParas = paraKeys.map(key => body[key]); + + // --- 2. 菜葫臬行 token --- + let finalParams = []; + const hasToken = Object.prototype.hasOwnProperty.call(body, 'token'); + + if (hasToken) { + // [璅∪ A] 喳 token嚗[token, para01, para02...] + finalParams = [body.token || '', ...orderedParas]; + logger.info(`[PARAM_PREPARE] SP: ${spName} | Detected Token -> [token, ${paraKeys.join(', ')}]`); + } else { + // [璅∪ B] 瘝喳 token嚗[para01, para02...] + finalParams = [...orderedParas]; + logger.info(`[PARAM_PREPARE] SP: ${spName} | No Token Field -> [${paraKeys.join(', ')}]`); + } + + // 3. 蝯曹脰蝛箏豢炎 (脰風璈) + if (finalParams.length === 0) { + finalParams = []; + logger.warn(`[PARAM_CHECK] No parameters found for ${spName}. Array is empty.`); + } + + // 隞乩蝔撘臬 mariadb sp 訾舀 default, 箔脤臬亦 20250808 + // get_treedata 喳2 + if (spName === 'get_treedata' || spName === 'get_assignData') { + finalParams = [...orderedParas, "''"]; + } + // get_treedata 喳3 + //if (spName === 'zen_showsource') { + // finalParams = [...orderedParas, "''"]; + //} + + return finalParams; + } + + // null 喟征 + isnull(str) { + // 瑼X交臬衣 null, undefined 蝛箏銝 + if (str === null || str === undefined || str === '') { + return ''; + } + return str; + } + + // ~ 隞踹桀, orm_api replace, 血⊥喳 + quotstr2(str) { + return '~' + str + '~'; + } + + + //// copy from ms-sql version code 2026/01/04 + /** + * 詨摮銝脰拐辣頛 + * 祉撘桀臬函扳, Gemini 芸賣憿(頧頛臭), 亙冽唾齒瘜芸 + */ + orm_kernel(req) { + let orm_pageNo = req.body.page || '1'; + let orm_perPage = req.body.perPage || ''; + let orm_keywords = req.body.keywords || ''; + let orm_keyfield = req.body._field_ || ''; + let orm_keyid = req.body._id_ || ''; + let orm_where = ''; + // + let orm_table = req.body._$_tableName; + let orm_pk = req.body._$_pk; + let orm_action = req.body._$_action; + let orm_data = ''; + // + let i = 0; + // + let frmQ1 = ''; + let frmQ2 = ''; + let frmQ3 = ''; + let ret_sql= ''; + + //debug + // console.log(req.body); + // logger.info(`[PARAMS-orm_data] ${req.body}`); + + /* orm 寧冽迨蝔格孵, 雿 token 閰脣雿 ?? + 唳: token, 箔嗆亥岷璅皞 + */ + //orm_table = req.body._$_tableName; + if (req.body.token) { + orm_table = req.body.token + '^' + req.body._$_tableName; + } else { + orm_table = req.body._$_tableName; + } + + orm_pk = req.body._$_pk; + orm_action = req.body._$_action; + + //debug + //logger.info(`[debug-_query_filter] ${req.body._$_query_filter}`); + + if (req.body._$_query_filter) { + //甈 + if (req.body.page) { + orm_pageNo = req.body.page; + } + if (req.body.perPage) { + orm_perPage = req.body.perPage; + } + if (req.body.keywords) { + orm_keywords = req.body.keywords; + } + // _id_ 舐雯喲貊, 嗡 _query_filter 蝚 9/10 (where 銝典) + if (req.body._field_) { + orm_keyfield = req.body._field_; + } + if (req.body._id_) { + orm_keyid = req.body._id_; + } + + //debug + logger.info(`[debug-_frmQueryFlds_] ${req.body._$_frmQueryFlds_}`); + logger.info(`[debug-_frmQueryData_] ${req.body._$_frmQueryData_}`); + logger.info(`[debug-_frmQueryType_] ${req.body._$_frmQueryType_}`); + + /*********************************** + 游 where 舀 Form Header 憭甈雿亥岷璇隞, 蝔敺株銵典, 閰脤賭蝙典甈雿亥岷, 桐 Query + 蝡 post 脖, 憓 3 _$_剔霈 + req.body._$_frmQueryFlds_ exp: bildate^personid^productid + req.body._$_frmQueryData_ exp: 20220101,20221231^A01^P001 + req.body._$_frmQueryType_ exp: C^C^C --> C=摮銝 閬敺桀 I=詨,銝桀 C I 敺W臭誑 command, 憒 Clike 銵函內 %%, I>= 銵函內 >= 閰脣 + Michael 2022/4/23 + ************************************/ + if (req.body._$_frmQueryFlds_) { + frmQ1 = req.body._$_frmQueryFlds_; + frmQ2 = req.body._$_frmQueryData_; + frmQ3 = req.body._$_frmQueryType_; + + // debug + // console.log(frmQ2); + + if (frmQ1 != '') { + let qryArr1 = frmQ1.split("^"); + let qryArr2 = frmQ2.split("^"); + let qryArr3 = frmQ3.split("^"); + + for (i = 0; i < qryArr1.length; i++) { + let v_filter = qryArr3[i].substring(1); + if (qryArr3[i].substr(0, 1) == 'C') { + if (qryArr2[i] != '' && qryArr2[i] != '0') { + //if (qryArr2[i] != '') { + //Date Range (between) + let qryArr4 = qryArr2[i].split(","); + if (qryArr4.length > 1) { + orm_where = orm_where + qryArr1[i] + ' >= ' + this.quotstr2(qryArr4[0]) + ' and ' + qryArr1[i] + ' <= ' + this.quotstr2(qryArr4[1]) + (i == qryArr1.length - 1 ? '' : ' and '); + } + else if (v_filter == 'like') { + orm_where = orm_where + qryArr1[i] + ' like ' + this.quotstr2('%' + qryArr2[i] + '%') + (i == qryArr1.length - 1 ? '' : ' and '); + } else { + orm_where = orm_where + qryArr1[i] + ' = ' + this.quotstr2(qryArr2[i]) + (i == qryArr1.length - 1 ? '' : ' and '); + } + } + } else { + if (qryArr2[i] != '') { + if (v_filter == '') { + orm_where = orm_where + qryArr1[i] + '=' + qryArr2[i] + (i == qryArr1.length - 1 ? '' : ' and '); + } else { + orm_where = orm_where + qryArr1[i] + v_filter + qryArr2[i] + (i == qryArr1.length - 1 ? '' : ' and '); + } + } + } + } + //餅敺5蝣潛 and + if (orm_where.substr(orm_where.length - 5, 5) == ' and ') { + orm_where = orm_where.substr(0, orm_where.length - 5); + } + } + } + /****************************************************/ + + orm_data = req.body._$_query_filter; + const myArr = orm_data.split("^"); + //孵亥銝銝 orm_keywords, 1st=* 2st=myArr[7] 3st=蝛箇orm_keywords + if (orm_keywords == '*') { + orm_keywords = ''; + } else if (this.isnull(myArr[7]) != '') { + //脤(函寞瘜隤文, ${ls:query_id} 璈) + if (myArr[7] == '{$ls:token}') { + orm_keywords = ''; + } else { + orm_keywords = myArr[7]; + } + } + + // where keyword + if (orm_where == '' || !orm_where) { + orm_where = ''; + } + + if (this.isnull(myArr[4]) != '' && orm_where == '') { + orm_where = myArr[4]; + } + + if (orm_perPage == '' || !orm_perPage) { + orm_perPage = myArr[1]; + if (!orm_perPage) { orm_perPage = 10; } + } + + // 銵典桐 call , 喲訾冽迨璈, 隞亙銝蝛箏澆斗 2023/1/28 Michael + if (this.isnull(myArr[8]) != '' && this.isnull(myArr[9]) != '' && orm_keyfield == '' && orm_keyid == '') { + orm_keyfield = myArr[8]; + orm_keyid = myArr[9]; + } + + // debug to see the content + // logger.info(`[PARAMS-orm_data] ${orm_data}`); + + //蝡臬喳 sample: 1^10^functiontag^*^^^functiontag,tablename,fieldname^abc01^functiontag^abc01 + orm_data = orm_pageNo + '^' + orm_perPage + '^' + myArr[2] + '^' + myArr[3] + '^' + orm_where + '^' + this.isnull(myArr[5]) + '^' + this.isnull(myArr[6]) + '^' + orm_keywords + '^' + orm_keyfield + '^' + orm_keyid; + } else //if (spName == 'orm_api') { + { + //撠 details Object 憿(amis joinValues Issue) + /* + if (req.body.details) { + for (let i = 0; i < req.body.details.length; i++) { + // hard code productid, 蝣箄∟炊敺, 唾齒瘜寧粹 20230828 Michael + if (typeof req.body.details[i].productid === 'object' && req.body.details[i].productid.productid !== null) { + req.body.details[i].productid = req.body.details[i].productid.productid; + } + } + } + + orm_api_v2 銝餉舀寧箇 parseJSON 喳亦 json + 銝餉 amis details picker 閬憭詨, json 批捆閬函寞 + 寧 parseJSON 箸撖怠交怠, 賊瘥頛憟賣批, 雿航隞蝝唳葫閰阡, 桀隞冽葫閰虫葉 20240127 + */ + + // hard code productid, 蝣箄∟炊敺, 唾齒瘜寧粹 20230828 Michael (銝蝔撘蝣澆皜祈岫銝) + let obj_id = {}; + let obj_id2 = ''; + let obj_id3 = {}; + //console.log(obj_id); + //quickEdit donot execute + console.log(Object.keys(req.body)); + console.log(req.body.hasOwnProperty("config")); + if (Object.keys(req.body)[1] === 'rowsDiff' || Object.keys(req.body)[3] === 'rowsOrigin') { + // break + console.log('quickEdit'); + //} else if (Object.keys(req.body)[0] === 'config' || Object.keys(req.body)[6] === 'config') { + } else if (req.body.hasOwnProperty("config") || req.body.hasOwnProperty("options")) { + // break + console.log('config-children or options'); + } else if (Object.keys(req.body)[0] === '0' || req.body._$_tableName === 'zen_fields') { + // break + console.log('zen_import_fields orm write error'); + } else { + for (let i = 0; i < Object.keys(req.body).length; i++) { + //console.log( Object.keys(req.body)[i]); + + if (Object.keys(req.body)[i] == 'details') { + //console.log( Object.keys(req.body.details)); + for (let j = 0; j < Object.keys(req.body.details).length; j++) { + // hard code productid, 蝣箄∟炊敺, 唾齒瘜寧粹 20230828 Michael + obj_id = req.body.details[Object.keys(req.body.details)[j]]; + //console.log(obj_id); + for (let k = 0; k < Object.keys(obj_id).length; k++) { + obj_id3 = obj_id[Object.keys(obj_id)[k]]; + if (typeof obj_id3 === 'object') { + obj_id2 = Object.keys(obj_id3)[0]; + //console.log(obj_id2); + if (obj_id2 !== null) { + //console.log(obj_id2); + req.body.details[j][obj_id2] = req.body.details[j][obj_id2][obj_id2]; + } + } + } + } + } else { + obj_id = req.body[Object.keys(req.body)[i]]; + + if (typeof obj_id === 'object') { + obj_id2 = Object.keys(obj_id)[0]; + //console.log(obj_id2); + if (obj_id2 !== null) { + //req.body[Object.keys(req.body)[i]] = req.body[Object.keys(req.body)[i]][obj_id2]; + req.body[obj_id2] = req.body[obj_id2][obj_id2]; + } + } + } + } + } + + orm_data = JSON.stringify(req.body); + } + // + return orm_data; + } + //// +} + +module.exports = new OrmService(); \ No newline at end of file diff --git a/src/services/uploadService.js b/src/services/uploadService.js new file mode 100644 index 0000000..85595e3 --- /dev/null +++ b/src/services/uploadService.js @@ -0,0 +1,32 @@ +const multer = require('multer'); +const fs = require('fs'); +const path = require('path'); + +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + const { dbname, typeid } = req.params; + const uploadPath = path.join(__dirname, `../../public/upload/${dbname}/${typeid}`); + fs.mkdirSync(uploadPath, { recursive: true }); + cb(null, uploadPath); + }, + filename: (req, file, cb) => { + const dateStr = new Date().toISOString().replace(/[:.]/g, '-'); + cb(null, `${dateStr}-${file.originalname}`); + } +}); + +const upload = multer({ + storage, + limits: { fileSize: parseInt(process.env.MAX_FILE_SIZE) || 50 * 1024 * 1024 }, + fileFilter: (req, file, cb) => { + // 蝳甇V喳梢芸舀 + const forbiddenExtensions = ['.exe', '.sh', '.php', '.js', '.bat']; + const ext = path.extname(file.originalname).toLowerCase(); + if (forbiddenExtensions.includes(ext)) { + return cb(new Error('File type not allowed'), false); + } + cb(null, true); + } +}); + +module.exports = upload; \ No newline at end of file diff --git a/src/utils/logger.js b/src/utils/logger.js new file mode 100644 index 0000000..9a0c2d1 --- /dev/null +++ b/src/utils/logger.js @@ -0,0 +1,44 @@ +const winston = require('winston'); +require('winston-daily-rotate-file'); +const path = require('path'); + +const logFormat = winston.format.combine( + winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), + winston.format.printf(info => `${info.timestamp} [${info.level.toUpperCase()}]: ${info.message}`) +); + +// 設定檔案滾動 (每天產生一個新檔,保留 14 天) +const dailyRotateFileTransport = new winston.transports.DailyRotateFile({ + filename: 'logs/application-%DATE%.log', + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + maxSize: '20m', + maxFiles: '14d', + format: logFormat +}); + +const errorFileTransport = new winston.transports.DailyRotateFile({ + level: 'error', + filename: 'logs/error-%DATE%.log', + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + maxSize: '20m', + maxFiles: '30d', + format: logFormat +}); + +const logger = winston.createLogger({ + level: process.env.LOG_LEVEL || 'info', + transports: [ + dailyRotateFileTransport, + errorFileTransport, + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + logFormat + ) + }) + ] +}); + +module.exports = logger; \ No newline at end of file diff --git a/ssl/AAACertificateServices.crt b/ssl/AAACertificateServices.crt new file mode 100644 index 0000000..33c71ba --- /dev/null +++ b/ssl/AAACertificateServices.crt @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- diff --git a/ssl/USERTrustRSAAAACA.crt b/ssl/USERTrustRSAAAACA.crt new file mode 100644 index 0000000..cc2d08b --- /dev/null +++ b/ssl/USERTrustRSAAAACA.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7 +MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD +VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE +AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4 +MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5 +MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO +ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI +s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG +vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ +Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb +IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0 +tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E +xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV +icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5 +D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ +WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ +5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG +KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg +EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID +ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG +BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t +L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr +BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA +A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+ +rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+ +/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA +CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F +zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA +vGp4z7h/jnZymQyd/teRCBaho1+V +-----END CERTIFICATE----- diff --git a/ssl/certificate.crt b/ssl/certificate.crt new file mode 100644 index 0000000..1f27ed9 --- /dev/null +++ b/ssl/certificate.crt @@ -0,0 +1,37 @@ +-----BEGIN CERTIFICATE----- +MIIGizCCBPOgAwIBAgIRAMpp0hTVnTNA8nHekzJofCkwDQYJKoZIhvcNAQELBQAw +YDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE +AxMuU2VjdGlnbyBQdWJsaWMgU2VydmVyIEF1dGhlbnRpY2F0aW9uIENBIERWIFIz +NjAeFw0yNTA3MTUwMDAwMDBaFw0yNjA3MTUyMzU5NTlaMBkxFzAVBgNVBAMTDmFw +aS5nZXguY29tLnR3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsofB +Hrxs0VV2pATNZeawwqC5tvuRlhURnLcm9EC9YtiSeeKjukg4kZpr5+hKiNh6lsvW +2smkLl37j+gTa0d7DMpUWNmEtmSUmMx0EvnWsDECIynW4PuZitjR/4VmeS9bxMI7 +hsa+kQGnzfjvvCkofhwWLYCw0h4en1tGAQq4TlGcP4wZeGfyjfbdpCRyd5wHNiE9 +F1Lh0S0URC+PLltOyQX2FaJLxUKnOrKLl5V7hQvgIDDPCAcySdWFcXAMmJpKeRHb +L3ThdWBxPH4OcYs9GJsVAWcO+cV0f++sBTozt+TgnfLFU5oGONqNB349tUts6Zu0 +yg/KCGZTPHZvFXXjOQIDAQABo4IDBTCCAwEwHwYDVR0jBBgwFoAUaMASFhgOr872 +h6YyV6NGUV3LBycwHQYDVR0OBBYEFFK96TipyR8phtAVR1EiYOtdDfmBMA4GA1Ud +DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr +BgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEW +F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEE +eDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29Q +dWJsaWNTZXJ2ZXJBdXRoZW50aWNhdGlvbkNBRFZSMzYuY3J0MCMGCCsGAQUFBzAB +hhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAtBgNVHREEJjAkgg5hcGkuZ2V4LmNv +bS50d4ISd3d3LmFwaS5nZXguY29tLnR3MIIBfwYKKwYBBAHWeQIEAgSCAW8EggFr +AWkAdwDYCVU7lE96/8gWGW+UT4WrsPj8XodVJg8V0S5yu0VLFAAAAZgMbNSkAAAE +AwBIMEYCIQDGR0Nuw7OsH2o+TRAH7GwNPhkIe7lZWRs0ccnLIjgKcAIhANrIAcCy +TkXkE4wHYKgrXJSKVI5jJMjMKul4gdcLIpWDAHYArKswcGzr7IQx9BPS9JFfER5C +JEOx8qaMTzwrO6ceAsMAAAGYDGzUagAABAMARzBFAiB5nz6YPWn41YXMMArlvxPH +m6o6CEK7Ai7HrYNU5HIZigIhAMJ4KTxfg+kR6MWqP83f9P15Qyw16iJm3hByObEM +kV/yAHYA1219ENGn9XfCx+lf1wC/+YLJM1pl4dCzAXMXwMjFaXcAAAGYDGzUQwAA +BAMARzBFAiBo3c0jrE1ri4XLwNX0pjiksWCBJt0zRlNVyhnfU1UhOQIhAOHt4Vnd +mjno7yn7zUPOY95JrGXOYyCmA97qimNjAUL9MA0GCSqGSIb3DQEBCwUAA4IBgQCM +w8XCex+oGGatwFLFzctyUSGZ6i/19T4Bk1CzBvscLsn1xe0eVvT8bkaBwuzFJQN0 +35q5FEXqIGlhsXIZYEeRAYe1xIHe8M03vWL8T1fPzqbCevSsZCOOljWOiaxeNAx9 +2AUlV/iORzfW1Pirj8XRUrvF15EQ8Fg0DPdOb8K8FfOkgEAubn6omTSimP0gTzF1 +KvMT87CqGuhIkr847/H+Hux7wpio4jy32QxMVIxVjUCP+Vp3QBPIjrErlfF9Qn8m +S8OCgQn3CcZPCB9lsONRRhDEjkvGhUXdZWED7A1XlgGl9odavdwr5cMadujmE/Do +XjlNod4V0C6sxH9JBfS/cV5scTzJZHuQs38h34FndVVQFgB9x2T1BVeDxrNeARJz +lvnNYQ6jQyitkSmy2R1F2Eflml8wB3pS2xWfuGAPPfvqdEk6Hl+H0xzU+GzLq14A +jZQt9wi59a8K47dcG/U0lT7nn5HdDbpj1xp7p6PJUPEsjCGsQ4BhKvUS8MyauUg= +-----END CERTIFICATE----- diff --git a/ssl/pre/ca_bundle.crt b/ssl/pre/ca_bundle.crt new file mode 100644 index 0000000..1d1739b --- /dev/null +++ b/ssl/pre/ca_bundle.crt @@ -0,0 +1,39 @@ +-----BEGIN CERTIFICATE----- +MIIG1TCCBL2gAwIBAgIQbFWr29AHksedBwzYEZ7WvzANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjAw +MTMwMDAwMDAwWhcNMzAwMTI5MjM1OTU5WjBLMQswCQYDVQQGEwJBVDEQMA4GA1UE +ChMHWmVyb1NTTDEqMCgGA1UEAxMhWmVyb1NTTCBSU0EgRG9tYWluIFNlY3VyZSBT +aXRlIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAhmlzfqO1Mdgj +4W3dpBPTVBX1AuvcAyG1fl0dUnw/MeueCWzRWTheZ35LVo91kLI3DDVaZKW+TBAs +JBjEbYmMwcWSTWYCg5334SF0+ctDAsFxsX+rTDh9kSrG/4mp6OShubLaEIUJiZo4 +t873TuSd0Wj5DWt3DtpAG8T35l/v+xrN8ub8PSSoX5Vkgw+jWf4KQtNvUFLDq8mF +WhUnPL6jHAADXpvs4lTNYwOtx9yQtbpxwSt7QJY1+ICrmRJB6BuKRt/jfDJF9Jsc +RQVlHIxQdKAJl7oaVnXgDkqtk2qddd3kCDXd74gv813G91z7CjsGyJ93oJIlNS3U +gFbD6V54JMgZ3rSmotYbz98oZxX7MKbtCm1aJ/q+hTv2YK1yMxrnfcieKmOYBbFD +hnW5O6RMA703dBK92j6XRN2EttLkQuujZgy+jXRKtaWMIlkNkWJmOiHmErQngHvt +iNkIcjJumq1ddFX4iaTI40a6zgvIBtxFeDs2RfcaH73er7ctNUUqgQT5rFgJhMmF +x76rQgB5OZUkodb5k2ex7P+Gu4J86bS15094UuYcV09hVeknmTh5Ex9CBKipLS2W +2wKBakf+aVYnNCU6S0nASqt2xrZpGC1v7v6DhuepyyJtn3qSV2PoBiU5Sql+aARp +wUibQMGm44gjyNDqDlVp+ShLQlUH9x8CAwEAAaOCAXUwggFxMB8GA1UdIwQYMBaA +FFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBTI2XhootkZaNU9ct5fCj7c +tYaGpjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUE +FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwIgYDVR0gBBswGTANBgsrBgEEAbIxAQIC +TjAIBgZngQwBAgEwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1 +c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYG +CCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3Qu +Y29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRw +Oi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAVDwoIzQDV +ercT0eYqZjBNJ8VNWwVFlQOtZERqn5iWnEVaLZZdzxlbvz2Fx0ExUNuUEgYkIVM4 +YocKkCQ7hO5noicoq/DrEYH5IuNcuW1I8JJZ9DLuB1fYvIHlZ2JG46iNbVKA3ygA +Ez86RvDQlt2C494qqPVItRjrz9YlJEGT0DrttyApq0YLFDzf+Z1pkMhh7c+7fXeJ +qmIhfJpduKc8HEQkYQQShen426S3H0JrIAbKcBCiyYFuOhfyvuwVCFDfFvrjADjd +4jX1uQXd161IyFRbm89s2Oj5oU1wDYz5sx+hoCuh6lSs+/uPuWomIq3y1GDFNafW ++LsHBU16lQo5Q2yh25laQsKRgyPmMpHJ98edm6y2sHUabASmRHxvGiuwwE25aDU0 +2SAeepyImJ2CzB80YG7WxlynHqNhpE7xfC7PzQlLgmfEHdU+tHFeQazRQnrFkW2W +kqRGIq7cKRnyypvjPMkjeiV9lRdAM9fSJvsB3svUuu1coIG1xxI1yegoGM4r5QP4 +RGIVvYaiI76C0djoSbQ/dkIUUXQuB8AL5jyH34g3BZaaXyvpmnV4ilppMXVAnAYG +ON51WhJ6W0xNdNJwzYASZYH+tmCWI+N60Gv2NNMGHwMZ7e9bXgzUCZH5FaBFDGR5 +S9VWqHB73Q+OyIVvIbKYcSc2w/aSuFKGSA== +-----END CERTIFICATE----- diff --git a/ssl/pre/certificate.crt b/ssl/pre/certificate.crt new file mode 100644 index 0000000..be04a5b --- /dev/null +++ b/ssl/pre/certificate.crt @@ -0,0 +1,37 @@ +-----BEGIN CERTIFICATE----- +MIIGbDCCBFSgAwIBAgIRAP+xCJvA5ssP/6EmqA7p960wDQYJKoZIhvcNAQEMBQAw +SzELMAkGA1UEBhMCQVQxEDAOBgNVBAoTB1plcm9TU0wxKjAoBgNVBAMTIVplcm9T +U0wgUlNBIERvbWFpbiBTZWN1cmUgU2l0ZSBDQTAeFw0yMzA0MzAwMDAwMDBaFw0y +MzA3MjkyMzU5NTlaMBkxFzAVBgNVBAMTDmFwaS5nZXguY29tLnR3MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqrhI+MLi+rsUSGlPHIrPnJ4+SGnntnQn +6W1xbd5go2FOiU1Z0d8gfIo4acH9qO6sFSL8MwjREkeG2szHSoOONx2dDll+bioq +c5QrB0PsdRUgEX+xlvHgIbJjm4xiSgGVhlDAoK9fc9E+UMQa7uRIy01X8zjqYoNo +rgGlF6Nf4ffpedK48A9oflIiN1VsgsQLRR3yJlG7qaFR78qJd8aH9U+feZ9H/fIW +F9iOAEI0+Zpz6nRzc0zqinap4/+Gas+MSRcGkptX6Znw+NwVKMdPkSTmDSyXswU1 +5Ns4wjCF2EqnAbMbuQqbOkV8c3AqwL/pZnadNVacW5s6NwRJpX16EwIDAQABo4IC +ezCCAncwHwYDVR0jBBgwFoAUyNl4aKLZGWjVPXLeXwo+3LWGhqYwHQYDVR0OBBYE +FAuVtNojbIzcY48XCw9/6Pmy03KaMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8E +AjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJBgNVHSAEQjBAMDQG +CysGAQQBsjEBAgJOMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20v +Q1BTMAgGBmeBDAECATCBiAYIKwYBBQUHAQEEfDB6MEsGCCsGAQUFBzAChj9odHRw +Oi8vemVyb3NzbC5jcnQuc2VjdGlnby5jb20vWmVyb1NTTFJTQURvbWFpblNlY3Vy +ZVNpdGVDQS5jcnQwKwYIKwYBBQUHMAGGH2h0dHA6Ly96ZXJvc3NsLm9jc3Auc2Vj +dGlnby5jb20wggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdwCt9776fP8QyIudPZwe +PhhqtGcpXc+xDCTKhYY069yCigAAAYfRcwfDAAAEAwBIMEYCIQDocC5ZkoSr0GWX +GuLPEosM2pbIkYLyQz3EmEHNQUwdQQIhAOr+1q3jIRN1IxG8LMKwkB8Y71Oeisos +IiyaRmBD4NADAHYAejKMVNi3LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61IAAAGH +0XMIHAAABAMARzBFAiEAssoYv0oEVSZraxpPjdyg29pNLREQcodN68Fl2Gy/+t8C +IBH8Z0ohdsXlfBzqI0PaylUK3+QmR7Gl67lkz/9QxlYyMBkGA1UdEQQSMBCCDmFw +aS5nZXguY29tLnR3MA0GCSqGSIb3DQEBDAUAA4ICAQByseVToYNy2DQgKfhA4uom +PDYbfYjfQT5xPlIk2JiXfeB34JxjVtO77hw4gfMlVi+TdzBj7tKzuz0V+pL4MhiW +hsHUwPtNZGUSdFAdLGlEE1x6s+Js38+nXTSiG+SDXGyOwQeoXDJtckOX03N1/CKa +/FM2T2HbyWziiW6erzHekkRrzOEXgQRt/b3pA1EYhj5bhG+bLmEDmfkeot0y2BvP +rBhkgcwpPqut7y0Jhfdo5KgBbWGYPjjWUQOzwldQMjovRnA0m77A5OpDZwOwfpbE +KhCK8sj5OQFKAC7SHLPmLkCRhW55OsSlRt+3o8szO/MfO51otR8kbtkbbYJcLRFq +6g7lVXGiVYEl63P+L/QqIZli8YUk0XijDIf9CZlbS/ZB41PKxJT3z/XrOrrkmaF+ +QZFDOya4CBIeBdBAJcVkwf+rV1JvmYxxKSu0VHRiPSugwqT9TokOWUFUlJKapFu9 +w3/JOlfeLgucH8M4tcwnmTyBQAkSSr8gSLgyVOLI+78z8YiLBSpnUYJ1tE4iw7WB +fjSN0V6wCO9iijbeMoZ56qO8bcbL+iRCSSKfjJFL77OegV6sZGqcrZ04zXD/7rAp +u6AytbEfxvrKE6xC3jJzUdVO7wstOBUcGaliVQ8bcFthU3XRYT/SI1CgsKCsbHQD +BNXcZTV0CZQEul/CRxyBqA== +-----END CERTIFICATE----- diff --git a/ssl/pre/private.key b/ssl/pre/private.key new file mode 100644 index 0000000..a0c0ef8 --- /dev/null +++ b/ssl/pre/private.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAqrhI+MLi+rsUSGlPHIrPnJ4+SGnntnQn6W1xbd5go2FOiU1Z +0d8gfIo4acH9qO6sFSL8MwjREkeG2szHSoOONx2dDll+bioqc5QrB0PsdRUgEX+x +lvHgIbJjm4xiSgGVhlDAoK9fc9E+UMQa7uRIy01X8zjqYoNorgGlF6Nf4ffpedK4 +8A9oflIiN1VsgsQLRR3yJlG7qaFR78qJd8aH9U+feZ9H/fIWF9iOAEI0+Zpz6nRz +c0zqinap4/+Gas+MSRcGkptX6Znw+NwVKMdPkSTmDSyXswU15Ns4wjCF2EqnAbMb +uQqbOkV8c3AqwL/pZnadNVacW5s6NwRJpX16EwIDAQABAoIBAHqR9ypLWgWkfaqD +mV4nt2l+H7+D8e4INYOdpRu51m5W9bkUhRFufneMEXa05fb87SX7yVCm2tyh6At9 +jPRNwbSGmXVtAZ38vh/fWIlN1h41vaFyqcFzBXWMC4HpZ8Q0oPMfVT3Iy+Jub6wz +MBcmZbE5ZZTl3zo9mNGdsrdm//dPBUvXFHPljRYJRgK8ZMD0NK+eWn7ynzYPtHBu +U/djjCUqoUGVokXPymdCc/FfD9FdLJo7d9b3udShrELCZA3nrk+COmgGFgoEiz7n +QDAG0MNMtRL3BXrpDkxoB3ZIQpe1eI996axRffdAPMOOGrNNLb/90IwTI4ZzaCgx +TWnF/pkCgYEA7pclED+YDBXz8f6D2UkA9P4UFv3c+JIdTHZ+vvyisTMJdEbgHgfy +NvzwYm+nHvbestb0sFV3X6y7LA5WetxeX0f7iCUSwo1/GmgO9u6QA5b1h758BZhh +auhhHq5GRwi4M3Ddzo5KzmBFCvt4jW8EM8Ahv+fujhNPGCaFc1LSIMcCgYEAty1S +hUgTdwECbmBLQi9Wg9DGPSBooOYhlJ9kll3I5oydLHb5LxxfSfLi17g4JXRVr/aJ +uUFzf0aLUgYiGH+H2I2cH2qAGeCw3P/gFXHUntUqBKb9yEb3rngahVViV+zWTPQY +gPSbscDC51jtzbkFBx4RF65v6Kr24T2xrrQaqFUCgYEAwsMK9FqVSbhZ7H8xLhxT +9am6yJHu4dKUrChGiq08OZ5J52s75Afkh1KvAAvYxoQLgr3J/G+oBKfCGtKRcbWW +K/1crORmjf5ndSzgml5fnS6Lu4WZRBAB5f1P2nW01KOfig5mYgjxs8oOUkq5O+sV +6RC7/CXeLIhClppLcbp34V0CgYEAqYJodexADwVBIbE8k6/IyMyfVpuyFws/khB6 +feel7Su8mxQx/hWsXHtGzkestYRVczObOXNHFUXL0YjZboA9zvkku7HLf6b9JFYp +IM8o6h7q9kkuWnLJ64s7R52/FwyVN7s/Hb6+gZyXAI276n9IFtENEjQbXV0wfzmf +PsNuU80CgYAIrPJMTa3jTQyrq7Rl5KNQLvn5ciUmi2yM0sH6zDnYv0KDd/rbl2LB +KgrYI/UAzBySzmls/5Oxw0/2hyW+x7HQGSwgganUQ8o9f8t5lXwU+v6609adnHkN +GJV+CShfoDI9oIAIT/KehwC3V1tGcqkl2qYG3bWyAdfvuRpMviCrJw== +-----END RSA PRIVATE KEY----- diff --git a/ssl/private.key b/ssl/private.key new file mode 100644 index 0000000..10e2ff0 --- /dev/null +++ b/ssl/private.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCyh8EevGzRVXak +BM1l5rDCoLm2+5GWFRGctyb0QL1i2JJ54qO6SDiRmmvn6EqI2HqWy9bayaQuXfuP +6BNrR3sMylRY2YS2ZJSYzHQS+dawMQIjKdbg+5mK2NH/hWZ5L1vEwjuGxr6RAafN ++O+8KSh+HBYtgLDSHh6fW0YBCrhOUZw/jBl4Z/KN9t2kJHJ3nAc2IT0XUuHRLRRE +L48uW07JBfYVokvFQqc6souXlXuFC+AgMM8IBzJJ1YVxcAyYmkp5EdsvdOF1YHE8 +fg5xiz0YmxUBZw75xXR/76wFOjO35OCd8sVTmgY42o0Hfj21S2zpm7TKD8oIZlM8 +dm8VdeM5AgMBAAECggEAYOLHbVS4gUouHoj0pu5w0s7Cuoj/00EP08qZe0h+/tul +cjwKupdjC7GQCcTIXkeND7UDnqx7SyZ51PkPQNMD9kb/S1CQcyNWeS3LeFjZp7iQ +/mBAWsxv4SgVnuPYXr/Sv47hGx1UYgFR/bew8p4reXTonD0QuJbb64NvFDWrG+TJ +vG6lLuJ6UIjD/b7Xrm+SewmTCU4vo/ItQATmuMisDmqYbQsqfjyZO6FXl7kGCkbD +g9zSEiq9PzX9kf+fQpHBYSNi8vkxvkSzjPgX/kNG7rHPM0r66S1hKi1KhuFgiEdq +5YUrnFme0eGeg3aOyQrNDGCNjcoXELJvksw5DdAh2QKBgQDjN0Qpsy4wYJdvQj0T +G3/Yuo0R8LCHfj6ba+WQn1sLKLFywHwfiFlJXXBAKLVK919414E0CHlhN14SMTp6 +DRHbFEqfk06OCfxi7Q41UJEJey7phbB//4Ak24NBba20Pk2qhycyWiuae9HTK2LW +fATxsUD3zQtcJv/m6U5s4YZbpwKBgQDJJZaKT/l5Bmj4x5qanjTZbZmfwBWVjBWE +6DlcptDlYjyJuhhe30YM6kwh79Qgsb5T42jHW+HzJbRwgFV2469yssEvnZ32xa2M +MHWzR57wL3KpwUldeCyP843ELPaVqUxyEcj12RM+d6EAa4nuohu5qRcxmyScrOqs +1nnZgXomHwKBgDFz/en1jcAJxev5RsG54oGRWNLmyAU1fPrm6PgpNu+e08BeFKXo +T0agh6XvNkYywRzUCtMAZSq7mkXrYQbfgVtldzh0H0za74u4fLct6eNeZD9/UYMK +YSGkhVTgQkZQqSbMc8OJzKO6/1guwTxdkdXo9nL4tdhAxMHFVcRs8YlRAoGAMiqO +vhYuGRIRMiLOG0vj0Gp2SxJkD7UtVMV6MPJl3R/AC3V/SIIU/Xmd3UTsOe86kb+A +zV/MHZFEzF4lco5cnpWYeuCrmfU5UGJxqHHvYOXkihPr0UT8kDZlIA06vp7Hsxde +cHpgQ08gt3MapoqFsatLXpLb8btqmAqxvx58sW8CgYBqrO1Uw3h0TBDiRhr3rUi0 +AH08GHIDqGFdMDLM6FJuiFX+MEH6NdLIW+zZTLkO9JFGKXsjBpoSewZt09di+E2b +97xAnc5qvzlx4JNBahWjghp6kRZrIC0mFVQ+7VWvlFyiH8q+E6BRqxGpz5A3xdI7 +DMGXTmNW+7LfmQZ6aNErsw== +-----END PRIVATE KEY-----