From ce59d66c3750544fe9ad2da03be86fe39eb4e76d Mon Sep 17 00:00:00 2001 From: JYE Date: Wed, 17 Jan 2024 15:29:33 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=ED=88=AC=EB=93=9C=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A1=B0=EC=98=81=EC=9D=80=20=EB=BC=88=EB=8C=80=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codingTest_jye/.vs/VSWorkspaceState.json | 6 + codingTest_jye/.vs/codingTest_jye/v16/.suo | Bin 0 -> 14336 bytes codingTest_jye/.vs/slnx.sqlite | Bin 0 -> 90112 bytes codingTest_jye/JYECalculator.js | 2 +- codingTest_jye/test.js | 27 + codingTest_jye/todolist/.gitignore | 2 + codingTest_jye/todolist/LICENCE | 1 + codingTest_jye/todolist/app/app.js | 20 + codingTest_jye/todolist/app/bin/www.js | 8 + codingTest_jye/todolist/app/package-lock.json | 1281 +++++++++++++++++ codingTest_jye/todolist/app/package.json | 24 + codingTest_jye/todolist/app/src/config/db.js | 12 + .../todolist/app/src/models/User.js | 48 + .../todolist/app/src/models/UserStorage.js | 70 + .../app/src/public/css/home/login.css | 15 + .../todolist/app/src/public/js/home/todo.js | 190 +++ .../todolist/app/src/routes/home/home.ctrl.js | 62 + .../todolist/app/src/routes/home/index.js | 21 + .../todolist/app/src/views/home/index.ejs | 20 + 19 files changed, 1808 insertions(+), 1 deletion(-) create mode 100644 codingTest_jye/.vs/VSWorkspaceState.json create mode 100644 codingTest_jye/.vs/codingTest_jye/v16/.suo create mode 100644 codingTest_jye/.vs/slnx.sqlite create mode 100644 codingTest_jye/test.js create mode 100644 codingTest_jye/todolist/.gitignore create mode 100644 codingTest_jye/todolist/LICENCE create mode 100644 codingTest_jye/todolist/app/app.js create mode 100644 codingTest_jye/todolist/app/bin/www.js create mode 100644 codingTest_jye/todolist/app/package-lock.json create mode 100644 codingTest_jye/todolist/app/package.json create mode 100644 codingTest_jye/todolist/app/src/config/db.js create mode 100644 codingTest_jye/todolist/app/src/models/User.js create mode 100644 codingTest_jye/todolist/app/src/models/UserStorage.js create mode 100644 codingTest_jye/todolist/app/src/public/css/home/login.css create mode 100644 codingTest_jye/todolist/app/src/public/js/home/todo.js create mode 100644 codingTest_jye/todolist/app/src/routes/home/home.ctrl.js create mode 100644 codingTest_jye/todolist/app/src/routes/home/index.js create mode 100644 codingTest_jye/todolist/app/src/views/home/index.ejs diff --git a/codingTest_jye/.vs/VSWorkspaceState.json b/codingTest_jye/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..6b61141 --- /dev/null +++ b/codingTest_jye/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/codingTest_jye/.vs/codingTest_jye/v16/.suo b/codingTest_jye/.vs/codingTest_jye/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..4c12cdf3d3ccfd61bc0e8fcc1df5db71c8a7c2c9 GIT binary patch literal 14336 zcmeI3U2{`K7{|9%RD1Kva+IAN|WqB3yr`zv&e7Bq|6Dkz`bCW zHI<2Bi&}tP|2Ek z_!nOCD36d+@GDkHi~fD&uLG0v|1M=iz1~9lU!MWeTZ6Wg{j`^Ug!H4}W8mYU#&8q( z1gPoU2C9zifn-7VXShEYr1h=?ch?B~pZdSCZ+l7q2iH#j>(;-s$YV$U83Z7dM%fVA z0qL!5!vmo7b^|Cq7OtlMPX=YfHaqvbe*}i`c#GzW$>Hq^+>`n}rrN@G{Ey@On>BWE{Fh=$^&b74d{)=Cbv{OJ>@7#$tR^M*gpxGLqAz^v_UMvMrF`mzOW# zdnfV3C+SC)=b{NCgIRjAWQOUL;-gu6E%)k3;Q!_4lG2whS>jwqXjh!(f|f7XC}4)% zPwBxT{g{X9yro{I8rC+ZANt}&<}@k&)07SEUmX4OP}j(e*hpxyOw>#D1^kP)zGMAZXIVSbjz>4nb8vi#+=8X--c)aHFZ9KW;*q5EPf@l%Xl~R@5q+kiR=8u1C(NOs zRPEbN=*uoDrcFx!BxMz^35MZb8c;M7@I1?`*OD|>K6*v|EnU$TMBi6?_Q!t&np2GQ zC4QRg3wFe((L(9K>X2%H{t(T|R|ul?hv>sBeYiq2zQ~A3=i>UYhw%?%(4_niLN_bo zK$O1h!8AR{$7-FctLyFtTw-P>%Cgib?@_zC}%Jl*H zt2_QyjH!52;B%Hn@8yM^CF;ZfNfsBZ9-M^kr1g@OGa>r2CE=RYHoD41v}Lmear7sk zT!3fAC{v{fMKxx~y=?8$U<3RsUJ31A9Q_N{3NM&ZW_HUvHz0rVJ)!@Pqd$xV zaFUQSrx*!YguHpLVjhk`U-G1VgrxefcrnTN`}D`5u1G<#P~P(h#9wvmALL8)m2MWq zcL>e4)kyu2w(j-TS1eEqWh3-XvAyCO%~{<3k7QbYNU|WCB%M@TtbL(p!R_D<@Hy~# zFa^EZMrZtx{=5BM_p3iv9x7wiT5z}G;Z-G9)$Gztf(kHxUznq`eIJXOEPNk2HLbLT{hnk@;nN$688~H&V6GOB8PfVyr z!E(QA6iARAt|k1U&E)y*Bu#4`e*}lowoI^g)|yH_JLRpaQ)u;dG;;vW&Jb736Jg4; z6u~*Hd&;hZig+5W##44b;wpYmYrqVe-jBu~CZ$zUj^9=MqT-Te@+Qd5;H{mfD3VT7 z-{tPZI`mP0z+Mm01GSW)?gBl~3RLlS1`d8|11_e`HO55T{MrWGoWeeTA9Q-kGy*t>{ZbDGRNeR>0Y|nWbxJk+i7*PxI_*Nc#S01L+fA1se@& zhd^Ib#91raKAk$r!oeIIm3?gZ+)g|>PTOOi?p#M8ehHw=A;)QcSI8;~NsgEp;*qL+159)oym$l_U6KnNR z^qT>F_Y(#?03QSiHQVEJ6YWzUU)qXzs>B7)2Q8oOXXWVsdP`67DZh@=YXkcBmB#M5 zozXGoLXqDRIr-8TZ0&k=^K-jkm2|ak-)yrOi3TR);tlN%HV!=|dIF(nvg$L90CNdP7ytkO literal 0 HcmV?d00001 diff --git a/codingTest_jye/.vs/slnx.sqlite b/codingTest_jye/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..5d84df5b466878d76289808c6652da52304cea1d GIT binary patch literal 90112 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 { + console.log(`${PORT}번 포트에서 서버가 가동됐습니다.`); +}); diff --git a/codingTest_jye/todolist/app/package-lock.json b/codingTest_jye/todolist/app/package-lock.json new file mode 100644 index 0000000..9106da5 --- /dev/null +++ b/codingTest_jye/todolist/app/package-lock.json @@ -0,0 +1,1281 @@ +{ + "name": "todolist", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "todolist", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "body-parser": "^1.20.2", + "dotenv": "^16.3.1", + "ejs": "^3.1.9", + "express": "^4.18.2", + "mysql": "^2.18.1", + "nodemon": "^3.0.2" + }, + "bin": { + "tdl": "www.js" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", + "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/codingTest_jye/todolist/app/package.json b/codingTest_jye/todolist/app/package.json new file mode 100644 index 0000000..27232ef --- /dev/null +++ b/codingTest_jye/todolist/app/package.json @@ -0,0 +1,24 @@ +{ + "dependencies": { + "body-parser": "^1.20.2", + "dotenv": "^16.3.1", + "ejs": "^3.1.9", + "express": "^4.18.2", + "mysql": "^2.18.1", + "nodemon": "^3.0.2" + }, + "name": "todolist", + "version": "1.0.0", + "main": "app.js", + "bin": { + "tdl": "www.js" + }, + "scripts": { + "start": "nodemon ./bin/www.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "JYE", + "license": "MIT", + "keywords": [], + "description": "" +} diff --git a/codingTest_jye/todolist/app/src/config/db.js b/codingTest_jye/todolist/app/src/config/db.js new file mode 100644 index 0000000..d80123d --- /dev/null +++ b/codingTest_jye/todolist/app/src/config/db.js @@ -0,0 +1,12 @@ +const mysql = require("mysql"); + +const db = mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PSWORD, + database: process.env.DB_DATABASE, +}); + +db.connect(); + +module.exports = db; diff --git a/codingTest_jye/todolist/app/src/models/User.js b/codingTest_jye/todolist/app/src/models/User.js new file mode 100644 index 0000000..ff06cb1 --- /dev/null +++ b/codingTest_jye/todolist/app/src/models/User.js @@ -0,0 +1,48 @@ +"use strict"; + +const UserStorage = require("./UserStorage"); + +class User { + constructor(body) { + this.body = body; + } + + async getDescription() { + const td = await UserStorage.getDescription(); + // console.log("User.js의 getDescription 동작"); + // console.log(td); + return td; + } + + async appendDescription(data) { + // console.log("User.js의 User class의 appendDescription 실행"); + // console.log(data); + + let key = await UserStorage.appendDescription(data); + //반환값 안줘도 되는데 catch문 때문에 그냥 줌 + + return key; + } + + async deleteDescription(data) { + let key = await UserStorage.deleteDescription(data); + //반환값 안줘도 되는데 catch문 때문에 그냥 줌 + + return key; + } + + async updateDescription(data) { + let key = await UserStorage.updateDescription(data); + //반환값 안줘도 되는데 catch문 때문에 그냥 줌 + + return key; + } + async checkbox(data) { + let key = await UserStorage.checkbox(data); + //반환값 안줘도 되는데 catch문 때문에 그냥 줌 + + return key; + } +} + +module.exports = User; diff --git a/codingTest_jye/todolist/app/src/models/UserStorage.js b/codingTest_jye/todolist/app/src/models/UserStorage.js new file mode 100644 index 0000000..b5e0a7b --- /dev/null +++ b/codingTest_jye/todolist/app/src/models/UserStorage.js @@ -0,0 +1,70 @@ +"use strict"; + +const db = require("../config/db"); + +class UserStorage { + static async getDescription() { + return new Promise((resolve, reject) => { + const query = "SELECT * FROM tdList"; + db.query(query, (err, data) => { + if (err) { + reject(`${err}`); + } else { + // console.log("UserStorage.js의 동작"); + // console.log(data); + resolve(data); + } + }); + }); + } + + static async appendDescription(description) { + return new Promise((resolve, reject) => { + const query = "INSERT INTO tdList(id, description) VALUES(?, ?);"; + // console.log("UserStorage.js의 appendDescription 실행"); + // console.log(description); + + db.query(query, [description.id, description.description], (err) => { + if (err) reject(`${err}`); + else resolve({ success: true }); + }); + }); + } + static async deleteDescription(description) { + return new Promise((resolve, reject) => { + const query = "DELETE FROM tdList WHERE id = ?"; + + db.query(query, [description.id], (err) => { + if (err) reject(`${err}`); + else resolve({ success: true }); + }); + }); + } + static async updateDescription(description) { + return new Promise((resolve, reject) => { + // console.log("UserStorage.js의 updateDescription 실행"); + // console.log(description); + + const query = "UPDATE tdList SET description = ? WHERE id = ?"; + + db.query(query, [description.description, description.id], (err) => { + if (err) reject(`${err}`); + else resolve({ success: true }); + }); + }); + } + static async checkbox(description) { + return new Promise((resolve, reject) => { + // console.log("UserStorage.js의 checkbox실행"); + + const query = "UPDATE tdList SET is_check = ? WHERE id = ?"; + + db.query(query, [description.isCheck, description.id], (err) => { + if (err) reject(`${err}`); + else resolve({ success: true }); + }); + }); + } +} + +module.exports = UserStorage; diff --git a/codingTest_jye/todolist/app/src/public/css/home/login.css b/codingTest_jye/todolist/app/src/public/css/home/login.css new file mode 100644 index 0000000..095f8e3 --- /dev/null +++ b/codingTest_jye/todolist/app/src/public/css/home/login.css @@ -0,0 +1,15 @@ +/* html { + background-color: #ffffff; +} +body { + width: 405px; + height: 154px; + margin: 0 auto; + background-color: #ffffff; + padding: 0 20px 20px 20px; + border: 5px solid black; +} + +#title { + color: #111111; +} */ diff --git a/codingTest_jye/todolist/app/src/public/js/home/todo.js b/codingTest_jye/todolist/app/src/public/js/home/todo.js new file mode 100644 index 0000000..1a43c94 --- /dev/null +++ b/codingTest_jye/todolist/app/src/public/js/home/todo.js @@ -0,0 +1,190 @@ +"use strict"; +//number의 값은 변동적이어야함. +//무슨 뜻이냐면 데이터 베이스에서 최적화(여기서는 이전에 작업했던 번호들을 앞으로 땡겨주는 일을 말함)를 통해 마지막 번호를 받고 +//그 이후부터 number을 시작해주면 됨 +//사용자가 사이트를 나갈때 데이터베이스에 있는 데이터들을 앞쪽으로 땡겨주고 사용자가 들어올 때 이후의 번호부터 시작하면 됨. +let number = 0; +let obj1 = {}; + +fetch("/lists") + .then((response) => response.json()) + .then((result) => { + console.log(result); + const box = document.getElementById("box"); + if (result[0]) { + for (let i = 0; i < result.length; i++) { + let key = result[i].id; + if (result[i].is_check === 1) { + const newP = document.createElement("p"); + newP.innerHTML = ` + ${result[i].description}`; + box.append(newP); + } else { + const newP = document.createElement("p"); + newP.innerHTML = ` + ${result[i].description}`; + box.append(newP); + } + } + return (number = result[result.length - 1].id + 1); + } else return (number = 1); + }); + +function add() { + const input1 = document.getElementById("input").value; + const box = document.getElementById("box"); + const newP = document.createElement("p"); + + if (!input1) { + alert("좋은말로 할때 입력값을 입력하도록."); + return 0; + } + newP.innerHTML = ` + ${input1}`; + box.appendChild(newP); + + const req = { + id: number, + description: input1, + }; + + fetch("/lines", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), + }) + .then((res) => res.json()) + .catch((err) => { + console.error("생성 중 에러 발생"); + }); + + document.getElementById("input").value = ""; + + return number++; +} + +function remove(obj, i) { + const box = document.getElementById("box"); + box.removeChild(obj.parentNode); + + const req = { id: i }; + + fetch("/lines", { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), + }) + .then((res) => res.json()) + .catch((err) => { + console.error("생성 중 에러 발생"); + }); +} + +function fix(i) { + // document.getElementById(`${i}fix`).type = "text"; + // document.getElementById(`${i}fix`).value = string; + // console.log(document.getElementById(`${i}span`)); + + let span = document.getElementById(`${i}span`); + let input = document.createElement("input"); + let fix = document.getElementById(`${i}fix`); + + input.type = "text"; + input.value = span.textContent; + span.parentNode.replaceChild(input, span); + input.id = `${i}input`; + + fix.value = "완료"; + fix.setAttribute("onclick", `fixed(${i})`); + // const newString = ``; + // document.getElementById(`${i}fix`) = newString.innerHTML; +} + +function fixed(i) { + let input = document.getElementById(`${i}input`); + let span = document.createElement("span"); + let fix = document.getElementById(`${i}fix`); + + if (!input.value) { + alert("입력값 입력하라고"); + return 0; + } + + span.textContent = input.value; + span.id = `${i}span`; + + fix.value = "fix"; + fix.setAttribute("onclick", `fix(${i})`); + + input.parentNode.replaceChild(span, input); + + const req = { + description: span.innerText, + id: i, + }; + + fetch("/descriptions", { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), + }) + .then((res) => res.json()) + .catch((err) => { + console.error("생성 중 에러 발생"); + }); + checkbox(i); +} + +function checkbox(i) { + //div로 된놈 불러옴 + const span = document.getElementById(`${i}span`); + const fix = document.getElementById(`${i}fix`); + const checkbox = document.getElementById(`${i}checkbox`); + let check = 0; //이걸로 체크된거 표시 + + console.log(checkbox.checked); + + if (document.getElementById(`${i}input`)) { + return 0; + } else { + if (checkbox.checked === false) { + check = 0; + span.style.textDecoration = ""; + //취소선 제거하기 + span.style.color = ""; + //원래 색갈 복원 + fix.style.display = ""; + //수정버튼 보여주기 + } else if (checkbox.checked === true) { + check = 1; + span.style.textDecoration = "line-through"; + //취소선 긋기 + span.style.color = "#797979"; + //회색으로 바꾸기 + fix.style.display = "none"; + //수정버튼 숨기기 + } + } + const req = { + id: i, + isCheck: check, + }; + + fetch("/checkboxes", { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), + }) + .then((res) => res.json()) + .catch((err) => { + console.error("생성 중 에러 발생"); + }); +} diff --git a/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js b/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js new file mode 100644 index 0000000..2efba3a --- /dev/null +++ b/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js @@ -0,0 +1,62 @@ +"use strict"; +const User = require("../../models/User"); + +const output = { + main: (req, res) => { + res.render("home/index"); + }, +}; + +const process = { + getDescription: async (req, res) => { + const user = new User(req.body); + + const response = await user.getDescription(); + // console.log("home.ctrl.js 의 process.getDescription실행"); + // console.log(response); + + return res.json(response); + }, + + appendDescription: async (req, res) => { + // console.log("home.ctrl.js 실행"); + const user = new User(req.body); + // console.log(user.body); + const response = await user.appendDescription(user.body); + + return res.json(response); + }, + + deleteDescription: async (req, res) => { + // console.log("home.ctrl.js의 deleteDescription 실행"); + const user = new User(req.body); + + // console.log(user.body); + + const response = await user.deleteDescription(user.body); + + return res.json(response); + }, + + updateDescription: async (req, res) => { + // console.log("home.ctrl.js의 updateDescription 실행"); + + const user = new User(req.body); + + const response = await user.updateDescription(user.body); + + return res.json(response); + }, + + checkbox: async (req, res) => { + // console.log("home.ctrl.js의 updateDescription 실행"); + + const user = new User(req.body); + + const response = await user.checkbox(user.body); + + return res.json(response); + }, +}; + +module.exports = { output, process }; diff --git a/codingTest_jye/todolist/app/src/routes/home/index.js b/codingTest_jye/todolist/app/src/routes/home/index.js new file mode 100644 index 0000000..8e19a50 --- /dev/null +++ b/codingTest_jye/todolist/app/src/routes/home/index.js @@ -0,0 +1,21 @@ +"use strict"; +const express = require("express"); +const router = express.Router(); + +const ctrl = require("./home.ctrl"); + +//데이터 조회 GET +router.get("/", ctrl.output.main); +router.get("/lists", ctrl.process.getDescription); + +//데이터 생성 POST +router.post("/lines", ctrl.process.appendDescription); + +//데이터 수정 PATCH +router.patch("/descriptions", ctrl.process.updateDescription); +router.patch("/checkboxes", ctrl.process.checkbox); + +//데이터 삭제 DELETE +router.delete("/lines", ctrl.process.deleteDescription); + +module.exports = router; diff --git a/codingTest_jye/todolist/app/src/views/home/index.ejs b/codingTest_jye/todolist/app/src/views/home/index.ejs new file mode 100644 index 0000000..70a8346 --- /dev/null +++ b/codingTest_jye/todolist/app/src/views/home/index.ejs @@ -0,0 +1,20 @@ + + +
+ + + + + +
+

+ To do List + + + +

+
+ + +
+ From 7d1e2638e6305356498722fb180e668b6edf35d0 Mon Sep 17 00:00:00 2001 From: JYE Date: Fri, 19 Jan 2024 16:51:44 +0900 Subject: [PATCH 2/3] =?UTF-8?q?To=20do=20List=20=EC=A1=B0=EC=98=81?= =?UTF-8?q?=EC=9D=80=20CSS=EB=A7=8C=20=EC=A0=81=EC=9A=A9=20=EC=A1=B0?= =?UTF-8?q?=EA=B8=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todolist/app/src/models/UserStorage.js | 3 + .../app/src/public/css/home/login.css | 15 -- .../todolist/app/src/public/css/home/tdl.css | 194 ++++++++++++++++++ .../todolist/app/src/public/js/home/todo.js | 16 +- .../todolist/app/src/public/resource/add.png | Bin 0 -> 4234 bytes .../app/src/public/resource/complete.png | Bin 0 -> 6488 bytes .../app/src/public/resource/delete.png | Bin 0 -> 10006 bytes .../todolist/app/src/public/resource/fix.png | Bin 0 -> 11816 bytes .../todolist/app/src/views/home/index.ejs | 35 ++-- 9 files changed, 225 insertions(+), 38 deletions(-) delete mode 100644 codingTest_jye/todolist/app/src/public/css/home/login.css create mode 100644 codingTest_jye/todolist/app/src/public/css/home/tdl.css create mode 100644 codingTest_jye/todolist/app/src/public/resource/add.png create mode 100644 codingTest_jye/todolist/app/src/public/resource/complete.png create mode 100644 codingTest_jye/todolist/app/src/public/resource/delete.png create mode 100644 codingTest_jye/todolist/app/src/public/resource/fix.png diff --git a/codingTest_jye/todolist/app/src/models/UserStorage.js b/codingTest_jye/todolist/app/src/models/UserStorage.js index b5e0a7b..6d752df 100644 --- a/codingTest_jye/todolist/app/src/models/UserStorage.js +++ b/codingTest_jye/todolist/app/src/models/UserStorage.js @@ -30,6 +30,7 @@ class UserStorage { }); }); } + static async deleteDescription(description) { return new Promise((resolve, reject) => { const query = "DELETE FROM tdList WHERE id = ?"; @@ -40,6 +41,7 @@ class UserStorage { }); }); } + static async updateDescription(description) { return new Promise((resolve, reject) => { // console.log("UserStorage.js의 updateDescription 실행"); @@ -53,6 +55,7 @@ class UserStorage { }); }); } + static async checkbox(description) { return new Promise((resolve, reject) => { // console.log("UserStorage.js의 checkbox실행"); diff --git a/codingTest_jye/todolist/app/src/public/css/home/login.css b/codingTest_jye/todolist/app/src/public/css/home/login.css deleted file mode 100644 index 095f8e3..0000000 --- a/codingTest_jye/todolist/app/src/public/css/home/login.css +++ /dev/null @@ -1,15 +0,0 @@ -/* html { - background-color: #ffffff; -} -body { - width: 405px; - height: 154px; - margin: 0 auto; - background-color: #ffffff; - padding: 0 20px 20px 20px; - border: 5px solid black; -} - -#title { - color: #111111; -} */ diff --git a/codingTest_jye/todolist/app/src/public/css/home/tdl.css b/codingTest_jye/todolist/app/src/public/css/home/tdl.css new file mode 100644 index 0000000..2250c71 --- /dev/null +++ b/codingTest_jye/todolist/app/src/public/css/home/tdl.css @@ -0,0 +1,194 @@ +/* +색상 정리 +#BDE3F2 +#77CFF2 +#41C0F2 +#0FB2F2 +#0D8BD9 +*/ + +html { + align-items: center; + height: 100%; + width: 100%; + display: flex; +} +body { + width: 405px; + height: 154px; + margin: 0 auto; + background-color: #bde3f2; + padding: 0 20px 20px 20px; +} +legend { + width: 101.26px; + height: 24px; + font: bold; + top: 25px; + left: 22.06px; + padding-inline-start: 22px; + padding-top: 25px; +} + +p:last-child { + margin-bottom: 20px; +} + +div { + width: 405px; + height: auto; + background-color: #77cff2; + border-radius: 20px; + box-shadow: 0px 3px 8px 0px #0000003d; + margin: 0 auto; + padding-bottom: 25px; +} + +#pinput { + left: 23.88px; + height: 30px; + margin-top: 8px; + margin: auto; + width: 360px; + border-bottom: 1px solid #0d8bd9; +} + +p { + display: flex; + /* align-items: center; */ + & > span { + display: flex; + flex-direction: column; + width: 280px; + height: inherit; + max-width: 280px; + overflow: hidden; + /* white-space: nowrap; */ + word-break: break-all; + + /* text-overflow: ellipsis; */ + } +} + +/* 부모 노드인 p가 호버링된다면 자식 노드인 버튼도 같이 호버링 시켜준다. */ +p:hover > .deleteButton { + background-color: #0fb2f2; +} + +p:hover > .fixButton { + background-color: #0fb2f2; +} +p:hover > .fixedButton { + background-color: #0fb2f2; +} + +p > input[type="text"] { + background-color: #bde3f2; + width: 287px; + height: auto; + border: 0px; + padding: 0px; + font-size: 16px; + border-radius: 5px; +} + +p:not(#pinput) { + padding-top: 10px; + padding-bottom: 10px; + border-bottom: 1px solid #0d8bd9; + width: 360px; /* 밑줄 길이 조절 */ + margin: 0 auto; +} + +p:hover:not(#pinput) { + background-color: #0fb2f2; +} + +#input { + outline: none; + background-color: #77cff2; + border-bottom-width: 0px; + border-left-width: 0px; + border-right-width: 0px; + border-top-width: 0px; + width: 337px; + height: 21px; +} + +#title { + color: #111111; +} + +#addButton { + background-image: url(../../resource/add.png); + width: 21px; + height: 21px; + background-color: #77cff2; + background-size: cover; + + border: 0px; +} + +#addButton:hover { + width: 25px; + height: 25px; +} +#addButton:active { + background-color: #0fb2f2; +} + +.fixButton { + background-image: url(../../resource/fix.png); + width: 21px; + height: 21px; + background-size: cover; + background-color: #77cff2; + margin-left: auto; + + border: 0px; +} + +.fixButton:hover { + width: 25px; + height: 25px; +} + +.fixedButton { + background-image: url(../../resource/complete.png); + width: 21px; + height: 21px; + background-size: cover; + background-color: #77cff2; + margin-left: 4px; + + border: 0px; +} + +.fixedButton:hover { + width: 25px; + height: 25px; +} + +.deleteButton { + background-image: url(../../resource/delete.png); + width: 21px; + height: 21px; + background-size: cover; + background-color: #77cff2; + + border: 0px; + margin-left: auto; +} + +.deleteButton:hover { + width: 25px; + height: 25px; +} + +input[type="checkbox"] { + height: 20px; + width: 20px; +} +legend { + font-weight: bold; +} diff --git a/codingTest_jye/todolist/app/src/public/js/home/todo.js b/codingTest_jye/todolist/app/src/public/js/home/todo.js index 1a43c94..1e937f8 100644 --- a/codingTest_jye/todolist/app/src/public/js/home/todo.js +++ b/codingTest_jye/todolist/app/src/public/js/home/todo.js @@ -17,12 +17,12 @@ fetch("/lists") if (result[i].is_check === 1) { const newP = document.createElement("p"); newP.innerHTML = ` - ${result[i].description}`; + ${result[i].description}`; box.append(newP); } else { const newP = document.createElement("p"); newP.innerHTML = ` - ${result[i].description}`; + ${result[i].description}`; box.append(newP); } } @@ -36,11 +36,11 @@ function add() { const newP = document.createElement("p"); if (!input1) { - alert("좋은말로 할때 입력값을 입력하도록."); + alert("값을 입력해주세요"); return 0; } newP.innerHTML = ` - ${input1}`; + ${input1}`; box.appendChild(newP); const req = { @@ -98,8 +98,10 @@ function fix(i) { span.parentNode.replaceChild(input, span); input.id = `${i}input`; - fix.value = "완료"; + fix.setAttribute("class", `fixedButton`); + fix.setAttribute("onclick", `fixed(${i})`); + input.focus(); // const newString = ``; // document.getElementById(`${i}fix`) = newString.innerHTML; } @@ -110,15 +112,15 @@ function fixed(i) { let fix = document.getElementById(`${i}fix`); if (!input.value) { - alert("입력값 입력하라고"); + alert("수정할 값을 입력해주세요"); return 0; } span.textContent = input.value; span.id = `${i}span`; - fix.value = "fix"; fix.setAttribute("onclick", `fix(${i})`); + fix.setAttribute("class", `fixButton`); input.parentNode.replaceChild(span, input); diff --git a/codingTest_jye/todolist/app/src/public/resource/add.png b/codingTest_jye/todolist/app/src/public/resource/add.png new file mode 100644 index 0000000000000000000000000000000000000000..ab281bc2bf19699a558397e14c0f00bc9f0772ec GIT binary patch literal 4234 zcmeHLYfzI{8a@FmSO@U378Dzx?nqg`>&pvGv|EIyff!~ z@4T1iIhVgcAzk0x`X&ItH9YL_F#sIwTL<9shJDdyJ~P=Dr*ntGqg?FcqRYvD+P~MP zgvFc#!0p%72`k&_=4A)Bqr$9zV#;&BZXU^dgQ%>z7rQs{o!CL`X z?;L*kd)Ss`srQVp@)ezSFmL%_;=P8T+098ChCf-pI4Xb z>CPiXKkeOmBJ5J=oCx zq|0ZTVxbA_9%KKZ_`sZz-sU}-9*0jeoIBfEmrHY0!s04Kosz_2;;+ax=hS&jeY;Nb z$X&LiBv8D!aw-VTOR6rGMY}ss~N&1oz57uJK{gnT%_9d}?z9Mj^6{)|QY>31^!krQ&Wqgi zrz`!52H9oca}@w;s6AvI)&k)2SMVBm?T^>t@ISJlDf9lmz*HuJC?%Jm2dX8kxAeHb zY}--K^PtJE*68#vaJ=NRC30Awhe_B=4#{qmz_I**R?-EIZPACO@Y|yjn^5r+2Q>w} z5Z%q97Gm~pbWkcmQ@{xq+%)K)FteTyHEjgbvXiX@<4Rrh-~b_&KCiWs)$8QcEcc%Ig=T_>5y(=XThw}S1Xx#v|eMOCE8Nid6{^OC%K zj@13U2V?WK233^n{w-hJDc?Jcy)a%(oI!d7t8vs-L(9}J-as!KJiVi%39_%6o5AFqWbyB&qCSTzM_78hsA69nZP>xN?k&F6oBdpIU)~_IBq;7k8Q&l$8 zB=ju;K8GuG{FfEtACJ0QEdV;d(A_Ovr+#q1iXH{UiO6#0>S^)xCVq;s!T&{${<|`y z;us|PqnkD7kf0FUv#lUZlqH!`jBZ)3r84=H-ef&EmS7f|HmlFxt{j{^{Ds}({};f zWfD}zQYJt7*%Hhrn#JsG;DGYapZJ?$RA18rG%Om~?g#^(hXDxnfdP=`WakVU?d?A7 zPX(Ml230VSAoSL7;oDibV-UiVoC(4tEW+M8FoF~ z$j&zsA+Dh~76y`{a|2m>XI-fRQ}!yCsE&d{L>>wSCg;rKjlf0pwP1MA?SO@{Fx_n` zWLgbH)b^alxVv)22LxAe`*`;0Xkw6ZjMAzu@ftTWdoFI8yrIAvk8@2=uYL;FCm6rO zvfODG^a>VbQnRlvX9Y>2$j~sv{9FX7{yqAecGl8t&ll0c!j+(vxv65^JUsiC-y9~J z?Ezk;`x%X9(crUx2iI|ZGkDz(<{HScdc`nIs(zns87A&)?veCt%3Uj5!Zfp4N=gjG zGPk>d>3^_;mKU3b;oH)r6b3qbW`=a!e4nm0UsfD?)fQQa;E#IPnzG_B&^q&OcQE}_ zWQ?gte8egkaHMo8>SA+FB<^mpDy**_Q$mDg)z3!OcT5fs{8ox(v*g&gdQ|Y(I4t!0 z0u?rbrjNaFGP=mw+^N7w%CjVXtj|d%nJ#j_Mtn9!=>B_${(i1;m7XXqF&u0JVjOkd zyI#shOE8};xM+UCS`SQS{eSj~m&Yn3$#&V0JKd1&0LZmaoTtF|bGFqk9a2Wug3+JlI}~05-+_~fX}14D z1?`y`kWP5u8||awpFd^`OD|Yq9BcSw@XFHDhy!HD7bNYc1wW2bQTssveyUQzWNa^ zBcs1mu3WH7$(27OU7#b#PS(go6)e-7@W3<@5fXvELt6+X@$vdzeOymcF=T3fCgF#UAi(sC^bas7!2OF9Rdk2RyV)Uo;5Ws#3W$t z{=)x3QJSj|vl81~X7&E8p`jKthHI#vFY;c|_fBux+(2^z+pg|J$jS#ph$c}qryP=$ z)tfXdsa;bCWsUoIK^A9$6dfy333%cTZT}-myXtR5yfz?gQ6c*E`17*By{oSdApBF* K;d_S?zWFy)m!^6E literal 0 HcmV?d00001 diff --git a/codingTest_jye/todolist/app/src/public/resource/complete.png b/codingTest_jye/todolist/app/src/public/resource/complete.png new file mode 100644 index 0000000000000000000000000000000000000000..79fa4f9df59ce42692831de4ef559e4d1c792b17 GIT binary patch literal 6488 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 literal 0 HcmV?d00001 diff --git a/codingTest_jye/todolist/app/src/public/resource/fix.png b/codingTest_jye/todolist/app/src/public/resource/fix.png new file mode 100644 index 0000000000000000000000000000000000000000..32394ef565e35cbf54fb5cdf561b870c3ea1f36b GIT binary patch literal 11816 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 literal 0 HcmV?d00001 diff --git a/codingTest_jye/todolist/app/src/views/home/index.ejs b/codingTest_jye/todolist/app/src/views/home/index.ejs index 70a8346..393020d 100644 --- a/codingTest_jye/todolist/app/src/views/home/index.ejs +++ b/codingTest_jye/todolist/app/src/views/home/index.ejs @@ -1,20 +1,23 @@ -
- - - - - -
-

- To do List - + + + + + + + +

+ To do List +

+ - -

-
- - -
+ +

+ + + From 962037835cce99271f2741dd7cd2b295b3d398b1 Mon Sep 17 00:00:00 2001 From: JYE Date: Tue, 23 Jan 2024 14:09:12 +0900 Subject: [PATCH 3/3] =?UTF-8?q?To=20do=20List=20=EC=A1=B0=EC=98=81?= =?UTF-8?q?=EC=9D=80=20=EC=A1=B0=EA=B8=88=20=EB=8D=94=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codingTest_jye/todolist/app/app.js | 21 ++-- codingTest_jye/todolist/app/bin/www.js | 4 +- codingTest_jye/todolist/app/package-lock.json | 117 ++++++++++++++++++ codingTest_jye/todolist/app/package.json | 5 +- codingTest_jye/todolist/app/src/config/db.js | 7 +- .../todolist/app/src/models/User.js | 8 +- .../todolist/app/src/models/UserStorage.js | 34 +++-- .../todolist/app/src/public/css/home/tdl.css | 11 +- .../todolist/app/src/public/js/home/fetch.js | 23 ++++ .../todolist/app/src/public/js/home/todo.js | 11 +- .../todolist/app/src/routes/home/home.ctrl.js | 83 +++++++------ .../todolist/app/src/routes/home/index.js | 8 +- 12 files changed, 249 insertions(+), 83 deletions(-) create mode 100644 codingTest_jye/todolist/app/src/public/js/home/fetch.js diff --git a/codingTest_jye/todolist/app/app.js b/codingTest_jye/todolist/app/app.js index 1c911fe..450cc87 100644 --- a/codingTest_jye/todolist/app/app.js +++ b/codingTest_jye/todolist/app/app.js @@ -1,12 +1,14 @@ -const express = require("express"); -const bodyParser = require("body-parser"); -const dotenv = require("dotenv"); - -dotenv.config(); +import express from "express"; +import dotenv from "dotenv"; +import home from "./src/routes/home/index.js"; +import { fileURLToPath } from "url"; +import bodyParser from "body-parser"; +import cors from "cors"; +const __dirname = fileURLToPath(new URL(".", import.meta.url)); const app = express(); -const home = require("./src/routes/home"); +dotenv.config(); app.set("views", "./src/views"); app.set("view engine", "ejs"); @@ -14,7 +16,12 @@ app.use(express.static(`${__dirname}/src/public`)); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); +app.use( + cors({ + origin: "*", + }) +); app.use("/", home); -module.exports = app; +export default app; diff --git a/codingTest_jye/todolist/app/bin/www.js b/codingTest_jye/todolist/app/bin/www.js index b404e39..04bc870 100644 --- a/codingTest_jye/todolist/app/bin/www.js +++ b/codingTest_jye/todolist/app/bin/www.js @@ -1,6 +1,6 @@ -"user strict"; +import app from "../app.js"; +("user strict"); -const app = require("../app"); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { diff --git a/codingTest_jye/todolist/app/package-lock.json b/codingTest_jye/todolist/app/package-lock.json index 9106da5..d15f44d 100644 --- a/codingTest_jye/todolist/app/package-lock.json +++ b/codingTest_jye/todolist/app/package-lock.json @@ -10,10 +10,12 @@ "license": "MIT", "dependencies": { "body-parser": "^1.20.2", + "cors": "^2.8.5", "dotenv": "^16.3.1", "ejs": "^3.1.9", "express": "^4.18.2", "mysql": "^2.18.1", + "mysql2": "^3.7.1", "nodemon": "^3.0.2" }, "bin": { @@ -257,6 +259,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -278,6 +292,14 @@ "node": ">= 0.4" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -516,6 +538,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", @@ -686,6 +716,11 @@ "node": ">=0.12.0" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -708,6 +743,11 @@ "node": ">=10" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -805,6 +845,70 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/mysql2": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.7.1.tgz", + "integrity": "sha512-4EEqYu57mnkW5+Bvp5wBebY7PpfyrmvJ3knHcmLkp8FyBu4kqgrF2GxIjsC2tbLNZWqJaL21v/MYH7bU5f03oA==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/mysql2/node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -902,6 +1006,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -1099,6 +1211,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", diff --git a/codingTest_jye/todolist/app/package.json b/codingTest_jye/todolist/app/package.json index 27232ef..fef4d49 100644 --- a/codingTest_jye/todolist/app/package.json +++ b/codingTest_jye/todolist/app/package.json @@ -1,10 +1,12 @@ { "dependencies": { "body-parser": "^1.20.2", + "cors": "^2.8.5", "dotenv": "^16.3.1", "ejs": "^3.1.9", "express": "^4.18.2", "mysql": "^2.18.1", + "mysql2": "^3.7.1", "nodemon": "^3.0.2" }, "name": "todolist", @@ -20,5 +22,6 @@ "author": "JYE", "license": "MIT", "keywords": [], - "description": "" + "description": "", + "type": "module" } diff --git a/codingTest_jye/todolist/app/src/config/db.js b/codingTest_jye/todolist/app/src/config/db.js index d80123d..0df7301 100644 --- a/codingTest_jye/todolist/app/src/config/db.js +++ b/codingTest_jye/todolist/app/src/config/db.js @@ -1,4 +1,7 @@ -const mysql = require("mysql"); +import mysql from "mysql2"; +import dotenv from "dotenv"; + +dotenv.config(); const db = mysql.createConnection({ host: process.env.DB_HOST, @@ -9,4 +12,4 @@ const db = mysql.createConnection({ db.connect(); -module.exports = db; +export default db; diff --git a/codingTest_jye/todolist/app/src/models/User.js b/codingTest_jye/todolist/app/src/models/User.js index ff06cb1..f75f7e8 100644 --- a/codingTest_jye/todolist/app/src/models/User.js +++ b/codingTest_jye/todolist/app/src/models/User.js @@ -1,8 +1,8 @@ "use strict"; -const UserStorage = require("./UserStorage"); +import UserStorage from "./UserStorage.js"; -class User { +export default class User { constructor(body) { this.body = body; } @@ -34,9 +34,11 @@ class User { async updateDescription(data) { let key = await UserStorage.updateDescription(data); //반환값 안줘도 되는데 catch문 때문에 그냥 줌 + console.log(data); return key; } + async checkbox(data) { let key = await UserStorage.checkbox(data); //반환값 안줘도 되는데 catch문 때문에 그냥 줌 @@ -44,5 +46,3 @@ class User { return key; } } - -module.exports = User; diff --git a/codingTest_jye/todolist/app/src/models/UserStorage.js b/codingTest_jye/todolist/app/src/models/UserStorage.js index 6d752df..dabbd50 100644 --- a/codingTest_jye/todolist/app/src/models/UserStorage.js +++ b/codingTest_jye/todolist/app/src/models/UserStorage.js @@ -1,19 +1,17 @@ "use strict"; +import db from "../config/db.js"; -const db = require("../config/db"); - -class UserStorage { - static async getDescription() { +export default class UserStorage { + async getDescription() { return new Promise((resolve, reject) => { const query = "SELECT * FROM tdList"; db.query(query, (err, data) => { if (err) { - reject(`${err}`); - } else { - // console.log("UserStorage.js의 동작"); - // console.log(data); - resolve(data); + reject(err); } + // console.log("UserStorage.js의 동작"); + // console.log(data); + resolve(data); }); }); } @@ -25,8 +23,8 @@ class UserStorage { // console.log(description); db.query(query, [description.id, description.description], (err) => { - if (err) reject(`${err}`); - else resolve({ success: true }); + if (err) reject(err); + resolve({ success: true }); }); }); } @@ -36,8 +34,8 @@ class UserStorage { const query = "DELETE FROM tdList WHERE id = ?"; db.query(query, [description.id], (err) => { - if (err) reject(`${err}`); - else resolve({ success: true }); + if (err) reject(err); + resolve({ success: true }); }); }); } @@ -50,8 +48,8 @@ class UserStorage { const query = "UPDATE tdList SET description = ? WHERE id = ?"; db.query(query, [description.description, description.id], (err) => { - if (err) reject(`${err}`); - else resolve({ success: true }); + if (err) reject(err); + resolve({ success: true }); }); }); } @@ -63,11 +61,9 @@ class UserStorage { const query = "UPDATE tdList SET is_check = ? WHERE id = ?"; db.query(query, [description.isCheck, description.id], (err) => { - if (err) reject(`${err}`); - else resolve({ success: true }); + if (err) reject(err); + resolve({ success: true }); }); }); } } - -module.exports = UserStorage; diff --git a/codingTest_jye/todolist/app/src/public/css/home/tdl.css b/codingTest_jye/todolist/app/src/public/css/home/tdl.css index 2250c71..4c04da0 100644 --- a/codingTest_jye/todolist/app/src/public/css/home/tdl.css +++ b/codingTest_jye/todolist/app/src/public/css/home/tdl.css @@ -84,7 +84,7 @@ p:hover > .fixedButton { p > input[type="text"] { background-color: #bde3f2; - width: 287px; + width: 280px; height: auto; border: 0px; padding: 0px; @@ -132,6 +132,7 @@ p:hover:not(#pinput) { #addButton:hover { width: 25px; height: 25px; + cursor: pointer; } #addButton:active { background-color: #0fb2f2; @@ -151,6 +152,7 @@ p:hover:not(#pinput) { .fixButton:hover { width: 25px; height: 25px; + cursor: pointer; } .fixedButton { @@ -167,6 +169,7 @@ p:hover:not(#pinput) { .fixedButton:hover { width: 25px; height: 25px; + cursor: pointer; } .deleteButton { @@ -178,6 +181,7 @@ p:hover:not(#pinput) { border: 0px; margin-left: auto; + cursor: pointer; } .deleteButton:hover { @@ -189,6 +193,11 @@ input[type="checkbox"] { height: 20px; width: 20px; } + +input[type="checkbox"]:hover { + cursor: pointer; +} + legend { font-weight: bold; } diff --git a/codingTest_jye/todolist/app/src/public/js/home/fetch.js b/codingTest_jye/todolist/app/src/public/js/home/fetch.js new file mode 100644 index 0000000..8b8ae6f --- /dev/null +++ b/codingTest_jye/todolist/app/src/public/js/home/fetch.js @@ -0,0 +1,23 @@ +// // //todo.js 의 fetch를 따로 분류하는 시도를 했던 곳.. + +// function addFetch(req) { +// fetch("/lines", { +// method: "POST", +// headers: { +// "Content-Type": "application/json", +// }, +// body: JSON.stringify(req), +// }) +// .then((res) => res.json()) +// .catch((err) => { +// console.error("생성 중 에러 발생"); +// }); + +// return number++; +// } +// function removeFetch() {} +// function fixFetch() {} +// function fixedFetch() {} +// function checkboxFetch() {} + +// export { addFetch, removeFetch, fixFetch, fixedFetch, checkboxFetch }; diff --git a/codingTest_jye/todolist/app/src/public/js/home/todo.js b/codingTest_jye/todolist/app/src/public/js/home/todo.js index 1e937f8..28a0f70 100644 --- a/codingTest_jye/todolist/app/src/public/js/home/todo.js +++ b/codingTest_jye/todolist/app/src/public/js/home/todo.js @@ -1,12 +1,19 @@ "use strict"; +// import { +// addFetch, +// removeFetch, +// fixedFetch, +// fixFetch, +// checkboxFetch, +// } from "./fetch.js"; + //number의 값은 변동적이어야함. //무슨 뜻이냐면 데이터 베이스에서 최적화(여기서는 이전에 작업했던 번호들을 앞으로 땡겨주는 일을 말함)를 통해 마지막 번호를 받고 //그 이후부터 number을 시작해주면 됨 //사용자가 사이트를 나갈때 데이터베이스에 있는 데이터들을 앞쪽으로 땡겨주고 사용자가 들어올 때 이후의 번호부터 시작하면 됨. let number = 0; -let obj1 = {}; -fetch("/lists") +fetch("http://localhost:3000/lists") .then((response) => response.json()) .then((result) => { console.log(result); diff --git a/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js b/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js index 2efba3a..b0ab31b 100644 --- a/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js +++ b/codingTest_jye/todolist/app/src/routes/home/home.ctrl.js @@ -1,62 +1,63 @@ "use strict"; -const User = require("../../models/User"); - -const output = { - main: (req, res) => { - res.render("home/index"); +import UserStorage from "../../models/UserStorage.js"; +import User from "../../models/User.js"; + +export default { + output: { + main: (req, res) => { + res.render("home/index"); + }, }, -}; -const process = { - getDescription: async (req, res) => { - const user = new User(req.body); + process: { + getDescription: async (req, res) => { + const user = new UserStorage(req.body); - const response = await user.getDescription(); - // console.log("home.ctrl.js 의 process.getDescription실행"); - // console.log(response); + const response = await user.getDescription(); + // console.log("home.ctrl.js 의 process.getDescription실행"); + // console.log(response); - return res.json(response); - }, + return res.json(response); + }, - appendDescription: async (req, res) => { - // console.log("home.ctrl.js 실행"); - const user = new User(req.body); - // console.log(user.body); - const response = await user.appendDescription(user.body); + appendDescription: async (req, res) => { + // console.log("home.ctrl.js 실행"); + const user = new User(req.body); + // console.log(user.body); + const response = await user.appendDescription(user.body); - return res.json(response); - }, + return res.status(201).json(response); + }, - deleteDescription: async (req, res) => { - // console.log("home.ctrl.js의 deleteDescription 실행"); - const user = new User(req.body); + deleteDescription: async (req, res) => { + // console.log("home.ctrl.js의 deleteDescription 실행"); + const user = new User(req.body); - // console.log(user.body); + // console.log(user.body); - const response = await user.deleteDescription(user.body); + const response = await user.deleteDescription(user.body); - return res.json(response); - }, + return res.json(response); + }, - updateDescription: async (req, res) => { - // console.log("home.ctrl.js의 updateDescription 실행"); + updateDescription: async (req, res) => { + // console.log("home.ctrl.js의 updateDescription 실행"); - const user = new User(req.body); + const user = new User(req.body); - const response = await user.updateDescription(user.body); + const response = await user.updateDescription(user.body); - return res.json(response); - }, + return res.json(response); + }, - checkbox: async (req, res) => { - // console.log("home.ctrl.js의 updateDescription 실행"); + checkbox: async (req, res) => { + // console.log("home.ctrl.js의 updateDescription 실행"); - const user = new User(req.body); + const user = new User(req.body); - const response = await user.checkbox(user.body); + const response = await user.checkbox(user.body); - return res.json(response); + return res.json(response); + }, }, }; - -module.exports = { output, process }; diff --git a/codingTest_jye/todolist/app/src/routes/home/index.js b/codingTest_jye/todolist/app/src/routes/home/index.js index 8e19a50..7417632 100644 --- a/codingTest_jye/todolist/app/src/routes/home/index.js +++ b/codingTest_jye/todolist/app/src/routes/home/index.js @@ -1,8 +1,8 @@ "use strict"; -const express = require("express"); -const router = express.Router(); +import express from "express"; +import ctrl from "./home.ctrl.js"; -const ctrl = require("./home.ctrl"); +const router = express.Router(); //데이터 조회 GET router.get("/", ctrl.output.main); @@ -18,4 +18,4 @@ router.patch("/checkboxes", ctrl.process.checkbox); //데이터 삭제 DELETE router.delete("/lines", ctrl.process.deleteDescription); -module.exports = router; +export default router;