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