diff --git a/src/entity/User.js b/README.md similarity index 100% rename from src/entity/User.js rename to README.md diff --git a/package-lock.json b/package-lock.json index 1aeb359..b472d62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,13 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@types/express": "^4.17.17", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.1.3", "express": "^4.18.2", "helmet": "^7.0.0", + "passport": "^0.6.0", "pg": "^8.11.1", "typeorm": "^0.3.17" }, @@ -25,7 +27,8 @@ "husky": "^8.0.1", "jest": "^28.1.2", "lint-staged": "^13.0.3", - "prettier": "^2.7.1" + "prettier": "^2.7.1", + "typescript": "^5.1.6" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -609,6 +612,30 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1154,7 +1181,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -1172,7 +1199,7 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", @@ -1274,6 +1301,34 @@ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "optional": true, + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -1315,6 +1370,45 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -1324,6 +1418,11 @@ "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -1360,11 +1459,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, "node_modules/@types/node": { "version": "20.3.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true + "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -1372,12 +1475,41 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "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==" + }, + "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==" + }, "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1632,7 +1764,7 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true, + "devOptional": true, "peer": true, "bin": { "acorn": "bin/acorn" @@ -1651,6 +1783,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1756,6 +1898,13 @@ "node": ">= 6.0.0" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true, + "peer": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2543,6 +2692,13 @@ "node": ">= 0.10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "optional": true, + "peer": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2808,6 +2964,16 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -5679,6 +5845,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true, + "peer": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -6134,6 +6307,31 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6181,6 +6379,11 @@ "node": ">=8" } }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/pg": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", @@ -7332,6 +7535,50 @@ "node": ">=0.6" } }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7598,8 +7845,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "peer": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7696,6 +7942,13 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "optional": true, + "peer": true + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -7920,6 +8173,16 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -8371,6 +8634,29 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "optional": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "optional": true, + "peer": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -8797,7 +9083,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "devOptional": true }, "@jridgewell/set-array": { "version": "1.1.2", @@ -8809,7 +9095,7 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "devOptional": true }, "@jridgewell/trace-mapping": { "version": "0.3.18", @@ -8898,6 +9184,34 @@ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "optional": true, + "peer": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "optional": true, + "peer": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "optional": true, + "peer": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "optional": true, + "peer": true + }, "@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -8939,6 +9253,45 @@ "@babel/types": "^7.20.7" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -8948,6 +9301,11 @@ "@types/node": "*" } }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -8984,11 +9342,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, "@types/node": { "version": "20.3.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true + "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==" }, "@types/prettier": { "version": "2.7.3", @@ -8996,12 +9358,41 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "@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==" + }, + "@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==" + }, "@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -9181,7 +9572,7 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true, + "devOptional": true, "peer": true }, "acorn-jsx": { @@ -9192,6 +9583,13 @@ "peer": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "optional": true, + "peer": true + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -9265,6 +9663,13 @@ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true, + "peer": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -9824,6 +10229,13 @@ "vary": "^1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "optional": true, + "peer": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -9991,6 +10403,13 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true, + "peer": true + }, "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -12086,6 +12505,13 @@ "semver": "^6.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true, + "peer": true + }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -12417,6 +12843,21 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12452,6 +12893,11 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "pg": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", @@ -13264,6 +13710,28 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "optional": true, + "peer": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -13414,8 +13882,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "peer": true + "devOptional": true }, "unbox-primitive": { "version": "1.0.2", @@ -13470,6 +13937,13 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "optional": true, + "peer": true + }, "v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -13641,6 +14115,13 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": true, + "peer": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 4f6b878..adc77a0 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,19 @@ "description": "", "main": "index.js", "scripts": { - "start": "node ./src/index.js", + "start": "ts-node ./src/index.ts", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { + "@types/express": "^4.17.17", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.1.3", "express": "^4.18.2", "helmet": "^7.0.0", + "passport": "^0.6.0", "pg": "^8.11.1", "typeorm": "^0.3.17" }, @@ -26,7 +28,7 @@ "husky": "^8.0.1", "jest": "^28.1.2", "lint-staged": "^13.0.3", - "prettier": "^2.7.1" - }, - "type": "module" + "prettier": "^2.7.1", + "typescript": "^5.1.6" + } } diff --git a/src/config/dataSource.js b/src/config/dataSource.js deleted file mode 100644 index fa85c76..0000000 --- a/src/config/dataSource.js +++ /dev/null @@ -1,23 +0,0 @@ -import typeorm from 'typeorm'; -import dotenv from 'dotenv'; -import {fileURLToPath} from 'url'; -import {dirname} from 'path'; - -dotenv.config(); - -const fileURL = import.meta.url; -const filePath = fileURLToPath(fileURL); -const dirPath = dirname(filePath); - -const dataSource = new typeorm.DataSource({ - type: 'postgres', - host: process.env.DB_HOST || 'localhost', - port: Number(process.env.DB_PORT) || 5432, - username: process.env.DB_USER || 'postgres', - password: process.env.DB_PASSWORD || 'postgres', - database: process.env.DB_NAME || 'naromaro', - synchronize: true, - entities: [dirPath + '/../entity/Post.js', dirPath + '/../entity/User.js'], -}); - -export default dataSource; diff --git a/src/config/dataSource.ts b/src/config/dataSource.ts new file mode 100644 index 0000000..e617043 --- /dev/null +++ b/src/config/dataSource.ts @@ -0,0 +1,23 @@ +import * as typeorm from 'typeorm'; +import { config } from 'dotenv'; +import { join } from 'path'; + +config(); + +const dataSource = new typeorm.DataSource({ + type: 'postgres', + host: process.env.DB_HOST || 'localhost', + port: Number(process.env.DB_PORT) || 5432, + username: process.env.DB_USER || 'postgres', + password: process.env.DB_PASSWORD || 'postgres', + database: process.env.DB_NAME || 'naromaro', + synchronize: true, + entities: [ + join(__dirname, '/../entity/Post.ts'), + join(__dirname, '/../entity/category.ts'), + + join(__dirname, '/../entity/user.ts'), + ], +}); + +export default dataSource; diff --git a/src/controller/category.ts b/src/controller/category.ts new file mode 100644 index 0000000..650369b --- /dev/null +++ b/src/controller/category.ts @@ -0,0 +1,42 @@ +import * as categoryService from '../service/categoryService'; +import { Request, Response } from 'express'; +export const getCategory = async (req: Request, res: Response, next) => { + try { + const categoryList = await categoryService.getCategory(req); + res.status(200).json(categoryList); + } catch (err) { + next(err); + } +}; +export const pickCategory = async (req:Request, res:Response, next) => { + try { + const categoryList = await categoryService.pickCategory(); + res.status(200).json(categoryList); + } catch (err) { + next(err); + } +}; +export const deleteCategory = async (req:Request, res:Response, next) => { + try { + const categoryList = await categoryService.deleteCategory(req); + res.status(200).json(categoryList); + } catch (err) { + next(err); + } +}; +export const createCategory = async (req:Request, res:Response, next) => { + try { + const postList = await categoryService.createCategory(req); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; +export const updateCategory = async (req:Request, res:Response, next) => { + try { + const postList = await categoryService.updateCategory(req); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; diff --git a/src/controller/post.js b/src/controller/post.js deleted file mode 100644 index 62a0c5b..0000000 --- a/src/controller/post.js +++ /dev/null @@ -1,10 +0,0 @@ -import * as postService from '../service/postService.js'; - -export const getPostList = async (req, res, next) => { - try { - const postList = await postService.getPostList(); - res.status(200).json(postList); - } catch (err) { - next(err); - } -}; diff --git a/src/controller/post.ts b/src/controller/post.ts new file mode 100644 index 0000000..e6927f2 --- /dev/null +++ b/src/controller/post.ts @@ -0,0 +1,46 @@ +import * as postService from '../service/postService'; +import { Request, Response } from 'express'; +export const getPostList = async (req: any, res: Response, next) => { + try { + if (!req.user) { + throw Error('unathorizted'); + }//로그인 한 유저인지 확인작업 + console.log(req.user); + const postList = await postService.getPostList(req, req.body.categoryName); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; +export const pickPost = async (req: Request, res: Response, next) => { + try { + const postList = await postService.pickPost(); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; +export const deletePost = async (req: Request, res: Response, next) => { + try { + const postList = await postService.deletePost(req); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; +export const createPost = async (req: Request, res: Response, next) => { + try { + const postList = await postService.createPost(req, req.body.categoryName); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; +export const updatePost = async (req: Request, res: Response, next) => { + try { + const postList = await postService.updatePost(req); + res.status(200).json(postList); + } catch (err) { + next(err); + } +}; diff --git a/src/controller/user.ts b/src/controller/user.ts new file mode 100644 index 0000000..f480303 --- /dev/null +++ b/src/controller/user.ts @@ -0,0 +1,27 @@ +import { NextFunction, Request, Response } from 'express'; +import * as userService from '../service/userService'; + +export const register = async (req: any, res: Response, next: NextFunction) => { + try { + if (req.user) throw Error('already login'); + const { username, password } = req.body; + await userService.register(username, password); + res.sendStatus(201); + } catch (err) { + res.status(400).json({ message: err.message }); + } +}; + +export const login = async (req: any, res: Response, next: NextFunction) => { + try { + if (req.user) throw Error('already login'); + const { username, password } = req.body; + const id = await userService.validateUser(username, password); + + const accessToken = id.toString() + 'access'; + + res.json({ accessToken: accessToken }); + } catch (err) { + res.status(400).json({ message: err.message }); + } +}; diff --git a/src/entity/Post.js b/src/entity/Post.js deleted file mode 100644 index 687e1af..0000000 --- a/src/entity/Post.js +++ /dev/null @@ -1,24 +0,0 @@ -import {EntitySchema} from 'typeorm'; - -const postSchema = new EntitySchema({ - name: 'post', - tableName: 'post', - columns: { - id: { - type: 'int', - primary: true, - generated: true, - }, - name: { - type: 'varchar', - length: 255, - }, - author: { - type: 'varchar', - length: 255, - nullable: true, - }, - }, -}); - -export default postSchema; diff --git a/src/entity/Post.ts b/src/entity/Post.ts new file mode 100644 index 0000000..04930a7 --- /dev/null +++ b/src/entity/Post.ts @@ -0,0 +1,55 @@ +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; +import { Category } from './category'; +@Entity() +export class Post { + @PrimaryGeneratedColumn() + id: number; + + @Column() + name: string; + @Column() + author: string; + @Column() + write: string; + @Column() + when: Date; + @Column() + isPicked: boolean; + @ManyToOne(() => Category, (category) => category.posts) + category: Category; +} + +/*const postSchema = new EntitySchema({ + name: 'post', + tableName: 'post', + columns: { + id: { + type: 'int', + primary: true, + generated: true, + }, + name: { + type: 'varchar', + length: 255, + }, + author: { + type: 'varchar', + length: 255, + nullable: true, + }, + write:{ + type:'varchar', + length: 255, + },//db 저장 데이터추가 + when:{ + type:'date', + }, + isPicked:{ + type:'boolean', + } + + }, +}); + +export default postSchema; +*/ diff --git a/src/entity/category.ts b/src/entity/category.ts new file mode 100644 index 0000000..eb27151 --- /dev/null +++ b/src/entity/category.ts @@ -0,0 +1,32 @@ +import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from 'typeorm'; +import { Post } from './Post'; + +@Entity() +export class Category { + @PrimaryGeneratedColumn() + id: number; + + @Column() + color: string; + + @OneToMany(()=> Post, (post) => post.category) + posts: Post[]; +} +/* +const postSchema = new EntitySchema({ + name: 'post', + tableName: 'post', + columns: { + id: { + type: 'int', + primary: true, + generated: true, + }, + color:{ + type:'text' + } + +},}); + +export default postSchema; +*/ \ No newline at end of file diff --git a/src/entity/user.ts b/src/entity/user.ts new file mode 100644 index 0000000..2b3fc80 --- /dev/null +++ b/src/entity/user.ts @@ -0,0 +1,47 @@ +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; +import { Category } from './category'; +@Entity() +export class User { + @PrimaryGeneratedColumn() + id: number; + + @Column() + username: string; + @Column() + password: string; +} + +/*const postSchema = new EntitySchema({ + name: 'post', + tableName: 'post', + columns: { + id: { + type: 'int', + primary: true, + generated: true, + }, + name: { + type: 'varchar', + length: 255, + }, + author: { + type: 'varchar', + length: 255, + nullable: true, + }, + write:{ + type:'varchar', + length: 255, + },//db 저장 데이터추가 + when:{ + type:'date', + }, + isPicked:{ + type:'boolean', + } + + }, +}); + +export default postSchema; +*/ diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 8da1d06..0000000 --- a/src/index.js +++ /dev/null @@ -1,55 +0,0 @@ -import express from 'express'; -import helmet from 'helmet'; -import http from 'http'; - -import dataSource from './config/dataSource.js'; -import router from './router/index.js'; -import errorHandler from './middlewares/errorHandler.js'; - -const connectDB = async () => { - try { - await dataSource.initialize(); - console.log('DB connected!'); - } catch (err) { - console.error(err); - } -}; - -const loadExpressApp = async () => { - await connectDB(); - const app = express(); - - app.use(helmet()); - app.use(express.json()); - app.enable('trust proxy'); - - app.use(router); - app.use(errorHandler); - app.all('*', (_, res) => { - res.status(404).json({ - data: null, - error: { - message: 'URL Not Found', - }, - }); - }); - return app; -}; - -const createServer = async () => { - const app = await loadExpressApp(); - const server = http.createServer(app); - const port = process.env.PORT || 8080; - - server.listen(port, () => { - console.log(`Server is running on port ${port}`); - }); -}; - -createServer() - .then(() => { - console.log('Server started!'); - }) - .catch((err) => { - console.error(err); - }); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..b6f77e6 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,57 @@ +import express from 'express'; +import helmet from 'helmet'; +import http from 'http'; + +import dataSource from './config/dataSource'; +import router from './router/index'; +import errorHandler from './middlewares/errorHandler'; +import { authChecker } from './middlewares/auth'; + +const connectDB = async () => { + try { + await dataSource.initialize(); + console.log('DB connected!'); + } catch (err) { + console.error(err); + } +}; +const a = 1; +const loadExpressApp = async () => { + await connectDB(); + const app = express(); + + app.use(helmet()); + app.use(express.json()); + app.enable('trust proxy'); + + app.use(authChecker); + app.use(router); + app.use(errorHandler); + app.all('*', (_, res) => { + res.status(404).json({ + data: null, + error: { + message: 'URL Not Found', + }, + }); + }); + return app; +}; + +const createServer = async () => { + const app = await loadExpressApp(); + const server = http.createServer(app); + const port = process.env.PORT || 8080; + + server.listen(port, () => { + console.log(`Server is running on port ${port}`); + }); +}; + +createServer() + .then(() => { + console.log('Server started!'); + }) + .catch((err) => { + console.error(err); + }); diff --git a/src/middlewares/auth.ts b/src/middlewares/auth.ts new file mode 100644 index 0000000..dde5d29 --- /dev/null +++ b/src/middlewares/auth.ts @@ -0,0 +1,16 @@ +import { NextFunction, Request, Response } from 'express'; + +export const authChecker = async ( + req: any, + res: Response, + next: NextFunction +) => { + const token = req.headers.authorization; + + if (token) { + const userId = token.substring(0, 1); + + req.user = userId; + } + next(); +}; diff --git a/src/middlewares/errorHandler.js b/src/middlewares/errorHandler.ts similarity index 100% rename from src/middlewares/errorHandler.js rename to src/middlewares/errorHandler.ts diff --git a/src/router/category.ts b/src/router/category.ts new file mode 100644 index 0000000..57585b3 --- /dev/null +++ b/src/router/category.ts @@ -0,0 +1,11 @@ +import * as express from 'express'; +import * as postController from '../controller/category'; + +const router = express.Router(); + +router.get('/', postController.getCategory); +router.get('/Pick', postController.pickCategory); +router.get('/delete/:id', postController.deleteCategory); +router.post('/create', postController.createCategory); +router.get('/update/:id', postController.updateCategory); +export default router; \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js deleted file mode 100644 index 904b8f7..0000000 --- a/src/router/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import express from 'express'; - -import postRouter from './post.js'; - -const router = express.Router(); - -router.use('/post', postRouter); - -router.get('/', (req, res) => { - res.send('Hello World!'); -}); - -export default router; diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..e738964 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,16 @@ +import * as express from 'express'; + +import postRouter from './post'; +import categoryRouter from './category'; +import userRouter from './user'; + +const router = express.Router(); + +router.use('/post', postRouter); +router.use('/category', categoryRouter); +router.use('/user', userRouter); +router.get('/', (req, res) => { + res.send('Hello World!'); +}); + +export default router; diff --git a/src/router/post.js b/src/router/post.js deleted file mode 100644 index 2c4ba5d..0000000 --- a/src/router/post.js +++ /dev/null @@ -1,8 +0,0 @@ -import express from 'express'; -import * as postController from '../controller/post.js'; - -const router = express.Router(); - -router.get('/', postController.getPostList); - -export default router; diff --git a/src/router/post.ts b/src/router/post.ts new file mode 100644 index 0000000..a360479 --- /dev/null +++ b/src/router/post.ts @@ -0,0 +1,11 @@ +import * as express from 'express'; +import * as postController from '../controller/post'; + +const router = express.Router(); + +router.get('/', postController.getPostList); +router.get('/Pick', postController.pickPost); +router.get('/delete/:id', postController.deletePost); +router.post('/create', postController.createPost); +router.post('/update/:id', postController.updatePost); +export default router; diff --git a/src/router/user.ts b/src/router/user.ts new file mode 100644 index 0000000..ca7a53b --- /dev/null +++ b/src/router/user.ts @@ -0,0 +1,9 @@ +import * as express from 'express'; +import * as userController from '../controller/user' + +const router = express.Router(); + +router.post('/register', userController.register) +router.post('/login', userController.login); + +export default router; \ No newline at end of file diff --git a/src/service/categoryService.ts b/src/service/categoryService.ts new file mode 100644 index 0000000..2a002bd --- /dev/null +++ b/src/service/categoryService.ts @@ -0,0 +1,63 @@ +import { Category } from '../entity/category'; +import dataSource from '../config/dataSource'; + + +const categoryRepository = dataSource.getRepository(Category); +export const getCategory = async (req) => { + try { + const category = await categoryRepository.find({}); + return category; + } catch (err) { + console.error(err); + } +}; +export const pickCategory = async () => { + try { + const category = await categoryRepository.findOne({}); + //await categoryRepository.save(category); + return category; + } catch (err) { + console.error(err); + } +}; +export const deleteCategory = async (req) => { + try { + const category = await categoryRepository.findOne({ where: { id: req.params.id } }); + await categoryRepository.delete(category); + // await categoryRepository.save(category); + return category; + } catch (err) { + console.error(err); + } +}; +export const createCategory = async (req) => { + try { + const category = await categoryRepository.create({ + color: req.body.color + }); + await categoryRepository.save(category); + return category; + } catch (err) { + console.error(err); + } +}; +export const updateCategory = async (req) => { + try { + const category = await categoryRepository.update( + { id: req.params.id }, + { + color: req.body.color + } + ); + return category; + } catch (err) { + console.error(err); + } +}; + +const getPostListByCategory =async (id:number) => { + const category = await categoryRepository.findOne({ + where:{id:id}, relations:['post'] + }) + return category.posts +} \ No newline at end of file diff --git a/src/service/postService.js b/src/service/postService.js deleted file mode 100644 index a77c84a..0000000 --- a/src/service/postService.js +++ /dev/null @@ -1,14 +0,0 @@ -import dataSource from '../config/dataSource.js'; - -const postRepository = dataSource.getRepository('post'); - -const insertPost = async (name) => {}; - -export const getPostList = async () => { - try { - const postList = await postRepository.find(); - return postList; - } catch (err) { - console.error(err); - } -}; \ No newline at end of file diff --git a/src/service/postService.ts b/src/service/postService.ts new file mode 100644 index 0000000..af2038e --- /dev/null +++ b/src/service/postService.ts @@ -0,0 +1,71 @@ +import { Category } from '../entity/category'; +import dataSource from '../config/dataSource'; +import { Post } from '../entity/Post'; + +const postRepository = dataSource.getRepository(Post); +const categoryRepository = dataSource.getRepository(Category); +//조회 +export const getPostList = async (req, categoryName: string) => { + try { + const postList = await postRepository.find({}); + return postList; + } catch (err) { + console.error(err); + } +}; +//뽑기 +export const pickPost = async () => { + try { + const post = await postRepository.findOne({}); + post.isPicked = true; + await postRepository.save(post); + return post; + } catch (err) { + console.error(err); + } +}; +//지워오는거 +export const deletePost = async (req) => { + try { + const post = await postRepository.findOne({ where: { id: req.params.id } }); + await postRepository.delete(post); + } catch (err) { + console.error(err); + } +}; +export const createPost = async (req, categoryName: string) => { + try { + const category = await categoryRepository.findOne({ + where: { color: categoryName }, + }); //왜 찾는함수를 썼는지?? + + const Post = await postRepository.create({ + name: req.body.name, + author: req.body.author, + write: req.body.write, + when: req.body.when, + isPicked: false, + category: category, + }); + await postRepository.save(Post); + return Post; + } catch (err) { + console.error(err); + } +}; +export const updatePost = async (req) => { + try { + const post = await postRepository.update( + { id: req.params.id }, + { + name: req.body.name, + write: req.body.write, + author: req.body.author, + when: req.body.when, + } + ); + return post; + } catch (err) { + console.error(err); + } +}; diff --git a/src/service/userService.ts b/src/service/userService.ts new file mode 100644 index 0000000..8c6af62 --- /dev/null +++ b/src/service/userService.ts @@ -0,0 +1,23 @@ +import dataSource from '../config/dataSource'; +import { User } from '../entity/user'; + +const userRepository = dataSource.getRepository(User); + +export const register = async (username: string, password: string) => { + const user = await userRepository.findOne({ where: { username } }); + if (user) throw new Error('invalid username'); + + const newUser = userRepository.create({ + username, + password, + }); + await userRepository.save(newUser); +}; + +export const validateUser = async (username: string, password: string) => { + const user = await userRepository.findOne({ + where: { username, password }, + }); + if (!user) throw new Error('invalid'); + return user.id; +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..03784db --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "esModuleInterop": true, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } + } + + \ No newline at end of file