From 17a56969f7627afd1bfd598b0e15d05d20e9dce6 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 3 Nov 2024 17:01:15 -0700 Subject: [PATCH 01/35] login page - leo --- ProjectSourceCode/docker-compose.yaml | 2 - ProjectSourceCode/src/views/pages/login.html | 127 +++++++++++++++++++ 2 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 ProjectSourceCode/src/views/pages/login.html diff --git a/ProjectSourceCode/docker-compose.yaml b/ProjectSourceCode/docker-compose.yaml index a4d5dee..8d755ff 100644 --- a/ProjectSourceCode/docker-compose.yaml +++ b/ProjectSourceCode/docker-compose.yaml @@ -2,7 +2,6 @@ version: '3.9' services: db: image: postgres:14 - env_file: .env expose: - '5432' volumes: @@ -12,7 +11,6 @@ services: image: node:lts user: 'node' working_dir: /home/node/app - env_file: .env environment: - NODE_ENV=development depends_on: diff --git a/ProjectSourceCode/src/views/pages/login.html b/ProjectSourceCode/src/views/pages/login.html new file mode 100644 index 0000000..f941a13 --- /dev/null +++ b/ProjectSourceCode/src/views/pages/login.html @@ -0,0 +1,127 @@ + + + + + + Login Page + + + + + +
+
+
+
+
+
+
+
+
+
+
+ +

Login to continue adventure!

+
+
+
+ +
+
+ + +
+ + + + + From 82b66167180c00b5a4633a15a6f2631bb8d778c7 Mon Sep 17 00:00:00 2001 From: Emily Smith Date: Mon, 4 Nov 2024 19:10:22 -0700 Subject: [PATCH 02/35] Emily: Moved CSS to stylesheet, temp header and footer implemented --- ProjectSourceCode/src/index.js | 3 +- ProjectSourceCode/src/resources/css/style.css | 124 ++++++++++++++++++ ProjectSourceCode/src/views/pages/login.hbs | 39 ++++++ .../src/views/partials/footer.hbs | 7 +- .../src/views/partials/header.hbs | 30 +++-- 5 files changed, 188 insertions(+), 15 deletions(-) diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index efbfa56..65079a5 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -24,7 +24,8 @@ app.engine('hbs', hbs.engine); app.set('view engine', 'hbs'); app.set('views', path.join(__dirname, 'views')); app.use(bodyParser.json()); - +// OHs this should fix my style.css inaccessibility issue +app.use('/resources', express.static(path.join(__dirname, 'resources'))); // set Session app.use( session({ diff --git a/ProjectSourceCode/src/resources/css/style.css b/ProjectSourceCode/src/resources/css/style.css index e69de29..88b1e98 100644 --- a/ProjectSourceCode/src/resources/css/style.css +++ b/ProjectSourceCode/src/resources/css/style.css @@ -0,0 +1,124 @@ +/* */ + +/* Christmas green background, color of text is white */ +.header { + background-color: #2e5d31; + color: white; + padding: 10px; + width: 100%; + font-family: 'Mountains of Christmas'; +} + +.first-tier { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid white; + padding: 5px 10px; +} + +.progress_head, .username_head, .timer_head { + flex: 1; + text-align: center; +} + +.second_tier { + display: flex; + justify-content: center; + gap: 10px; + padding: 5px 10px; +} + +.second_tier a { + color: white; + padding: 5px 10px; + transition: background .3s; + font-weight: bolder; +} + +body, html { + height: 100%; + margin: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-family: Arial, sans-serif; + background: linear-gradient(to bottom, #cb4335, #1e8449); + color: white; + text-align: center; + } + + label { +font-size: 1.5em; +} + + + h1 { + margin-bottom: 20px; + font-size: 3.5em; + color: #ffebcd; + } + + + .form-control { + width: 100%; + font-size: 1.5em; + max-width: 500px; + padding: 10px; + margin: 10px auto; + border: 1px solid #ddd; + border-radius: 15px; + background-color: rgba(255, 255, 255, 0.8); + text-align: center; + } + + + .btn { + background: #ff6347; + border: none; + padding: 10px 20px; + color: white; + border-radius: 15px; + cursor: pointer; + font-weight: bold; + transition: background 0.3s; + margin-top: 10px; + } + + .btn:hover { + background: #dc143c; + } + + + .snowflake { + color: #ffffff; + font-size: 2.5em; + opacity: 0.9; + animation: fall 10s linear infinite; + position: fixed; + top: -10px; + user-select: none; + z-index: -1; + } + + @keyframes fall { + to { + transform: translateY(100vh); + } + } + + .register-link { + margin-top: 15px; + font-size: 1.5em; + color: #ffebcd; + } + + .register-link a { + color: #ffebcd; + text-decoration: underline; + } + + .register-link a:hover { + color: #ffffff; + } \ No newline at end of file diff --git a/ProjectSourceCode/src/views/pages/login.hbs b/ProjectSourceCode/src/views/pages/login.hbs index e69de29..8c07498 100644 --- a/ProjectSourceCode/src/views/pages/login.hbs +++ b/ProjectSourceCode/src/views/pages/login.hbs @@ -0,0 +1,39 @@ +{{!-- Couldn't do a pull, had to copy/paste --}} + + + + {{!-- + --}} + Login Page + {{!-- --}} +{{!-- --}} + + +
+
+
+
+
+
+
+
+
+
+
+ +

Login to begin adventuring!

+
+
+
+ +
+
+ + +
+ + + + \ No newline at end of file diff --git a/ProjectSourceCode/src/views/partials/footer.hbs b/ProjectSourceCode/src/views/partials/footer.hbs index 0ebe4e0..d8d4f84 100644 --- a/ProjectSourceCode/src/views/partials/footer.hbs +++ b/ProjectSourceCode/src/views/partials/footer.hbs @@ -1,3 +1,4 @@ -
-

this is a test footer

-
\ No newline at end of file +
+

this is a test footer

+
+ \ No newline at end of file diff --git a/ProjectSourceCode/src/views/partials/header.hbs b/ProjectSourceCode/src/views/partials/header.hbs index 54df14e..c72a480 100644 --- a/ProjectSourceCode/src/views/partials/header.hbs +++ b/ProjectSourceCode/src/views/partials/header.hbs @@ -1,13 +1,21 @@ - - - - - - - - + + + + + + +
+
+
Username: Test
+
Progress: ---
+
Timer: ---
+
+
+ From 1cefbcf7f5bd73039b86c1fe26e41a78123a388c Mon Sep 17 00:00:00 2001 From: Sofia Date: Mon, 4 Nov 2024 23:04:39 -0700 Subject: [PATCH 03/35] fixed conflicting styling issues & put header inside body --- ProjectSourceCode/src/resources/css/style.css | 42 +++++++++++-------- ProjectSourceCode/src/views/layouts/main.hbs | 6 +-- ProjectSourceCode/src/views/pages/login.hbs | 15 +------ .../src/views/partials/footer.hbs | 5 ++- .../src/views/partials/header.hbs | 35 +++++++++------- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/ProjectSourceCode/src/resources/css/style.css b/ProjectSourceCode/src/resources/css/style.css index 88b1e98..99883fc 100644 --- a/ProjectSourceCode/src/resources/css/style.css +++ b/ProjectSourceCode/src/resources/css/style.css @@ -2,11 +2,17 @@ /* Christmas green background, color of text is white */ .header { - background-color: #2e5d31; - color: white; - padding: 10px; - width: 100%; - font-family: 'Mountains of Christmas'; + height:10vh; + background-color: #2e5d31; + color: white; + padding: 10px; + width: 100%; + font-family: 'Mountains of Christmas'; + text-align: center; +} + +.non-header { + height:90vh; } .first-tier { @@ -36,20 +42,20 @@ font-weight: bolder; } -body, html { - height: 100%; - margin: 0; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - font-family: Arial, sans-serif; - background: linear-gradient(to bottom, #cb4335, #1e8449); - color: white; - text-align: center; - } +.login { + height: 100%; + margin: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-family: Arial, sans-serif; + background: linear-gradient(to bottom, #cb4335, #1e8449); + color: white; + text-align: center; +} - label { +label { font-size: 1.5em; } diff --git a/ProjectSourceCode/src/views/layouts/main.hbs b/ProjectSourceCode/src/views/layouts/main.hbs index eb60a6f..0461477 100644 --- a/ProjectSourceCode/src/views/layouts/main.hbs +++ b/ProjectSourceCode/src/views/layouts/main.hbs @@ -1,7 +1,7 @@ {{>header}} - -{{{body}}} - +
+ {{{body}}} +
{{>footer}} \ No newline at end of file diff --git a/ProjectSourceCode/src/views/pages/login.hbs b/ProjectSourceCode/src/views/pages/login.hbs index 8c07498..289a129 100644 --- a/ProjectSourceCode/src/views/pages/login.hbs +++ b/ProjectSourceCode/src/views/pages/login.hbs @@ -1,14 +1,4 @@ -{{!-- Couldn't do a pull, had to copy/paste --}} - - - - {{!-- - --}} - Login Page - {{!-- --}} -{{!-- --}} - - + \ No newline at end of file diff --git a/ProjectSourceCode/src/views/partials/footer.hbs b/ProjectSourceCode/src/views/partials/footer.hbs index d8d4f84..53228c7 100644 --- a/ProjectSourceCode/src/views/partials/footer.hbs +++ b/ProjectSourceCode/src/views/partials/footer.hbs @@ -1,4 +1,5 @@ -
+ + {{!--

this is a test footer

-
+
--}} \ No newline at end of file diff --git a/ProjectSourceCode/src/views/partials/header.hbs b/ProjectSourceCode/src/views/partials/header.hbs index c72a480..f0566ca 100644 --- a/ProjectSourceCode/src/views/partials/header.hbs +++ b/ProjectSourceCode/src/views/partials/header.hbs @@ -1,21 +1,26 @@ - + + + + + - -
-
-
Username: Test
-
Progress: ---
-
Timer: ---
-
-
- + + +
+
+
Username: Test
+
Progress: ---
+
Timer: ---
+
+ +
\ No newline at end of file From 9e0385f26ff3be3ee04acdb44f25d4650cd8e68e Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Tue, 5 Nov 2024 16:54:18 -0700 Subject: [PATCH 04/35] Update minutes.txt --- TeamMeetingLogs/minutes.txt | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/TeamMeetingLogs/minutes.txt b/TeamMeetingLogs/minutes.txt index b278544..33e3b12 100644 --- a/TeamMeetingLogs/minutes.txt +++ b/TeamMeetingLogs/minutes.txt @@ -21,4 +21,38 @@ Leo: Login page Future thoughts: Sofia: Look into body parsers Emily: I'm going to make the header beautiful <3 -Leo: Plan out the different puzzles for Sofia to implement \ No newline at end of file +Leo: Plan out the different puzzles for Sofia to implement + +Meeting 11/5/2024 @4:30pm +Attendees: Emily, Sofia, Leo, Dorjee, Carter + +Are there any release notes? +More formal release notes for following weeks. "This person did this on this branch etc..." +Dorjee started on the scoreboard page. Shared screen and showed "dummy" content. Plan on having a + global rank and using the database to show the top 10 people. Christmas theme, so no background + yet to reflect that. Plans to implement call from database this week. Get request to render the page + complete as well. Code for the database call there but commented out. Background and database call + completed by next week. +WIP on your own branch, need three commits + +Emily talked about login page reformatting, CSS stylesheet being made, header being completed, footer + being formatted correctly, and tables being generated and some dummy data in init_data. Plan to get + the db working so that we can do calls. + +Cater created a footer, has a hot bar, on hover changes color, needs to figure out how to connect an + image to it. Having issues getting local host to open to check it works. +In future weeks, need to commit 3 times a week, need to have a feature. Reason why we have you on branches + is so that you can commit not fully working code but WIP code. Then when complete, push to main. + +Leo created the login page, christmas theme. Don't accoriding to the proposed wireframe template. + Also created a plan for four christmas games that we can work towards. Next week plans to make the + register page, maintain styling for the website, maybe do the footer if need be. + +Sofia created two endpoints for demos for the game. Generated two different ways to generate images, chose svg. + Demo page of getting an item and unlocking a key, and touching a tree and a present and it swaps between + images. Has some script that is primed to scale this up. Fixed the CSS stylesheet so that it doesn't squash + the picture down into the center, now it takes up the right amount of space. Plan for next week, + implement leo's plans for the different pages. + +No major comments, having some issues with the time bar, some guidance given on that. Go to anyone's OHs, not + limited to just Chloe's. Upload the minutes! Also upload the project board to canvas to get credit. From 7ac9ec808d25bc28f0bbf2fb9dd74cd8d8237ea8 Mon Sep 17 00:00:00 2001 From: Emily Smith Date: Tue, 5 Nov 2024 16:51:30 -0700 Subject: [PATCH 05/35] Notes from TA meeting 11/5/2024 --- TeamMeetingLogs/minutes.txt | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/TeamMeetingLogs/minutes.txt b/TeamMeetingLogs/minutes.txt index b278544..29b6e34 100644 --- a/TeamMeetingLogs/minutes.txt +++ b/TeamMeetingLogs/minutes.txt @@ -21,4 +21,38 @@ Leo: Login page Future thoughts: Sofia: Look into body parsers Emily: I'm going to make the header beautiful <3 -Leo: Plan out the different puzzles for Sofia to implement \ No newline at end of file +Leo: Plan out the different puzzles for Sofia to implement + +Meeting 11/5/2024 @4:30pm +Attendees: Emily, Sofia, Leo, Dorjee, Carter? + +Are there any release notes? +More formal release notes for following weeks. "This person did this on this branch etc..." +Dorjee started on the scoreboard page. Shared screen and showed "dummy" content. Plan on having a + global rank and using the database to show the top 10 people. Christmas theme, so no background + yet to reflect that. Plans to implement call from database this week. Get request to render the page + complete as well. Code for the database call there but commented out. Background and database call + completed by next week. +WIP on your own branch, need three commits + +Emily talked about login page reformatting, CSS stylesheet being made, header being completed, footer + being formatted correctly, and tables being generated and some dummy data in init_data. Plan to get + the db working so that we can do calls. + +Cater created a footer, has a hot bar, on hover changes color, needs to figure out how to connect an + image to it. Having issues getting local host to open to check it works. +In future weeks, need to commit 3 times a week, need to have a feature. Reason why we have you on branches + is so that you can commit not fully working code but WIP code. Then when complete, push to main. + +Leo created the login page, christmas theme. Don't accoriding to the proposed wireframe template. + Also created a plan for four christmas games that we can work towards. Next week plans to make the + register page, maintain styling for the website, maybe do the footer if need be. + +Sofia created two endpoints for demos for the game. Generated two different ways to generate images, chose svg. + Demo page of getting an item and unlocking a key, and touching a tree and a present and it swaps between + images. Has some script that is primed to scale this up. Fixed the CSS stylesheet so that it doesn't squash + the picture down into the center, now it takes up the right amount of space. Plan for next week, + implement leo's plans for the different pages. + +No major comments, having some issues with the time bar, some guidance given on that. Go to anyone's OHs, not + limited to just Chloe's. Upload the minutes! Also upload the project board to canvas to get credit. \ No newline at end of file From 0b6fa8d8f1a1c2e455643f7c87e2c97dea6df728 Mon Sep 17 00:00:00 2001 From: Emily Smith Date: Wed, 6 Nov 2024 10:43:42 -0700 Subject: [PATCH 06/35] Emily: Database now functional --- ProjectSourceCode/.env | 7 +++ ProjectSourceCode/docker-compose.yaml | 5 ++- ProjectSourceCode/src/index.js | 50 +++++++++++----------- ProjectSourceCode/src/init_data/create.sql | 17 +++++--- ProjectSourceCode/src/init_data/insert.sql | 43 +++++++------------ 5 files changed, 62 insertions(+), 60 deletions(-) create mode 100644 ProjectSourceCode/.env diff --git a/ProjectSourceCode/.env b/ProjectSourceCode/.env new file mode 100644 index 0000000..33d4900 --- /dev/null +++ b/ProjectSourceCode/.env @@ -0,0 +1,7 @@ +# database credentials +POSTGRES_USER="postgres" +POSTGRES_PASSWORD="pwd" +POSTGRES_DB="users_db" + +# Node vars +SESSION_SECRET="super duper secret!" \ No newline at end of file diff --git a/ProjectSourceCode/docker-compose.yaml b/ProjectSourceCode/docker-compose.yaml index 5b9d1d4..bd89a20 100644 --- a/ProjectSourceCode/docker-compose.yaml +++ b/ProjectSourceCode/docker-compose.yaml @@ -1,6 +1,7 @@ version: '3.9' services: - db: + #these are containers + db: #this is for the database image: postgres:14 env_file: .env expose: @@ -8,7 +9,7 @@ services: volumes: - group-project:/var/lib/postgresql/data - ./src/init_data:/docker-entrypoint-initdb.d - web: + web: #this is for the website image: node:lts user: 'node' working_dir: /repository diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index 65079a5..b99101d 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -3,7 +3,7 @@ const express = require('express'); const app = express(); const handlebars = require('express-handlebars'); const path = require('path'); -const pgp = require('pg-promise')(); +const pgp = require('pg-promise')(); //library that gives me access to make any database that i have access to normally const bodyParser = require('body-parser'); const session = require('express-session'); @@ -19,6 +19,31 @@ const hbs = handlebars.create({ ] }); +// ------------------------------------- DB CONFIG AND CONNECT --------------------------------------- +//TODO: Use this later for setting up db! +//accessed by either: hosted by another entity (need to have the url to access that) + //hosted outself, create two docker containers that runs the application and the other the database +const dbConfig = { + host: 'db', + port: 5432, + database: process.env.POSTGRES_DB, + user: process.env.POSTGRES_USER, + password: process.env.POSTGRES_PASSWORD, +}; +const db = pgp(dbConfig); + + +//// db test +db.connect() + .then(obj => { + // Can check the server version here (pg-promise v10.1.0+): + console.log('Database connection successful'); + obj.done(); // success, release the connection; + }) + .catch(error => { + console.log('ERROR', error.message || error); + }); + // Register `hbs` as our view engine using its bound `engine()` function. app.engine('hbs', hbs.engine); app.set('view engine', 'hbs'); @@ -40,29 +65,6 @@ app.use( }) ); -// ------------------------------------- DB CONFIG AND CONNECT --------------------------------------- -//TODO: Use this later for setting up db! -// const dbConfig = { -// host: 'db', -// port: 5432, -// database: process.env.POSTGRES_DB, -// user: process.env.POSTGRES_USER, -// password: process.env.POSTGRES_PASSWORD, -// }; -// const db = pgp(dbConfig); - - -// //// db test -// db.connect() -// .then(obj => { -// // Can check the server version here (pg-promise v10.1.0+): -// console.log('Database connection successful'); -// obj.done(); // success, release the connection; -// }) -// .catch(error => { -// console.log('ERROR', error.message || error); -// }); - app.get('/game', (req, res) => { res.render('pages/page1'); //this will call the /anotherRoute route in the API diff --git a/ProjectSourceCode/src/init_data/create.sql b/ProjectSourceCode/src/init_data/create.sql index 3a6991f..1f5fb8e 100644 --- a/ProjectSourceCode/src/init_data/create.sql +++ b/ProjectSourceCode/src/init_data/create.sql @@ -1,24 +1,27 @@ +-- need to make PostgresSQL not mySQL CREATE TABLE users ( - user_id SERIAL NOT NULL PRIMARY KEY, + user_id SERIAL PRIMARY KEY, username VARCHAR(30) NOT NULL, password VARCHAR(30) NOT NULL, timer TIME DEFAULT '00:00:00', - progress TINYINT DEFAULT '0' + progress INT DEFAULT '0' ); CREATE TABLE puzzles ( - puzzle_id SERIAL NOT NULL PRIMARY KEY, - value TINYINT NOT NULL + puzzle_id SERIAL PRIMARY KEY, + name VARCHAR(30) NOT NULL, + value INT NOT NULL ); CREATE TABLE users_puzzles ( - user_id FOREIGN KEY (user_id) REFERENCES users(user_id), - puzzle_id FOREIGN KEY (puzzle_id) REFERENCES puzzles(puzzle_id), - is_solved BOOL DEFAULT '0', + user_id INT REFERENCES users(user_id) ON DELETE CASCADE, + puzzle_id INT REFERENCES puzzles(puzzle_id) ON DELETE CASCADE, + is_solved BOOLEAN DEFAULT FALSE, PRIMARY KEY (user_id, puzzle_id) ); CREATE TABLE items ( item_id SERIAL PRIMARY KEY, + name VARCHAR(30) NOT NULL, status VARCHAR(10) CHECK(status IN('unknown','found','active','disabled')) ); \ No newline at end of file diff --git a/ProjectSourceCode/src/init_data/insert.sql b/ProjectSourceCode/src/init_data/insert.sql index f0c6d80..478c963 100644 --- a/ProjectSourceCode/src/init_data/insert.sql +++ b/ProjectSourceCode/src/init_data/insert.sql @@ -3,43 +3,32 @@ -- 1-3 users with username and passwords, default timer and progress INSERT INTO users (username, password) -VALUES ( +VALUES ('test', '123'), - ('admin', 'admin') - ('beep', 'boop') -); + ('admin', 'admin'), + ('beep', 'boop'); --- puzzles 1-4 all valued at 25 -INSERT INTO puzzles (value) -VALUES ( - (25), - (25), - (25), - (25) -); +-- puzzles 1-3, values at 33,33, and 34 (total 100) +INSERT INTO puzzles (name, value) +VALUES + ('Lock_and_key',34), + ('Light_up_tree',33), + ('Open_the_present',33); --- users 1-3 with puzzles 1-4 all unsolved +-- users 1-3 with puzzles 1-3 all unsolved INSERT INTO users_puzzles (user_id, puzzle_id) -VALUES ( +VALUES (1,1), (1,2), (1,3), - (1,4), (2,1), (2,2), (2,3), - (2,4), (3,1), (3,2), - (3,3), - (3,4) -); + (3,3); --- items 1-4 all unknown -INSERT INTO items (status) -VALUES ( - ('unknown'), - ('unknown'), - ('unknown'), - ('unknown') -); \ No newline at end of file +-- items 1 set to unknown +INSERT INTO items (name,status) +VALUES + ('key','unknown'); \ No newline at end of file From f37018098c8d2f5e2550f9fffb1e65495bd7e62b Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 7 Nov 2024 15:29:48 -0700 Subject: [PATCH 07/35] register page -leo --- .../src/views/pages/register.html | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 ProjectSourceCode/src/views/pages/register.html diff --git a/ProjectSourceCode/src/views/pages/register.html b/ProjectSourceCode/src/views/pages/register.html new file mode 100644 index 0000000..5b90818 --- /dev/null +++ b/ProjectSourceCode/src/views/pages/register.html @@ -0,0 +1,127 @@ + + + + + + Register Page + + + + + +
+
+
+
+
+
+
+
+
+
+
+ +

Register to start your adventure!

+
+
+
+ +
+
+ + +
+ + + + + From 7a7852795243d07403add2aa88e4220b5f90f4cc Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:33:10 -0700 Subject: [PATCH 08/35] Lab11 : Update project.json --- ProjectSourceCode/package.json | 43 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/ProjectSourceCode/package.json b/ProjectSourceCode/package.json index 98898d4..489e569 100644 --- a/ProjectSourceCode/package.json +++ b/ProjectSourceCode/package.json @@ -1,18 +1,27 @@ { - "name": "node-ejs", - "main": "index.js", - "dependencies": { - "ejs": "^2.5.5", - "ejs-lint": "^0.3.0", - "body-parser": "^1.20.0", - "express": "^4.6.1", - "express-session": "^1.17.3", - "express-handlebars": "^7.1.2", - "pg-promise": "^10.11.1", - "nodemon": "2.0.20" - }, - "scripts": { - "prestart": "npm install", - "start": "nodemon src/index.js" - } - } \ No newline at end of file + "name": "SoftwareDevTeamProject", + "main": "src/index.js", + "dependencies": { + "express": "^4.6.1", + "pg-promise": "^10.11.1", + "body-parser": "1.20.0", + "express-session": "1.17.3", + "express-handlebars": "^7.1.2", + "handlebars": "^4.7.8", + "axios": "^1.1.3", + "bcryptjs": "^2.4.0" + }, + "devDependencies": { + "nodemon": "^2.0.7", + "mocha": "^6.2.2", + "chai": "^4.2.0", + "chai-http": "^4.3.0", + "npm-run-all": "^4.1.5" + }, + "scripts": { + "prestart": "npm install", + "start": "nodemon index.js", + "test": "mocha", + "testandrun": "npm run prestart && npm run test && npm start" + } +} From f2680a31018c1fbf056ea006f2c59691772dd689 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:34:56 -0700 Subject: [PATCH 09/35] Lab11: Update docker-compose.yaml --- ProjectSourceCode/docker-compose.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectSourceCode/docker-compose.yaml b/ProjectSourceCode/docker-compose.yaml index bd89a20..feb826b 100644 --- a/ProjectSourceCode/docker-compose.yaml +++ b/ProjectSourceCode/docker-compose.yaml @@ -22,6 +22,6 @@ services: - '3000:3000' volumes: - ./:/repository - command: 'npm start' + command: 'npm run testandrun' volumes: - group-project: \ No newline at end of file + group-project: From b8f1fd0de55517772dc18eb3a7e4879d8faf4d86 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:41:25 -0700 Subject: [PATCH 10/35] Lab11: Started test file --- ProjectSourceCode/test/server.spec.js | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/ProjectSourceCode/test/server.spec.js b/ProjectSourceCode/test/server.spec.js index e69de29..c0c3f07 100644 --- a/ProjectSourceCode/test/server.spec.js +++ b/ProjectSourceCode/test/server.spec.js @@ -0,0 +1,32 @@ +// ********************** Initialize server ********************************** + +const server = require('../src/index.js'); //TODO: Make sure the path to your index.js is correctly added + +// ********************** Import Libraries *********************************** + +const chai = require('chai'); // Chai HTTP provides an interface for live integration testing of the API's. +const chaiHttp = require('chai-http'); +chai.should(); +chai.use(chaiHttp); +const {assert, expect} = chai; + +// ********************** DEFAULT WELCOME TESTCASE **************************** + +describe('Server!', () => { + // Sample test case given to test / endpoint. + it('Returns the default welcome message', done => { + chai + .request(server) + .get('/welcome') + .end((err, res) => { + expect(res).to.have.status(200); + expect(res.body.status).to.equals('success'); + assert.strictEqual(res.body.message, 'Welcome!'); + done(); + }); + }); +}); + +// *********************** TODO: WRITE 2 UNIT TESTCASES ************************** + +// ******************************************************************************** From 0e5f7531b56b1b5b56b56cd602bd168b5689e91b Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:46:55 -0700 Subject: [PATCH 11/35] Lab11: Update index.js --- ProjectSourceCode/src/index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index b276888..f450a1f 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -18,7 +18,6 @@ const hbs = handlebars.create({ __dirname + '/views/partials/svg_components' ] }); - // ------------------------------------- DB CONFIG AND CONNECT --------------------------------------- //TODO: Use this later for setting up db! //accessed by either: hosted by another entity (need to have the url to access that) @@ -65,6 +64,10 @@ app.use( }) ); +app.get('/welcome', (req, res) => { + res.json({status: 'success', message: 'Welcome!'}); +}); + app.get('/page1', (req, res) => { res.render('pages/page1'); //this will call the /anotherRoute route in the API @@ -116,5 +119,5 @@ app.post('/login', async (req, res) => { } }) -app.listen(3000); +module.exports = app.listen(3000); console.log('Server is listening on port 3000'); From c85159d51c48d19ba1a357df5583abcac38acb93 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:50:04 -0700 Subject: [PATCH 12/35] Lab11: Added basic add_user tests from lab writeup --- ProjectSourceCode/test/server.spec.js | 49 +++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/ProjectSourceCode/test/server.spec.js b/ProjectSourceCode/test/server.spec.js index c0c3f07..19f1afc 100644 --- a/ProjectSourceCode/test/server.spec.js +++ b/ProjectSourceCode/test/server.spec.js @@ -29,4 +29,53 @@ describe('Server!', () => { // *********************** TODO: WRITE 2 UNIT TESTCASES ************************** +// Example Positive Testcase : +// API: /add_user +// Input: {id: 5, name: 'John Doe', dob: '2020-02-20'} +// Expect: res.status == 200 and res.body.message == 'Success' +// Result: This test case should pass and return a status 200 along with a "Success" message. +// Explanation: The testcase will call the /add_user API with the following input +// and expects the API to return a status of 200 along with the "Success" message. + +describe('Testing Add User API', () => { + it('positive : /add_user', done => { + chai + .request(server) + .post('/add_user') + .send({username: 'John Doe', password: 'BigTester'}) + .end((err, res) => { + expect(res).to.have.status(200); + expect(res.body.message).to.equals('Success'); + done(); + }); + }); +}); + +//We are checking POST /add_user API by passing the user info in in incorrect manner (name cannot be an integer). This test case should pass and return a status 400 along with a "Invalid input" message. + +describe('Testing Add User API', () => { + it('positive : /add_user', done => { + // Refer above for the positive testcase implementation + }); + + // Example Negative Testcase : + // API: /add_user + // Input: {id: 5, name: 10, dob: '2020-02-20'} + // Expect: res.status == 400 and res.body.message == 'Invalid input' + // Result: This test case should pass and return a status 400 along with a "Invalid input" message. + // Explanation: The testcase will call the /add_user API with the following invalid inputs + // and expects the API to return a status of 400 along with the "Invalid input" message. + it('Negative : /add_user. Checking invalid name', done => { + chai + .request(server) + .post('/add_user') + .send({username: 10, password: 'BigTester'}) + .end((err, res) => { + expect(res).to.have.status(400); + expect(res.body.message).to.equals('Invalid input'); + done(); + }); + }); +}); + // ******************************************************************************** From 71b29d949b6d812bb0c0896cf8471dc015aff6e1 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:51:56 -0700 Subject: [PATCH 13/35] Lab11: Updating descriptions --- ProjectSourceCode/test/server.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectSourceCode/test/server.spec.js b/ProjectSourceCode/test/server.spec.js index 19f1afc..ab51f4a 100644 --- a/ProjectSourceCode/test/server.spec.js +++ b/ProjectSourceCode/test/server.spec.js @@ -37,7 +37,7 @@ describe('Server!', () => { // Explanation: The testcase will call the /add_user API with the following input // and expects the API to return a status of 200 along with the "Success" message. -describe('Testing Add User API', () => { +describe('Testing Add User Account', () => { it('positive : /add_user', done => { chai .request(server) @@ -53,7 +53,7 @@ describe('Testing Add User API', () => { //We are checking POST /add_user API by passing the user info in in incorrect manner (name cannot be an integer). This test case should pass and return a status 400 along with a "Invalid input" message. -describe('Testing Add User API', () => { +describe('Testing Add User Account', () => { it('positive : /add_user', done => { // Refer above for the positive testcase implementation }); From a5f9aa99ee668bfd98a285152229f87819a28236 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:57:15 -0700 Subject: [PATCH 14/35] Emily: Added register get/post --- ProjectSourceCode/src/index.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index f450a1f..5038c99 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -119,5 +119,34 @@ app.post('/login', async (req, res) => { } }) +//register +app.get('/register', (req, res) => { + res.render('pages/register'); +}); + +//from lab 8 +app.post('/register', async (req, res) => { + //hash the password using bcrypt library + const hash = await bcrypt.hash(req.body.password, 10); + + // DONE: Insert username and hashed password into the 'users' table + const username = req.body.username + //the rest of the information in the users table is auto generated + const sqlRegister = "INSERT INTO users (username, password) VALUES ($1, $2) RETURNING *;" + db.any(sqlRegister, [username, hash]) + /* + Redirect to GET /login route page after data has been inserted successfully. + If the insert fails, redirect to GET /register route. + */ + .then(data => { + // console.log("Registered user with: ", data) + //res.redirect('/login', {message:"Error discovering data.", error:true}) + res.redirect('/login', {message:"Registration Successful!", error:false}) + }) + .catch(function (err) { + res.redirect('/register', {message:"Registration Error!", error:true}) + }); +}); + module.exports = app.listen(3000); console.log('Server is listening on port 3000'); From fa189655e70bb9bbe3f32feb9d93b4325af49f66 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:58:49 -0700 Subject: [PATCH 15/35] Lab11: Create account tests added --- ProjectSourceCode/test/server.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ProjectSourceCode/test/server.spec.js b/ProjectSourceCode/test/server.spec.js index ab51f4a..430305f 100644 --- a/ProjectSourceCode/test/server.spec.js +++ b/ProjectSourceCode/test/server.spec.js @@ -38,10 +38,10 @@ describe('Server!', () => { // and expects the API to return a status of 200 along with the "Success" message. describe('Testing Add User Account', () => { - it('positive : /add_user', done => { + it('positive : /register', done => { chai .request(server) - .post('/add_user') + .post('/regsiter') .send({username: 'John Doe', password: 'BigTester'}) .end((err, res) => { expect(res).to.have.status(200); @@ -54,7 +54,7 @@ describe('Testing Add User Account', () => { //We are checking POST /add_user API by passing the user info in in incorrect manner (name cannot be an integer). This test case should pass and return a status 400 along with a "Invalid input" message. describe('Testing Add User Account', () => { - it('positive : /add_user', done => { + it('positive : /register', done => { // Refer above for the positive testcase implementation }); @@ -68,7 +68,7 @@ describe('Testing Add User Account', () => { it('Negative : /add_user. Checking invalid name', done => { chai .request(server) - .post('/add_user') + .post('/register') .send({username: 10, password: 'BigTester'}) .end((err, res) => { expect(res).to.have.status(400); From e3d1ed6c79e7c884f95e8ca95c64c41f3ab99be9 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:00:04 -0700 Subject: [PATCH 16/35] Emily: Updated register check --- ProjectSourceCode/test/server.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectSourceCode/test/server.spec.js b/ProjectSourceCode/test/server.spec.js index 430305f..43b06e6 100644 --- a/ProjectSourceCode/test/server.spec.js +++ b/ProjectSourceCode/test/server.spec.js @@ -1,6 +1,6 @@ // ********************** Initialize server ********************************** -const server = require('../src/index.js'); //TODO: Make sure the path to your index.js is correctly added +const server = require('../src/index.js'); //DONE: Make sure the path to your index.js is correctly added // ********************** Import Libraries *********************************** @@ -65,7 +65,7 @@ describe('Testing Add User Account', () => { // Result: This test case should pass and return a status 400 along with a "Invalid input" message. // Explanation: The testcase will call the /add_user API with the following invalid inputs // and expects the API to return a status of 400 along with the "Invalid input" message. - it('Negative : /add_user. Checking invalid name', done => { + it('Negative : /register. Checking invalid name', done => { chai .request(server) .post('/register') From f1ff5dfd8f4f4a48a62b1b91ca12eb43628f1184 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:17:25 -0700 Subject: [PATCH 17/35] Emily: Added dummy code for page3 for index.js get call --- ProjectSourceCode/src/views/pages/page3.hbs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ProjectSourceCode/src/views/pages/page3.hbs b/ProjectSourceCode/src/views/pages/page3.hbs index e69de29..9c8e049 100644 --- a/ProjectSourceCode/src/views/pages/page3.hbs +++ b/ProjectSourceCode/src/views/pages/page3.hbs @@ -0,0 +1,3 @@ + + This is a sample page3! + From 607c616b3c5a3b335bad79ec1bbad8276e9d1e9e Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:17:58 -0700 Subject: [PATCH 18/35] Emily: Added page3 get call --- ProjectSourceCode/src/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index 5038c99..825f9f3 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -77,6 +77,10 @@ app.get('/page2', (req, res) => { res.render('pages/page2'); //this will call the /anotherRoute route in the API }); +app.get('/page3', (req, res) => { + res.render('pages/page3'); //this will call the /anotherRoute route in the API +}); + app.get('/', (req, res) => { res.redirect('/login'); //this will call the /anotherRoute route in the API }); From 7a155b807cf20cc32c8744672a6dad9a811b0147 Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 7 Nov 2024 22:38:15 -0700 Subject: [PATCH 19/35] SVG's for scene 1 & 2, WIP --- .../src/resources/plain_svg/scene1_test.svg | 843 ++++++++++++++++++ .../plain_svg/scene2_cutting_cookies.svg | 376 ++++++++ .../plain_svg/scene2_making_dough.svg | 273 ++++++ .../plain_svg/{scene2.svg => scene2_test.svg} | 0 4 files changed, 1492 insertions(+) create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene1_test.svg create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg rename ProjectSourceCode/src/resources/plain_svg/{scene2.svg => scene2_test.svg} (100%) diff --git a/ProjectSourceCode/src/resources/plain_svg/scene1_test.svg b/ProjectSourceCode/src/resources/plain_svg/scene1_test.svg new file mode 100644 index 0000000..6b28126 --- /dev/null +++ b/ProjectSourceCode/src/resources/plain_svg/scene1_test.svg @@ -0,0 +1,843 @@ + + + + diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg new file mode 100644 index 0000000..ca3b7f3 --- /dev/null +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg @@ -0,0 +1,376 @@ + + + + diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg new file mode 100644 index 0000000..850ba59 --- /dev/null +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg @@ -0,0 +1,273 @@ + + + + diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_test.svg similarity index 100% rename from ProjectSourceCode/src/resources/plain_svg/scene2.svg rename to ProjectSourceCode/src/resources/plain_svg/scene2_test.svg From 7d8e310a4626dd77296349a50c24e266e1b344e4 Mon Sep 17 00:00:00 2001 From: Sofia Date: Fri, 8 Nov 2024 15:02:32 -0700 Subject: [PATCH 20/35] Small edits to svg's for gameplay --- .../src/resources/plain_svg/scene1.svg | 806 ++++++++++++++++++ .../plain_svg/scene2_cutting_cookies.svg | 153 ++-- .../plain_svg/scene2_making_dough.svg | 103 +-- 3 files changed, 913 insertions(+), 149 deletions(-) create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene1.svg diff --git a/ProjectSourceCode/src/resources/plain_svg/scene1.svg b/ProjectSourceCode/src/resources/plain_svg/scene1.svg new file mode 100644 index 0000000..3955d4e --- /dev/null +++ b/ProjectSourceCode/src/resources/plain_svg/scene1.svg @@ -0,0 +1,806 @@ + + + + diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg index ca3b7f3..d6b618a 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg @@ -23,29 +23,24 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="0.50940487" - inkscape:cx="429.91344" - inkscape:cy="544.75333" + inkscape:zoom="0.4966185" + inkscape:cx="375.53978" + inkscape:cy="582.94244" inkscape:window-width="1512" inkscape:window-height="916" inkscape:window-x="0" inkscape:window-y="38" inkscape:window-maximized="0" inkscape:current-layer="layer1" /> + id="path9-9" + inkscape:label="path9-9" /> diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg index 850ba59..c024332 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg @@ -7,9 +7,9 @@ viewBox="0 0 211.66666 211.66667" version="1.1" id="svg1" - inkscape:version="1.3 (0e150ed, 2023-07-21)" - sodipodi:docname="scene2_making_dough.svg" xml:space="preserve" + sodipodi:docname="scene2_making_dough.svg" + inkscape:version="1.3 (0e150ed, 2023-07-21)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -22,32 +22,23 @@ inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" - inkscape:document-units="mm" - inkscape:zoom="0.75047828" - inkscape:cx="381.09031" - inkscape:cy="429.72596" + inkscape:zoom="0.48370896" + inkscape:cx="350.41733" + inkscape:cy="511.67132" inkscape:window-width="1512" inkscape:window-height="916" inkscape:window-x="0" inkscape:window-y="38" - inkscape:window-maximized="0" - inkscape:current-layer="layer1" /> + id="path3" /> 0/3 From faf0b1e9c1bbdeef5d7b8b702f73024efb1882c6 Mon Sep 17 00:00:00 2001 From: Sofia Date: Fri, 8 Nov 2024 20:03:21 -0700 Subject: [PATCH 21/35] SVG Palooza, even more svg's --- .../src/resources/plain_svg/scene1.svg | 116 ++-- .../plain_svg/scene2_cutting_cookies.svg | 40 +- .../plain_svg/scene2_making_dough.svg | 105 ++-- .../src/resources/plain_svg/scene3_part1.svg | 361 ++++++++++++ .../src/resources/plain_svg/scene3_part2.svg | 282 +++++++++ .../src/resources/plain_svg/scene4.svg | 537 ++++++++++++++++++ 6 files changed, 1317 insertions(+), 124 deletions(-) create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene3_part1.svg create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene3_part2.svg create mode 100644 ProjectSourceCode/src/resources/plain_svg/scene4.svg diff --git a/ProjectSourceCode/src/resources/plain_svg/scene1.svg b/ProjectSourceCode/src/resources/plain_svg/scene1.svg index 3955d4e..c5aadac 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene1.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene1.svg @@ -8,8 +8,29 @@ version="1.1" id="svg1" xml:space="preserve" + sodipodi:docname="scene1.svg" + inkscape:version="1.3 (0e150ed, 2023-07-21)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> + id="path13-1-0-7-8-7" /> diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg index d6b618a..28d050a 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg @@ -23,9 +23,9 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="0.4966185" - inkscape:cx="375.53978" - inkscape:cy="582.94244" + inkscape:zoom="0.44924673" + inkscape:cx="191.43156" + inkscape:cy="330.55332" inkscape:window-width="1512" inkscape:window-height="916" inkscape:window-x="0" @@ -161,40 +161,6 @@ height="3.1013074" x="73.406136" y="141.33737" /> + + +0/3 diff --git a/ProjectSourceCode/src/resources/plain_svg/scene3_part2.svg b/ProjectSourceCode/src/resources/plain_svg/scene3_part2.svg new file mode 100644 index 0000000..ee8c48f --- /dev/null +++ b/ProjectSourceCode/src/resources/plain_svg/scene3_part2.svg @@ -0,0 +1,282 @@ + + + +0/3 diff --git a/ProjectSourceCode/src/resources/plain_svg/scene4.svg b/ProjectSourceCode/src/resources/plain_svg/scene4.svg new file mode 100644 index 0000000..99adb77 --- /dev/null +++ b/ProjectSourceCode/src/resources/plain_svg/scene4.svg @@ -0,0 +1,537 @@ + + + + From fab32a9ada66a669f112df5c63dead59154c2f04 Mon Sep 17 00:00:00 2001 From: Sofia Date: Fri, 8 Nov 2024 20:10:42 -0700 Subject: [PATCH 22/35] Simpler svg's (no inkscape bloat) --- .../plain_svg/scene2_cutting_cookies.svg | 56 +++-------------- .../plain_svg/scene2_making_dough.svg | 40 +++--------- .../src/resources/plain_svg/scene2_test.svg | 62 ------------------- .../src/resources/plain_svg/scene3_part1.svg | 44 +++---------- .../src/resources/plain_svg/scene3_part2.svg | 31 +--------- .../src/resources/plain_svg/scene4.svg | 38 +++--------- 6 files changed, 36 insertions(+), 235 deletions(-) delete mode 100644 ProjectSourceCode/src/resources/plain_svg/scene2_test.svg diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg index 28d050a..77030c0 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_cutting_cookies.svg @@ -7,42 +7,17 @@ viewBox="0 0 211.66666 211.66667" version="1.1" id="svg1" - inkscape:version="1.3 (0e150ed, 2023-07-21)" - sodipodi:docname="scene2_cutting_cookies.svg" xml:space="preserve" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> + id="path9-9" /> diff --git a/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg b/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg index d750721..21575ec 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene2_making_dough.svg @@ -8,29 +8,8 @@ version="1.1" id="svg1" xml:space="preserve" - sodipodi:docname="scene2_making_dough.svg" - inkscape:version="1.3 (0e150ed, 2023-07-21)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - - - diff --git a/ProjectSourceCode/src/resources/plain_svg/scene3_part1.svg b/ProjectSourceCode/src/resources/plain_svg/scene3_part1.svg index ec38a22..907e22b 100644 --- a/ProjectSourceCode/src/resources/plain_svg/scene3_part1.svg +++ b/ProjectSourceCode/src/resources/plain_svg/scene3_part1.svg @@ -8,29 +8,8 @@ version="1.1" id="svg1" xml:space="preserve" - sodipodi:docname="scene3_part1.svg" - inkscape:version="1.3 (0e150ed, 2023-07-21)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> Date: Sun, 10 Nov 2024 20:16:30 -0700 Subject: [PATCH 23/35] Emily: Post for update_item_status --- ProjectSourceCode/src/index.js | 44 ++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index 825f9f3..727cfa4 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -4,8 +4,10 @@ const app = express(); const handlebars = require('express-handlebars'); const path = require('path'); const pgp = require('pg-promise')(); //library that gives me access to make any database that i have access to normally +const bcrypt = require('bcryptjs'); // To hash passwords const bodyParser = require('body-parser'); const session = require('express-session'); +const { getBuiltinModule } = require('process'); // ------------------------------------- APP CONFIG ---------------------------------------------- @@ -77,6 +79,33 @@ app.get('/page2', (req, res) => { res.render('pages/page2'); //this will call the /anotherRoute route in the API }); +app.post('/update_item_status', async (req, res) => { + const {item_id, new_status} = req.body; + //try to update the item status + try{ + const sql_item_update = 'UPDATE items SET status = $1 WHERE item_id = $2 RETURNING *'; + //call update with db.one and the new_status and item_id that we want to update + db.one(sql_item_update, [new_status, item_id]) + //do we need the data? just put it because I always do. + //also, don't reload the page bc tehre's no need (I think? We dont' want to have to refresh the page everytime we click an item) + .then(data => { + res.status(200).send('Item status updated successfully!'); + console.log('Item_id: ', item_id, " and new_status: ", new_status); + }) + //reload the page with the error message pop-up + .catch(function (err) { + res.status(400); + res.redirect('/page2', {message:"Item Status Update Error!"}); + }); + } + //error if unable to + catch (error){ + console.error('Error updating item status: ', error); + res.status(400).send({error: 'Failed to update item status.'}); + } +}) + + app.get('/page3', (req, res) => { res.render('pages/page3'); //this will call the /anotherRoute route in the API }); @@ -134,10 +163,12 @@ app.post('/register', async (req, res) => { const hash = await bcrypt.hash(req.body.password, 10); // DONE: Insert username and hashed password into the 'users' table - const username = req.body.username + const username = req.body.username; + console.log(username, password, hash); //the rest of the information in the users table is auto generated - const sqlRegister = "INSERT INTO users (username, password) VALUES ($1, $2) RETURNING *;" - db.any(sqlRegister, [username, hash]) + const sqlRegister = "INSERT INTO users (username, password) VALUES ($1, $2);" ;//removed returning * + + db.none(sqlRegister, [username, hash]) //changed any to none /* Redirect to GET /login route page after data has been inserted successfully. If the insert fails, redirect to GET /register route. @@ -145,10 +176,13 @@ app.post('/register', async (req, res) => { .then(data => { // console.log("Registered user with: ", data) //res.redirect('/login', {message:"Error discovering data.", error:true}) - res.redirect('/login', {message:"Registration Successful!", error:false}) + res.status(200); + res.redirect('/login', {message:"Registration Successful!"}); + // res.redirect('/login'); }) .catch(function (err) { - res.redirect('/register', {message:"Registration Error!", error:true}) + res.status(400); + res.redirect('/register', {message:"Registration Error!"}); }); }); From a3293817e8e652c0f8914ee4b53792b5dee1f898 Mon Sep 17 00:00:00 2001 From: Sofia Date: Sun, 10 Nov 2024 20:58:22 -0700 Subject: [PATCH 24/35] Uploading test plan + changing default docker command from 'test' to 'run' --- .../Lab 11 Deliverable Test Plan.docx | Bin 0 -> 12005 bytes .../Lab 11 Deliverable Test Plan.pdf | Bin 0 -> 78193 bytes ProjectSourceCode/docker-compose.yaml | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 MilestoneSubmissions/Lab 11 Deliverable Test Plan.docx create mode 100644 MilestoneSubmissions/Lab 11 Deliverable Test Plan.pdf diff --git a/MilestoneSubmissions/Lab 11 Deliverable Test Plan.docx b/MilestoneSubmissions/Lab 11 Deliverable Test Plan.docx new file mode 100644 index 0000000000000000000000000000000000000000..35281df73ffaf64b06b075bce6812dcbdbda8d1a GIT binary patch literal 12005 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 L%SROGe*gP_y6L|t literal 0 HcmV?d00001 diff --git a/MilestoneSubmissions/Lab 11 Deliverable Test Plan.pdf b/MilestoneSubmissions/Lab 11 Deliverable Test Plan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..48724f4e90fbc321d14832cdb8aa733cbf56ffcb GIT binary patch literal 78193 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 KRYpw~=f41wJ0uPO literal 0 HcmV?d00001 diff --git a/ProjectSourceCode/docker-compose.yaml b/ProjectSourceCode/docker-compose.yaml index feb826b..8fff004 100644 --- a/ProjectSourceCode/docker-compose.yaml +++ b/ProjectSourceCode/docker-compose.yaml @@ -22,6 +22,6 @@ services: - '3000:3000' volumes: - ./:/repository - command: 'npm run testandrun' + command: 'npm run start' volumes: group-project: From 91f9984122efedee498a8f57b3e592264b73112f Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Mon, 11 Nov 2024 08:03:58 -0700 Subject: [PATCH 25/35] Emily: Reformatted meeting logs --- TeamMeetingLogs/meeting1.txt | 24 ++++++++++++++++++++++++ TeamMeetingLogs/meeting2.txt | 33 +++++++++++++++++++++++++++++++++ TeamMeetingLogs/meeting3.txt | 24 ++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 TeamMeetingLogs/meeting1.txt create mode 100644 TeamMeetingLogs/meeting2.txt create mode 100644 TeamMeetingLogs/meeting3.txt diff --git a/TeamMeetingLogs/meeting1.txt b/TeamMeetingLogs/meeting1.txt new file mode 100644 index 0000000..b278544 --- /dev/null +++ b/TeamMeetingLogs/meeting1.txt @@ -0,0 +1,24 @@ +Meeting 11/3/2024 @ 4pm +Attendees: Emily, Sofia, Leo +Excused: Dorjee +Did not attend: Carter + +What has been completed? +Sofia: Worked on rendering the game, made the structure, separated out the function and the structure so that it's easier to expand, setup partials with the index.js for the login +Emily: Added messages partial, added get/post for login +Leo: Written the structure for the login page + +What is still in progress? +Sofia: Working on swapping between scenes +Emily: Going to OHs this week to get postgres set up (or at least started), starting to work on header partial +Leo: Working on the login page + +What will be our deliverables by Tuesday's meeting? +Sofia: Create an internal variable to test puzzle solving +Emily: Header partial (not pretty but working probably) +Leo: Login page + +Future thoughts: +Sofia: Look into body parsers +Emily: I'm going to make the header beautiful <3 +Leo: Plan out the different puzzles for Sofia to implement \ No newline at end of file diff --git a/TeamMeetingLogs/meeting2.txt b/TeamMeetingLogs/meeting2.txt new file mode 100644 index 0000000..e54fcac --- /dev/null +++ b/TeamMeetingLogs/meeting2.txt @@ -0,0 +1,33 @@ +Meeting 11/5/2024 @4:30pm +Attendees: Emily, Sofia, Leo, Dorjee, Carter + +Are there any release notes? +More formal release notes for following weeks. "This person did this on this branch etc..." +Dorjee started on the scoreboard page. Shared screen and showed "dummy" content. Plan on having a + global rank and using the database to show the top 10 people. Christmas theme, so no background + yet to reflect that. Plans to implement call from database this week. Get request to render the page + complete as well. Code for the database call there but commented out. Background and database call + completed by next week. +WIP on your own branch, need three commits + +Emily talked about login page reformatting, CSS stylesheet being made, header being completed, footer + being formatted correctly, and tables being generated and some dummy data in init_data. Plan to get + the db working so that we can do calls. + +Cater created a footer, has a hot bar, on hover changes color, needs to figure out how to connect an + image to it. Having issues getting local host to open to check it works. +In future weeks, need to commit 3 times a week, need to have a feature. Reason why we have you on branches + is so that you can commit not fully working code but WIP code. Then when complete, push to main. + +Leo created the login page, christmas theme. Don't accoriding to the proposed wireframe template. + Also created a plan for four christmas games that we can work towards. Next week plans to make the + register page, maintain styling for the website, maybe do the footer if need be. + +Sofia created two endpoints for demos for the game. Generated two different ways to generate images, chose svg. + Demo page of getting an item and unlocking a key, and touching a tree and a present and it swaps between + images. Has some script that is primed to scale this up. Fixed the CSS stylesheet so that it doesn't squash + the picture down into the center, now it takes up the right amount of space. Plan for next week, + implement leo's plans for the different pages. + +No major comments, having some issues with the time bar, some guidance given on that. Go to anyone's OHs, not + limited to just Chloe's. Upload the minutes! Also upload the project board to canvas to get credit. \ No newline at end of file diff --git a/TeamMeetingLogs/meeting3.txt b/TeamMeetingLogs/meeting3.txt new file mode 100644 index 0000000..56781cf --- /dev/null +++ b/TeamMeetingLogs/meeting3.txt @@ -0,0 +1,24 @@ +Meeting 11/10/2024 @ 8pm +Attendees: Emily, Sofia, Dorjee +Excused: +Did not attend: Leo, Carter + +What has been completed? +Sofia: Created the scenes based on Leo's writeup suggestions, changed the svgstorage method (simplified) +Emily: Database is now working, POST request for updating status +Dorjee: Nothing yet. + +What is still in progress? +Sofia: Nothing, done for the week. +Emily: Tests from lab and get reqeust for item status (talk to someone in OHs about that). +Dorjee: Fully implement the scoreboard with christmas theme and timer. Reassigned to and going to prioritize inventory creation. + +What will be our deliverables by Tuesday's meeting? +Sofia: Scenes loaded with things hidden that should be. +Emily: Have the tests from Lab working and done so that we don't fail. :( +Dorjee: Plans to have scoreboard and timer by Tuesday and inventory by Friday. + +Future thoughts: +Sofia: Get some basic logic out and work with Dorjee to get it so that if you have the item you can get the thing, etc... And working on scene swapping. +Emily: Inventory needs to be done by Friday so that we can work on implementing key elements over the weekend / before Tuesday. +Dorjee: Unsure yet, wanna see how current workload looks on tuesday. From d5b3b0619181b3273443982f760d5a28170392c6 Mon Sep 17 00:00:00 2001 From: emsm2434 <90489000+emsm2434@users.noreply.github.com> Date: Mon, 11 Nov 2024 08:04:45 -0700 Subject: [PATCH 26/35] Emily: Deleted minutes.txt because it's redundant now --- TeamMeetingLogs/minutes.txt | 58 ------------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 TeamMeetingLogs/minutes.txt diff --git a/TeamMeetingLogs/minutes.txt b/TeamMeetingLogs/minutes.txt deleted file mode 100644 index 33e3b12..0000000 --- a/TeamMeetingLogs/minutes.txt +++ /dev/null @@ -1,58 +0,0 @@ -Meeting 11/3/2024 @ 4pm -Attendees: Emily, Sofia, Leo -Excused: Dorjee -Did not attend: Carter - -What has been completed? -Sofia: Worked on rendering the game, made the structure, separated out the function and the structure so that it's easier to expand, setup partials with the index.js for the login -Emily: Added messages partial, added get/post for login -Leo: Written the structure for the login page - -What is still in progress? -Sofia: Working on swapping between scenes -Emily: Going to OHs this week to get postgres set up (or at least started), starting to work on header partial -Leo: Working on the login page - -What will be our deliverables by Tuesday's meeting? -Sofia: Create an internal variable to test puzzle solving -Emily: Header partial (not pretty but working probably) -Leo: Login page - -Future thoughts: -Sofia: Look into body parsers -Emily: I'm going to make the header beautiful <3 -Leo: Plan out the different puzzles for Sofia to implement - -Meeting 11/5/2024 @4:30pm -Attendees: Emily, Sofia, Leo, Dorjee, Carter - -Are there any release notes? -More formal release notes for following weeks. "This person did this on this branch etc..." -Dorjee started on the scoreboard page. Shared screen and showed "dummy" content. Plan on having a - global rank and using the database to show the top 10 people. Christmas theme, so no background - yet to reflect that. Plans to implement call from database this week. Get request to render the page - complete as well. Code for the database call there but commented out. Background and database call - completed by next week. -WIP on your own branch, need three commits - -Emily talked about login page reformatting, CSS stylesheet being made, header being completed, footer - being formatted correctly, and tables being generated and some dummy data in init_data. Plan to get - the db working so that we can do calls. - -Cater created a footer, has a hot bar, on hover changes color, needs to figure out how to connect an - image to it. Having issues getting local host to open to check it works. -In future weeks, need to commit 3 times a week, need to have a feature. Reason why we have you on branches - is so that you can commit not fully working code but WIP code. Then when complete, push to main. - -Leo created the login page, christmas theme. Don't accoriding to the proposed wireframe template. - Also created a plan for four christmas games that we can work towards. Next week plans to make the - register page, maintain styling for the website, maybe do the footer if need be. - -Sofia created two endpoints for demos for the game. Generated two different ways to generate images, chose svg. - Demo page of getting an item and unlocking a key, and touching a tree and a present and it swaps between - images. Has some script that is primed to scale this up. Fixed the CSS stylesheet so that it doesn't squash - the picture down into the center, now it takes up the right amount of space. Plan for next week, - implement leo's plans for the different pages. - -No major comments, having some issues with the time bar, some guidance given on that. Go to anyone's OHs, not - limited to just Chloe's. Upload the minutes! Also upload the project board to canvas to get credit. From 4026b72ca08aef3ac244fe8b3cf175729c123998 Mon Sep 17 00:00:00 2001 From: Emily Smith Date: Mon, 11 Nov 2024 09:59:30 -0700 Subject: [PATCH 27/35] Emily: Temp Register Page added, registration works, login works, logout works, but doesn't restrict access to game, links work to the pages I have in my current branch except scoreboard (works but no code there yet) --- ProjectSourceCode/src/index.js | 44 ++++++++++++++----- ProjectSourceCode/src/init_data/create.sql | 4 +- ProjectSourceCode/src/init_data/insert.sql | 15 ++++--- ProjectSourceCode/src/resources/css/style.css | 19 +++++++- ProjectSourceCode/src/views/pages/login.hbs | 2 + .../src/views/pages/register.hbs | 29 ++++++++++++ .../src/views/partials/footer.hbs | 7 +-- 7 files changed, 97 insertions(+), 23 deletions(-) diff --git a/ProjectSourceCode/src/index.js b/ProjectSourceCode/src/index.js index 727cfa4..6eb171d 100644 --- a/ProjectSourceCode/src/index.js +++ b/ProjectSourceCode/src/index.js @@ -119,8 +119,11 @@ app.get('/login', (req, res) => { }); app.post('/login', async (req, res) => { + console.log('login post accessed') const username = req.body.username const password = req.body.password + const hash = await bcrypt.hash(password, 10); + console.log("Hashed password:", hash) const sqlUsername = "SELECT * FROM users WHERE username = $1;" try{ @@ -128,19 +131,21 @@ app.post('/login', async (req, res) => { const user = await db.one(sqlUsername, [username]) const match = await bcrypt.compare(password, user.password) - - // console.log("User is:", user); - // console.log("Matched as:", match); + //looks like there's a space for some reason? Why tho...? + console.log("Username is:", username, ", Other username is:", user.username); + console.log("Password is: ", password, ", Other password is: ", user.password) + console.log("Matched as:", match); // rest is mine from earlier if(match){ - // console.log("if statement") + // if (user.password == password && user.username == username){ + console.log("if statement") req.session.user = user; req.session.save(); - res.redirect('/discover') + res.redirect('/page1') } else{ - // console.log("else statement") + console.log("else statement") // If the password is incorrect, render the login page and send a message to the user stating "Incorrect username or password." res.render('pages/login', {message:"Incorrect username or password.", error:true}) // res.render('/login') @@ -164,6 +169,7 @@ app.post('/register', async (req, res) => { // DONE: Insert username and hashed password into the 'users' table const username = req.body.username; + const password = req.body.password; console.log(username, password, hash); //the rest of the information in the users table is auto generated const sqlRegister = "INSERT INTO users (username, password) VALUES ($1, $2);" ;//removed returning * @@ -176,15 +182,33 @@ app.post('/register', async (req, res) => { .then(data => { // console.log("Registered user with: ", data) //res.redirect('/login', {message:"Error discovering data.", error:true}) - res.status(200); - res.redirect('/login', {message:"Registration Successful!"}); + res.status(200).render('pages/login', {message: "Registration Successful!"}); + // res.redirect('/login', {message:"Registration Successful!"}); // res.redirect('/login'); }) .catch(function (err) { - res.status(400); - res.redirect('/register', {message:"Registration Error!"}); + res.status(400).render('page/register', {message: "Registration Error!", error: true}); + // res.redirect('/register', {message:"Registration Error!", error: true}); }); }); +// Authentication Middleware. +const auth = (req, res, next) => { + // console.log(req.session) + if (!req.session.user) { + // Default to login page. + return res.redirect('/login'); + } + next(); +}; + +// Authentication Required +app.use(auth); + +app.get('/logout', (req, res) => { + req.session.destroy() + res.render('pages/login', {message:"Logged out successfully!", error:false}) +}); + module.exports = app.listen(3000); console.log('Server is listening on port 3000'); diff --git a/ProjectSourceCode/src/init_data/create.sql b/ProjectSourceCode/src/init_data/create.sql index 1f5fb8e..aead9dc 100644 --- a/ProjectSourceCode/src/init_data/create.sql +++ b/ProjectSourceCode/src/init_data/create.sql @@ -1,8 +1,8 @@ -- need to make PostgresSQL not mySQL CREATE TABLE users ( user_id SERIAL PRIMARY KEY, - username VARCHAR(30) NOT NULL, - password VARCHAR(30) NOT NULL, + username VARCHAR(30) NOT NULL UNIQUE, + password CHAR(60) NOT NULL, timer TIME DEFAULT '00:00:00', progress INT DEFAULT '0' ); diff --git a/ProjectSourceCode/src/init_data/insert.sql b/ProjectSourceCode/src/init_data/insert.sql index 478c963..d774383 100644 --- a/ProjectSourceCode/src/init_data/insert.sql +++ b/ProjectSourceCode/src/init_data/insert.sql @@ -4,9 +4,10 @@ -- 1-3 users with username and passwords, default timer and progress INSERT INTO users (username, password) VALUES - ('test', '123'), - ('admin', 'admin'), - ('beep', 'boop'); + -- username: admin, password: admin + ('admin','$2a$10$UjNEiZ7DKCr4iTt3.yRD3uAswujYyjRdzi8UsCI4S1UAbVldSPCWu'), + -- username: beep, password: boop + ('beep','$2a$10$n4si2D1TNuaFohFTsxx/A.HAlDRag2cs6fkwmU2XdYiAYLGmmXTOi'); -- puzzles 1-3, values at 33,33, and 34 (total 100) INSERT INTO puzzles (name, value) @@ -23,10 +24,10 @@ VALUES (1,3), (2,1), (2,2), - (2,3), - (3,1), - (3,2), - (3,3); + (2,3); + -- (3,1), + -- (3,2), + -- (3,3); -- items 1 set to unknown INSERT INTO items (name,status) diff --git a/ProjectSourceCode/src/resources/css/style.css b/ProjectSourceCode/src/resources/css/style.css index 99883fc..fb872bc 100644 --- a/ProjectSourceCode/src/resources/css/style.css +++ b/ProjectSourceCode/src/resources/css/style.css @@ -11,6 +11,23 @@ text-align: center; } +.footer { + height:10vh; + background-color: #2e5d31; + color: white; + padding: 10px; + width: 100%; + font-family: 'Mountains of Christmas'; + text-align: center; +} + +.footer a { + color: white; + padding: 5px 10px; + transition: background .3s; + font-weight: bolder; +} + .non-header { height:90vh; } @@ -42,7 +59,7 @@ font-weight: bolder; } -.login { +.login, .register { height: 100%; margin: 0; display: flex; diff --git a/ProjectSourceCode/src/views/pages/login.hbs b/ProjectSourceCode/src/views/pages/login.hbs index 289a129..03954c2 100644 --- a/ProjectSourceCode/src/views/pages/login.hbs +++ b/ProjectSourceCode/src/views/pages/login.hbs @@ -1,3 +1,5 @@ +{{>message}} +