From 7ceef48d06d92e7aa497e397ae367806f2798e9b Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 11:20:32 +0100 Subject: [PATCH 01/10] Added prisma dependencies --- package-lock.json | 27 +++++++++++++++++++++++++++ package.json | 3 +++ 2 files changed, 30 insertions(+) diff --git a/package-lock.json b/package-lock.json index 55389fe..62380df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,9 @@ "react": "^18.2.0", "react-bootstrap": "^2.7.4", "react-dom": "^18.2.0" + }, + "devDependencies": { + "prisma": "^4.15.0" } }, "node_modules/@babel/runtime": { @@ -318,6 +321,13 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@prisma/engines": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.15.0.tgz", + "integrity": "sha512-FTaOCGs0LL0OW68juZlGxFtYviZa4xdQj/rQEdat2txw0s3Vu/saAPKjNVXfIgUsGXmQ72HPgNr6935/P8FNAA==", + "dev": true, + "hasInstallScript": true + }, "node_modules/@react-aria/ssr": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz", @@ -2975,6 +2985,23 @@ "node": ">= 0.8.0" } }, + "node_modules/prisma": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.15.0.tgz", + "integrity": "sha512-iKZZpobPl48gTcSZVawLMQ3lEy6BnXwtoMj7hluoGFYu2kQ6F9LBuBrUyF95zRVnNo8/3KzLXJXJ5TEnLSJFiA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.15.0" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", diff --git a/package.json b/package.json index 445a6e2..2f4ca5a 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,8 @@ "react": "^18.2.0", "react-bootstrap": "^2.7.4", "react-dom": "^18.2.0" + }, + "devDependencies": { + "prisma": "^4.15.0" } } -- GitLab From 9ed071e1a2c09daa824ed23335e6ae2cfbd034dd Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 11:46:54 +0100 Subject: [PATCH 02/10] Added postgres connection URL --- .env | 7 +++++++ prisma/schema.prisma | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 .env create mode 100644 prisma/schema.prisma diff --git a/.env b/.env new file mode 100644 index 0000000..19a046b --- /dev/null +++ b/.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://djs21:3;iR5,q772@db.doc.ic.ac.uk:5432/djs21?schema=public" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..d205f42 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,11 @@ +// 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" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} -- GitLab From e745960c8f86ae26efe656d75e91ba1467af2504 Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 12:36:30 +0100 Subject: [PATCH 03/10] Added database fetch on student dashboard --- prisma/schema.prisma | 6 +++ src/app/studentDashboard/page.js | 74 +++++++++++++++++--------------- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d205f42..ee33ef2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -9,3 +9,9 @@ datasource db { provider = "postgresql" url = env("DATABASE_URL") } + +model Student { + id Int @id @default(autoincrement()) + language String + maths String +} \ No newline at end of file diff --git a/src/app/studentDashboard/page.js b/src/app/studentDashboard/page.js index 9a647f4..0dae686 100644 --- a/src/app/studentDashboard/page.js +++ b/src/app/studentDashboard/page.js @@ -1,55 +1,61 @@ 'use client' - import "bootstrap/dist/css/bootstrap.min.css" import Accordion from 'react-bootstrap/Accordion'; import Form from 'react-bootstrap/Form'; import Nav from 'react-bootstrap/Nav'; import Button from 'react-bootstrap/Button'; -function studentDashboard() { +export async function getStaticProps() { + const prisma = new PrismaClient() + const c = await prisma.student.count({}) + + return { + props : { c } + } +} + +function studentDashboard({c}) { return ( <main className="studentDashboard"> + <h1>{c}</h1> <Nav fill className="justify-content-center" activeKey="/home"> - <Nav.Item> - <h6>3 Requirements Matched </h6> - </Nav.Item> - <Nav.Item> - <h4>Your Application </h4> - </Nav.Item> - <Nav.Item> - <Nav.Link eventKey="link-2">Upload CV</Nav.Link> - </Nav.Item> + <Nav.Item> + <h6>3 Requirements Matched </h6> + </Nav.Item> + <Nav.Item> + <h4>Your Application </h4> + </Nav.Item> + <Nav.Item> + <Nav.Link eventKey="link-2">Upload CV</Nav.Link> + </Nav.Item> </Nav> - - <Form> - <Accordion defaultActiveKey={['0']} alwaysOpen> - <Accordion.Item eventKey="0"> - <Accordion.Header>Language Skill</Accordion.Header> - <Accordion.Body> - <Form.Group className="mb-3" controlId="formGroupSkill1"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> - </Form.Group> - </Accordion.Body> - </Accordion.Item> - <Accordion.Item eventKey="1"> - <Accordion.Header>Profient in Maths</Accordion.Header> - <Accordion.Body> - <Form.Group className="mb-3" controlId="formGroupSkill2"> - <Form.Label>Password</Form.Label> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> - </Form.Group> - </Accordion.Body> - </Accordion.Item> + <Form> + <Accordion defaultActiveKey={['0']} alwaysOpen> + <Accordion.Item eventKey="0"> + <Accordion.Header>Language Skill</Accordion.Header> + <Accordion.Body> + <Form.Group className="mb-3" controlId="formGroupSkill1"> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> + </Form.Group> + </Accordion.Body> + </Accordion.Item> + <Accordion.Item eventKey="1"> + <Accordion.Header>Profient in Maths</Accordion.Header> + <Accordion.Body> + <Form.Group className="mb-3" controlId="formGroupSkill2"> + <Form.Label>Password</Form.Label> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> + </Form.Group> + </Accordion.Body> + </Accordion.Item> </Accordion> </Form> - <Button variant="primary" type="submit"> + <Button variant="primary" type="submit" onClick={() => handleSubmit()}> Submit </Button> </main> - - ); } -- GitLab From 0cae8186c667aafc998f9c70f0049e5b577d9b62 Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 17:47:06 +0100 Subject: [PATCH 04/10] Changed student dashboard text boxes to fetch default values from database --- .env | 3 ++- .gitignore | 1 + package-lock.json | 30 ++++++++++++++++++++++++++++-- package.json | 1 + prisma/schema.prisma | 1 + src/app/api/student/route.js | 9 +++++++++ src/app/studentDashboard/page.js | 24 +++++++++++------------- 7 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 src/app/api/student/route.js diff --git a/.env b/.env index 19a046b..19eec93 100644 --- a/.env +++ b/.env @@ -4,4 +4,5 @@ # 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://djs21:3;iR5,q772@db.doc.ic.ac.uk:5432/djs21?schema=public" \ No newline at end of file +DATABASE_URL="postgresql://djs21:3;iR5,q772@db.doc.ic.ac.uk:5432/djs21?schema=public" +SHADOW_DATABASE_URL="postgresql://rgw20:e8:4CBnj+>cn@db.doc.ic.ac.uk:5432/rgw20?schema=public" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8f322f0..83354c1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/prisma/migrations # testing /coverage diff --git a/package-lock.json b/package-lock.json index 62380df..631c61b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "drp45", "version": "0.1.0", "dependencies": { + "@prisma/client": "^4.15.0", "bootstrap": "^5.3.0", "eslint": "8.41.0", "eslint-config-next": "13.4.4", @@ -321,13 +322,38 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@prisma/client": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.15.0.tgz", + "integrity": "sha512-xnROvyABcGiwqRNdrObHVZkD9EjkJYHOmVdlKy1yGgI+XOzvMzJ4tRg3dz1pUlsyhKxXGCnjIQjWW+2ur+YXuw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, "node_modules/@prisma/engines": { "version": "4.15.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.15.0.tgz", "integrity": "sha512-FTaOCGs0LL0OW68juZlGxFtYviZa4xdQj/rQEdat2txw0s3Vu/saAPKjNVXfIgUsGXmQ72HPgNr6935/P8FNAA==", - "dev": true, + "devOptional": true, "hasInstallScript": true }, + "node_modules/@prisma/engines-version": { + "version": "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz", + "integrity": "sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg==" + }, "node_modules/@react-aria/ssr": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz", @@ -2989,7 +3015,7 @@ "version": "4.15.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.15.0.tgz", "integrity": "sha512-iKZZpobPl48gTcSZVawLMQ3lEy6BnXwtoMj7hluoGFYu2kQ6F9LBuBrUyF95zRVnNo8/3KzLXJXJ5TEnLSJFiA==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "dependencies": { "@prisma/engines": "4.15.0" diff --git a/package.json b/package.json index 2f4ca5a..0431d32 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@prisma/client": "^4.15.0", "bootstrap": "^5.3.0", "eslint": "8.41.0", "eslint-config-next": "13.4.4", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ee33ef2..5a68d4c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -8,6 +8,7 @@ generator client { datasource db { provider = "postgresql" url = env("DATABASE_URL") + shadowDatabaseUrl = env("SHADOW_DATABASE_URL") } model Student { diff --git a/src/app/api/student/route.js b/src/app/api/student/route.js new file mode 100644 index 0000000..8e1c052 --- /dev/null +++ b/src/app/api/student/route.js @@ -0,0 +1,9 @@ +import { PrismaClient } from '@prisma/client'; +import { NextResponse } from 'next/server'; + +const prisma = new PrismaClient(); + +export async function GET() { + const student = await prisma.student.findFirst(); + return NextResponse.json(student); +} \ No newline at end of file diff --git a/src/app/studentDashboard/page.js b/src/app/studentDashboard/page.js index 0dae686..182b5a0 100644 --- a/src/app/studentDashboard/page.js +++ b/src/app/studentDashboard/page.js @@ -4,20 +4,18 @@ import Accordion from 'react-bootstrap/Accordion'; import Form from 'react-bootstrap/Form'; import Nav from 'react-bootstrap/Nav'; import Button from 'react-bootstrap/Button'; +import { useEffect, useState } from 'react'; -export async function getStaticProps() { - const prisma = new PrismaClient() - const c = await prisma.student.count({}) +function studentDashboard() { + const [student, setStudent] = useState([]); + useEffect(() => { + fetch('/api/student') + .then((response) => response.json()) + .then((data) => {setStudent(data)} ); + }, []); - return { - props : { c } - } -} - -function studentDashboard({c}) { return ( <main className="studentDashboard"> - <h1>{c}</h1> <Nav fill className="justify-content-center" activeKey="/home"> <Nav.Item> <h6>3 Requirements Matched </h6> @@ -36,7 +34,7 @@ function studentDashboard({c}) { <Accordion.Header>Language Skill</Accordion.Header> <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill1"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.language}/> </Form.Group> </Accordion.Body> </Accordion.Item> @@ -45,14 +43,14 @@ function studentDashboard({c}) { <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill2"> <Form.Label>Password</Form.Label> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths}/> </Form.Group> </Accordion.Body> </Accordion.Item> </Accordion> </Form> - <Button variant="primary" type="submit" onClick={() => handleSubmit()}> + <Button variant="primary" type="submit"> Submit </Button> </main> -- GitLab From 811efcf4f346d0a0faef1c2ea747e88e8f4091f6 Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 18:00:40 +0100 Subject: [PATCH 05/10] Renamed function studentDashboard to StudentDashboard to fix react hooks --- src/app/studentDashboard/page.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/studentDashboard/page.js b/src/app/studentDashboard/page.js index 182b5a0..726c7af 100644 --- a/src/app/studentDashboard/page.js +++ b/src/app/studentDashboard/page.js @@ -6,7 +6,7 @@ import Nav from 'react-bootstrap/Nav'; import Button from 'react-bootstrap/Button'; import { useEffect, useState } from 'react'; -function studentDashboard() { +function StudentDashboard() { const [student, setStudent] = useState([]); useEffect(() => { fetch('/api/student') @@ -42,7 +42,6 @@ function studentDashboard() { <Accordion.Header>Profient in Maths</Accordion.Header> <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill2"> - <Form.Label>Password</Form.Label> <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths}/> </Form.Group> </Accordion.Body> @@ -57,4 +56,4 @@ function studentDashboard() { ); } -export default studentDashboard; +export default StudentDashboard; -- GitLab From 1b52175d6a407bd2b45deb0c8f7c63326d5c0ee3 Mon Sep 17 00:00:00 2001 From: "Sadler, David" <david.sadler21@imperial.ac.uk> Date: Thu, 1 Jun 2023 17:42:07 +0000 Subject: [PATCH 06/10] Added database fetching --- .env | 8 ++++ .gitignore | 1 + package-lock.json | 52 +++++++++++++++++++++++ package.json | 2 + prisma/schema.prisma | 18 ++++++++ src/app/api/student/route.js | 9 ++++ src/app/studentDashboard/page.js | 71 +++++++++++++++++--------------- 7 files changed, 127 insertions(+), 34 deletions(-) create mode 100644 .env create mode 100644 prisma/schema.prisma create mode 100644 src/app/api/student/route.js diff --git a/.env b/.env new file mode 100644 index 0000000..19eec93 --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +# 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://djs21:3;iR5,q772@db.doc.ic.ac.uk:5432/djs21?schema=public" +SHADOW_DATABASE_URL="postgresql://rgw20:e8:4CBnj+>cn@db.doc.ic.ac.uk:5432/rgw20?schema=public" \ No newline at end of file diff --git a/.gitignore b/.gitignore index b6a4af1..7d4fc50 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/prisma/migrations # testing /coverage diff --git a/package-lock.json b/package-lock.json index fcef9b9..d1aba42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "drp45", "version": "0.1.0", "dependencies": { + "@prisma/client": "^4.15.0", "bootstrap": "^5.3.0", "eslint": "8.41.0", "eslint-config-next": "13.4.4", @@ -17,6 +18,7 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "prisma": "^4.15.0", "cypress": "^12.13.0", "start-server-and-test": "^2.0.0" } @@ -395,6 +397,38 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@prisma/client": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.15.0.tgz", + "integrity": "sha512-xnROvyABcGiwqRNdrObHVZkD9EjkJYHOmVdlKy1yGgI+XOzvMzJ4tRg3dz1pUlsyhKxXGCnjIQjWW+2ur+YXuw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.15.0.tgz", + "integrity": "sha512-FTaOCGs0LL0OW68juZlGxFtYviZa4xdQj/rQEdat2txw0s3Vu/saAPKjNVXfIgUsGXmQ72HPgNr6935/P8FNAA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz", + "integrity": "sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg==" + }, "node_modules/@react-aria/ssr": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz", @@ -4285,6 +4319,23 @@ "node": ">= 0.8.0" } }, +<<<<<<< HEAD + "node_modules/prisma": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.15.0.tgz", + "integrity": "sha512-iKZZpobPl48gTcSZVawLMQ3lEy6BnXwtoMj7hluoGFYu2kQ6F9LBuBrUyF95zRVnNo8/3KzLXJXJ5TEnLSJFiA==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.15.0" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" +======= "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -4295,6 +4346,7 @@ }, "funding": { "url": "https://github.com/sponsors/sindresorhus" +>>>>>>> origin/master } }, "node_modules/prop-types": { diff --git a/package.json b/package.json index c97d803..8788c65 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "test-e2e": "start-server-and-test dev http://localhost:3000 \"cypress run --e2e\"" }, "dependencies": { + "@prisma/client": "^4.15.0", "bootstrap": "^5.3.0", "eslint": "8.41.0", "eslint-config-next": "13.4.4", @@ -21,6 +22,7 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "prisma": "^4.15.0", "cypress": "^12.13.0", "start-server-and-test": "^2.0.0" } diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..5a68d4c --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,18 @@ +// 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" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + shadowDatabaseUrl = env("SHADOW_DATABASE_URL") +} + +model Student { + id Int @id @default(autoincrement()) + language String + maths String +} \ No newline at end of file diff --git a/src/app/api/student/route.js b/src/app/api/student/route.js new file mode 100644 index 0000000..8e1c052 --- /dev/null +++ b/src/app/api/student/route.js @@ -0,0 +1,9 @@ +import { PrismaClient } from '@prisma/client'; +import { NextResponse } from 'next/server'; + +const prisma = new PrismaClient(); + +export async function GET() { + const student = await prisma.student.findFirst(); + return NextResponse.json(student); +} \ No newline at end of file diff --git a/src/app/studentDashboard/page.js b/src/app/studentDashboard/page.js index 9a647f4..726c7af 100644 --- a/src/app/studentDashboard/page.js +++ b/src/app/studentDashboard/page.js @@ -1,46 +1,51 @@ 'use client' - import "bootstrap/dist/css/bootstrap.min.css" import Accordion from 'react-bootstrap/Accordion'; import Form from 'react-bootstrap/Form'; import Nav from 'react-bootstrap/Nav'; import Button from 'react-bootstrap/Button'; +import { useEffect, useState } from 'react'; + +function StudentDashboard() { + const [student, setStudent] = useState([]); + useEffect(() => { + fetch('/api/student') + .then((response) => response.json()) + .then((data) => {setStudent(data)} ); + }, []); -function studentDashboard() { return ( <main className="studentDashboard"> <Nav fill className="justify-content-center" activeKey="/home"> - <Nav.Item> - <h6>3 Requirements Matched </h6> - </Nav.Item> - <Nav.Item> - <h4>Your Application </h4> - </Nav.Item> - <Nav.Item> - <Nav.Link eventKey="link-2">Upload CV</Nav.Link> - </Nav.Item> + <Nav.Item> + <h6>3 Requirements Matched </h6> + </Nav.Item> + <Nav.Item> + <h4>Your Application </h4> + </Nav.Item> + <Nav.Item> + <Nav.Link eventKey="link-2">Upload CV</Nav.Link> + </Nav.Item> </Nav> - - <Form> - <Accordion defaultActiveKey={['0']} alwaysOpen> - <Accordion.Item eventKey="0"> - <Accordion.Header>Language Skill</Accordion.Header> - <Accordion.Body> - <Form.Group className="mb-3" controlId="formGroupSkill1"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> - </Form.Group> - </Accordion.Body> - </Accordion.Item> - <Accordion.Item eventKey="1"> - <Accordion.Header>Profient in Maths</Accordion.Header> - <Accordion.Body> - <Form.Group className="mb-3" controlId="formGroupSkill2"> - <Form.Label>Password</Form.Label> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill"/> - </Form.Group> - </Accordion.Body> - </Accordion.Item> + <Form> + <Accordion defaultActiveKey={['0']} alwaysOpen> + <Accordion.Item eventKey="0"> + <Accordion.Header>Language Skill</Accordion.Header> + <Accordion.Body> + <Form.Group className="mb-3" controlId="formGroupSkill1"> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.language}/> + </Form.Group> + </Accordion.Body> + </Accordion.Item> + <Accordion.Item eventKey="1"> + <Accordion.Header>Profient in Maths</Accordion.Header> + <Accordion.Body> + <Form.Group className="mb-3" controlId="formGroupSkill2"> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths}/> + </Form.Group> + </Accordion.Body> + </Accordion.Item> </Accordion> </Form> @@ -48,9 +53,7 @@ function studentDashboard() { Submit </Button> </main> - - ); } -export default studentDashboard; +export default StudentDashboard; -- GitLab From 4c715e87d681a1b8bb96c12bfe16578d9c9e2d5d Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 18:51:26 +0100 Subject: [PATCH 07/10] Changed student dashboard to update database when submit is clicked --- src/app/api/student/route.js | 18 ++++++++++++++++-- src/app/studentDashboard/page.js | 32 ++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/app/api/student/route.js b/src/app/api/student/route.js index 8e1c052..8757b54 100644 --- a/src/app/api/student/route.js +++ b/src/app/api/student/route.js @@ -4,6 +4,20 @@ import { NextResponse } from 'next/server'; const prisma = new PrismaClient(); export async function GET() { - const student = await prisma.student.findFirst(); - return NextResponse.json(student); + const student = await prisma.student.findFirst(); + return NextResponse.json(student); +} + +export async function PUT(request) { + const { language, maths } = await request.json(); + await prisma.student.update({ + where: { + id: 1 + }, + data: { + language: language, + maths: maths + } + }); + return NextResponse.json({}); } \ No newline at end of file diff --git a/src/app/studentDashboard/page.js b/src/app/studentDashboard/page.js index 726c7af..2dbe77c 100644 --- a/src/app/studentDashboard/page.js +++ b/src/app/studentDashboard/page.js @@ -4,9 +4,26 @@ import Accordion from 'react-bootstrap/Accordion'; import Form from 'react-bootstrap/Form'; import Nav from 'react-bootstrap/Nav'; import Button from 'react-bootstrap/Button'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; function StudentDashboard() { + const langRef = useRef(); + const mathRef = useRef(); + + const handleSubmit = (event) => { + event.preventDefault(); + fetch('/api/student', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + language : langRef.current.value, + maths : mathRef.current.value + }), + }); + } + const [student, setStudent] = useState([]); useEffect(() => { fetch('/api/student') @@ -28,13 +45,13 @@ function StudentDashboard() { </Nav.Item> </Nav> - <Form> + <Form onSubmit={handleSubmit}> <Accordion defaultActiveKey={['0']} alwaysOpen> <Accordion.Item eventKey="0"> <Accordion.Header>Language Skill</Accordion.Header> <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill1"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.language}/> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.language} ref={langRef}/> </Form.Group> </Accordion.Body> </Accordion.Item> @@ -42,16 +59,15 @@ function StudentDashboard() { <Accordion.Header>Profient in Maths</Accordion.Header> <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill2"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths}/> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths} ref={mathRef}/> </Form.Group> </Accordion.Body> </Accordion.Item> </Accordion> + <Button variant="primary" type="submit"> + Submit + </Button> </Form> - - <Button variant="primary" type="submit"> - Submit - </Button> </main> ); } -- GitLab From 84357eae29e20ccf50f67f643f64257b2787e0f9 Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 18:53:10 +0100 Subject: [PATCH 08/10] Fixed broken package-lock.json --- package-lock.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1aba42..69f821e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4319,7 +4319,6 @@ "node": ">= 0.8.0" } }, -<<<<<<< HEAD "node_modules/prisma": { "version": "4.15.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.15.0.tgz", @@ -4335,7 +4334,8 @@ }, "engines": { "node": ">=14.17" -======= + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -4346,7 +4346,6 @@ }, "funding": { "url": "https://github.com/sponsors/sindresorhus" ->>>>>>> origin/master } }, "node_modules/prop-types": { -- GitLab From 4423f8f0a2d7baec8fd22d2181a534b171d5b563 Mon Sep 17 00:00:00 2001 From: "Sadler, David" <david.sadler21@imperial.ac.uk> Date: Thu, 1 Jun 2023 18:12:25 +0000 Subject: [PATCH 09/10] Added database updating --- package-lock.json | 7 ++++--- src/app/api/student/route.js | 18 ++++++++++++++++-- src/app/studentDashboard/page.js | 32 ++++++++++++++++++++++++-------- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1aba42..478fa10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "drp45", "version": "0.1.0", "dependencies": { + "@prisma/client": "^4.15.0", "@prisma/client": "^4.15.0", "bootstrap": "^5.3.0", "eslint": "8.41.0", @@ -18,6 +19,7 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "prisma": "^4.15.0", "prisma": "^4.15.0", "cypress": "^12.13.0", "start-server-and-test": "^2.0.0" @@ -4319,7 +4321,6 @@ "node": ">= 0.8.0" } }, -<<<<<<< HEAD "node_modules/prisma": { "version": "4.15.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.15.0.tgz", @@ -4335,7 +4336,8 @@ }, "engines": { "node": ">=14.17" -======= + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -4346,7 +4348,6 @@ }, "funding": { "url": "https://github.com/sponsors/sindresorhus" ->>>>>>> origin/master } }, "node_modules/prop-types": { diff --git a/src/app/api/student/route.js b/src/app/api/student/route.js index 8e1c052..8757b54 100644 --- a/src/app/api/student/route.js +++ b/src/app/api/student/route.js @@ -4,6 +4,20 @@ import { NextResponse } from 'next/server'; const prisma = new PrismaClient(); export async function GET() { - const student = await prisma.student.findFirst(); - return NextResponse.json(student); + const student = await prisma.student.findFirst(); + return NextResponse.json(student); +} + +export async function PUT(request) { + const { language, maths } = await request.json(); + await prisma.student.update({ + where: { + id: 1 + }, + data: { + language: language, + maths: maths + } + }); + return NextResponse.json({}); } \ No newline at end of file diff --git a/src/app/studentDashboard/page.js b/src/app/studentDashboard/page.js index 726c7af..2dbe77c 100644 --- a/src/app/studentDashboard/page.js +++ b/src/app/studentDashboard/page.js @@ -4,9 +4,26 @@ import Accordion from 'react-bootstrap/Accordion'; import Form from 'react-bootstrap/Form'; import Nav from 'react-bootstrap/Nav'; import Button from 'react-bootstrap/Button'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; function StudentDashboard() { + const langRef = useRef(); + const mathRef = useRef(); + + const handleSubmit = (event) => { + event.preventDefault(); + fetch('/api/student', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + language : langRef.current.value, + maths : mathRef.current.value + }), + }); + } + const [student, setStudent] = useState([]); useEffect(() => { fetch('/api/student') @@ -28,13 +45,13 @@ function StudentDashboard() { </Nav.Item> </Nav> - <Form> + <Form onSubmit={handleSubmit}> <Accordion defaultActiveKey={['0']} alwaysOpen> <Accordion.Item eventKey="0"> <Accordion.Header>Language Skill</Accordion.Header> <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill1"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.language}/> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.language} ref={langRef}/> </Form.Group> </Accordion.Body> </Accordion.Item> @@ -42,16 +59,15 @@ function StudentDashboard() { <Accordion.Header>Profient in Maths</Accordion.Header> <Accordion.Body> <Form.Group className="mb-3" controlId="formGroupSkill2"> - <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths}/> + <Form.Control as="textarea" rows={3} placeholder="Enter your evidence of the skill" defaultValue={student.maths} ref={mathRef}/> </Form.Group> </Accordion.Body> </Accordion.Item> </Accordion> + <Button variant="primary" type="submit"> + Submit + </Button> </Form> - - <Button variant="primary" type="submit"> - Submit - </Button> </main> ); } -- GitLab From 244df2e1459e4ca5a119dc7082604edfb66acabc Mon Sep 17 00:00:00 2001 From: David Sadler <djs21@ic.ac.uk> Date: Thu, 1 Jun 2023 20:06:50 +0100 Subject: [PATCH 10/10] Added prisma migrations directory --- .gitignore | 1 - prisma/migrations/20230601114814_init/migration.sql | 8 ++++++++ prisma/migrations/migration_lock.toml | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 prisma/migrations/20230601114814_init/migration.sql create mode 100644 prisma/migrations/migration_lock.toml diff --git a/.gitignore b/.gitignore index 7d4fc50..b6a4af1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ /node_modules /.pnp .pnp.js -/prisma/migrations # testing /coverage diff --git a/prisma/migrations/20230601114814_init/migration.sql b/prisma/migrations/20230601114814_init/migration.sql new file mode 100644 index 0000000..b2ec550 --- /dev/null +++ b/prisma/migrations/20230601114814_init/migration.sql @@ -0,0 +1,8 @@ +-- CreateTable +CREATE TABLE "Student" ( + "id" SERIAL NOT NULL, + "language" TEXT NOT NULL, + "maths" TEXT NOT NULL, + + CONSTRAINT "Student_pkey" PRIMARY KEY ("id") +); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file -- GitLab