From f3848371f384a02d5e184179173bb6db675d0cd9 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Wed, 28 Jun 2023 00:05:57 +0900 Subject: [PATCH 01/14] =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=9D=B4=EB=8F=99=20(#524)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 318 ++++++++-------------------------------------- package.json | 16 +-- 2 files changed, 64 insertions(+), 270 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ae7d81b..c5d5d14d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,15 @@ "version": "0.0.8", "license": "GNU", "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-decorators": "^7.22.3", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-transform-runtime": "^7.17.0", + "@babel/preset-env": "^7.16.11", + "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", - "@types/swagger-ui-express": "^4.1.3", - "@types/winston": "^2.4.4", "aws-sdk": "^2.1101.0", + "babel-plugin-module-resolver": "^4.1.0", "body-parser": "^1.20.1", "chai": "^4.3.6", "connect": "^3.7.0", @@ -43,11 +47,6 @@ "@babel/cli": "^7.17.6", "@babel/core": "^7.17.8", "@babel/node": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", - "@babel/plugin-transform-runtime": "^7.17.0", - "@babel/preset-env": "^7.16.11", - "@babel/preset-typescript": "^7.16.7", "@types/aws-sdk": "^2.7.0", "@types/chai": "^4.3.0", "@types/cookie-parser": "^1.4.2", @@ -64,10 +63,11 @@ "@types/sinon": "^10.0.15", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", + "@types/swagger-ui-express": "^4.1.3", "@types/validator": "^13.7.17", + "@types/winston": "^2.4.4", "@typescript-eslint/eslint-plugin": "^5.16.0", "@typescript-eslint/parser": "^5.16.0", - "babel-plugin-module-resolver": "^4.1.0", "eslint": "^8.12.0", "mocha": "^10.2.0", "nodemon": "^2.0.22", @@ -256,7 +256,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" @@ -308,7 +307,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -324,7 +322,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -349,7 +346,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -443,7 +439,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -534,7 +529,6 @@ "version": "7.18.11", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", - "dev": true, "dependencies": { "@babel/helper-function-name": "^7.18.9", "@babel/template": "^7.18.10", @@ -609,7 +603,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -624,7 +617,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", @@ -641,7 +633,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9", @@ -659,7 +650,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -675,7 +665,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -710,7 +699,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -726,7 +714,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -742,7 +729,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -758,7 +744,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -774,7 +759,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -790,7 +774,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -806,7 +789,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.18.8", "@babel/helper-compilation-targets": "^7.18.9", @@ -825,7 +807,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -841,7 +822,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", @@ -858,7 +838,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -874,7 +853,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -892,7 +870,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -908,7 +885,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -920,7 +896,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -932,7 +907,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -961,7 +935,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -973,7 +946,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -985,7 +957,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1000,7 +971,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1012,7 +982,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1024,7 +993,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1036,7 +1004,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1048,7 +1015,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1060,7 +1026,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1072,7 +1037,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1084,7 +1048,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1099,7 +1062,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1114,7 +1076,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1129,7 +1090,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1144,7 +1104,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1161,7 +1120,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1176,7 +1134,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1191,7 +1148,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -1213,7 +1169,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1228,7 +1183,6 @@ "version": "7.18.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1243,7 +1197,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1259,7 +1212,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1274,7 +1226,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1290,7 +1241,6 @@ "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1305,7 +1255,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", @@ -1322,7 +1271,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1337,7 +1285,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1352,7 +1299,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1369,7 +1315,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1387,7 +1332,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", - "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.18.9", @@ -1406,7 +1350,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1422,7 +1365,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1438,7 +1380,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1453,7 +1394,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" @@ -1469,7 +1409,6 @@ "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1484,7 +1423,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1499,7 +1437,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" @@ -1515,7 +1452,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1530,7 +1466,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.9", @@ -1550,7 +1485,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1565,7 +1499,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" @@ -1581,7 +1514,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1596,7 +1528,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1611,7 +1542,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1626,7 +1556,6 @@ "version": "7.18.12", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz", "integrity": "sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9", @@ -1643,7 +1572,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1658,7 +1586,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1674,7 +1601,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.18.8", "@babel/helper-compilation-targets": "^7.18.9", @@ -1763,7 +1689,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1779,7 +1704,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -1815,7 +1739,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -2192,6 +2115,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2207,6 +2131,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -2244,6 +2169,7 @@ "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -2255,6 +2181,7 @@ "version": "4.17.30", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2301,7 +2228,8 @@ "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true }, "node_modules/@types/mocha": { "version": "9.1.1", @@ -2345,17 +2273,20 @@ "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true }, "node_modules/@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, "dependencies": { "@types/mime": "*", "@types/node": "*" @@ -2405,6 +2336,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", "integrity": "sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA==", + "dev": true, "dependencies": { "@types/express": "*", "@types/serve-static": "*" @@ -2434,6 +2366,7 @@ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==", "deprecated": "This is a stub types definition. winston provides its own type definitions, so you do not need this installed.", + "dev": true, "dependencies": { "winston": "*" } @@ -2876,7 +2809,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "dependencies": { "object.assign": "^4.1.0" } @@ -2885,7 +2817,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", - "dev": true, "dependencies": { "find-babel-config": "^1.2.0", "glob": "^7.1.6", @@ -2901,7 +2832,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.2", @@ -2915,7 +2845,6 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" @@ -2928,7 +2857,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", - "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.2" }, @@ -3520,7 +3448,6 @@ "version": "3.25.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", - "dev": true, "dependencies": { "browserslist": "^4.21.3", "semver": "7.0.0" @@ -3534,7 +3461,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -4278,7 +4204,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4561,7 +4486,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", - "dev": true, "dependencies": { "json5": "^0.5.1", "path-exists": "^3.0.0" @@ -4574,7 +4498,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "dev": true, "bin": { "json5": "lib/cli.js" } @@ -4844,7 +4767,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5240,7 +5162,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -5736,8 +5657,7 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.defaults": { "version": "4.2.0", @@ -6790,7 +6710,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -6828,7 +6747,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, "engines": { "node": ">=4" } @@ -6852,8 +6770,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -6985,7 +6902,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -6997,7 +6913,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -7009,7 +6924,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -7022,7 +6936,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -7037,7 +6950,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -7234,14 +7146,12 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -7252,14 +7162,12 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -7296,7 +7204,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -7312,14 +7219,12 @@ "node_modules/regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "node_modules/regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "dependencies": { "jsesc": "~0.5.0" }, @@ -7331,7 +7236,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" } @@ -7348,14 +7252,12 @@ "node_modules/reselect": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==", - "dev": true + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -8104,7 +8006,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8468,7 +8369,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, "engines": { "node": ">=4" } @@ -8477,7 +8377,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -8490,7 +8389,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, "engines": { "node": ">=4" } @@ -8499,7 +8397,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, "engines": { "node": ">=4" } @@ -9125,7 +9022,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" @@ -9162,7 +9058,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -9172,7 +9067,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -9191,7 +9085,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -9261,7 +9154,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -9325,7 +9217,6 @@ "version": "7.18.11", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.18.9", "@babel/template": "^7.18.10", @@ -9376,7 +9267,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9385,7 +9275,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", @@ -9396,7 +9285,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9", @@ -9408,7 +9296,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9418,7 +9305,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -9441,7 +9327,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -9451,7 +9336,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -9461,7 +9345,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -9471,7 +9354,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -9481,7 +9363,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -9491,7 +9372,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -9501,7 +9381,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, "requires": { "@babel/compat-data": "^7.18.8", "@babel/helper-compilation-targets": "^7.18.9", @@ -9514,7 +9393,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -9524,7 +9402,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", @@ -9535,7 +9412,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9545,7 +9421,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -9557,7 +9432,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9567,7 +9441,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9576,7 +9449,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -9585,7 +9457,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -9602,7 +9473,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9611,7 +9481,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -9620,7 +9489,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9629,7 +9497,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9638,7 +9505,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -9647,7 +9513,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9656,7 +9521,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -9665,7 +9529,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9674,7 +9537,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9683,7 +9545,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -9692,7 +9553,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -9701,7 +9561,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -9710,7 +9569,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9719,7 +9577,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9728,7 +9585,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -9739,7 +9595,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9748,7 +9603,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -9757,7 +9611,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -9773,7 +9626,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -9782,7 +9634,6 @@ "version": "7.18.13", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -9791,7 +9642,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9801,7 +9651,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -9810,7 +9659,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9820,7 +9668,6 @@ "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9829,7 +9676,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", @@ -9840,7 +9686,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -9849,7 +9694,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9858,7 +9702,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -9869,7 +9712,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -9881,7 +9723,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", - "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.18.9", @@ -9894,7 +9735,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9904,7 +9744,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -9914,7 +9753,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9923,7 +9761,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" @@ -9933,7 +9770,6 @@ "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9942,7 +9778,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9951,7 +9786,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" @@ -9961,7 +9795,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9970,7 +9803,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.9", @@ -9984,7 +9816,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -9993,7 +9824,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" @@ -10003,7 +9833,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -10012,7 +9841,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -10021,7 +9849,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -10030,7 +9857,6 @@ "version": "7.18.12", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz", "integrity": "sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9", @@ -10041,7 +9867,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -10050,7 +9875,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -10060,7 +9884,6 @@ "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, "requires": { "@babel/compat-data": "^7.18.8", "@babel/helper-compilation-targets": "^7.18.9", @@ -10143,7 +9966,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -10156,7 +9978,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -10180,7 +10001,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -10499,6 +10319,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -10514,6 +10335,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, "requires": { "@types/node": "*" } @@ -10551,6 +10373,7 @@ "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -10562,6 +10385,7 @@ "version": "4.17.30", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -10607,7 +10431,8 @@ "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true }, "@types/mocha": { "version": "9.1.1", @@ -10651,17 +10476,20 @@ "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true }, "@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, "requires": { "@types/mime": "*", "@types/node": "*" @@ -10711,6 +10539,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", "integrity": "sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA==", + "dev": true, "requires": { "@types/express": "*", "@types/serve-static": "*" @@ -10739,6 +10568,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==", + "dev": true, "requires": { "winston": "*" } @@ -11030,7 +10860,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -11039,7 +10868,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", - "dev": true, "requires": { "find-babel-config": "^1.2.0", "glob": "^7.1.6", @@ -11052,7 +10880,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.2", @@ -11063,7 +10890,6 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" @@ -11073,7 +10899,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.2" } @@ -11513,7 +11338,6 @@ "version": "3.25.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", - "dev": true, "requires": { "browserslist": "^4.21.3", "semver": "7.0.0" @@ -11522,8 +11346,7 @@ "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, @@ -12091,8 +11914,7 @@ "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -12331,7 +12153,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", - "dev": true, "requires": { "json5": "^0.5.1", "path-exists": "^3.0.0" @@ -12340,8 +12161,7 @@ "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "dev": true + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==" } } }, @@ -12545,7 +12365,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12831,7 +12650,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -13182,8 +13000,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.defaults": { "version": "4.2.0", @@ -14014,8 +13831,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parent-module": { "version": "1.0.1", @@ -14040,8 +13856,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" }, "path-is-absolute": { "version": "1.0.1", @@ -14056,8 +13871,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -14155,7 +13969,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, "requires": { "find-up": "^3.0.0" }, @@ -14164,7 +13977,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -14173,7 +13985,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -14183,7 +13994,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -14192,7 +14002,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -14340,14 +14149,12 @@ "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "requires": { "regenerate": "^1.4.2" } @@ -14355,14 +14162,12 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, "requires": { "@babel/runtime": "^7.8.4" } @@ -14387,7 +14192,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -14400,14 +14204,12 @@ "regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -14415,8 +14217,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, @@ -14429,14 +14230,12 @@ "reselect": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==", - "dev": true + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -14979,8 +14778,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "swagger-jsdoc": { "version": "6.2.5", @@ -15237,14 +15035,12 @@ "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -15253,14 +15049,12 @@ "unicode-match-property-value-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, "universalify": { "version": "2.0.0", diff --git a/package.json b/package.json index 75b461c8..0fc315af 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,15 @@ "license": "GNU", "private": true, "dependencies": { + "@babel/preset-env": "^7.16.11", + "@babel/preset-typescript": "^7.16.7", "@babel/plugin-proposal-decorators": "^7.22.3", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-transform-runtime": "^7.17.0", "@opensearch-project/opensearch": "^1.2.0", - "@types/swagger-ui-express": "^4.1.3", - "@types/winston": "^2.4.4", "aws-sdk": "^2.1101.0", + "babel-plugin-module-resolver": "^4.1.0", "body-parser": "^1.20.1", "chai": "^4.3.6", "connect": "^3.7.0", @@ -57,11 +61,6 @@ "@babel/cli": "^7.17.6", "@babel/core": "^7.17.8", "@babel/node": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", - "@babel/plugin-transform-runtime": "^7.17.0", - "@babel/preset-env": "^7.16.11", - "@babel/preset-typescript": "^7.16.7", "@types/aws-sdk": "^2.7.0", "@types/chai": "^4.3.0", "@types/cookie-parser": "^1.4.2", @@ -78,10 +77,11 @@ "@types/sinon": "^10.0.15", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", + "@types/swagger-ui-express": "^4.1.3", "@types/validator": "^13.7.17", + "@types/winston": "^2.4.4", "@typescript-eslint/eslint-plugin": "^5.16.0", "@typescript-eslint/parser": "^5.16.0", - "babel-plugin-module-resolver": "^4.1.0", "eslint": "^8.12.0", "mocha": "^10.2.0", "nodemon": "^2.0.22", From 40e7bc9744f7887ec709d381278c2a8ee7f12dcf Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Wed, 28 Jun 2023 00:10:36 +0900 Subject: [PATCH 02/14] =?UTF-8?q?=ED=99=98=EA=B2=BD,=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EB=AC=B8=EC=84=9C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20(#525)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 환경, 배포 관련 문서 추가 * 최상위에서 접근경로 추가 --- README.md | 2 ++ docs/environments.md | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 docs/environments.md diff --git a/README.md b/README.md index 70caae65..bd13b632 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Scents Node Server - [기여하기](./docs/contribution.md) +- [환경, 배포](./docs/environments.md) + # 연관 프로젝트 [A.fume.Analysis](https://github.com/Scents-Note/A.fume.Analysis) diff --git a/docs/environments.md b/docs/environments.md new file mode 100644 index 00000000..2d8f4c2d --- /dev/null +++ b/docs/environments.md @@ -0,0 +1,21 @@ +# 환경 + +- dev + - 목적: 개발환경에서 사용. + - 기준 브랜치: dev +- production-1 + - 목적: ios 용 엔드포인트 +- production-2 + - 목적: android 용 엔드포인트 + +* production 이 현재 1과 2, 2개가 공존하는 상황. 초기에 안전성을 위해 분리한 것으로 보이나, 불필요한 분리여서 합치는 것이 좋다고 판단. + +# 배포 + +- dev 환경 + - dev 브랜치에 병합시 자동으로 배포됨 +- production-1, production-2 + - [저장소의 깃헙액션 페이지](https://github.com/Scents-Note/A.fume.Server/actions) 에서 각 환경에 해당하는 워크플로우 진입 후, 아래 과정을 따라 수행 + - Run workflow 드랍다운 클릭 + - 배포를 원하는 브랜치 선택 + - 초록색 Run workflow 버튼 클릭 From cde451d913f60e0163d7769e39af63b009422ef2 Mon Sep 17 00:00:00 2001 From: hanyiseo2 Date: Tue, 27 Jun 2023 07:15:45 +0900 Subject: [PATCH 03/14] =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/Admin.ts | 88 +++++++++++++++++++++++- src/service/IngredientCategoryService.ts | 1 + 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index b82496ee..fc3be83d 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -13,7 +13,6 @@ import { NextFunction, Request, RequestHandler, Response } from 'express'; import { IngredientCategoryResponse, IngredientFullResponse, - // IngredientResponse, LoginResponse, PerfumeDetailResponse, PerfumeResponse, @@ -437,3 +436,90 @@ export const createIngredientCategory: RequestHandler = async ( } } }; + +/** + * @swagger + * /admin/perfumes: + * post: + * tags: + * - admin + * summary: 향수 추가 + * description: 향수 추가 + * operationId: createPerfume + * consumes: + * - application/json + * produces: + * - application/json + * parameters: + * - name: body + * in: body + * required: true + * schema: + * $ref: '#/definitions/PerfumeInput' +// * name: +// * type: string +// * elgishName: +// * type: string +// * Brand: +// * type: object +// * abundanceRate: +// * type: number +// * Notes: +// * type: object +// * imageUrl: +// * type: string + * responses: + * 200: + * description: success + * schema: + * type: object + * properties: + * message: + * type: string + * 400: + * description: 요청 실패 + * 409: + * description: 같은 이름의 카테고리가 존재할 때 + * schema: + * type: object + * x-swagger-router-controll er: Admin + * definitions: + * Brand: + * type: object + * properties: + * brandIdx: + * type: integer + * name: + * type: string + * Note: + * type: object + * properties: + * perfumeIdx: + * type: integer + * ingredientIdx: + * type: integer + * type: + * + */ +export const createPerfume: RequestHandler = async ( + req: Request, + res: Response +) => { + const { name } = req.body; + try { + await IngredientCategory.create(name); + res.status(StatusCode.OK).json({ + message: '성공', + }); + } catch (e: any) { + if (e instanceof DuplicatedEntryError) { + res.status(StatusCode.CONFLICT).json( + new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) + ); + } else { + res.status(StatusCode.BAD_REQUEST).json( + new SimpleResponseDTO(e.message) + ); + } + } +}; diff --git a/src/service/IngredientCategoryService.ts b/src/service/IngredientCategoryService.ts index fca9ae05..ffaa7d13 100644 --- a/src/service/IngredientCategoryService.ts +++ b/src/service/IngredientCategoryService.ts @@ -48,6 +48,7 @@ class IngredientCategoryService { if (err.parent.errno === 1062) { throw new DuplicatedEntryError(); } + throw new FailedToCreateError(); } } From f73d181cfee1c163dd7681dee8d261c8c72b0bb6 Mon Sep 17 00:00:00 2001 From: Taeho Choi <48103834+Taehoya@users.noreply.github.com> Date: Tue, 18 Jul 2023 10:02:44 -0500 Subject: [PATCH 04/14] =?UTF-8?q?=EB=B8=8C=EB=9E=9C=EB=93=9C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C,=20=EA=B2=80=EC=83=89=20(#526)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/Admin.ts | 107 +++++++++++++++--- src/controllers/definitions/response/brand.ts | 66 ++++++++++- src/dao/BrandDao.ts | 19 +++- src/service/BrandService.ts | 27 +++++ 4 files changed, 204 insertions(+), 15 deletions(-) diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index fc3be83d..80634e0e 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -1,16 +1,19 @@ import IngredientService from '@services/IngredientService'; import { AdminService } from '@src/service/AdminService'; import PerfumeService from '@src/service/PerfumeService'; +import BrandService from '@src/service/BrandService'; import StatusCode from '@src/utils/statusCode'; import { MSG_EXIST_DUPLICATE_ENTRY, MSG_GET_ADDED_PERFUME_RECENT_SUCCESS, + MSG_GET_BRAND_ALL_SUCCESS, MSG_GET_PERFUME_DETAIL_SUCCESS, MSG_GET_SEARCH_INGREDIENT_SUCCESS, MSG_LOGIN_SUCCESS, } from '@src/utils/strings'; import { NextFunction, Request, RequestHandler, Response } from 'express'; import { + BrandFullResponse, IngredientCategoryResponse, IngredientFullResponse, LoginResponse, @@ -28,7 +31,7 @@ let Perfume: PerfumeService = new PerfumeService(); let Ingredient: IngredientService = new IngredientService(); let IngredientCategory: IngredientCategoryService = new IngredientCategoryService(); - +let Brand: BrandService = new BrandService(); /** * @swagger * /admin/login: @@ -456,18 +459,18 @@ export const createIngredientCategory: RequestHandler = async ( * required: true * schema: * $ref: '#/definitions/PerfumeInput' -// * name: -// * type: string -// * elgishName: -// * type: string -// * Brand: -// * type: object -// * abundanceRate: -// * type: number -// * Notes: -// * type: object -// * imageUrl: -// * type: string + * name: + * type: string + * elgishName: + * type: string + * Brand: + * type: object + * abundanceRate: + * type: number + * Notes: + * type: object + * imageUrl: + * type: string * responses: * 200: * description: success @@ -523,3 +526,81 @@ export const createPerfume: RequestHandler = async ( } } }; + +/** + * + * @swagger + * /admin/brands: + * get: + * tags: + * - admin + * summary: 브랜드 목록 조회 + * description: 브랜드 리스트 조회
반환 되는 정보 [재료] + * operationId: getBrandAll + * produces: + * - application/json + * parameters: + * - name: page + * in: query + * required: true + * type: integer + * format: int64 + * - name: target + * in: query + * required: false + * type: string + * enum: + * - id + * - name + * - englishName + * - name: keyword + * in: query + * required: false + * type: string + * responses: + * 200: + * description: 성공 + * schema: + * type: object + * properties: + * message: + * type: string + * example: brand 목록 조회 성공 + * data: + * type: object + * properties: + * count: + * type: integer + * example: 1 + * rows: + * type: array + * items: + * allOf: + * - $ref: '#/definitions/BrandResponse' + * 401: + * description: Token is missing or invalid + * x-swagger-router-controller: Admin + */ + +export const getBrandAll: RequestHandler = async ( + req: Request, + res: Response, + next: NextFunction +) => { + const page: number = Number(req.query.page); + if (isNaN(page)) { + next(); + return; + } + const limit = 20; + const offset = (page - 1) * limit; + const brands = await Brand.readPage(offset, limit, req.query); + + res.status(StatusCode.OK).json( + new ResponseDTO>( + MSG_GET_BRAND_ALL_SUCCESS, + brands.convertType(BrandFullResponse.createByJson) + ) + ); +}; + diff --git a/src/controllers/definitions/response/brand.ts b/src/controllers/definitions/response/brand.ts index 0d017d8e..ef8ed3a0 100644 --- a/src/controllers/definitions/response/brand.ts +++ b/src/controllers/definitions/response/brand.ts @@ -68,4 +68,68 @@ class BrandFilterResponse { } } -export { BrandResponse, BrandFilterResponse }; +/** + * @swagger + * definitions: + * BrandFullResponse: + * type: object + * properties: + * brand_idx: + * type: number + * name: + * type: string + * englishName: + * type: string + * description: + * type: string + * firstInitial: + * type: string + * example: + * brand_idx: 1 + * name: (테스트)조말론 + * englishName: jo malone + * description: 설명 + * firstInitial: ㅈ + * */ +class BrandFullResponse { + readonly brandIdx: number; + readonly name: string; + readonly englishName: string; + readonly description: string; + readonly firstInitial: string; + constructor( + brandIdx: number, + name: string, + englishName: string, + description: string, + firstInitial: string + ) { + this.brandIdx = brandIdx; + this.name = name; + this.englishName = englishName; + this.description = description; + this.firstInitial = firstInitial; + } + + public toString(): string { + return `${this.constructor.name} (${JSON.stringify(this)})`; + } + + static createByJson(json: { + brandIdx: number; + name: string; + englishName: string; + description: string; + firstInitial: string; + }): BrandFullResponse { + return new BrandFullResponse( + json.brandIdx, + json.name, + json.englishName, + json.description, + json.firstInitial + ); + } +} + +export { BrandResponse, BrandFilterResponse, BrandFullResponse }; diff --git a/src/dao/BrandDao.ts b/src/dao/BrandDao.ts index a8966e58..f941e9b0 100644 --- a/src/dao/BrandDao.ts +++ b/src/dao/BrandDao.ts @@ -4,7 +4,7 @@ import { NotMatchedError } from '@errors'; import { BrandDTO, PagingDTO, ListAndCountDTO } from '@dto/index'; import { Brand } from '@sequelize'; - +import { WhereOptions } from 'sequelize'; const LOG_TAG: string = '[Brand/DAO]'; class BrandDao { @@ -50,6 +50,23 @@ class BrandDao { ); }); } + + /** + * 브랜드 전체 조회 + * + * @returns {Promise} + */ + async readPage(offset: number, limit: number, where?: WhereOptions) { + logger.debug(`${LOG_TAG} readAll()`); + return Brand.findAndCountAll({ + offset, + limit, + where, + raw: true, + nest: true, + order: [['createdAt', 'desc']], + }); + } } export default BrandDao; diff --git a/src/service/BrandService.ts b/src/service/BrandService.ts index ee016c6b..5ed357d7 100644 --- a/src/service/BrandService.ts +++ b/src/service/BrandService.ts @@ -1,6 +1,7 @@ import { logger } from '@modules/winston'; import BrandDao from '@dao/BrandDao'; +import { Op } from 'sequelize'; import { BrandFilterDTO, @@ -50,6 +51,32 @@ class BrandService { }); }); } + + async readPage(offset: number, limit: number, query: any) { + const { target, keyword } = query; + const whereOptions = {} as any; + if (target && keyword) { + switch (target) { + case 'id': + whereOptions.brandIdx = keyword; + break; + case 'name': + whereOptions.name = { [Op.startsWith]: keyword }; + break; + case 'englishName': + whereOptions.englishName = { [Op.startsWith]: keyword }; + break; + } + } + + const { rows, count } = await this.brandDao.readPage( + offset, + limit, + whereOptions + ); + const list = rows.map((brand) => BrandDTO.createByJson(brand)); + return new ListAndCountDTO(count, list); + } } export default BrandService; From 165ca87f913bb9c756ab95385caf1ce83721a349 Mon Sep 17 00:00:00 2001 From: Taehoya Date: Tue, 18 Jul 2023 18:53:28 -0500 Subject: [PATCH 05/14] =?UTF-8?q?2-5-1=20=EB=B8=8C=EB=9E=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 11 ++++++ package.json | 7 ++-- src/controllers/Admin.ts | 79 ++++++++++++++++++++++++++++++++++--- src/dao/BrandDao.ts | 14 +++++++ src/models/tables/Brand.ts | 1 + src/service/BrandService.ts | 28 +++++++++++++ 6 files changed, 131 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5d5d14d..1b0ab305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "discord-webhook-node": "^1.1.8", "dotenv": "^16.0.0", "express": "^4.17.3", + "hangul-js": "^0.2.6", "ioredis": "^5.2.4", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", @@ -4843,6 +4844,11 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/hangul-js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", + "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12422,6 +12428,11 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "hangul-js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", + "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", diff --git a/package.json b/package.json index 0fc315af..983048ca 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,12 @@ "license": "GNU", "private": true, "dependencies": { - "@babel/preset-env": "^7.16.11", - "@babel/preset-typescript": "^7.16.7", - "@babel/plugin-proposal-decorators": "^7.22.3", "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-decorators": "^7.22.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-transform-runtime": "^7.17.0", + "@babel/preset-env": "^7.16.11", + "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", "aws-sdk": "^2.1101.0", "babel-plugin-module-resolver": "^4.1.0", @@ -41,6 +41,7 @@ "discord-webhook-node": "^1.1.8", "dotenv": "^16.0.0", "express": "^4.17.3", + "hangul-js": "^0.2.6", "ioredis": "^5.2.4", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index 80634e0e..bf99f774 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -25,7 +25,7 @@ import { import { ListAndCountDTO } from '@src/data/dto'; import IngredientCategoryService from '@src/service/IngredientCategoryService'; import { DuplicatedEntryError } from '@src/utils/errors/errors'; - +import * as Hangul from 'hangul-js'; let Admin: AdminService = new AdminService(); let Perfume: PerfumeService = new PerfumeService(); let Ingredient: IngredientService = new IngredientService(); @@ -487,22 +487,22 @@ export const createIngredientCategory: RequestHandler = async ( * type: object * x-swagger-router-controll er: Admin * definitions: - * Brand: + * Brand: * type: object - * properties: + * properties: * brandIdx: * type: integer * name: * type: string - * Note: + * Note: * type: object * properties: * perfumeIdx: * type: integer * ingredientIdx: * type: integer - * type: - * + * type: + * */ export const createPerfume: RequestHandler = async ( req: Request, @@ -604,3 +604,70 @@ export const getBrandAll: RequestHandler = async ( ); }; +/** + * @swagger + * /admin/brand: + * post: + * tags: + * - admin + * summary: 브랜드 추가 + * description: 브랜드 추가 + * operationId: createBrand + * consumes: + * - application/json + * produces: + * - application/json + * parameters: + * - name: body + * in: body + * required: true + * schema: + * type: object + * properties: + * name: + * type: string + * englishName: + * type: string + * description: + * type: string + * responses: + * 200: + * description: success + * schema: + * type: object + * properties: + * message: + * type: string + * example: 성공 + * 400: + * description: 요청 실패 + * 409: + * description: 같은 이름의 브랜드가 존재할 때 + * schema: + * type: object + * x-swagger-router-controller: Admin + * + */ +export const createBrand: RequestHandler = async ( + req: Request, + res: Response +) => { + const { name, englishName, description } = req.body; + try { + const firstInitail = Hangul.disassemble(name)[0]; + await Brand.create(name, englishName, description, firstInitail); + res.status(StatusCode.OK).json({ + message: '성공', + }); + } catch (e: any) { + if (e instanceof DuplicatedEntryError) { + res.status(StatusCode.CONFLICT).json( + new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) + ); + } else { + res.status(StatusCode.BAD_REQUEST).json( + new SimpleResponseDTO(e.message) + ); + } + } +}; diff --git a/src/dao/BrandDao.ts b/src/dao/BrandDao.ts index f941e9b0..3746f3fa 100644 --- a/src/dao/BrandDao.ts +++ b/src/dao/BrandDao.ts @@ -67,6 +67,20 @@ class BrandDao { order: [['createdAt', 'desc']], }); } + + async create( + name: string, + englishName: string, + description: string, + firstInitial: string + ) { + return Brand.create({ + name, + englishName, + description, + firstInitial, + }); + } } export default BrandDao; diff --git a/src/models/tables/Brand.ts b/src/models/tables/Brand.ts index 1c95cd67..49848bbf 100644 --- a/src/models/tables/Brand.ts +++ b/src/models/tables/Brand.ts @@ -38,6 +38,7 @@ export class Brand extends Model { @Column({ type: DataType.STRING, allowNull: false, + defaultValue: '', }) imageUrl: string; diff --git a/src/service/BrandService.ts b/src/service/BrandService.ts index 5ed357d7..284e0f96 100644 --- a/src/service/BrandService.ts +++ b/src/service/BrandService.ts @@ -9,6 +9,10 @@ import { BrandDTO, PagingDTO, } from '@dto/index'; +import { + DuplicatedEntryError, + FailedToCreateError, +} from '@src/utils/errors/errors'; const LOG_TAG: string = '[Brand/Service]'; @@ -77,6 +81,30 @@ class BrandService { const list = rows.map((brand) => BrandDTO.createByJson(brand)); return new ListAndCountDTO(count, list); } + + async create( + name: string, + englishName: string, + description: string, + firstInitial: string + ) { + try { + return await this.brandDao.create( + name, + englishName, + description, + firstInitial + ); + } catch (err: Error | any) { + if ( + err.original.code === 'ER_DUP_ENTRY' || + err.parent.errno === 1062 + ) { + throw new DuplicatedEntryError(); + } + throw new FailedToCreateError(); + } + } } export default BrandService; From 91155d3df6f66e4cbf46935765647be3d7814f7f Mon Sep 17 00:00:00 2001 From: Taehoya Date: Tue, 18 Jul 2023 19:33:32 -0500 Subject: [PATCH 06/14] =?UTF-8?q?Revert=20"2-5-1=20=EB=B8=8C=EB=9E=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 165ca87f913bb9c756ab95385caf1ce83721a349. --- package-lock.json | 11 ------ package.json | 7 ++-- src/controllers/Admin.ts | 79 +++---------------------------------- src/dao/BrandDao.ts | 14 ------- src/models/tables/Brand.ts | 1 - src/service/BrandService.ts | 28 ------------- 6 files changed, 9 insertions(+), 131 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b0ab305..c5d5d14d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,6 @@ "discord-webhook-node": "^1.1.8", "dotenv": "^16.0.0", "express": "^4.17.3", - "hangul-js": "^0.2.6", "ioredis": "^5.2.4", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", @@ -4844,11 +4843,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "node_modules/hangul-js": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", - "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12428,11 +12422,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "hangul-js": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", - "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", diff --git a/package.json b/package.json index 983048ca..0fc315af 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,12 @@ "license": "GNU", "private": true, "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/preset-env": "^7.16.11", + "@babel/preset-typescript": "^7.16.7", "@babel/plugin-proposal-decorators": "^7.22.3", + "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-transform-runtime": "^7.17.0", - "@babel/preset-env": "^7.16.11", - "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", "aws-sdk": "^2.1101.0", "babel-plugin-module-resolver": "^4.1.0", @@ -41,7 +41,6 @@ "discord-webhook-node": "^1.1.8", "dotenv": "^16.0.0", "express": "^4.17.3", - "hangul-js": "^0.2.6", "ioredis": "^5.2.4", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index bf99f774..80634e0e 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -25,7 +25,7 @@ import { import { ListAndCountDTO } from '@src/data/dto'; import IngredientCategoryService from '@src/service/IngredientCategoryService'; import { DuplicatedEntryError } from '@src/utils/errors/errors'; -import * as Hangul from 'hangul-js'; + let Admin: AdminService = new AdminService(); let Perfume: PerfumeService = new PerfumeService(); let Ingredient: IngredientService = new IngredientService(); @@ -487,22 +487,22 @@ export const createIngredientCategory: RequestHandler = async ( * type: object * x-swagger-router-controll er: Admin * definitions: - * Brand: + * Brand: * type: object - * properties: + * properties: * brandIdx: * type: integer * name: * type: string - * Note: + * Note: * type: object * properties: * perfumeIdx: * type: integer * ingredientIdx: * type: integer - * type: - * + * type: + * */ export const createPerfume: RequestHandler = async ( req: Request, @@ -604,70 +604,3 @@ export const getBrandAll: RequestHandler = async ( ); }; -/** - * @swagger - * /admin/brand: - * post: - * tags: - * - admin - * summary: 브랜드 추가 - * description: 브랜드 추가 - * operationId: createBrand - * consumes: - * - application/json - * produces: - * - application/json - * parameters: - * - name: body - * in: body - * required: true - * schema: - * type: object - * properties: - * name: - * type: string - * englishName: - * type: string - * description: - * type: string - * responses: - * 200: - * description: success - * schema: - * type: object - * properties: - * message: - * type: string - * example: 성공 - * 400: - * description: 요청 실패 - * 409: - * description: 같은 이름의 브랜드가 존재할 때 - * schema: - * type: object - * x-swagger-router-controller: Admin - * - */ -export const createBrand: RequestHandler = async ( - req: Request, - res: Response -) => { - const { name, englishName, description } = req.body; - try { - const firstInitail = Hangul.disassemble(name)[0]; - await Brand.create(name, englishName, description, firstInitail); - res.status(StatusCode.OK).json({ - message: '성공', - }); - } catch (e: any) { - if (e instanceof DuplicatedEntryError) { - res.status(StatusCode.CONFLICT).json( - new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) - ); - } else { - res.status(StatusCode.BAD_REQUEST).json( - new SimpleResponseDTO(e.message) - ); - } - } -}; diff --git a/src/dao/BrandDao.ts b/src/dao/BrandDao.ts index 3746f3fa..f941e9b0 100644 --- a/src/dao/BrandDao.ts +++ b/src/dao/BrandDao.ts @@ -67,20 +67,6 @@ class BrandDao { order: [['createdAt', 'desc']], }); } - - async create( - name: string, - englishName: string, - description: string, - firstInitial: string - ) { - return Brand.create({ - name, - englishName, - description, - firstInitial, - }); - } } export default BrandDao; diff --git a/src/models/tables/Brand.ts b/src/models/tables/Brand.ts index 49848bbf..1c95cd67 100644 --- a/src/models/tables/Brand.ts +++ b/src/models/tables/Brand.ts @@ -38,7 +38,6 @@ export class Brand extends Model { @Column({ type: DataType.STRING, allowNull: false, - defaultValue: '', }) imageUrl: string; diff --git a/src/service/BrandService.ts b/src/service/BrandService.ts index 284e0f96..5ed357d7 100644 --- a/src/service/BrandService.ts +++ b/src/service/BrandService.ts @@ -9,10 +9,6 @@ import { BrandDTO, PagingDTO, } from '@dto/index'; -import { - DuplicatedEntryError, - FailedToCreateError, -} from '@src/utils/errors/errors'; const LOG_TAG: string = '[Brand/Service]'; @@ -81,30 +77,6 @@ class BrandService { const list = rows.map((brand) => BrandDTO.createByJson(brand)); return new ListAndCountDTO(count, list); } - - async create( - name: string, - englishName: string, - description: string, - firstInitial: string - ) { - try { - return await this.brandDao.create( - name, - englishName, - description, - firstInitial - ); - } catch (err: Error | any) { - if ( - err.original.code === 'ER_DUP_ENTRY' || - err.parent.errno === 1062 - ) { - throw new DuplicatedEntryError(); - } - throw new FailedToCreateError(); - } - } } export default BrandService; From e969d1784c708a54415bab3c7cd3485a8482f022 Mon Sep 17 00:00:00 2001 From: Taehoya Date: Tue, 18 Jul 2023 22:03:01 -0500 Subject: [PATCH 07/14] =?UTF-8?q?Revert=20"Revert=20"2-5-1=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EB=93=9C=20=EC=B6=94=EA=B0=80""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 91155d3df6f66e4cbf46935765647be3d7814f7f. --- package-lock.json | 11 ++++++ package.json | 7 ++-- src/controllers/Admin.ts | 79 ++++++++++++++++++++++++++++++++++--- src/dao/BrandDao.ts | 14 +++++++ src/models/tables/Brand.ts | 1 + src/service/BrandService.ts | 28 +++++++++++++ 6 files changed, 131 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5d5d14d..1b0ab305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "discord-webhook-node": "^1.1.8", "dotenv": "^16.0.0", "express": "^4.17.3", + "hangul-js": "^0.2.6", "ioredis": "^5.2.4", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", @@ -4843,6 +4844,11 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/hangul-js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", + "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12422,6 +12428,11 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "hangul-js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hangul-js/-/hangul-js-0.2.6.tgz", + "integrity": "sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==" + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", diff --git a/package.json b/package.json index 0fc315af..983048ca 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,12 @@ "license": "GNU", "private": true, "dependencies": { - "@babel/preset-env": "^7.16.11", - "@babel/preset-typescript": "^7.16.7", - "@babel/plugin-proposal-decorators": "^7.22.3", "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-decorators": "^7.22.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-transform-runtime": "^7.17.0", + "@babel/preset-env": "^7.16.11", + "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", "aws-sdk": "^2.1101.0", "babel-plugin-module-resolver": "^4.1.0", @@ -41,6 +41,7 @@ "discord-webhook-node": "^1.1.8", "dotenv": "^16.0.0", "express": "^4.17.3", + "hangul-js": "^0.2.6", "ioredis": "^5.2.4", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index 80634e0e..bf99f774 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -25,7 +25,7 @@ import { import { ListAndCountDTO } from '@src/data/dto'; import IngredientCategoryService from '@src/service/IngredientCategoryService'; import { DuplicatedEntryError } from '@src/utils/errors/errors'; - +import * as Hangul from 'hangul-js'; let Admin: AdminService = new AdminService(); let Perfume: PerfumeService = new PerfumeService(); let Ingredient: IngredientService = new IngredientService(); @@ -487,22 +487,22 @@ export const createIngredientCategory: RequestHandler = async ( * type: object * x-swagger-router-controll er: Admin * definitions: - * Brand: + * Brand: * type: object - * properties: + * properties: * brandIdx: * type: integer * name: * type: string - * Note: + * Note: * type: object * properties: * perfumeIdx: * type: integer * ingredientIdx: * type: integer - * type: - * + * type: + * */ export const createPerfume: RequestHandler = async ( req: Request, @@ -604,3 +604,70 @@ export const getBrandAll: RequestHandler = async ( ); }; +/** + * @swagger + * /admin/brand: + * post: + * tags: + * - admin + * summary: 브랜드 추가 + * description: 브랜드 추가 + * operationId: createBrand + * consumes: + * - application/json + * produces: + * - application/json + * parameters: + * - name: body + * in: body + * required: true + * schema: + * type: object + * properties: + * name: + * type: string + * englishName: + * type: string + * description: + * type: string + * responses: + * 200: + * description: success + * schema: + * type: object + * properties: + * message: + * type: string + * example: 성공 + * 400: + * description: 요청 실패 + * 409: + * description: 같은 이름의 브랜드가 존재할 때 + * schema: + * type: object + * x-swagger-router-controller: Admin + * + */ +export const createBrand: RequestHandler = async ( + req: Request, + res: Response +) => { + const { name, englishName, description } = req.body; + try { + const firstInitail = Hangul.disassemble(name)[0]; + await Brand.create(name, englishName, description, firstInitail); + res.status(StatusCode.OK).json({ + message: '성공', + }); + } catch (e: any) { + if (e instanceof DuplicatedEntryError) { + res.status(StatusCode.CONFLICT).json( + new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) + ); + } else { + res.status(StatusCode.BAD_REQUEST).json( + new SimpleResponseDTO(e.message) + ); + } + } +}; diff --git a/src/dao/BrandDao.ts b/src/dao/BrandDao.ts index f941e9b0..3746f3fa 100644 --- a/src/dao/BrandDao.ts +++ b/src/dao/BrandDao.ts @@ -67,6 +67,20 @@ class BrandDao { order: [['createdAt', 'desc']], }); } + + async create( + name: string, + englishName: string, + description: string, + firstInitial: string + ) { + return Brand.create({ + name, + englishName, + description, + firstInitial, + }); + } } export default BrandDao; diff --git a/src/models/tables/Brand.ts b/src/models/tables/Brand.ts index 1c95cd67..49848bbf 100644 --- a/src/models/tables/Brand.ts +++ b/src/models/tables/Brand.ts @@ -38,6 +38,7 @@ export class Brand extends Model { @Column({ type: DataType.STRING, allowNull: false, + defaultValue: '', }) imageUrl: string; diff --git a/src/service/BrandService.ts b/src/service/BrandService.ts index 5ed357d7..284e0f96 100644 --- a/src/service/BrandService.ts +++ b/src/service/BrandService.ts @@ -9,6 +9,10 @@ import { BrandDTO, PagingDTO, } from '@dto/index'; +import { + DuplicatedEntryError, + FailedToCreateError, +} from '@src/utils/errors/errors'; const LOG_TAG: string = '[Brand/Service]'; @@ -77,6 +81,30 @@ class BrandService { const list = rows.map((brand) => BrandDTO.createByJson(brand)); return new ListAndCountDTO(count, list); } + + async create( + name: string, + englishName: string, + description: string, + firstInitial: string + ) { + try { + return await this.brandDao.create( + name, + englishName, + description, + firstInitial + ); + } catch (err: Error | any) { + if ( + err.original.code === 'ER_DUP_ENTRY' || + err.parent.errno === 1062 + ) { + throw new DuplicatedEntryError(); + } + throw new FailedToCreateError(); + } + } } export default BrandService; From 3ffe96053dbf308deca552da9c790bf54c0c48df Mon Sep 17 00:00:00 2001 From: Hanyi SEO <122385460+hanyiseo2@users.noreply.github.com> Date: Wed, 19 Jul 2023 19:32:57 +0900 Subject: [PATCH 08/14] Dev admin fix (#527) * GET perfume_add englishName * Fixing GET admin/perfumes by adding englishName --- src/controllers/Admin.ts | 52 ++++++--------- .../definitions/request/perfume.ts | 63 ++++++++++++++++++- .../definitions/response/perfume.ts | 12 +++- src/dao/PerfumeDao.ts | 31 +++++++++ src/data/dto/PerfumeInquireHistoryDTO.ts | 13 +++- src/data/dto/PerfumeThumbDTO.ts | 4 ++ src/service/PerfumeService.ts | 30 ++++++++- src/service/SearchService.ts | 1 + tests/test_unit/dao/PerfumeDao.spec.ts | 11 ++-- 9 files changed, 172 insertions(+), 45 deletions(-) diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index bf99f774..03c1e8c4 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -149,6 +149,7 @@ export const getPerfume: RequestHandler = async ( }; /** + * * @swagger * /admin/perfumes: * get: @@ -449,28 +450,20 @@ export const createIngredientCategory: RequestHandler = async ( * summary: 향수 추가 * description: 향수 추가 * operationId: createPerfume - * consumes: - * - application/json * produces: * - application/json + * consumes: + * - multipart/form-data * parameters: * - name: body * in: body * required: true * schema: * $ref: '#/definitions/PerfumeInput' - * name: - * type: string - * elgishName: - * type: string - * Brand: - * type: object - * abundanceRate: - * type: number - * Notes: - * type: object - * imageUrl: - * type: string + * - name: file + * in: formData + * type: file + * description: uploaded file * responses: * 200: * description: success @@ -485,32 +478,23 @@ export const createIngredientCategory: RequestHandler = async ( * description: 같은 이름의 카테고리가 존재할 때 * schema: * type: object - * x-swagger-router-controll er: Admin - * definitions: - * Brand: - * type: object - * properties: - * brandIdx: - * type: integer - * name: - * type: string - * Note: - * type: object - * properties: - * perfumeIdx: - * type: integer - * ingredientIdx: - * type: integer - * type: - * + * x-swagger-router-controller: Admin */ export const createPerfume: RequestHandler = async ( req: Request, res: Response ) => { - const { name } = req.body; + const { name, englishName, brandIdx, abundanceRate, Notes, imageUrl } = + req.body; try { - await IngredientCategory.create(name); + await Perfume.create( + name, + englishName, + brandIdx, + abundanceRate, + Notes, + imageUrl + ); res.status(StatusCode.OK).json({ message: '성공', }); diff --git a/src/controllers/definitions/request/perfume.ts b/src/controllers/definitions/request/perfume.ts index 06cd474d..21c1809c 100644 --- a/src/controllers/definitions/request/perfume.ts +++ b/src/controllers/definitions/request/perfume.ts @@ -62,4 +62,65 @@ class PerfumeSearchRequest { } } -export { PerfumeSearchRequest }; +/** + * @swagger + * definitions: + * Note: + * type: object + * properties: + * ingredientIdx: + * type: number + * type: + * type: number + */ +class Note { + ingredientIdx: number; + type: number; + + constructor(ingredientIdx: number, type: number) { + this.ingredientIdx = ingredientIdx; + this.type = type; + } +} + +/** + * @swagger + * definitions: + * PerfumeInput: + * type: object + * properties: + * name: + * type: string + * englishName: + * type: string + * brandIdx: + * type: number + * abundanceRate: + * type: number + * Notes: + * type: array + * items: + * $ref: '#/definitions/Note' + */ +class PerfumeInput { + name: string; + englishName: string; + brandIdx: number; + abundanceRate: number; + Notes: Note; + + constructor( + name: string, + englishName: string, + brandIdx: number, + abundanceRate: number, + Notes: Note + ) { + this.name = name; + this.englishName = englishName; + this.brandIdx = brandIdx; + this.abundanceRate = abundanceRate; + this.Notes = Notes; + } +} +export { PerfumeSearchRequest, PerfumeInput }; diff --git a/src/controllers/definitions/response/perfume.ts b/src/controllers/definitions/response/perfume.ts index 1765d91c..ebf5cb26 100644 --- a/src/controllers/definitions/response/perfume.ts +++ b/src/controllers/definitions/response/perfume.ts @@ -291,18 +291,21 @@ class PerfumeResponse { readonly brandName: string; readonly imageUrl: string; readonly isLiked: boolean; + readonly englishName: string; constructor( perfumeIdx: number, name: string, brandName: string, imageUrl: string, - isLiked: boolean + isLiked: boolean, + englishName: string ) { this.perfumeIdx = perfumeIdx; this.name = name; this.brandName = brandName; this.imageUrl = imageUrl; this.isLiked = isLiked; + this.englishName = englishName; } public toString(): string { @@ -315,7 +318,8 @@ class PerfumeResponse { json.name, json.brandName, json.imageUrl, - json.isLiked + json.isLiked, + json.englishName ); } } @@ -356,9 +360,10 @@ class PerfumeRecommendResponse extends PerfumeResponse { brandName: string, imageUrl: string, isLiked: boolean, + englishName: string, keywordList: string[] ) { - super(perfumeIdx, name, brandName, imageUrl, isLiked); + super(perfumeIdx, name, brandName, imageUrl, isLiked, englishName); this.keywordList = keywordList; } @@ -373,6 +378,7 @@ class PerfumeRecommendResponse extends PerfumeResponse { json.brandName, json.imageUrl, json.isLiked, + json.englishName, json.keywordList ); } diff --git a/src/dao/PerfumeDao.ts b/src/dao/PerfumeDao.ts index 311e4496..64cc894e 100644 --- a/src/dao/PerfumeDao.ts +++ b/src/dao/PerfumeDao.ts @@ -21,6 +21,7 @@ import { Perfume, PerfumeSurvey, sequelize, + Note, } from '@sequelize'; import Sequelize, { QueryTypes, WhereOptions } from 'sequelize'; @@ -439,6 +440,36 @@ class PerfumeDao { order: [['createdAt', 'desc']], }); } + + async create( + name: string, + englishName: string, + brandIdx: number, + abundanceRate: number, + Notes: Array, + imageUrl: string + ) { + await sequelize.transaction(async (transaction) => { + const created = await Perfume.create( + { + name, + englishName, + brandIdx, + abundanceRate, + imageUrl, + story: '', + volumeAndPrice: '', + }, + { raw: true, transaction } + ); + + await Note.bulkCreate( + Notes.map((i) => ({ ...i, perfumeIdx: created.perfumeIdx })), + { transaction } + ); + return created; + }); + } } export default PerfumeDao; diff --git a/src/data/dto/PerfumeInquireHistoryDTO.ts b/src/data/dto/PerfumeInquireHistoryDTO.ts index 09c39e3c..0e1a7f2f 100644 --- a/src/data/dto/PerfumeInquireHistoryDTO.ts +++ b/src/data/dto/PerfumeInquireHistoryDTO.ts @@ -17,10 +17,20 @@ class PerfumeInquireHistoryDTO extends PerfumeThumbDTO { imageUrl: string, createdAt: Date, updatedAt: Date, + englishName: string, Brand: BrandDTO, inquireHistory: InquireHistory ) { - super(perfumeIdx, name, isLiked, imageUrl, createdAt, updatedAt, Brand); + super( + perfumeIdx, + name, + isLiked, + imageUrl, + englishName, + createdAt, + updatedAt, + Brand + ); this.InquireHistory = inquireHistory; } @@ -36,6 +46,7 @@ class PerfumeInquireHistoryDTO extends PerfumeThumbDTO { json.imageUrl, json.createdAt, json.updatedAt, + json.englishName, json.Brand, json.InquireHistory ); diff --git a/src/data/dto/PerfumeThumbDTO.ts b/src/data/dto/PerfumeThumbDTO.ts index bb79b8d1..5031b7bb 100644 --- a/src/data/dto/PerfumeThumbDTO.ts +++ b/src/data/dto/PerfumeThumbDTO.ts @@ -6,6 +6,7 @@ class PerfumeThumbDTO { readonly brandName: string; readonly isLiked: boolean; readonly imageUrl: string; + readonly englishName: string; readonly createdAt: Date; readonly updatedAt: Date; readonly Brand: BrandDTO; @@ -14,6 +15,7 @@ class PerfumeThumbDTO { name: string, isLiked: boolean, imageUrl: string, + englishName: string, createdAt: Date, updatedAt: Date, Brand: BrandDTO @@ -23,6 +25,7 @@ class PerfumeThumbDTO { this.brandName = Brand?.name; this.isLiked = isLiked || false; this.imageUrl = imageUrl; + this.englishName = englishName; this.createdAt = createdAt; this.updatedAt = updatedAt; this.Brand = Brand; @@ -38,6 +41,7 @@ class PerfumeThumbDTO { json.name, json.isLiked, json.imageUrl, + json.englishName, json.createdAt, json.updatedAt, json.Brand diff --git a/src/service/PerfumeService.ts b/src/service/PerfumeService.ts index 57753ac4..98ce6e38 100644 --- a/src/service/PerfumeService.ts +++ b/src/service/PerfumeService.ts @@ -27,7 +27,10 @@ import ImageService from './ImageService'; import KeywordService from './KeywordService'; import SearchService from './SearchService'; import { PerfumeResponse } from '@src/controllers/definitions/response'; - +import { + DuplicatedEntryError, + FailedToCreateError, +} from '@src/utils/errors/errors'; const LOG_TAG: string = '[Perfume/Service]'; const DEFAULT_VALUE_OF_INDEX = 0; @@ -470,6 +473,31 @@ class PerfumeService { const list = rows.map((c) => PerfumeThumbDTO.createByJson(c)); return new ListAndCountDTO(count, list); } + + async create( + name: string, + englishName: string, + brandIdx: number, + abundanceRate: number, + Notes: Array, + imageUrl: string + ) { + try { + return await perfumeDao.create( + name, + englishName, + brandIdx, + abundanceRate, + Notes, + imageUrl + ); + } catch (err: Error | any) { + if (err.parent?.errno === 1062) { + throw new DuplicatedEntryError(); + } + throw new FailedToCreateError(); + } + } } export default PerfumeService; diff --git a/src/service/SearchService.ts b/src/service/SearchService.ts index bf6a0b82..f1f4df65 100644 --- a/src/service/SearchService.ts +++ b/src/service/SearchService.ts @@ -10,6 +10,7 @@ interface PerfumeSearchResultItem { }; imageUrl: string; isLiked: boolean; + englishName: string; } export default class SearchService { diff --git a/tests/test_unit/dao/PerfumeDao.spec.ts b/tests/test_unit/dao/PerfumeDao.spec.ts index 9f6514b2..532228ae 100644 --- a/tests/test_unit/dao/PerfumeDao.spec.ts +++ b/tests/test_unit/dao/PerfumeDao.spec.ts @@ -97,11 +97,12 @@ describe('# perfumeDao Test', () => { .then( (result: ListAndCountDTO) => { expect(result.rows.length).eq(5); - result.rows.forEach((element: any) => { - for (const key in element) { - expect(element[key]).to.be.not.undefined; - } - }); + // result.rows.forEach((element: any) => { + // for (const key in element) { + // console.log(element[key]); + // expect(element[key]).to.be.not.undefined; + // } + // }); const originString: string = result.rows .map( From 5390f4ec76af190738a26eabc63eec7058f404b0 Mon Sep 17 00:00:00 2001 From: Hanyi SEO <122385460+hanyiseo2@users.noreply.github.com> Date: Sun, 30 Jul 2023 01:55:16 +0900 Subject: [PATCH 09/14] =?UTF-8?q?admin-imgUrl=20=EC=9E=91=EC=97=85?= =?UTF-8?q?=EC=A4=91=20(#528)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * admin-imgUrl * POST admin/ingredient - create ingredient --- package-lock.json | 219 ++++++++++++++++++++++++++----- package.json | 4 +- src/app.ts | 8 +- src/config/config.js | 3 + src/config/multerConfig.ts | 15 +++ src/config/s3Config.ts | 10 ++ src/controllers/Admin.ts | 147 +++++++++++++++++++-- src/dao/IngredientDao.ts | 11 ++ src/dao/PerfumeDao.ts | 15 ++- src/service/ImageService.ts | 44 ++++++- src/service/IngredientService.ts | 19 +++ src/service/PerfumeService.ts | 17 ++- 12 files changed, 457 insertions(+), 55 deletions(-) create mode 100644 src/config/multerConfig.ts create mode 100644 src/config/s3Config.ts diff --git a/package-lock.json b/package-lock.json index 1b0ab305..f43fb667 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", - "aws-sdk": "^2.1101.0", + "aws-sdk": "^2.1418.0", "babel-plugin-module-resolver": "^4.1.0", "body-parser": "^1.20.1", "chai": "^4.3.6", @@ -34,6 +34,7 @@ "lodash": "^4.17.21", "mongoose": "^6.4.6", "morgan": "^1.10.0", + "multer": "^1.4.5-lts.1", "mysql2": "^2.3.3", "node-cron": "^3.0.2", "parseurl": "^1.3.3", @@ -59,6 +60,7 @@ "@types/lodash": "^4.14.180", "@types/mocha": "^9.1.0", "@types/morgan": "^1.9.3", + "@types/multer": "^1.4.7", "@types/node": "^17.0.45", "@types/node-cron": "^3.0.2", "@types/sinon": "^10.0.15", @@ -2252,6 +2254,15 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/mysql": { "version": "2.15.21", "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", @@ -2693,6 +2704,11 @@ "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==" + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -2782,9 +2798,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1207.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1207.0.tgz", - "integrity": "sha512-UDNYNeWw9ATbz+pH4lI3AUQgnmK3RwowCrXmW+lVV0bZYo+efiB/LEWQKe0nZK9K2h1LxZYihIih9dOvaGme/w==", + "version": "2.1418.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1418.0.tgz", + "integrity": "sha512-6WDMJQAWKwVt+44+61c/SAXKpUSwToqBMeaqizhEe3GN8TWfxMc9RfCnsYIIwS+L+5hedmKC5oc6Fg2ujs8KUQ==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -2795,7 +2811,7 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" + "xml2js": "0.5.0" }, "engines": { "node": ">= 10.0.0" @@ -3064,8 +3080,18 @@ "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==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "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", @@ -3320,6 +3346,20 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -5968,11 +6008,21 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "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==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -6260,6 +6310,23 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/mysql": { "version": "2.18.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", @@ -7826,6 +7893,14 @@ "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.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8326,6 +8401,11 @@ "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==" + }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -8763,22 +8843,33 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "engines": { "node": ">=4.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10460,6 +10551,15 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/mysql": { "version": "2.15.21", "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", @@ -10773,6 +10873,11 @@ "picomatch": "^2.0.4" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -10841,9 +10946,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sdk": { - "version": "2.1207.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1207.0.tgz", - "integrity": "sha512-UDNYNeWw9ATbz+pH4lI3AUQgnmK3RwowCrXmW+lVV0bZYo+efiB/LEWQKe0nZK9K2h1LxZYihIih9dOvaGme/w==", + "version": "2.1418.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1418.0.tgz", + "integrity": "sha512-6WDMJQAWKwVt+44+61c/SAXKpUSwToqBMeaqizhEe3GN8TWfxMc9RfCnsYIIwS+L+5hedmKC5oc6Fg2ujs8KUQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -10854,7 +10959,7 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" + "xml2js": "0.5.0" } }, "aws4": { @@ -11049,8 +11154,15 @@ "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==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } }, "bytes": { "version": "3.1.2", @@ -11245,6 +11357,17 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -13256,8 +13379,15 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } }, "mocha": { "version": "10.2.0", @@ -13482,6 +13612,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, "mysql": { "version": "2.18.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", @@ -14650,6 +14794,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15011,6 +15160,11 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -15337,18 +15491,23 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 983048ca..6f5c5315 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", - "aws-sdk": "^2.1101.0", + "aws-sdk": "^2.1418.0", "babel-plugin-module-resolver": "^4.1.0", "body-parser": "^1.20.1", "chai": "^4.3.6", @@ -48,6 +48,7 @@ "lodash": "^4.17.21", "mongoose": "^6.4.6", "morgan": "^1.10.0", + "multer": "^1.4.5-lts.1", "mysql2": "^2.3.3", "node-cron": "^3.0.2", "parseurl": "^1.3.3", @@ -73,6 +74,7 @@ "@types/lodash": "^4.14.180", "@types/mocha": "^9.1.0", "@types/morgan": "^1.9.3", + "@types/multer": "^1.4.7", "@types/node": "^17.0.45", "@types/node-cron": "^3.0.2", "@types/sinon": "^10.0.15", diff --git a/src/app.ts b/src/app.ts index ca7ccc37..3d5c2b66 100644 --- a/src/app.ts +++ b/src/app.ts @@ -10,7 +10,6 @@ import properties from '@properties'; import { logger } from '@modules/winston'; import makeMorgan from '@modules/morgan'; - import { HttpError } from '@errors'; import statusCode from '@utils/statusCode'; import { verifyTokenMiddleware, encryptPassword } from '@middleware/auth'; @@ -23,8 +22,10 @@ const { specs, swaggerMetadataHandler, } = require('@modules/swagger'); - import { sequelize } from './models'; +import { multerConfig } from './config/multerConfig'; +import multer from 'multer'; + sequelize.sync(); require('@utils/db/mongoose.js'); @@ -51,6 +52,7 @@ const corsOptionsDelegate: CorsOptionsDelegate = function ( app.use(cors(corsOptionsDelegate)); app.use(bodyParser.json({ limit: '5mb' })); +const upload = multer({ storage: multerConfig.storage }); app.use( makeMorgan((message: string) => { @@ -58,6 +60,8 @@ app.use( }) ); +app.use(upload.single('file')); + app.use('/docs', swaggerUi.serve, swaggerUi.setup(specs)); app.use(swaggerMetadataHandler); diff --git a/src/config/config.js b/src/config/config.js index 0982ef47..5265bd5d 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -8,6 +8,9 @@ module.exports = { dialect: process.env.MYSQL_DEV_DIALECT, timezone: '+09:00', logging: false, + s3AccessKey: process.env.AWS_ACCESS_KEY_ID, + s3SecretKey: process.env.AWS_SECRET_ACCESS_KEY, + bucketName: process.env.AWS_BUCKET_NAME, }, test: { username: process.env.MYSQL_TST_USERNAME, diff --git a/src/config/multerConfig.ts b/src/config/multerConfig.ts new file mode 100644 index 00000000..b2c384ae --- /dev/null +++ b/src/config/multerConfig.ts @@ -0,0 +1,15 @@ +import multer from 'multer'; +type FileNameCallback = (error: Error | null, filename: string) => void; + +export const multerConfig = { + storage: multer.diskStorage({ + destination: 'perfumes/', + filename: function ( + _req: any, + file: Express.Multer.File, + cb: FileNameCallback + ) { + cb(null, file.originalname); + }, + }), +}; diff --git a/src/config/s3Config.ts b/src/config/s3Config.ts new file mode 100644 index 00000000..fc819b38 --- /dev/null +++ b/src/config/s3Config.ts @@ -0,0 +1,10 @@ +import AWS from 'aws-sdk'; +import config from './config'; + +const storage: AWS.S3 = new AWS.S3({ + accessKeyId: config.development.s3AccessKey, + secretAccessKey: config.development.s3SecretKey, + region: 'ap-northeast-2', +}); + +export default storage; diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index 03c1e8c4..290b4c89 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -26,6 +26,7 @@ import { ListAndCountDTO } from '@src/data/dto'; import IngredientCategoryService from '@src/service/IngredientCategoryService'; import { DuplicatedEntryError } from '@src/utils/errors/errors'; import * as Hangul from 'hangul-js'; +import ImageService from '@src/service/ImageService'; let Admin: AdminService = new AdminService(); let Perfume: PerfumeService = new PerfumeService(); let Ingredient: IngredientService = new IngredientService(); @@ -441,9 +442,16 @@ export const createIngredientCategory: RequestHandler = async ( } }; +export async function createImageUrl( + file: Express.Multer.File +): Promise { + const fileLocation: string = await ImageService.uploadImagefileToS3(file); + return fileLocation; +} + /** * @swagger - * /admin/perfumes: + * /admin/perfume: * post: * tags: * - admin @@ -452,14 +460,64 @@ export const createIngredientCategory: RequestHandler = async ( * operationId: createPerfume * produces: * - application/json - * consumes: - * - multipart/form-data * parameters: * - name: body * in: body * required: true * schema: * $ref: '#/definitions/PerfumeInput' + * responses: + * 200: + * description: success + * schema: + * type: object + * properties: + * message: + * type: string + * 400: + * description: 요청 실패 + * 409: + * description: 같은 이름의 카테고리가 존재할 때 + * schema: + * type: object + * x-swagger-router-controller: Admin + */ + +export const createPerfume: RequestHandler = async ( + req: Request, + res: Response +) => { + const { name, englishName, brandIdx, abundanceRate, Notes } = req.body; + try { + await Perfume.create(name, englishName, brandIdx, abundanceRate, Notes); + res.status(StatusCode.OK).json({ + message: '성공', + }); + } catch (e: any) { + if (e instanceof DuplicatedEntryError) { + res.status(StatusCode.CONFLICT).json( + new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) + ); + } else { + res.status(StatusCode.BAD_REQUEST).json( + new SimpleResponseDTO(e.message) + ); + } + } +}; + +/** + * @swagger + * /admin/perfume/img: + * post: + * tags: + * - admin + * summary: 향수 추가 + * description: 향수 추가 + * operationId: createPerfumeImg + * consumes: + * - multipart/form-data + * parameters: * - name: file * in: formData * type: file @@ -480,21 +538,19 @@ export const createIngredientCategory: RequestHandler = async ( * type: object * x-swagger-router-controller: Admin */ -export const createPerfume: RequestHandler = async ( + +export const createPerfumeImg: RequestHandler = async ( req: Request, res: Response ) => { - const { name, englishName, brandIdx, abundanceRate, Notes, imageUrl } = - req.body; + console.log(req.file); + if (!req.file) + return res + .status(400) + .json({ error: 'cannot find file from the request' }); + const imageUrl = await createImageUrl(req.file); try { - await Perfume.create( - name, - englishName, - brandIdx, - abundanceRate, - Notes, - imageUrl - ); + await Perfume.createImg(imageUrl); res.status(StatusCode.OK).json({ message: '성공', }); @@ -655,3 +711,66 @@ export const createBrand: RequestHandler = async ( } } }; + +/** + * @swagger + * /admin/Ingredient: + * post: + * tags: + * - admin + * summary: 향료 추가 + * description: 향료 추가 + * operationId: createIngredient + * produces: + * - application/json + * parameters: + * - name: body + * in: body + * required: true + * schema: + * type: object + * properties: + * name: + * type: string + * seriesIdx: + * type: number + * categoryIdx: + * type: number + * responses: + * 200: + * description: success + * schema: + * type: object + * properties: + * message: + * type: string + * 400: + * description: 요청 실패 + * 409: + * description: 같은 이름의 카테고리가 존재할 때 + * schema: + * type: object + * x-swagger-router-controller: Admin + */ +export const createIngredient: RequestHandler = async ( + req: Request, + res: Response +) => { + const { name, seriesIdx, categoryIdx } = req.body; + try { + await Ingredient.create(name, seriesIdx, categoryIdx); + res.status(StatusCode.OK).json({ + message: '성공', + }); + } catch (e: any) { + if (e instanceof DuplicatedEntryError) { + res.status(StatusCode.CONFLICT).json( + new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) + ); + } else { + res.status(StatusCode.BAD_REQUEST).json( + new SimpleResponseDTO(e.message) + ); + } + } +}; diff --git a/src/dao/IngredientDao.ts b/src/dao/IngredientDao.ts index cde4dd23..6e00f5bb 100644 --- a/src/dao/IngredientDao.ts +++ b/src/dao/IngredientDao.ts @@ -105,6 +105,17 @@ class IngredientDao { order: [['createdAt', 'desc']], }); } + + async create(name: string, seriesIdx: number, categoryIdx: number) { + return Ingredient.create({ + name, + seriesIdx, + categoryIdx, + englishName: '', + description: '', + imageUrl: '', + }); + } } export default IngredientDao; diff --git a/src/dao/PerfumeDao.ts b/src/dao/PerfumeDao.ts index 64cc894e..11120bfa 100644 --- a/src/dao/PerfumeDao.ts +++ b/src/dao/PerfumeDao.ts @@ -446,8 +446,7 @@ class PerfumeDao { englishName: string, brandIdx: number, abundanceRate: number, - Notes: Array, - imageUrl: string + Notes: Array ) { await sequelize.transaction(async (transaction) => { const created = await Perfume.create( @@ -456,7 +455,7 @@ class PerfumeDao { englishName, brandIdx, abundanceRate, - imageUrl, + imageUrl: '', story: '', volumeAndPrice: '', }, @@ -470,6 +469,16 @@ class PerfumeDao { return created; }); } + + async createImg(imageUrl: string | any) { + const created = await Perfume.update( + { + imageUrl, + }, + { where: {} } + ); + return created; + } } export default PerfumeDao; diff --git a/src/service/ImageService.ts b/src/service/ImageService.ts index 4bcbcc76..075e4bf0 100644 --- a/src/service/ImageService.ts +++ b/src/service/ImageService.ts @@ -1,4 +1,11 @@ import S3FileDao from '@src/dao/S3FileDao'; +import config from '../config/config'; +import fs from 'fs'; +import AWS from 'aws-sdk'; +import { + DuplicatedEntryError, + FailedToCreateError, +} from '@src/utils/errors/errors'; class ImageService { s3FileDao: S3FileDao; @@ -21,6 +28,41 @@ class ImageService { return [defaultImage]; } -} + static async uploadImagefileToS3( + fileData: Express.Multer.File + ): Promise { + try { + console.log('Inside the Service'); + const fileContent: Buffer = fs.readFileSync(fileData.path); + + const storage: AWS.S3 = new AWS.S3({ + accessKeyId: process.env.AWS_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, + region: 'ap-northeast-2', + }); + console.log('Inside the Service2'); + + const params: { + Bucket: string; + Key: string; + Body: Buffer; + } = { + Bucket: config.development.bucketName as string, + Key: fileData.originalname, + Body: fileContent, + }; + console.log('Inside the Service3'); + + const result = await storage.upload(params).promise(); + console.log(result.Location); + return result.Location; + } catch (err: Error | any) { + if (err.parent?.errno === 1062) { + throw new DuplicatedEntryError(); + } + throw new FailedToCreateError(); + } + } +} export default ImageService; diff --git a/src/service/IngredientService.ts b/src/service/IngredientService.ts index 3fa56af7..e4d975ad 100644 --- a/src/service/IngredientService.ts +++ b/src/service/IngredientService.ts @@ -9,6 +9,10 @@ import { PagingDTO, } from '@dto/index'; import { Op } from 'sequelize'; +import { + DuplicatedEntryError, + FailedToCreateError, +} from '@src/utils/errors/errors'; const LOG_TAG: string = '[Ingredient/Service]'; @@ -79,7 +83,22 @@ class IngredientService { }; }); return new ListAndCountDTO(count, perfumesWithCategory); + } + async create(name: string, seriesIdx: number, categoryIdx: number) { + try { + return await this.ingredientDao.create( + name, + seriesIdx, + categoryIdx + ); + } catch (err: Error | any) { + if (err.parent.errno === 1062) { + throw new DuplicatedEntryError(); + } + + throw new FailedToCreateError(); + } } } diff --git a/src/service/PerfumeService.ts b/src/service/PerfumeService.ts index 98ce6e38..116156bd 100644 --- a/src/service/PerfumeService.ts +++ b/src/service/PerfumeService.ts @@ -479,8 +479,7 @@ class PerfumeService { englishName: string, brandIdx: number, abundanceRate: number, - Notes: Array, - imageUrl: string + Notes: Array ) { try { return await perfumeDao.create( @@ -488,8 +487,7 @@ class PerfumeService { englishName, brandIdx, abundanceRate, - Notes, - imageUrl + Notes ); } catch (err: Error | any) { if (err.parent?.errno === 1062) { @@ -498,6 +496,17 @@ class PerfumeService { throw new FailedToCreateError(); } } + + async createImg(imageUrl: string) { + try { + return await perfumeDao.createImg(imageUrl); + } catch (err: Error | any) { + if (err.parent?.errno === 1062) { + throw new DuplicatedEntryError(); + } + throw new FailedToCreateError(); + } + } } export default PerfumeService; From 084df176d902cc9be4950730851513282fb38485 Mon Sep 17 00:00:00 2001 From: Hanyi SEO <122385460+hanyiseo2@users.noreply.github.com> Date: Wed, 16 Aug 2023 01:48:34 +0900 Subject: [PATCH 10/14] Dev admin img url (#529) * admin-imgUrl * POST admin/ingredient - create ingredient * perfume-addImage --- src/controllers/Admin.ts | 10 ++++++++-- src/dao/PerfumeDao.ts | 4 ++-- src/service/ImageService.ts | 15 +++------------ src/service/PerfumeService.ts | 4 ++-- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index 290b4c89..791e5a4b 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -522,6 +522,11 @@ export const createPerfume: RequestHandler = async ( * in: formData * type: file * description: uploaded file + * - name: perfumeIdx + * in: query + * required: true + * type: integer + * format: int64 * responses: * 200: * description: success @@ -543,14 +548,15 @@ export const createPerfumeImg: RequestHandler = async ( req: Request, res: Response ) => { - console.log(req.file); if (!req.file) return res .status(400) .json({ error: 'cannot find file from the request' }); const imageUrl = await createImageUrl(req.file); + const perfumeIdx: number = Number(req.query.perfumeIdx); + try { - await Perfume.createImg(imageUrl); + await Perfume.createImg(imageUrl, perfumeIdx); res.status(StatusCode.OK).json({ message: '성공', }); diff --git a/src/dao/PerfumeDao.ts b/src/dao/PerfumeDao.ts index 11120bfa..5beb3061 100644 --- a/src/dao/PerfumeDao.ts +++ b/src/dao/PerfumeDao.ts @@ -470,12 +470,12 @@ class PerfumeDao { }); } - async createImg(imageUrl: string | any) { + async createImg(imageUrl: string | any, perfumeIdx: number) { const created = await Perfume.update( { imageUrl, }, - { where: {} } + { where: { perfumeIdx } } ); return created; } diff --git a/src/service/ImageService.ts b/src/service/ImageService.ts index 075e4bf0..3699a73f 100644 --- a/src/service/ImageService.ts +++ b/src/service/ImageService.ts @@ -1,11 +1,11 @@ import S3FileDao from '@src/dao/S3FileDao'; import config from '../config/config'; import fs from 'fs'; -import AWS from 'aws-sdk'; import { DuplicatedEntryError, FailedToCreateError, } from '@src/utils/errors/errors'; +import storage from '../config/s3Config'; class ImageService { s3FileDao: S3FileDao; @@ -33,15 +33,8 @@ class ImageService { fileData: Express.Multer.File ): Promise { try { - console.log('Inside the Service'); const fileContent: Buffer = fs.readFileSync(fileData.path); - - const storage: AWS.S3 = new AWS.S3({ - accessKeyId: process.env.AWS_ACCESS_KEY_ID, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, - region: 'ap-northeast-2', - }); - console.log('Inside the Service2'); + const keyWithPrefix = `perfumes/${fileData.originalname}`; const params: { Bucket: string; @@ -49,13 +42,11 @@ class ImageService { Body: Buffer; } = { Bucket: config.development.bucketName as string, - Key: fileData.originalname, + Key: keyWithPrefix, Body: fileContent, }; - console.log('Inside the Service3'); const result = await storage.upload(params).promise(); - console.log(result.Location); return result.Location; } catch (err: Error | any) { if (err.parent?.errno === 1062) { diff --git a/src/service/PerfumeService.ts b/src/service/PerfumeService.ts index 116156bd..72676847 100644 --- a/src/service/PerfumeService.ts +++ b/src/service/PerfumeService.ts @@ -497,9 +497,9 @@ class PerfumeService { } } - async createImg(imageUrl: string) { + async createImg(imageUrl: string, perfumeIdx: number) { try { - return await perfumeDao.createImg(imageUrl); + return await perfumeDao.createImg(imageUrl, perfumeIdx); } catch (err: Error | any) { if (err.parent?.errno === 1062) { throw new DuplicatedEntryError(); From 3133ac230fd8ca6611f684e50a00b389bb852d9d Mon Sep 17 00:00:00 2001 From: Taeho Choi <48103834+Taehoya@users.noreply.github.com> Date: Fri, 25 Aug 2023 23:34:17 -0500 Subject: [PATCH 11/14] cth/fix (#530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Dev admin img url (#529)" This reverts commit 084df176d902cc9be4950730851513282fb38485. * Revert "admin-imgUrl 작업중 (#528)" This reverts commit 5390f4ec76af190738a26eabc63eec7058f404b0. * Revert "Dev admin fix (#527)" This reverts commit 3ffe96053dbf308deca552da9c790bf54c0c48df. --- package-lock.json | 219 +++--------------- package.json | 4 +- src/app.ts | 8 +- src/config/config.js | 3 - src/config/multerConfig.ts | 15 -- src/config/s3Config.ts | 10 - src/controllers/Admin.ts | 179 +++----------- .../definitions/request/perfume.ts | 63 +---- .../definitions/response/perfume.ts | 12 +- src/dao/IngredientDao.ts | 11 - src/dao/PerfumeDao.ts | 40 ---- src/data/dto/PerfumeInquireHistoryDTO.ts | 13 +- src/data/dto/PerfumeThumbDTO.ts | 4 - src/service/ImageService.ts | 35 +-- src/service/IngredientService.ts | 19 -- src/service/PerfumeService.ts | 39 +--- src/service/SearchService.ts | 1 - tests/test_unit/dao/PerfumeDao.spec.ts | 11 +- 18 files changed, 80 insertions(+), 606 deletions(-) delete mode 100644 src/config/multerConfig.ts delete mode 100644 src/config/s3Config.ts diff --git a/package-lock.json b/package-lock.json index f43fb667..1b0ab305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", - "aws-sdk": "^2.1418.0", + "aws-sdk": "^2.1101.0", "babel-plugin-module-resolver": "^4.1.0", "body-parser": "^1.20.1", "chai": "^4.3.6", @@ -34,7 +34,6 @@ "lodash": "^4.17.21", "mongoose": "^6.4.6", "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", "mysql2": "^2.3.3", "node-cron": "^3.0.2", "parseurl": "^1.3.3", @@ -60,7 +59,6 @@ "@types/lodash": "^4.14.180", "@types/mocha": "^9.1.0", "@types/morgan": "^1.9.3", - "@types/multer": "^1.4.7", "@types/node": "^17.0.45", "@types/node-cron": "^3.0.2", "@types/sinon": "^10.0.15", @@ -2254,15 +2252,6 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, - "node_modules/@types/multer": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", - "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, "node_modules/@types/mysql": { "version": "2.15.21", "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", @@ -2704,11 +2693,6 @@ "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==" - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -2798,9 +2782,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1418.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1418.0.tgz", - "integrity": "sha512-6WDMJQAWKwVt+44+61c/SAXKpUSwToqBMeaqizhEe3GN8TWfxMc9RfCnsYIIwS+L+5hedmKC5oc6Fg2ujs8KUQ==", + "version": "2.1207.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1207.0.tgz", + "integrity": "sha512-UDNYNeWw9ATbz+pH4lI3AUQgnmK3RwowCrXmW+lVV0bZYo+efiB/LEWQKe0nZK9K2h1LxZYihIih9dOvaGme/w==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -2811,7 +2795,7 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.5.0" + "xml2js": "0.4.19" }, "engines": { "node": ">= 10.0.0" @@ -3080,18 +3064,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==" - }, - "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" - } + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/bytes": { "version": "3.1.2", @@ -3346,20 +3320,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -6008,21 +5968,11 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "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==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -6310,23 +6260,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/mysql": { "version": "2.18.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", @@ -7893,14 +7826,6 @@ "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.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8401,11 +8326,6 @@ "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==" - }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -8843,33 +8763,22 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" + "xmlbuilder": "~9.0.1" } }, "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", "engines": { "node": ">=4.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10551,15 +10460,6 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, - "@types/multer": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", - "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, "@types/mysql": { "version": "2.15.21", "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", @@ -10873,11 +10773,6 @@ "picomatch": "^2.0.4" } }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -10946,9 +10841,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sdk": { - "version": "2.1418.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1418.0.tgz", - "integrity": "sha512-6WDMJQAWKwVt+44+61c/SAXKpUSwToqBMeaqizhEe3GN8TWfxMc9RfCnsYIIwS+L+5hedmKC5oc6Fg2ujs8KUQ==", + "version": "2.1207.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1207.0.tgz", + "integrity": "sha512-UDNYNeWw9ATbz+pH4lI3AUQgnmK3RwowCrXmW+lVV0bZYo+efiB/LEWQKe0nZK9K2h1LxZYihIih9dOvaGme/w==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -10959,7 +10854,7 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.5.0" + "xml2js": "0.4.19" } }, "aws4": { @@ -11154,15 +11049,8 @@ "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==" - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "bytes": { "version": "3.1.2", @@ -11357,17 +11245,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -13379,15 +13256,8 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true }, "mocha": { "version": "10.2.0", @@ -13612,20 +13482,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, "mysql": { "version": "2.18.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", @@ -14794,11 +14650,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15160,11 +15011,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, "typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -15491,23 +15337,18 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 6f5c5315..983048ca 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-typescript": "^7.16.7", "@opensearch-project/opensearch": "^1.2.0", - "aws-sdk": "^2.1418.0", + "aws-sdk": "^2.1101.0", "babel-plugin-module-resolver": "^4.1.0", "body-parser": "^1.20.1", "chai": "^4.3.6", @@ -48,7 +48,6 @@ "lodash": "^4.17.21", "mongoose": "^6.4.6", "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", "mysql2": "^2.3.3", "node-cron": "^3.0.2", "parseurl": "^1.3.3", @@ -74,7 +73,6 @@ "@types/lodash": "^4.14.180", "@types/mocha": "^9.1.0", "@types/morgan": "^1.9.3", - "@types/multer": "^1.4.7", "@types/node": "^17.0.45", "@types/node-cron": "^3.0.2", "@types/sinon": "^10.0.15", diff --git a/src/app.ts b/src/app.ts index 3d5c2b66..ca7ccc37 100644 --- a/src/app.ts +++ b/src/app.ts @@ -10,6 +10,7 @@ import properties from '@properties'; import { logger } from '@modules/winston'; import makeMorgan from '@modules/morgan'; + import { HttpError } from '@errors'; import statusCode from '@utils/statusCode'; import { verifyTokenMiddleware, encryptPassword } from '@middleware/auth'; @@ -22,10 +23,8 @@ const { specs, swaggerMetadataHandler, } = require('@modules/swagger'); -import { sequelize } from './models'; -import { multerConfig } from './config/multerConfig'; -import multer from 'multer'; +import { sequelize } from './models'; sequelize.sync(); require('@utils/db/mongoose.js'); @@ -52,7 +51,6 @@ const corsOptionsDelegate: CorsOptionsDelegate = function ( app.use(cors(corsOptionsDelegate)); app.use(bodyParser.json({ limit: '5mb' })); -const upload = multer({ storage: multerConfig.storage }); app.use( makeMorgan((message: string) => { @@ -60,8 +58,6 @@ app.use( }) ); -app.use(upload.single('file')); - app.use('/docs', swaggerUi.serve, swaggerUi.setup(specs)); app.use(swaggerMetadataHandler); diff --git a/src/config/config.js b/src/config/config.js index 5265bd5d..0982ef47 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -8,9 +8,6 @@ module.exports = { dialect: process.env.MYSQL_DEV_DIALECT, timezone: '+09:00', logging: false, - s3AccessKey: process.env.AWS_ACCESS_KEY_ID, - s3SecretKey: process.env.AWS_SECRET_ACCESS_KEY, - bucketName: process.env.AWS_BUCKET_NAME, }, test: { username: process.env.MYSQL_TST_USERNAME, diff --git a/src/config/multerConfig.ts b/src/config/multerConfig.ts deleted file mode 100644 index b2c384ae..00000000 --- a/src/config/multerConfig.ts +++ /dev/null @@ -1,15 +0,0 @@ -import multer from 'multer'; -type FileNameCallback = (error: Error | null, filename: string) => void; - -export const multerConfig = { - storage: multer.diskStorage({ - destination: 'perfumes/', - filename: function ( - _req: any, - file: Express.Multer.File, - cb: FileNameCallback - ) { - cb(null, file.originalname); - }, - }), -}; diff --git a/src/config/s3Config.ts b/src/config/s3Config.ts deleted file mode 100644 index fc819b38..00000000 --- a/src/config/s3Config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import AWS from 'aws-sdk'; -import config from './config'; - -const storage: AWS.S3 = new AWS.S3({ - accessKeyId: config.development.s3AccessKey, - secretAccessKey: config.development.s3SecretKey, - region: 'ap-northeast-2', -}); - -export default storage; diff --git a/src/controllers/Admin.ts b/src/controllers/Admin.ts index 791e5a4b..bf99f774 100644 --- a/src/controllers/Admin.ts +++ b/src/controllers/Admin.ts @@ -26,7 +26,6 @@ import { ListAndCountDTO } from '@src/data/dto'; import IngredientCategoryService from '@src/service/IngredientCategoryService'; import { DuplicatedEntryError } from '@src/utils/errors/errors'; import * as Hangul from 'hangul-js'; -import ImageService from '@src/service/ImageService'; let Admin: AdminService = new AdminService(); let Perfume: PerfumeService = new PerfumeService(); let Ingredient: IngredientService = new IngredientService(); @@ -150,7 +149,6 @@ export const getPerfume: RequestHandler = async ( }; /** - * * @swagger * /admin/perfumes: * get: @@ -442,22 +440,17 @@ export const createIngredientCategory: RequestHandler = async ( } }; -export async function createImageUrl( - file: Express.Multer.File -): Promise { - const fileLocation: string = await ImageService.uploadImagefileToS3(file); - return fileLocation; -} - /** * @swagger - * /admin/perfume: + * /admin/perfumes: * post: * tags: * - admin * summary: 향수 추가 * description: 향수 추가 * operationId: createPerfume + * consumes: + * - application/json * produces: * - application/json * parameters: @@ -466,67 +459,18 @@ export async function createImageUrl( * required: true * schema: * $ref: '#/definitions/PerfumeInput' - * responses: - * 200: - * description: success - * schema: - * type: object - * properties: - * message: + * name: + * type: string + * elgishName: + * type: string + * Brand: + * type: object + * abundanceRate: + * type: number + * Notes: + * type: object + * imageUrl: * type: string - * 400: - * description: 요청 실패 - * 409: - * description: 같은 이름의 카테고리가 존재할 때 - * schema: - * type: object - * x-swagger-router-controller: Admin - */ - -export const createPerfume: RequestHandler = async ( - req: Request, - res: Response -) => { - const { name, englishName, brandIdx, abundanceRate, Notes } = req.body; - try { - await Perfume.create(name, englishName, brandIdx, abundanceRate, Notes); - res.status(StatusCode.OK).json({ - message: '성공', - }); - } catch (e: any) { - if (e instanceof DuplicatedEntryError) { - res.status(StatusCode.CONFLICT).json( - new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) - ); - } else { - res.status(StatusCode.BAD_REQUEST).json( - new SimpleResponseDTO(e.message) - ); - } - } -}; - -/** - * @swagger - * /admin/perfume/img: - * post: - * tags: - * - admin - * summary: 향수 추가 - * description: 향수 추가 - * operationId: createPerfumeImg - * consumes: - * - multipart/form-data - * parameters: - * - name: file - * in: formData - * type: file - * description: uploaded file - * - name: perfumeIdx - * in: query - * required: true - * type: integer - * format: int64 * responses: * 200: * description: success @@ -541,22 +485,32 @@ export const createPerfume: RequestHandler = async ( * description: 같은 이름의 카테고리가 존재할 때 * schema: * type: object - * x-swagger-router-controller: Admin + * x-swagger-router-controll er: Admin + * definitions: + * Brand: + * type: object + * properties: + * brandIdx: + * type: integer + * name: + * type: string + * Note: + * type: object + * properties: + * perfumeIdx: + * type: integer + * ingredientIdx: + * type: integer + * type: + * */ - -export const createPerfumeImg: RequestHandler = async ( +export const createPerfume: RequestHandler = async ( req: Request, res: Response ) => { - if (!req.file) - return res - .status(400) - .json({ error: 'cannot find file from the request' }); - const imageUrl = await createImageUrl(req.file); - const perfumeIdx: number = Number(req.query.perfumeIdx); - + const { name } = req.body; try { - await Perfume.createImg(imageUrl, perfumeIdx); + await IngredientCategory.create(name); res.status(StatusCode.OK).json({ message: '성공', }); @@ -717,66 +671,3 @@ export const createBrand: RequestHandler = async ( } } }; - -/** - * @swagger - * /admin/Ingredient: - * post: - * tags: - * - admin - * summary: 향료 추가 - * description: 향료 추가 - * operationId: createIngredient - * produces: - * - application/json - * parameters: - * - name: body - * in: body - * required: true - * schema: - * type: object - * properties: - * name: - * type: string - * seriesIdx: - * type: number - * categoryIdx: - * type: number - * responses: - * 200: - * description: success - * schema: - * type: object - * properties: - * message: - * type: string - * 400: - * description: 요청 실패 - * 409: - * description: 같은 이름의 카테고리가 존재할 때 - * schema: - * type: object - * x-swagger-router-controller: Admin - */ -export const createIngredient: RequestHandler = async ( - req: Request, - res: Response -) => { - const { name, seriesIdx, categoryIdx } = req.body; - try { - await Ingredient.create(name, seriesIdx, categoryIdx); - res.status(StatusCode.OK).json({ - message: '성공', - }); - } catch (e: any) { - if (e instanceof DuplicatedEntryError) { - res.status(StatusCode.CONFLICT).json( - new ResponseDTO(MSG_EXIST_DUPLICATE_ENTRY, false) - ); - } else { - res.status(StatusCode.BAD_REQUEST).json( - new SimpleResponseDTO(e.message) - ); - } - } -}; diff --git a/src/controllers/definitions/request/perfume.ts b/src/controllers/definitions/request/perfume.ts index 21c1809c..06cd474d 100644 --- a/src/controllers/definitions/request/perfume.ts +++ b/src/controllers/definitions/request/perfume.ts @@ -62,65 +62,4 @@ class PerfumeSearchRequest { } } -/** - * @swagger - * definitions: - * Note: - * type: object - * properties: - * ingredientIdx: - * type: number - * type: - * type: number - */ -class Note { - ingredientIdx: number; - type: number; - - constructor(ingredientIdx: number, type: number) { - this.ingredientIdx = ingredientIdx; - this.type = type; - } -} - -/** - * @swagger - * definitions: - * PerfumeInput: - * type: object - * properties: - * name: - * type: string - * englishName: - * type: string - * brandIdx: - * type: number - * abundanceRate: - * type: number - * Notes: - * type: array - * items: - * $ref: '#/definitions/Note' - */ -class PerfumeInput { - name: string; - englishName: string; - brandIdx: number; - abundanceRate: number; - Notes: Note; - - constructor( - name: string, - englishName: string, - brandIdx: number, - abundanceRate: number, - Notes: Note - ) { - this.name = name; - this.englishName = englishName; - this.brandIdx = brandIdx; - this.abundanceRate = abundanceRate; - this.Notes = Notes; - } -} -export { PerfumeSearchRequest, PerfumeInput }; +export { PerfumeSearchRequest }; diff --git a/src/controllers/definitions/response/perfume.ts b/src/controllers/definitions/response/perfume.ts index ebf5cb26..1765d91c 100644 --- a/src/controllers/definitions/response/perfume.ts +++ b/src/controllers/definitions/response/perfume.ts @@ -291,21 +291,18 @@ class PerfumeResponse { readonly brandName: string; readonly imageUrl: string; readonly isLiked: boolean; - readonly englishName: string; constructor( perfumeIdx: number, name: string, brandName: string, imageUrl: string, - isLiked: boolean, - englishName: string + isLiked: boolean ) { this.perfumeIdx = perfumeIdx; this.name = name; this.brandName = brandName; this.imageUrl = imageUrl; this.isLiked = isLiked; - this.englishName = englishName; } public toString(): string { @@ -318,8 +315,7 @@ class PerfumeResponse { json.name, json.brandName, json.imageUrl, - json.isLiked, - json.englishName + json.isLiked ); } } @@ -360,10 +356,9 @@ class PerfumeRecommendResponse extends PerfumeResponse { brandName: string, imageUrl: string, isLiked: boolean, - englishName: string, keywordList: string[] ) { - super(perfumeIdx, name, brandName, imageUrl, isLiked, englishName); + super(perfumeIdx, name, brandName, imageUrl, isLiked); this.keywordList = keywordList; } @@ -378,7 +373,6 @@ class PerfumeRecommendResponse extends PerfumeResponse { json.brandName, json.imageUrl, json.isLiked, - json.englishName, json.keywordList ); } diff --git a/src/dao/IngredientDao.ts b/src/dao/IngredientDao.ts index 6e00f5bb..cde4dd23 100644 --- a/src/dao/IngredientDao.ts +++ b/src/dao/IngredientDao.ts @@ -105,17 +105,6 @@ class IngredientDao { order: [['createdAt', 'desc']], }); } - - async create(name: string, seriesIdx: number, categoryIdx: number) { - return Ingredient.create({ - name, - seriesIdx, - categoryIdx, - englishName: '', - description: '', - imageUrl: '', - }); - } } export default IngredientDao; diff --git a/src/dao/PerfumeDao.ts b/src/dao/PerfumeDao.ts index 5beb3061..311e4496 100644 --- a/src/dao/PerfumeDao.ts +++ b/src/dao/PerfumeDao.ts @@ -21,7 +21,6 @@ import { Perfume, PerfumeSurvey, sequelize, - Note, } from '@sequelize'; import Sequelize, { QueryTypes, WhereOptions } from 'sequelize'; @@ -440,45 +439,6 @@ class PerfumeDao { order: [['createdAt', 'desc']], }); } - - async create( - name: string, - englishName: string, - brandIdx: number, - abundanceRate: number, - Notes: Array - ) { - await sequelize.transaction(async (transaction) => { - const created = await Perfume.create( - { - name, - englishName, - brandIdx, - abundanceRate, - imageUrl: '', - story: '', - volumeAndPrice: '', - }, - { raw: true, transaction } - ); - - await Note.bulkCreate( - Notes.map((i) => ({ ...i, perfumeIdx: created.perfumeIdx })), - { transaction } - ); - return created; - }); - } - - async createImg(imageUrl: string | any, perfumeIdx: number) { - const created = await Perfume.update( - { - imageUrl, - }, - { where: { perfumeIdx } } - ); - return created; - } } export default PerfumeDao; diff --git a/src/data/dto/PerfumeInquireHistoryDTO.ts b/src/data/dto/PerfumeInquireHistoryDTO.ts index 0e1a7f2f..09c39e3c 100644 --- a/src/data/dto/PerfumeInquireHistoryDTO.ts +++ b/src/data/dto/PerfumeInquireHistoryDTO.ts @@ -17,20 +17,10 @@ class PerfumeInquireHistoryDTO extends PerfumeThumbDTO { imageUrl: string, createdAt: Date, updatedAt: Date, - englishName: string, Brand: BrandDTO, inquireHistory: InquireHistory ) { - super( - perfumeIdx, - name, - isLiked, - imageUrl, - englishName, - createdAt, - updatedAt, - Brand - ); + super(perfumeIdx, name, isLiked, imageUrl, createdAt, updatedAt, Brand); this.InquireHistory = inquireHistory; } @@ -46,7 +36,6 @@ class PerfumeInquireHistoryDTO extends PerfumeThumbDTO { json.imageUrl, json.createdAt, json.updatedAt, - json.englishName, json.Brand, json.InquireHistory ); diff --git a/src/data/dto/PerfumeThumbDTO.ts b/src/data/dto/PerfumeThumbDTO.ts index 5031b7bb..bb79b8d1 100644 --- a/src/data/dto/PerfumeThumbDTO.ts +++ b/src/data/dto/PerfumeThumbDTO.ts @@ -6,7 +6,6 @@ class PerfumeThumbDTO { readonly brandName: string; readonly isLiked: boolean; readonly imageUrl: string; - readonly englishName: string; readonly createdAt: Date; readonly updatedAt: Date; readonly Brand: BrandDTO; @@ -15,7 +14,6 @@ class PerfumeThumbDTO { name: string, isLiked: boolean, imageUrl: string, - englishName: string, createdAt: Date, updatedAt: Date, Brand: BrandDTO @@ -25,7 +23,6 @@ class PerfumeThumbDTO { this.brandName = Brand?.name; this.isLiked = isLiked || false; this.imageUrl = imageUrl; - this.englishName = englishName; this.createdAt = createdAt; this.updatedAt = updatedAt; this.Brand = Brand; @@ -41,7 +38,6 @@ class PerfumeThumbDTO { json.name, json.isLiked, json.imageUrl, - json.englishName, json.createdAt, json.updatedAt, json.Brand diff --git a/src/service/ImageService.ts b/src/service/ImageService.ts index 3699a73f..4bcbcc76 100644 --- a/src/service/ImageService.ts +++ b/src/service/ImageService.ts @@ -1,11 +1,4 @@ import S3FileDao from '@src/dao/S3FileDao'; -import config from '../config/config'; -import fs from 'fs'; -import { - DuplicatedEntryError, - FailedToCreateError, -} from '@src/utils/errors/errors'; -import storage from '../config/s3Config'; class ImageService { s3FileDao: S3FileDao; @@ -28,32 +21,6 @@ class ImageService { return [defaultImage]; } - - static async uploadImagefileToS3( - fileData: Express.Multer.File - ): Promise { - try { - const fileContent: Buffer = fs.readFileSync(fileData.path); - const keyWithPrefix = `perfumes/${fileData.originalname}`; - - const params: { - Bucket: string; - Key: string; - Body: Buffer; - } = { - Bucket: config.development.bucketName as string, - Key: keyWithPrefix, - Body: fileContent, - }; - - const result = await storage.upload(params).promise(); - return result.Location; - } catch (err: Error | any) { - if (err.parent?.errno === 1062) { - throw new DuplicatedEntryError(); - } - throw new FailedToCreateError(); - } - } } + export default ImageService; diff --git a/src/service/IngredientService.ts b/src/service/IngredientService.ts index e4d975ad..3fa56af7 100644 --- a/src/service/IngredientService.ts +++ b/src/service/IngredientService.ts @@ -9,10 +9,6 @@ import { PagingDTO, } from '@dto/index'; import { Op } from 'sequelize'; -import { - DuplicatedEntryError, - FailedToCreateError, -} from '@src/utils/errors/errors'; const LOG_TAG: string = '[Ingredient/Service]'; @@ -83,22 +79,7 @@ class IngredientService { }; }); return new ListAndCountDTO(count, perfumesWithCategory); - } - async create(name: string, seriesIdx: number, categoryIdx: number) { - try { - return await this.ingredientDao.create( - name, - seriesIdx, - categoryIdx - ); - } catch (err: Error | any) { - if (err.parent.errno === 1062) { - throw new DuplicatedEntryError(); - } - - throw new FailedToCreateError(); - } } } diff --git a/src/service/PerfumeService.ts b/src/service/PerfumeService.ts index 72676847..57753ac4 100644 --- a/src/service/PerfumeService.ts +++ b/src/service/PerfumeService.ts @@ -27,10 +27,7 @@ import ImageService from './ImageService'; import KeywordService from './KeywordService'; import SearchService from './SearchService'; import { PerfumeResponse } from '@src/controllers/definitions/response'; -import { - DuplicatedEntryError, - FailedToCreateError, -} from '@src/utils/errors/errors'; + const LOG_TAG: string = '[Perfume/Service]'; const DEFAULT_VALUE_OF_INDEX = 0; @@ -473,40 +470,6 @@ class PerfumeService { const list = rows.map((c) => PerfumeThumbDTO.createByJson(c)); return new ListAndCountDTO(count, list); } - - async create( - name: string, - englishName: string, - brandIdx: number, - abundanceRate: number, - Notes: Array - ) { - try { - return await perfumeDao.create( - name, - englishName, - brandIdx, - abundanceRate, - Notes - ); - } catch (err: Error | any) { - if (err.parent?.errno === 1062) { - throw new DuplicatedEntryError(); - } - throw new FailedToCreateError(); - } - } - - async createImg(imageUrl: string, perfumeIdx: number) { - try { - return await perfumeDao.createImg(imageUrl, perfumeIdx); - } catch (err: Error | any) { - if (err.parent?.errno === 1062) { - throw new DuplicatedEntryError(); - } - throw new FailedToCreateError(); - } - } } export default PerfumeService; diff --git a/src/service/SearchService.ts b/src/service/SearchService.ts index f1f4df65..bf6a0b82 100644 --- a/src/service/SearchService.ts +++ b/src/service/SearchService.ts @@ -10,7 +10,6 @@ interface PerfumeSearchResultItem { }; imageUrl: string; isLiked: boolean; - englishName: string; } export default class SearchService { diff --git a/tests/test_unit/dao/PerfumeDao.spec.ts b/tests/test_unit/dao/PerfumeDao.spec.ts index 532228ae..9f6514b2 100644 --- a/tests/test_unit/dao/PerfumeDao.spec.ts +++ b/tests/test_unit/dao/PerfumeDao.spec.ts @@ -97,12 +97,11 @@ describe('# perfumeDao Test', () => { .then( (result: ListAndCountDTO) => { expect(result.rows.length).eq(5); - // result.rows.forEach((element: any) => { - // for (const key in element) { - // console.log(element[key]); - // expect(element[key]).to.be.not.undefined; - // } - // }); + result.rows.forEach((element: any) => { + for (const key in element) { + expect(element[key]).to.be.not.undefined; + } + }); const originString: string = result.rows .map( From 9025579a504d90c375d4c5cbd3be9db7306b8510 Mon Sep 17 00:00:00 2001 From: heesung6701 Date: Mon, 16 Oct 2023 23:30:57 +0900 Subject: [PATCH 12/14] upgrade android min version --- src/controllers/System.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/System.ts b/src/controllers/System.ts index f7efb7f1..6e836d3b 100644 --- a/src/controllers/System.ts +++ b/src/controllers/System.ts @@ -133,8 +133,8 @@ interface IVersionChecker { class VersionCheckerAndroid implements IVersionChecker { // TODO: prevVersion, latestVersion을 삭제하고 minimumVersion으로 변경 // 유연한 변경을 위해서 코드 레벨이 아닌 환경 변수 주입으로 변경 필요 - prevVersion: Version = new Version(1, 4, 0); - latestVersion: Version = new Version(1, 4, 1); + prevVersion: Version = new Version(1, 5, 2); + latestVersion: Version = new Version(1, 5, 2); isSupportVersion(apkVersion: string): Boolean { const version: Version = Version.create(apkVersion); From 966a101581e20c53f8ca8cdc6f577e4218cd62dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=ED=95=98=EB=8B=B4?= <35447878+ChoHadam@users.noreply.github.com> Date: Tue, 26 Dec 2023 18:47:11 +0900 Subject: [PATCH 13/14] Refactor dev branch CI/CD process (#534) * Update prebuild.sh * Update reload.sh * Create deploy file to test with Github Hosted Runner * Update deploy-development.yml using github-hosted runner and SSH * Rollback branch name to push * Remove workflow file for testing --- .github/workflows/deploy-development.yml | 40 ++++++++++++++---------- script/prebuild.sh | 15 +++++++-- script/reload.sh | 21 ++++++++++--- 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/.github/workflows/deploy-development.yml b/.github/workflows/deploy-development.yml index c15bc545..ea2b3d28 100644 --- a/.github/workflows/deploy-development.yml +++ b/.github/workflows/deploy-development.yml @@ -1,6 +1,3 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - name: Deploy development server to ec2 on: @@ -9,27 +6,36 @@ on: - dev jobs: - build: - runs-on: self-hosted + deploy: + runs-on: ubuntu-latest + strategy: matrix: node-version: [16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - defaults: - run: - working-directory: ${{ env.SERVER_PROFILE }} + steps: - - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - with: - path: ${{ env.SERVER_PROFILE }} + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 #v.3.5.1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - run: cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json - - run: cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env - - run: bash ${{ env.PROJECT_PATH }}/script/prebuild.sh - - run: sh ${{ env.PROJECT_PATH }}/script/reload.sh + + - name: Deploy to EC2 using SSH + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + script: | + cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json + cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env + cd ${{ env.PROJECT_PATH }} + bash script/prebuild.sh + sh script/reload.sh + env: NODE_ENV: development SERVER_PROFILE: development diff --git a/script/prebuild.sh b/script/prebuild.sh index 3a8a83a9..f2bc5326 100755 --- a/script/prebuild.sh +++ b/script/prebuild.sh @@ -1,7 +1,18 @@ #!/bin/bash +# 에러 핸들링 추가 +set -e + +# ecosystem.json 파일이 존재하면 pm2로 실행 중인 프로세스 중지 if [[ -f "ecosystem.json" ]]; then - pm2 stop ecosystem.json + pm2 stop ecosystem.json || true fi -npm ci \ No newline at end of file +# 종속성 설치 +npm ci || exit 1 + +# 프로젝트 빌드 +npm run build || exit 1 + +# Exit code를 출력하여 스크립트가 성공적으로 실행되었는지 확인 +echo $? \ No newline at end of file diff --git a/script/reload.sh b/script/reload.sh index c8af0c4a..1db728da 100755 --- a/script/reload.sh +++ b/script/reload.sh @@ -1,6 +1,17 @@ -#!/bin/sh +#!/bin/bash -pm2 stop ecosystem.json -npm run build -pm2 restart ecosystem.json -echo $? +# 에러 핸들링 추가 +set -e + +# ecosystem.json 파일이 존재하면 pm2로 실행 중인 프로세스를 중지 +if [[ -f "ecosystem.json" ]]; then + pm2 stop ecosystem.json || true +fi + +# npm run build 명령어로 프로젝트 빌드 +npm run build || exit 1 + +# ecosystem.json 사용하여 pm2로 프로세스 재시작 +if [[ -f "ecosystem.json" ]]; then + pm2 restart ecosystem.json || exit 1 +fi \ No newline at end of file From adf7633888b2f79054f6dcff5926d2f87173aaaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=ED=95=98=EB=8B=B4?= <35447878+ChoHadam@users.noreply.github.com> Date: Tue, 2 Jan 2024 10:21:24 +0900 Subject: [PATCH 14/14] Refactor deploy-development.yml and reload.sh for CI/CD performance (#535) * Rollback deploy file to test with Github Hosted Runner * Update branch name to push * Add step to check default github workspace path * Add path option for actions/checkout * Delete unnecessary code * Use bash instead of sh * Get the latest changes from the branch * Manage branch name with environment variable * Use '&&' to ensure each step runs successfully * Write branch name directly * Fetch all branches from remote repository * Update reload.sh to delete duplicate code and clarify roles * Remove git reset and leave only git pull * Reflect the changes so far in deployment-development.yml * Delete the file for testing using Github Hosted Runner * Delete code for checking github workspace path * Reflect the changes so far in deployment-production-1.yml * Reflect the changes so far in deployment-production-2.yml * Reflect the changes so far in deployment-production.yml --- .github/workflows/deploy-development.yml | 14 ++++--- .github/workflows/deploy-production-1.yml | 44 +++++++++++++--------- .github/workflows/deploy-production-2.yml | 44 +++++++++++++--------- .github/workflows/deploy-production.yml | 45 ++++++++++++++--------- script/reload.sh | 8 ---- 5 files changed, 91 insertions(+), 64 deletions(-) diff --git a/.github/workflows/deploy-development.yml b/.github/workflows/deploy-development.yml index ea2b3d28..f58cd28b 100644 --- a/.github/workflows/deploy-development.yml +++ b/.github/workflows/deploy-development.yml @@ -30,13 +30,17 @@ jobs: key: ${{ secrets.SSH_PRIVATE_KEY }} port: 22 script: | - cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json - cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env - cd ${{ env.PROJECT_PATH }} - bash script/prebuild.sh - sh script/reload.sh + cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json && + cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env && + cd ${{ env.PROJECT_PATH }} && + git fetch --all && + git checkout ${{ env.BRANCH_NAME }} && + git pull origin ${{ env.BRANCH_NAME }} && + bash script/prebuild.sh && + bash script/reload.sh env: + BRANCH_NAME: dev NODE_ENV: development SERVER_PROFILE: development PROJECT_PATH: ~/actions-runner/_work/A.fume.Server/A.fume.Server/development diff --git a/.github/workflows/deploy-production-1.yml b/.github/workflows/deploy-production-1.yml index f4401222..12d42c29 100644 --- a/.github/workflows/deploy-production-1.yml +++ b/.github/workflows/deploy-production-1.yml @@ -1,6 +1,3 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - name: Deploy production-1 server to ec2 on: @@ -10,28 +7,41 @@ on: - production-1 jobs: - build: - runs-on: self-hosted + deploy: + runs-on: ubuntu-latest + strategy: matrix: node-version: [16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - defaults: - run: - working-directory: ${{ env.SERVER_PROFILE }} + steps: - - uses: actions/checkout@v2 - with: - path: ${{ env.SERVER_PROFILE }} + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - run: cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json - - run: cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env - - run: bash ${{ env.PROJECT_PATH }}/script/prebuild.sh - - run: sh ${{ env.PROJECT_PATH }}/script/reload.sh + + - name: Deploy to EC2 using SSH + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + script: | + cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json && + cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env && + cd ${{ env.PROJECT_PATH }} && + git fetch --all && + git checkout ${{ env.BRANCH_NAME }} && + git pull origin ${{ env.BRANCH_NAME }} && + bash script/prebuild.sh && + bash script/reload.sh + env: + BRANCH_NAME: production-1 NODE_ENV: production SERVER_PROFILE: production-1 PROJECT_PATH: ~/actions-runner/_work/A.fume.Server/A.fume.Server/production-1 diff --git a/.github/workflows/deploy-production-2.yml b/.github/workflows/deploy-production-2.yml index e442ca15..a59a5854 100644 --- a/.github/workflows/deploy-production-2.yml +++ b/.github/workflows/deploy-production-2.yml @@ -1,6 +1,3 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - name: Deploy production-2 server to ec2 on: @@ -10,28 +7,41 @@ on: - production-2 jobs: - build: - runs-on: self-hosted + deploy: + runs-on: ubuntu-latest + strategy: matrix: node-version: [16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - defaults: - run: - working-directory: ${{ env.SERVER_PROFILE }} + steps: - - uses: actions/checkout@v2 - with: - path: ${{ env.SERVER_PROFILE }} + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - run: cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json - - run: cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env - - run: bash ${{ env.PROJECT_PATH }}/script/prebuild.sh - - run: sh ${{ env.PROJECT_PATH }}/script/reload.sh + + - name: Deploy to EC2 using SSH + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + script: | + cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json && + cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env && + cd ${{ env.PROJECT_PATH }} && + git fetch --all && + git checkout ${{ env.BRANCH_NAME }} && + git pull origin ${{ env.BRANCH_NAME }} && + bash script/prebuild.sh && + bash script/reload.sh + env: + BRANCH_NAME: production-2 NODE_ENV: production SERVER_PROFILE: production-2 PROJECT_PATH: ~/actions-runner/_work/A.fume.Server/A.fume.Server/production-2 diff --git a/.github/workflows/deploy-production.yml b/.github/workflows/deploy-production.yml index f330e40e..82397e0b 100644 --- a/.github/workflows/deploy-production.yml +++ b/.github/workflows/deploy-production.yml @@ -1,36 +1,47 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - name: Deploy production server to ec2 on: + workflow_dispatch: push: branches: - main jobs: - build: - runs-on: self-hosted + deploy: + runs-on: ubuntu-latest + strategy: matrix: node-version: [16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - defaults: - run: - working-directory: ${{ env.SERVER_PROFILE }} + steps: - - uses: actions/checkout@v2 - with: - path: ${{ env.SERVER_PROFILE }} + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - run: cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json - - run: cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env - - run: bash ${{ env.PROJECT_PATH }}/script/prebuild.sh - - run: sh ${{ env.PROJECT_PATH }}/script/reload.sh + + - name: Deploy to EC2 using SSH + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + script: | + cp ~/config-injection/ecosystem-${{ env.SERVER_PROFILE }}.json ${{ env.PROJECT_PATH }}/ecosystem.json && + cp ~/config-injection/envs/.env.${{ env.NODE_ENV }} ${{ env.PROJECT_PATH }}/.env && + cd ${{ env.PROJECT_PATH }} && + git fetch --all && + git checkout ${{ env.BRANCH_NAME }} && + git pull origin ${{ env.BRANCH_NAME }} && + bash script/prebuild.sh && + bash script/reload.sh + env: + BRANCH_NAME: main NODE_ENV: production SERVER_PROFILE: production PROJECT_PATH: ~/actions-runner/_work/A.fume.Server/A.fume.Server/production diff --git a/script/reload.sh b/script/reload.sh index 1db728da..beb6b5b3 100755 --- a/script/reload.sh +++ b/script/reload.sh @@ -3,14 +3,6 @@ # 에러 핸들링 추가 set -e -# ecosystem.json 파일이 존재하면 pm2로 실행 중인 프로세스를 중지 -if [[ -f "ecosystem.json" ]]; then - pm2 stop ecosystem.json || true -fi - -# npm run build 명령어로 프로젝트 빌드 -npm run build || exit 1 - # ecosystem.json 사용하여 pm2로 프로세스 재시작 if [[ -f "ecosystem.json" ]]; then pm2 restart ecosystem.json || exit 1