diff --git a/mitaina-back/package.json b/mitaina-back/package.json index a9f6834..1d5c399 100644 --- a/mitaina-back/package.json +++ b/mitaina-back/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "start": "nodemon index.ts", + "start": "nodemon src/routes/index.ts", "test": "echo \"Error: no test specified\" && exit 1", "build": "tsc" }, @@ -12,6 +12,7 @@ "author": "", "license": "ISC", "devDependencies": { + "@types/bcrypt": "^5.0.0", "@types/express": "^4.17.13", "@types/node": "^18.0.0", "nodemon": "^2.0.18", @@ -21,6 +22,7 @@ }, "dependencies": { "@prisma/client": "^4.0.0", + "bcrypt": "^5.0.1", "express": "^4.18.1" } } diff --git a/mitaina-back/pnpm-lock.yaml b/mitaina-back/pnpm-lock.yaml index fedc3e7..ddced64 100644 --- a/mitaina-back/pnpm-lock.yaml +++ b/mitaina-back/pnpm-lock.yaml @@ -2,8 +2,10 @@ lockfileVersion: 5.4 specifiers: '@prisma/client': ^4.0.0 + '@types/bcrypt': ^5.0.0 '@types/express': ^4.17.13 '@types/node': ^18.0.0 + bcrypt: ^5.0.1 express: ^4.18.1 nodemon: ^2.0.18 prisma: ^3.9.2 @@ -12,9 +14,11 @@ specifiers: dependencies: '@prisma/client': 4.0.0_prisma@3.15.2 + bcrypt: 5.0.1 express: 4.18.1 devDependencies: + '@types/bcrypt': 5.0.0 '@types/express': 4.17.13 '@types/node': 18.0.0 nodemon: 2.0.18 @@ -47,6 +51,24 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@mapbox/node-pre-gyp/1.0.9: + resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.7 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.3.7 + tar: 6.1.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@prisma/client/4.0.0_prisma@3.15.2: resolution: {integrity: sha512-g1h2OGoRo7anBVQ9Cw3gsbjwPtvf7i0pkGxKeZICtwkvE5CZXW+xZF4FZdmrViYkKaAShbISL0teNpu9ecpf4g==} engines: {node: '>=14.17'} @@ -97,6 +119,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/bcrypt/5.0.0: + resolution: {integrity: sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==} + dependencies: + '@types/node': 18.0.0 + dev: true + /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: @@ -164,7 +192,6 @@ packages: /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -185,6 +212,15 @@ packages: hasBin: true dev: true + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /ansi-align/3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -194,7 +230,6 @@ packages: /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -211,6 +246,18 @@ packages: picomatch: 2.3.1 dev: true + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: false + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -221,7 +268,18 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + + /bcrypt/5.0.1: + resolution: {integrity: sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.9 + node-addon-api: 3.2.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -267,7 +325,6 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -329,6 +386,11 @@ packages: fsevents: 2.3.2 dev: true + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + /ci-info/2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true @@ -355,9 +417,13 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true /configstore/5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} @@ -371,6 +437,10 @@ packages: xdg-basedir: 4.0.0 dev: true + /console-control-strings/1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -424,6 +494,18 @@ packages: supports-color: 5.5.0 dev: true + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + /decompress-response/3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} @@ -440,6 +522,10 @@ packages: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: true + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -450,6 +536,11 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false + /detect-libc/2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: false + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -472,7 +563,6 @@ packages: /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} @@ -570,6 +660,17 @@ packages: engines: {node: '>= 0.6'} dev: false + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -582,6 +683,21 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + /get-intrinsic/1.1.2: resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} dependencies: @@ -611,6 +727,17 @@ packages: is-glob: 4.0.3 dev: true + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + /global-dirs/3.0.0: resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} engines: {node: '>=10'} @@ -656,6 +783,10 @@ packages: engines: {node: '>= 0.4'} dev: false + /has-unicode/2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + /has-yarn/2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} engines: {node: '>=8'} @@ -683,6 +814,16 @@ packages: toidentifier: 1.0.1 dev: false + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -704,6 +845,13 @@ packages: engines: {node: '>=0.8.19'} dev: true + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false @@ -744,7 +892,6 @@ packages: /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -821,14 +968,12 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 - dev: true /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -875,16 +1020,40 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - dev: true /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true + /minipass/3.3.4: + resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + yallist: 4.0.0 + dev: false + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -893,6 +1062,22 @@ packages: engines: {node: '>= 0.6'} dev: false + /node-addon-api/3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + dev: false + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /nodemon/2.0.18: resolution: {integrity: sha512-uAvrKipi2zAz8E7nkSz4qW4F4zd5fs2wNGsTx+xXlP8KXqd9ucE0vY9wankOsPboeDyuUGN9vsXGV1pLn80l/A==} engines: {node: '>=8.10.0'} @@ -918,6 +1103,14 @@ packages: abbrev: 1.1.1 dev: true + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -928,6 +1121,20 @@ packages: engines: {node: '>=8'} dev: true + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: false @@ -943,7 +1150,6 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /p-cancelable/1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} @@ -965,6 +1171,11 @@ packages: engines: {node: '>= 0.8'} dev: false + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false @@ -1045,6 +1256,15 @@ packages: strip-json-comments: 2.0.1 dev: true + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1072,6 +1292,13 @@ packages: lowercase-keys: 1.0.1 dev: true + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false @@ -1095,7 +1322,6 @@ packages: /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - dev: true /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} @@ -1103,7 +1329,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /send/0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -1138,6 +1363,10 @@ packages: - supports-color dev: false + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false @@ -1152,7 +1381,6 @@ packages: /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} @@ -1166,14 +1394,18 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -1194,6 +1426,18 @@ packages: has-flag: 4.0.0 dev: true + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.4 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + /to-readable-stream/1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -1218,6 +1462,10 @@ packages: nopt: 1.0.10 dev: true + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /ts-node/10.8.1_qiyc72axg2v44xl4yovan2v55u: resolution: {integrity: sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==} hasBin: true @@ -1317,6 +1565,10 @@ packages: prepend-http: 2.0.0 dev: true + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -1331,6 +1583,23 @@ packages: engines: {node: '>= 0.8'} dev: false + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + /widest-line/3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -1349,7 +1618,6 @@ packages: /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true /write-file-atomic/3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -1367,7 +1635,6 @@ packages: /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/mitaina-back/src/repository/userRepository.ts b/mitaina-back/src/repository/userRepository.ts new file mode 100644 index 0000000..f25a8c5 --- /dev/null +++ b/mitaina-back/src/repository/userRepository.ts @@ -0,0 +1,30 @@ +import { User } from '@prisma/client'; +import prisma from '../lib/prisma'; +import bcrypt from 'bcrypt'; + +type CreateUser = { loginId: string; userName: string; password: string }; + +export class UserRepository { + static async createUser(data: CreateUser): Promise { + const { loginId, userName, password } = data; + console.log({ + loginId, + name: userName, + passwordHash: await bcrypt.hash(password, 10) + }); + return await prisma.user.create({ + data: { + loginId, + name: userName, + passwordHash: await bcrypt.hash(password, 10) + } + }); + } + + static async getIsExistUserFromLoginId(loginId: string): Promise { + const user = await prisma.user.findUnique({ + where: { loginId } + }); + return !!user; + } +} diff --git a/mitaina-back/src/routes/api/api.ts b/mitaina-back/src/routes/api/api.ts new file mode 100644 index 0000000..2a51635 --- /dev/null +++ b/mitaina-back/src/routes/api/api.ts @@ -0,0 +1,11 @@ +import { Router } from 'express'; +import registerRouter from './register'; + +// Export the base-router +const baseRouter = Router(); + +// Setup routers +baseRouter.use('/users', registerRouter); + +// Export default. +export default baseRouter; diff --git a/mitaina-back/src/routes/api/register/index.ts b/mitaina-back/src/routes/api/register/index.ts new file mode 100644 index 0000000..321ff0c --- /dev/null +++ b/mitaina-back/src/routes/api/register/index.ts @@ -0,0 +1,27 @@ +import { Request, Response, Router } from 'express'; +import prisma from '../../../lib/prisma'; +import { UserRepository } from '../../../repository/userRepository'; + +// Constants +const router = Router(); + +router.get('/', async (req: Request, res: Response) => { + const users = await prisma.user.findMany(); + return res.json(users); +}); + +router.post('/', async (req: Request, res: Response) => { + const data = await req.body; + const isExist = await UserRepository.getIsExistUserFromLoginId(data.loginId); + if (isExist) { + return res.status(409).send('User already exists'); + } + const user = await UserRepository.createUser(data); + if (user) { + return res.status(204).send(); + } else { + return res.status(404).send(); + } +}); + +export default router; diff --git a/mitaina-back/index.ts b/mitaina-back/src/routes/index.ts similarity index 69% rename from mitaina-back/index.ts rename to mitaina-back/src/routes/index.ts index 50c22f8..ca72c6b 100644 --- a/mitaina-back/index.ts +++ b/mitaina-back/src/routes/index.ts @@ -1,23 +1,23 @@ import express, { Request, Response } from 'express'; import path from 'path'; -import prisma from './src/lib/prisma'; +import prisma from '../lib/prisma'; +import apiRouter from './api/api'; const app = express(); const port = process.env.PORT || 8080; app.use(express.static(path.join(__dirname, '../../mitaina-front/build'))); +app.use(express.json()); app.get('/users', async (req: Request, res: Response) => { const users = await prisma.user.findMany(); return res.json(users); }); -app.get('/api', (req, res) => { - res.json({ message: 'Hello World!' }); -}); +app.use('/api', apiRouter); app.get('*', (req, res) => { - res.sendFile(path.join(__dirname, '../../mitaina-front/build/index.html')); + res.sendFile(path.join(__dirname, '../../../mitaina-front/build/index.html')); }); app.listen(port, () => console.log(`Example app listening on port ${port}!`)); diff --git a/mitaina-front/.env b/mitaina-front/.env new file mode 100644 index 0000000..153f9d9 --- /dev/null +++ b/mitaina-front/.env @@ -0,0 +1,7 @@ +# Environment variables declared in this file are automatically made available to Prisma. +# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" \ No newline at end of file diff --git a/mitaina-front/package.json b/mitaina-front/package.json index 17dcca5..d5cf160 100644 --- a/mitaina-front/package.json +++ b/mitaina-front/package.json @@ -7,6 +7,8 @@ "@babel/core": "^7.0.0-0", "@babel/plugin-syntax-flow": "^7.14.5", "@babel/plugin-transform-react-jsx": "^7.14.9", + "@heroicons/react": "^1.0.6", + "@prisma/client": "^4.0.0", "@testing-library/dom": "^8.14.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.3.0", @@ -16,9 +18,12 @@ "@types/react": "^18.0.14", "@types/react-dom": "^18.0.5", "autoprefixer": "^10.4.7", + "daisyui": "^2.18.1", "postcss": "^8.4.14", + "prisma": "^4.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "recoil": "^0.7.4", "tailwindcss": "^3.1.4", diff --git a/mitaina-front/pnpm-lock.yaml b/mitaina-front/pnpm-lock.yaml index 95a6991..91bf41f 100644 --- a/mitaina-front/pnpm-lock.yaml +++ b/mitaina-front/pnpm-lock.yaml @@ -4,6 +4,8 @@ specifiers: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-flow': ^7.14.5 '@babel/plugin-transform-react-jsx': ^7.14.9 + '@heroicons/react': ^1.0.6 + '@prisma/client': ^4.0.0 '@testing-library/dom': ^8.14.0 '@testing-library/jest-dom': ^5.16.4 '@testing-library/react': ^13.3.0 @@ -13,9 +15,12 @@ specifiers: '@types/react': ^18.0.14 '@types/react-dom': ^18.0.5 autoprefixer: ^10.4.7 + daisyui: ^2.18.1 postcss: ^8.4.14 + prisma: ^4.0.0 react: ^18.2.0 react-dom: ^18.2.0 + react-router-dom: ^6.3.0 react-scripts: 5.0.1 recoil: ^0.7.4 tailwindcss: ^3.1.4 @@ -26,6 +31,8 @@ dependencies: '@babel/core': 7.18.6 '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.18.6 '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.6 + '@heroicons/react': 1.0.6_react@18.2.0 + '@prisma/client': 4.0.0_prisma@4.0.0 '@testing-library/dom': 8.14.0 '@testing-library/jest-dom': 5.16.4 '@testing-library/react': 13.3.0_biqbaboplfbrettd7655fr4n2y @@ -35,9 +42,12 @@ dependencies: '@types/react': 18.0.14 '@types/react-dom': 18.0.6 autoprefixer: 10.4.7_postcss@8.4.14 + daisyui: 2.18.1_ugi4xkrfysqkt4c4y6hkyfj344 postcss: 8.4.14 + prisma: 4.0.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 + react-router-dom: 6.3.0_biqbaboplfbrettd7655fr4n2y react-scripts: 5.0.1_l4duqkh7x67d4fmf6jocdn7i5q recoil: 0.7.4_biqbaboplfbrettd7655fr4n2y tailwindcss: 3.1.4 @@ -1583,6 +1593,14 @@ packages: - supports-color dev: false + /@heroicons/react/1.0.6_react@18.2.0: + resolution: {integrity: sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==} + peerDependencies: + react: '>= 16' + dependencies: + react: 18.2.0 + dev: false + /@humanwhocodes/config-array/0.9.5: resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} engines: {node: '>=10.10.0'} @@ -1956,6 +1974,29 @@ packages: webpack-dev-server: 4.9.3_webpack@5.73.0 dev: false + /@prisma/client/4.0.0_prisma@4.0.0: + resolution: {integrity: sha512-g1h2OGoRo7anBVQ9Cw3gsbjwPtvf7i0pkGxKeZICtwkvE5CZXW+xZF4FZdmrViYkKaAShbISL0teNpu9ecpf4g==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11 + prisma: 4.0.0 + dev: false + + /@prisma/engines-version/3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11: + resolution: {integrity: sha512-PiZhdD624SrYEjyLboI0X7OugNbxUzDJx9v/6ldTKuqNDVUCmRH/Z00XwDi/dgM4FlqOSO+YiUsSiSKjxxG8cw==} + dev: false + + /@prisma/engines/3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11: + resolution: {integrity: sha512-u/rG4lDHALolWBLr3yebZ+N2qImp3SDMcu7bHNJuRDaYvYEXy/MqfNRNEgd9GoPsXL3gofYf0VzJf2AmCG3YVw==} + requiresBuild: true + dev: false + /@rollup/plugin-babel/5.3.1_fb3qe53zzddvqjqqltveoanfhe: resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -3510,6 +3551,21 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color/4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /colord/2.9.2: resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==} dev: false @@ -3780,6 +3836,13 @@ packages: nth-check: 2.1.1 dev: false + /css-selector-tokenizer/0.8.0: + resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + dev: false + /css-tree/1.0.0-alpha.37: resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} engines: {node: '>=8.0.0'} @@ -3913,6 +3976,22 @@ packages: resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} dev: false + /daisyui/2.18.1_ugi4xkrfysqkt4c4y6hkyfj344: + resolution: {integrity: sha512-MBmhUxkFefa9WvIWcOg2XYadHpZNakgFDHzfQJ75C4S3Vy0I9m9xZiiZgqhR9dQd1YnFal/E30i4FgpRSVtRSw==} + peerDependencies: + autoprefixer: ^10.0.2 + postcss: ^8.1.6 + dependencies: + autoprefixer: 10.4.7_postcss@8.4.14 + color: 4.2.3 + css-selector-tokenizer: 0.8.0 + postcss: 8.4.14 + postcss-js: 4.0.0_postcss@8.4.14 + tailwindcss: 3.1.4 + transitivePeerDependencies: + - ts-node + dev: false + /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: false @@ -4795,6 +4874,10 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: false + /fastparse/1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + dev: false + /fastq/1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: @@ -5214,6 +5297,12 @@ packages: hasBin: true dev: false + /history/5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + dependencies: + '@babel/runtime': 7.18.6 + dev: false + /hoopy/0.1.4: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} @@ -5477,6 +5566,10 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: false + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -7890,6 +7983,15 @@ packages: react-is: 18.2.0 dev: false + /prisma/4.0.0: + resolution: {integrity: sha512-Dtsar03XpCBkcEb2ooGWO/WcgblDTLzGhPcustbehwlFXuTMliMDRzXsfygsgYwQoZnAUKRd1rhpvBNEUziOVw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11 + dev: false + /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false @@ -8060,6 +8162,27 @@ packages: engines: {node: '>=0.10.0'} dev: false + /react-router-dom/6.3.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + history: 5.3.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-router: 6.3.0_react@18.2.0 + dev: false + + /react-router/6.3.0_react@18.2.0: + resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + peerDependencies: + react: '>=16.8' + dependencies: + history: 5.3.0 + react: 18.2.0 + dev: false + /react-scripts/5.0.1_l4duqkh7x67d4fmf6jocdn7i5q: resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} @@ -8641,6 +8764,12 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false diff --git a/mitaina-front/prisma/schema.prisma b/mitaina-front/prisma/schema.prisma new file mode 100644 index 0000000..d3f4d03 --- /dev/null +++ b/mitaina-front/prisma/schema.prisma @@ -0,0 +1,43 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" + previewFeatures = ["referentialIntegrity"] +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + referentialIntegrity = "prisma" +} + +model User { + id String @id @default(cuid()) + loginId String @unique + name String + passwordHash String + rooms Room[] +} + +model Room { + id String @id @default(cuid()) + ownerId String + users User[] + turns Turn[] +} + +model Turn { + id String @id @default(cuid()) + roomId String + room Room @relation(fields: [roomId], references: [id]) + frontCardId String + backCardId String + cards Card[] +} + +model Card { + id String @id @default(cuid()) + text String @unique + turn Turn[] +} \ No newline at end of file diff --git a/mitaina-front/src/App.tsx b/mitaina-front/src/App.tsx index 7ba90e2..95a03a2 100644 --- a/mitaina-front/src/App.tsx +++ b/mitaina-front/src/App.tsx @@ -1,36 +1,42 @@ -import "./App.css"; -import { useState, useEffect, Dispatch, SetStateAction } from "react"; +import './App.css'; +import { useState, useEffect } from 'react'; +import { getJSON } from './lib/EndpointHelper'; +import { BrowserRouter, Route, Routes } from 'react-router-dom'; -interface Users { - id?: number; - email?: string; - name?: string; -} +//components +import Top from './pages/Top'; +import Login from './pages/Auth/Login'; +import Register from './pages/Auth/Register'; + +//Types +import { User } from '@prisma/client'; function App() { - const [message, setMessage] = useState(""); - const [users, setUsers]: [Users[], Dispatch>] = useState( - [] - ); - useEffect(() => { - fetch("/api") - .then((res) => res.json()) - .then((data) => setMessage(data.message)); - }, []); - useEffect(() => { - fetch("/users") - .then((res) => res.json()) - .then((data) => setUsers(data)); - }, []); - console.log(users); - console.log(message); + const [users, setUsers] = useState([]); + useEffect(() => { + const getUsers = async () => { + const users: User[] | undefined = await getJSON('/users/get'); + console.log(users); + users && setUsers(users); + }; + getUsers(); + }, []); + console.log(users); - return ( -
-

{message}

- {users.length &&

{users[0].name}

} -
- ); + return ( + + + {/* } />} + /> */} + } /> + } /> + } /> + + + ); } export default App; diff --git a/mitaina-front/src/lib/EndpointHelper.ts b/mitaina-front/src/lib/EndpointHelper.ts new file mode 100644 index 0000000..1cacf26 --- /dev/null +++ b/mitaina-front/src/lib/EndpointHelper.ts @@ -0,0 +1,47 @@ +export const getJSON = async (url: string): Promise => { + return await toJSON(fetch(`/api/${url}`)); +}; +export const toJSON = async (fetchRequest: Promise): Promise => { + return fetchRequest.then((res) => (res.ok ? res.json().then((json) => json) : undefined)); +}; + +export const postJSON = (url: string, data: T) => { + return fetch(`/api/${url}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); +}; + +export const putJSON = (url: string, data: T) => { + return fetch(`/api/${url}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); +}; +type Methods = 'POST' | 'GET' | 'PUT' | 'PATCH' | 'DELETE'; +type CustomFetchProps = U extends 'GET' | 'DELETE' + ? { + url: string; + method: U; + } + : U extends 'PATCH' + ? { url: string; method: U; data: Partial } + : { url: string; method: U; data: T }; + +export const customFetch = async ( + props: CustomFetchProps +) => { + if (props.method === 'GET' || props.method === 'DELETE') { + return await toJSON(fetch(`/api/${props.url}`, { method: props.method })); + } else { + return await toJSON( + fetch(`/api/${props.url}`, { + method: props.method, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(props.data) + }) + ); + } +}; diff --git a/mitaina-front/src/pages/Auth/Login.tsx b/mitaina-front/src/pages/Auth/Login.tsx new file mode 100644 index 0000000..125547f --- /dev/null +++ b/mitaina-front/src/pages/Auth/Login.tsx @@ -0,0 +1,13 @@ +import React, { FC } from 'react'; + +type Props = {}; + +const Login: FC = () => { + return ( + <> +

Login

+ + ); +}; + +export default Login; diff --git a/mitaina-front/src/pages/Auth/Register.tsx b/mitaina-front/src/pages/Auth/Register.tsx new file mode 100644 index 0000000..d5aae14 --- /dev/null +++ b/mitaina-front/src/pages/Auth/Register.tsx @@ -0,0 +1,120 @@ +import React, { FC, useState } from 'react'; +import { postJSON } from '../../lib/EndpointHelper'; +import { XCircleIcon, CheckCircleIcon } from '@heroicons/react/outline'; + +type Props = {}; + +const Register: FC = () => { + const [loginId, setLoginId] = useState(''); + const [userName, setUserName] = useState(''); + const [password, setPassword] = useState(''); + const [message, setMessage] = useState<{ + type: 'success' | 'error'; + message: string; + } | null>(null); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (loginId === '' || userName === '' || password === '') { + setMessage({ type: 'error', message: '入力されていない項目があります' }); + return; + } + if (loginId.length < 6) { + setMessage({ type: 'error', message: 'ログインIDは6文字以上です' }); + return; + } + if (password.length < 6) { + setMessage({ type: 'error', message: 'パスワードは6文字以上です' }); + return; + } + const createRes = await postJSON('users', { + loginId, + userName, + password + }); + if (createRes.status === 409) { + setMessage({ type: 'error', message: 'すでに登録されているログインIDです' }); + } else if (createRes.status === 404) { + setMessage({ type: 'error', message: 'アカウント作成に失敗しました' }); + } + if (createRes.ok) { + setMessage({ type: 'success', message: 'アカウントを作成しました' }); + } + }; + return ( + <> +
+
+
+

SignUp

+
+ {message && ( +
+
+ {message.type === 'success' ? ( + + ) : ( + + )} + {message.message} +
+
+ )} +
+
+
+
+ + setMessage(null)} + type="text" + pattern="^[0-9A-Za-z]+$" + id="register-loginId" + className="input input-bordered" + value={loginId} + onChange={(e) => setLoginId(e.target.value)} + /> +
+
+ + setMessage(null)} + type="email" + id="register-userName" + className="input input-bordered" + value={userName} + onChange={(e) => setUserName(e.target.value)} + /> +
+
+ + setMessage(null)} + type="password" + id="register-password" + className="input input-bordered" + value={password} + onChange={(e) => setPassword(e.target.value)} + /> +
+
+ +
+
+
+
+
+
+ + ); +}; + +export default Register; diff --git a/mitaina-front/src/pages/Top/index.tsx b/mitaina-front/src/pages/Top/index.tsx new file mode 100644 index 0000000..c12bf84 --- /dev/null +++ b/mitaina-front/src/pages/Top/index.tsx @@ -0,0 +1,13 @@ +import React, { FC } from 'react'; + +type Props = {}; + +const Top: FC = () => { + return ( + <> +

Top

+ + ); +}; + +export default Top; diff --git a/mitaina-front/tailwind.config.js b/mitaina-front/tailwind.config.js index 32e3abd..58dd439 100644 --- a/mitaina-front/tailwind.config.js +++ b/mitaina-front/tailwind.config.js @@ -1,8 +1,8 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: [], - theme: { - extend: {}, - }, - plugins: [], -} + content: ['./src/**/*.{html,tsx,js,ts}'], + theme: { + extend: {} + }, + plugins: [require('daisyui')] +}; diff --git a/package.json b/package.json index ee6f65a..0a5a4bb 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "test": "echo \"Error: no test specified\" && exit 1", "start": "concurrently \"cd mitaina-back && pnpm start\" \"cd mitaina-front && pnpm start\" ", "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", - "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ." + "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. .", + "generate": "cd mitaina-back && cp -f ./prisma/schema.prisma ../mitaina-front/prisma/schema.prisma && prisma generate && cd ../mitaina-front && prisma generate" }, "keywords": [], "author": "",