diff --git a/package.json b/package.json index 403133d..1f2e679 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,12 @@ "winston-daily-rotate-file": "^4.7.1" }, "devDependencies": { + "axios": "^1.6.2", "cross-env": "^7.0.3", "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", + "loadtest": "^8.0.5", "nodemon": "^3.0.1", "prettier": "^3.0.3", "sequelize-auto": "^0.8.8" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da22fec..8fd99fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ dependencies: version: 4.7.1(winston@3.11.0) devDependencies: + axios: + specifier: ^1.6.2 + version: 1.6.2 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -61,6 +64,9 @@ devDependencies: eslint-plugin-prettier: specifier: ^5.0.0 version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0) + loadtest: + specifier: ^8.0.5 + version: 8.0.5 nodemon: specifier: ^3.0.1 version: 3.0.1 @@ -356,6 +362,18 @@ packages: hasBin: true dev: true + /agent-base@4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + dependencies: + es6-promisify: 5.0.0 + dev: true + + /agentkeepalive@2.2.0: + resolution: {integrity: sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg==} + engines: {node: '>= 0.10.0'} + dev: true + /ajv-errors@3.0.0(ajv@8.12.0): resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} peerDependencies: @@ -426,6 +444,20 @@ packages: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: false + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -461,6 +493,14 @@ packages: fill-range: 7.0.1 dev: true + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.7.1 + dev: true + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -589,6 +629,13 @@ packages: text-hex: 1.0.0 dev: false + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -600,6 +647,14 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /confinode@2.1.1: + resolution: {integrity: sha512-u5u0ZHpYMnVWtelxjalNtLvL+SdP7B/7s0JTFUIkyvqqIf67DAvy6SKaE6WZiwbufLPk+6zJKsh5SdpbtbFi9g==} + engines: {node: '>=10.0.0'} + dependencies: + quick-lru: 5.1.1 + yaml: 1.10.2 + dev: true + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -637,6 +692,24 @@ packages: which: 2.0.2 dev: true + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -700,6 +773,11 @@ packages: engines: {node: '>=12'} dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false @@ -757,6 +835,41 @@ packages: engines: {node: '>= 0.8'} dev: false + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -934,6 +1047,12 @@ packages: engines: {node: '>=4.5'} dev: false + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1015,6 +1134,25 @@ packages: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: false + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /formidable@2.1.2: resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: @@ -1185,6 +1323,16 @@ packages: toidentifier: 1.0.1 dev: false + /https-proxy-agent@2.2.4: + resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} + engines: {node: '>= 4.5.0'} + dependencies: + agent-base: 4.3.0 + debug: 3.2.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -1330,6 +1478,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -1506,6 +1658,21 @@ packages: type-check: 0.4.0 dev: true + /loadtest@8.0.5: + resolution: {integrity: sha512-7a15RVrplinxEuqKJK0IOdQpH/KFWzTitxJKyRalC955gFiQQB/r0UYQkqKmaio+qFKF075c5eZSkgPTgSZWjA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + agentkeepalive: 2.2.0 + confinode: 2.1.1 + https-proxy-agent: 2.2.4 + stdio: 0.2.7 + testing: 3.1.0 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: true + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1587,14 +1754,12 @@ packages: /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: false /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: false /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -1626,6 +1791,10 @@ packages: /moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1657,6 +1826,15 @@ packages: engines: {node: '>= 0.6'} dev: false + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-gyp-build@4.7.1: + resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} + hasBin: true + dev: true + /nodemon@3.0.1: resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} engines: {node: '>=10'} @@ -1851,6 +2029,10 @@ packages: hasBin: true dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true @@ -1870,6 +2052,11 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -2105,6 +2292,10 @@ packages: engines: {node: '>= 0.8'} dev: false + /stdio@0.2.7: + resolution: {integrity: sha512-q7zge680s4BhYx91a8RqHWfiyHM9b+2ZwrNEJJkL6Y6I3F78p9Ag56enyMlpLckCH+bL1shV7YEK1cLXOaA3Bg==} + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2163,6 +2354,11 @@ packages: tslib: 2.6.2 dev: true + /testing@3.1.0: + resolution: {integrity: sha512-CJXhYndfyUrznQOGeRb1snX0NYAqt54Rux9hrbcEqCeV9Omrq/vBkFw0J80XEsJ7vWNRI0g564l58UZgEHQFEA==} + engines: {node: '>16'} + dev: true + /text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false @@ -2232,6 +2428,20 @@ packages: mime-types: 2.1.35 dev: false + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true @@ -2254,6 +2464,14 @@ packages: dependencies: punycode: 2.3.1 + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.7.1 + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -2271,6 +2489,20 @@ packages: engines: {node: '>= 0.8'} dev: false + /websocket@1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.62 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2340,9 +2572,19 @@ packages: engines: {node: '>=10'} dev: true + /yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} diff --git a/production.env.js b/production.env.js index f898a60..53ea4ea 100644 --- a/production.env.js +++ b/production.env.js @@ -27,7 +27,7 @@ const prodConfig = { // 同设备(IP)限制登陆次数 status: true, duration: 60 * 1000, - max: 100, + max: 1000000, }, database:{ mysql:{ diff --git a/src/routes/graphResource2/resourceClass/index.dto.js b/src/routes/graphResource2/resourceClass/index.dto.js index 3b4daae..65716c4 100644 --- a/src/routes/graphResource2/resourceClass/index.dto.js +++ b/src/routes/graphResource2/resourceClass/index.dto.js @@ -351,14 +351,12 @@ export function EditResourceClassItemDTO(data) { required: [ 'resourceClassBaseId', 'resourceClassBaseIdentify', - 'resourceClassBaseDescribe', 'resourceClassBaseName', ], errorMessage: { required: { resourceClassBaseId: '资源类ID为必填项', resourceClassBaseIdentify: '资源类标识为必填项', - resourceClassBaseDescribe: '资源类描述为必填项', resourceClassBaseName: '资源类名称为必填项', }, }, diff --git a/src/routes/graphResource2/resourceClass/index.js b/src/routes/graphResource2/resourceClass/index.js index b3e625f..6f27903 100644 --- a/src/routes/graphResource2/resourceClass/index.js +++ b/src/routes/graphResource2/resourceClass/index.js @@ -256,7 +256,75 @@ resourceClass.post('/editResourceClassItem', async (ctx, next) => { if (!verif.status) { return ctx.throw(400, { e: verif.error.map((i) => i.message) }); } - ctx.body = 5; + const { + resourceClassBaseName, + resourceClassBaseDescribe, + resourceClassBaseIdentify, + resourceClassBaseId, + resourceClassBaseAvatar, + resourceClassBaseDefine, + resourceClassBaseColor, + resourceClassBaseType + } = ctx.request.body; + const RRP = resourceCache.resourcePool; + let oldName,oldIdentify,atomModelId + // @ 判断ID是否存在 + if(!RRP.classIdList.includes(resourceClassBaseId)){ + return ctx.throw(400, { e: '资源类不存在' }); + }else{ + oldName = RRP.classObject[resourceClassBaseId].resourceClassBaseId + oldIdentify = RRP.classObject[resourceClassBaseId].resourceClassBaseIdentify + atomModelId = RRP.classObject[resourceClassBaseId].atomModel + } + // @ 判断名称是否重复 + if(RRP.classListForAtomModel[atomModelId].some(i => i.resourceClassBaseName == getNoSpacesStr(resourceClassBaseName) && i.resourceClassBaseId != resourceClassBaseId)){ + return ctx.throw(400, { e: '资源类重名' }); + } + // @ 判断标识是否重复 + if(RRP.classList.some(i => i.resourceClassBaseIdentify == getNoSpacesStr(resourceClassBaseIdentify).toUpperCase() && i.resourceClassBaseId != resourceClassBaseId)){ + return ctx.throw(400, { e: '资源类标识已存在' }); + } + // 修改信息 + RRP.classObject[resourceClassBaseId].resourceClassBaseName = getNoSpacesStr(resourceClassBaseName); + RRP.classObject[resourceClassBaseId].resourceClassBaseDescribe = resourceClassBaseDescribe; + RRP.classObject[resourceClassBaseId].resourceClassBaseIdentify = getNoSpacesStr(resourceClassBaseIdentify).toUpperCase(); + RRP.classObject[resourceClassBaseId].resourceClassBaseId = resourceClassBaseId; + RRP.classObject[resourceClassBaseId].resourceClassBaseAvatar = resourceClassBaseAvatar; + RRP.classObject[resourceClassBaseId].resourceClassBaseDefine = resourceClassBaseDefine; + RRP.classObject[resourceClassBaseId].resourceClassBaseColor = resourceClassBaseColor; + RRP.classObject[resourceClassBaseId].resourceClassBaseType = resourceClassBaseType; + + // @ 是否修改标识 + console.log(oldIdentify, getNoSpacesStr(resourceClassBaseIdentify).toUpperCase()) + if(oldIdentify != getNoSpacesStr(resourceClassBaseIdentify).toUpperCase()){ + console.log('更改表名') + // 需要更改表明 + // ! 删除模型 + delete ctx.sequelize.models[oldIdentify.toLowerCase()] + // ! 修改表名 + const results = await ctx.sequelize.queryInterface.renameTable('entity_' + oldIdentify.toLowerCase(),'entity_' + getNoSpacesStr(resourceClassBaseIdentify).toLowerCase()) + // ! 启动新模型 + await RRP.classModelObject[resourceClassBaseId].createSequelizeModel(); + // | 更新资源实体ID + } + ctx.body = { + message: '修改资源类信息成功' + }; + await next() + await ctx.sequelize.models.ResourceClassBase.update({ + resourceClassBaseName : getNoSpacesStr(resourceClassBaseName), + resourceClassBaseDescribe : resourceClassBaseDescribe, + resourceClassBaseIdentify : getNoSpacesStr(resourceClassBaseIdentify).toUpperCase(), + resourceClassBaseId : resourceClassBaseId, + resourceClassBaseAvatar : resourceClassBaseAvatar, + resourceClassBaseDefine : resourceClassBaseDefine, + resourceClassBaseColor : resourceClassBaseColor, + resourceClassBaseType : resourceClassBaseType, + },{ + where:{ + resourceClassBaseId + } + }) }); // @ 删除资源类 @@ -299,9 +367,9 @@ resourceClass.get('/getResourceClassCompleteInfo', async (ctx, next) => { RRP.classIdList.find((i) => { if ( RRP.classModelObject[i].classIdentify == - resourceClassBaseIdentify + getNoSpacesStr(resourceClassBaseIdentify).toUpperCase() ) { - classId = i.classId; + classId = RRP.classModelObject[i].classId; } }); if (!classId) { diff --git a/test/压力/getClassTreeForAtomMOdel.js b/test/压力/getClassTreeForAtomMOdel.js new file mode 100644 index 0000000..8a486d2 --- /dev/null +++ b/test/压力/getClassTreeForAtomMOdel.js @@ -0,0 +1,42 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: getClassTreeForAtomMOdel.js - +// | @创建时间: 2023-12-06 21:23 +// | @更新时间: 2023-12-06 21:23 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import loadtest from 'loadtest' + +// 定义要测试的目标 URL +const url = ['http://localhost:5000/graphResource2/resourceClass/getResourceClassTree?searchData&atomModelId=1', + 'http://localhost:5000/graphResource2/resourceClass/getResourceClassCompleteInfo?resourceClassBaseId=1&resourceClassBaseIdentify=', + 'http://localhost:5000/graphResource2/resourceClass/getResourceClassList?searchData=%E4%BC%81%E4%B8%9A&atomModelId=1' +] +// 定义 loadtest 的参数 +const options = { + url: url, + maxRequests: 1000, // 总请求数 + concurrency: 20 // 并发请求数 +}; + +loadtest.loadTest(options, function(error, result) { + if (error) { + console.error('压力测试失败:', error); + } else { + console.log('压力测试结果1:'); + console.log('总请求数:', result.totalRequests); + console.log('请求失败数:', result.totalErrors); + console.log('总运行时间(秒):', result.totalTimeSeconds); + console.log('平均延迟时间(毫秒):', result.meanLatencyMs); + console.log('最小延迟时间(毫秒):', result.minLatencyMs); + console.log('最大延迟时间(毫秒):', result.maxLatencyMs); + console.log('请求总字节数:', result.requestBytes); + console.log('响应总字节数:', result.responseBytes); + console.log('每秒请求数:', result.rps); + } +});