From 51761a3df17f4a89ea3ad38ca0fc35ad0d911bea Mon Sep 17 00:00:00 2001 From: deb-cod <83533796+deb-cod@users.noreply.github.com> Date: Wed, 22 May 2024 22:00:04 +0530 Subject: [PATCH 1/5] making it serverless and mailing system --- backend/env.mjs | 2 + backend/index.js | 3 +- backend/logics/Availability/query.mjs | 55 +- .../logics/Availability/setAvailQueries.mjs | 148 +++-- backend/logics/GetEvents/getEvents.mjs | 4 +- backend/logics/Mailer/mailer.mjs | 74 +++ backend/logics/Register/query.mjs | 13 +- backend/logics/VerifyJWT/verifyJWT.mjs | 2 +- backend/package-lock.json | 518 +++++++++++++++++- backend/package.json | 4 +- backend/routes/routes.mjs | 55 +- frontend/frontend/package-lock.json | 48 ++ frontend/frontend/package.json | 2 + frontend/frontend/src/App.js | 32 +- .../src/components/Availability/Avaiblity.js | 7 +- .../components/Availability/graphqlQueries.js | 2 +- .../components/EventDetails/EventDetails.js | 2 +- .../src/components/EventList/EventList.js | 32 +- .../components/EventList/EventListQuries.js | 10 + .../src/components/Register/Register.css | 130 +++++ .../src/components/Register/Register.js | 254 +++++++++ .../src/components/Register/RegisterQuery.js | 15 + .../src/components/confirmpage/confirmpage.js | 47 +- .../src/components/confirmpage/query.js | 12 +- .../frontend/src/components/slotbook/query.js | 19 +- .../src/components/slotbook/slotBook.css | 6 +- .../src/components/slotbook/slotbook.js | 50 +- 27 files changed, 1337 insertions(+), 209 deletions(-) create mode 100644 backend/env.mjs create mode 100644 backend/logics/Mailer/mailer.mjs create mode 100644 frontend/frontend/src/components/EventList/EventListQuries.js create mode 100644 frontend/frontend/src/components/Register/Register.css create mode 100644 frontend/frontend/src/components/Register/Register.js create mode 100644 frontend/frontend/src/components/Register/RegisterQuery.js diff --git a/backend/env.mjs b/backend/env.mjs new file mode 100644 index 0000000..b6e41dd --- /dev/null +++ b/backend/env.mjs @@ -0,0 +1,2 @@ +export const EMAIL = "your_mail"; +export const PASSWORD = "password"; \ No newline at end of file diff --git a/backend/index.js b/backend/index.js index b82a5f3..e2fe922 100644 --- a/backend/index.js +++ b/backend/index.js @@ -4,8 +4,7 @@ import cors from 'cors'; import { router } from './routes/routes.mjs'; const app = express(); -express.urlencoded() -//app.use(cookieParser()); +app.use(cookieParser()); app.use(cors({ origin: 'http://localhost:3000', // replace with your React app origin credentials: true, diff --git a/backend/logics/Availability/query.mjs b/backend/logics/Availability/query.mjs index d1eebb9..a22c84e 100644 --- a/backend/logics/Availability/query.mjs +++ b/backend/logics/Availability/query.mjs @@ -1,36 +1,25 @@ -import { gql } from 'graphql-request'; - -export const GET_AVAILABILITY = ` - query GetAvailability($eventName: String!) { - availability(where: { event_name: { _eq: $eventName } }) { - day - start_time - end_time - } - } -`; - -export const UPSERT_AVAILABILITY = ` - mutation UpsertAvailability($day: String!, $startTime: String!, $endTime: String!, $eventName: String!) { - insert_availability_one( - object: { day: $day, start_time: $startTime, end_time: $endTime, event_name: $eventName }, - on_conflict: { constraint: availability_day_start_time_event_name_key, update_columns: [end_time] } - ) { - id - day - start_time - end_time - event_name - } +export class SetAvailabilitySchema { + queryAvailability() { + return ` + mutation MyMutation($day: String!, $startTime: String!, $endTime: String!, $eventName: String!) { + insert_availability_one(object: {day: $day, start_time: $startTime, end_time: $endTime, event_name: $eventName}) { + id + day + start_time + end_time + event_name + } + } + `; } -`; - - -export const DELETE_AVAILABILITY = ` - mutation DeleteAvailability($day: String!, $startTime: String!, $eventName: String!) { - delete_availability(where: { day: { _eq: $day }, start_time: { _eq: $startTime }, event_name: { _eq: $eventName } }) { - affected_rows - } + deleteAvailability() { + return ` + mutation DeleteAvailability($day: String!, $startTime: String!, $eventName: String!) { + delete_availability(where: {day: {_eq: $day}, start_time: {_eq: $startTime}, event_name: {_eq: $eventName}}) { + affected_rows + } + } + `; } -`; +} diff --git a/backend/logics/Availability/setAvailQueries.mjs b/backend/logics/Availability/setAvailQueries.mjs index 1c90f45..f0516e6 100644 --- a/backend/logics/Availability/setAvailQueries.mjs +++ b/backend/logics/Availability/setAvailQueries.mjs @@ -1,81 +1,69 @@ -// import { GraphQLClient } from 'graphql-request'; -// import bodyParser from "body-parser"; -// import { SetAvailabilitySchema } from './query.mjs'; -// //import axios from 'axios'; -// //import gql from 'graphql-tag'; -// -// -// const new_availability = new SetAvailabilitySchema(); -// -// const hasuraEndpoint = 'http://localhost:8080/v1/graphql'; -// const adminSecret = '123'; -// const client = new GraphQLClient(hasuraEndpoint, { -// headers: { -// 'x-hasura-admin-secret': adminSecret -// // 'Authorization': `Bearer ${generateJwtToken()}` -// }, -// }); -// -// -// // Function to create availability -// export class setAvailability { -// set_availability(req, res) { -// for (const [day, slots] of Object.entries(req.body)) { -// slots.forEach(async slot => { // Note: Added 'async' here -// const { startTime, endTime } = slot; -// console.log(day, startTime, endTime); -// const eventName = req.params.eventName; -// //console.log(req.params); -// // Here you can call your function to insert the data into Hasura -// -// try { -// const response = await client.request(new_availability.queryAvailability(), { -// day, // Note: Changed 'weekday' to 'day' -// startTime, -// endTime, -// eventName -// }) -// console.log(response.data); -// } catch (error) { -// console.error('Failed to create event:', error); -// //res.status(500).json({success: false}); -// return; -// } -// }); -// } -// -// //res.status(200).json({success: "availability inserted"}); -// } -// async delete_availability(req, res) { -// const { day, startTime } = req.body; -// //console.log(req.body) -// const eventName = req.params.eventName -// console.log(eventName) -// try { -// const data = await client.request(new_availability.deleteAvailability(), { day, startTime ,eventName }); -// res.json({ success: true }); -// } catch (error) { -// console.error('Error occurred while deleting slot:', error); -// res.json({ success: false }); -// } -// } -// -// // async get_availability(req, res) { -// // const eventName = req.params.eventName; -// // try { -// // const data = await client.request(new_availability.getAvailability(), { eventName }); -// // res.json({ success: true, availability: data.availability }); -// // } catch (error) { -// // console.error('Error occurred while fetching availability:', error); -// // res.json({ success: false }); -// // } -// // } -// -// } -// -// -// -// -// -// +import { GraphQLClient } from 'graphql-request'; +import bodyParser from "body-parser"; +import { SetAvailabilitySchema } from './query.mjs'; +//import axios from 'axios'; +//import gql from 'graphql-tag'; + + +const new_availability = new SetAvailabilitySchema(); + +const hasuraEndpoint = 'http://localhost:8080/v1/graphql'; +const adminSecret = '123'; + +const client = new GraphQLClient(hasuraEndpoint, { + headers: { + 'x-hasura-admin-secret': adminSecret + // 'Authorization': `Bearer ${generateJwtToken()}` + }, +}); + + +// Function to create availability +export class setAvailability { + set_availability(req, res) { + for (const [day, slots] of Object.entries(req.body)) { + slots.forEach(async slot => { // Note: Added 'async' here + const { startTime, endTime } = slot; + console.log(day, startTime, endTime); + const {eventName} = req.params; + console.log(req.params); + // Here you can call your function to insert the data into Hasura + + try { + const response = await client.request(new_availability.queryAvailability(), { + day, // Note: Changed 'weekday' to 'day' + startTime, + endTime, + eventName + }) + console.log(response.data); + } catch (error) { + console.error('Failed to create event:', error); + //res.status(500).json({success: false}); + return; + } + }); + } + + //res.status(200).json({success: "availability inserted"}); + } + async delete_availability(req, res) { + const { day, startTime } = req.body; + const {eventName} = req.params; + console.log("*************************") + console.log(req.body) + try { + const data = await client.request(new_availability.deleteAvailability(), { day, startTime, eventName }); + res.json({ success: true }); + } catch (error) { + console.error('Error occurred while deleting slot:', error); + res.json({ success: false }); + } + } +} + + + + + diff --git a/backend/logics/GetEvents/getEvents.mjs b/backend/logics/GetEvents/getEvents.mjs index f0b6c98..ea7a21f 100644 --- a/backend/logics/GetEvents/getEvents.mjs +++ b/backend/logics/GetEvents/getEvents.mjs @@ -22,7 +22,9 @@ export class GetEvent{ try { const data = await client.request(get_events.GetEvents(),{}); - //console.log(data); + + // console.log(data.kalenview_create_events); + res.json(data.kalenview_create_events); // res.status(200).json({success:true}); } catch (error) { diff --git a/backend/logics/Mailer/mailer.mjs b/backend/logics/Mailer/mailer.mjs new file mode 100644 index 0000000..4842241 --- /dev/null +++ b/backend/logics/Mailer/mailer.mjs @@ -0,0 +1,74 @@ +import nodemailer from 'nodemailer'; +import Mailgen from 'mailgen'; +import { EMAIL, PASSWORD } from '../../env.mjs'; + +export class Mailer { + + async send_real_mail(req, res) { + + const { userEmail, userName, day, eventName, date, startTime, endTime } = req.body; + console.log(userEmail, userName, day, eventName, date, startTime, endTime); // testmail@test.com New Name MON abcdef 2024-05-27 15:00 15:30 + + const config = { + service: 'gmail', + auth: { + user: EMAIL, + pass: PASSWORD + } + } + + const transporter = nodemailer.createTransport(config); + + const MailGenerator = new Mailgen({ + theme: "default", + product: { + name: "Event Scheduler of Kalenview ", + link: "https://mailgen.js" + } + }); + + const response = { + body: { + name: userName, + intro: `You have an upcoming event/meeting: ${eventName}`, + table: { + data: [ + { + item: 'Date', + description: date + }, + { + item: 'Day', + description: day + }, + { + item: 'Start Time', + description: startTime + }, + { + item: 'End Time', + description: endTime + } + ] + }, + outro: "Kindly be present there are per the scheduled time" + } + } + + const mail = MailGenerator.generate(response); + + let message = { + from: EMAIL, + to: [userEmail, "other_email"], + subject: `Event Reminder: ${eventName}`, + html: mail + } + + transporter.sendMail(message).then(() => { + return res.status(201).json({ "msg": "Email is sent" }) + }).catch(error => { + return res.status(500).json({ error }) + }); + + } +} diff --git a/backend/logics/Register/query.mjs b/backend/logics/Register/query.mjs index f1c5e24..87f7852 100644 --- a/backend/logics/Register/query.mjs +++ b/backend/logics/Register/query.mjs @@ -1,18 +1,7 @@ export class RegisterEventQuery{ registerUser(){ return ` - mutation ($email: String!, $password: String!, $firstName: String!, $lastName: String!, $company: String!, $role: String!) { - insert_kalenview_one(object: { - email: $email, - password: $password, - first_name: $firstName, - last_name: $lastName, - company_name: $company, - company_role: $role - }) { - uuid - } - } + `; } } \ No newline at end of file diff --git a/backend/logics/VerifyJWT/verifyJWT.mjs b/backend/logics/VerifyJWT/verifyJWT.mjs index a8cb22d..1e3e701 100644 --- a/backend/logics/VerifyJWT/verifyJWT.mjs +++ b/backend/logics/VerifyJWT/verifyJWT.mjs @@ -21,7 +21,7 @@ export class VerifyJWToken{ } else{ - console.log("Valid jwt"); + console.log("Valid jwt !"); return res.status(200).json({success:true}); } diff --git a/backend/package-lock.json b/backend/package-lock.json index 7ae8270..f0dd890 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -13,7 +13,9 @@ "cors": "^2.8.5", "express": "^4.19.2", "graphql-request": "^7.0.1", - "jsonwebtoken": "^9.0.2" + "jsonwebtoken": "^9.0.2", + "mailgen": "^2.0.28", + "nodemailer": "^6.9.13" } }, "node_modules/@dprint/darwin-arm64": { @@ -167,6 +169,14 @@ "zod": "^3.17.3" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -178,11 +188,35 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -206,6 +240,20 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -248,6 +296,70 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -312,6 +424,32 @@ "node": ">= 0.10" } }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -353,6 +491,57 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dprint": { "version": "0.45.1", "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.45.1.tgz", @@ -384,6 +573,20 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -392,6 +595,14 @@ "node": ">= 0.8" } }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -411,6 +622,17 @@ "node": ">= 0.4" } }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -465,6 +687,33 @@ "node": ">= 0.10.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -563,6 +812,14 @@ "graphql": "14 - 16" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -607,6 +864,32 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -646,6 +929,38 @@ "node": ">= 0.10" } }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -672,6 +987,24 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/juice": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz", + "integrity": "sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==", + "dependencies": { + "cheerio": "1.0.0-rc.10", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -741,6 +1074,16 @@ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, + "node_modules/mailgen": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mailgen/-/mailgen-2.0.28.tgz", + "integrity": "sha512-6g8vyKwMjAvNLuoDuGpJ4UhpvmroQQH9ZYzERC+/tL21Qvrzs2CM/li561rVIsSE+zroC4xSjXYYQ6pfPYYCXQ==", + "dependencies": { + "ejs": "^3.1.6", + "he": "^1.2.0", + "juice": "^8.0.0" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -749,6 +1092,11 @@ "node": ">= 0.6" } }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -792,6 +1140,17 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -805,6 +1164,44 @@ "node": ">= 0.6" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemailer": { + "version": "6.9.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", + "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -832,6 +1229,19 @@ "node": ">= 0.8" } }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1021,6 +1431,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "engines": { + "node": "*" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1057,6 +1475,17 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1065,11 +1494,21 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-toolbelt": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/type-fest": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", @@ -1109,6 +1548,14 @@ "node": ">= 0.4.0" } }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "engines": { + "node": ">=10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1117,6 +1564,75 @@ "node": ">= 0.8" } }, + "node_modules/web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/zod": { "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", diff --git a/backend/package.json b/backend/package.json index a21fc5b..8c6644a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,9 @@ "cors": "^2.8.5", "express": "^4.19.2", "graphql-request": "^7.0.1", - "jsonwebtoken": "^9.0.2" + "jsonwebtoken": "^9.0.2", + "mailgen": "^2.0.28", + "nodemailer": "^6.9.13" }, "name": "backend", "version": "1.0.0", diff --git a/backend/routes/routes.mjs b/backend/routes/routes.mjs index 78f827f..aa5a2ce 100644 --- a/backend/routes/routes.mjs +++ b/backend/routes/routes.mjs @@ -2,7 +2,6 @@ import express from 'express'; // import { AuthLogic } from '../authintication/signup_login.mjs'; // import { NormRoutes } from '../normRoutes/linkpage.mjs'; // import { VerifyJwt } from '../verifyJWT/verifyjwt.mjs'; -import bodyParser from 'body-parser'; import { CreateEvent } from '../logics/CreateEvent/createEvent.mjs'; import { GetEvent } from '../logics/GetEvents/getEvents.mjs'; @@ -10,11 +9,11 @@ import { LoginUser } from '../logics/Login/login.mjs'; import { VerifyJWToken } from '../logics/VerifyJWT/verifyJWT.mjs'; import { ParticularEventDetails } from '../logics/EventDetails/eventDetail.mjs'; import { EditParticularEventDetails } from '../logics/EditEvent/editEvent.mjs'; +import { setAvailability } from '../logics/Availability/setAvailQueries.mjs'; +import { CreateUser } from '../logics/Register/registerUser.mjs'; +import { GetSlots } from '../logics/SelectSlot/slotSelect.mjs'; -//import { setAvailability } from '../logics/Availability/setAvailQueries.mjs'; - -//import {GetSlots} from "../logics/slotbook/getAvailQueries.mjs"; - +import { Mailer } from '../logics/Mailer/mailer.mjs'; // const auth_logic = new AuthLogic(); // const norm_routes = new NormRoutes(); @@ -26,15 +25,19 @@ const login_user = new LoginUser(); const jwt_verify = new VerifyJWToken(); const particular_event = new ParticularEventDetails(); const edit_Event = new EditParticularEventDetails(); +const availability = new setAvailability(); +const insert_user = new CreateUser(); +const getSlot = new GetSlots(); +const router = express.Router(); -//const availability = new setAvailability(); -//const getSlot = new GetSlots(); +const mail_message = new Mailer(); -const router = express.Router(); +// For Mail +router.post('/event/mail', mail_message.send_real_mail); -// For signup -router.post('/register', insert_user.create_user); +// // For signup +// router.post('/register', insert_user.create_user); // For login router.post('/login', login_user.login); @@ -42,37 +45,31 @@ router.post('/login', login_user.login); // For JWT Verification router.post('/verify', jwt_verify.verifyJWT); -// // For Home -// router.get('/', norm_routes.linkpage); +// // // For Home +// // router.get('/', norm_routes.linkpage); // For Create Event router.post('/events/create', new_event.create_event); -// For Get Event -router.get('/events', get_event.get_events); +// // For Get Event +// router.get('/events', get_event.get_events); -// For Get Event Details -router.get('/events/:eventName', particular_event.get_particular_event); +// // For Get Event Deatils +// router.get('/events/:eventName', particular_event.get_particular_event); -// For Edit Event Details -router.put('/events/:eventName', edit_Event.edit_particular_event); +// // For Edit Event Details +// router.put('/events/:eventName', edit_Event.edit_particular_event); -// For Set Availability +// // For Set Availability +// router.post('/events/availability/create/:eventName', availability.set_availability); +// router.post('/events/availability/delete/:eventName', availability.delete_availability); -//router.post('/events/availability/create/:eventName', availability.set_availability); +// // For Get Slots -//delete availability -//router.post(`/events/availability/delete/:eventName`, availability.delete_availability); -// router.post(`events/availability/delete/:eventName`,(req,res)=>{ -// console.log(req.body) -// }); +// router.get('/events/slots/:dayofWeek/:eventName', getSlot.get_slots); -//For get availability -//router.get('/events/slots/:dayofWeek/:eventName', getSlot.get_slots); -//console.log(getAvailability); -//router.get('/events/availability/:eventName', availability.get_availability); export {router}; \ No newline at end of file diff --git a/frontend/frontend/package-lock.json b/frontend/frontend/package-lock.json index 3e6fcbe..9f9d246 100644 --- a/frontend/frontend/package-lock.json +++ b/frontend/frontend/package-lock.json @@ -8,6 +8,8 @@ "name": "calendly-clone", "version": "0.1.0", "dependencies": { + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/react-fontawesome": "^0.2.1", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", @@ -2485,6 +2487,52 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", + "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.1.tgz", + "integrity": "sha512-ldr5QO2MneAX5W5WBCYB2pZp/PiHDD1hy9YEBLcXUyJb0qnO86oP8RU+CgmYVSH/R4Dbe2ernhcWOrcgaKD9NQ==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", diff --git a/frontend/frontend/package.json b/frontend/frontend/package.json index b6cf6a5..0b49b65 100644 --- a/frontend/frontend/package.json +++ b/frontend/frontend/package.json @@ -3,6 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/react-fontawesome": "^0.2.1", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", diff --git a/frontend/frontend/src/App.js b/frontend/frontend/src/App.js index 76e5633..759aa68 100644 --- a/frontend/frontend/src/App.js +++ b/frontend/frontend/src/App.js @@ -1,34 +1,44 @@ import React from "react"; -import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import { BrowserRouter as Router, Routes, Route} from "react-router-dom"; import CreateEvent from "./components/CreateEvent/CreateEvent.js"; import EventList from "./components/EventList/EventList.js"; import Login from "./components/login/Login.js"; import EventDetails from "./components/EventDetails/EventDetails.js"; import AvailabilityForm from "./components/Availability/Avaiblity.js"; +import Register from "./components/Register/Register.js"; import CalendarPage from "./components/slotbook/slotbook"; import BookingPage from "./components/confirmpage/confirmpage"; import SuccessPage from "./components/successpage/successpage"; - import "./App.css"; function App() { return ( - -
- - } /> + //
+ // + //
+ + + +
+ + + } /> + + + } /> } /> } /> } /> } /> } /> } /> - } /> - -
-
+ } /> +
+
+
+ ); } -export default App; \ No newline at end of file +export default App; diff --git a/frontend/frontend/src/components/Availability/Avaiblity.js b/frontend/frontend/src/components/Availability/Avaiblity.js index a23015f..acddf5b 100644 --- a/frontend/frontend/src/components/Availability/Avaiblity.js +++ b/frontend/frontend/src/components/Availability/Avaiblity.js @@ -170,12 +170,17 @@ const AvailabilityForm = () => { for (const [day, slots] of Object.entries(filteredAvailability)) { for (const slot of slots) { if (slot.selected) { - await graphqlClient.request(UPSERT_AVAILABILITY, { + const data = await graphqlClient.request(UPSERT_AVAILABILITY, { day: day, startTime: slot.startTime, endTime: slot.endTime, eventName: eventName, }); + console.log(data.insert_availability_one.event_name); + + if(!(data.insert_availability_one.event_name==eventName)){ + alert(`Availability will not set for Timeline:\n${day} ${slot.startTime}\nas it is already present in Event Name:\n${data.insert_availability_one.event_name}`); + } } } } diff --git a/frontend/frontend/src/components/Availability/graphqlQueries.js b/frontend/frontend/src/components/Availability/graphqlQueries.js index 63bc964..3225583 100644 --- a/frontend/frontend/src/components/Availability/graphqlQueries.js +++ b/frontend/frontend/src/components/Availability/graphqlQueries.js @@ -14,7 +14,7 @@ export const UPSERT_AVAILABILITY = ` mutation UpsertAvailability($day: String!, $startTime: String!, $endTime: String!, $eventName: String!) { insert_availability_one( object: { day: $day, start_time: $startTime, end_time: $endTime, event_name: $eventName }, - on_conflict: { constraint: availability_day_start_time_event_name_key, update_columns: [end_time] } + on_conflict: { constraint: availability_day_start_time_key, update_columns: [end_time] } ) { id day diff --git a/frontend/frontend/src/components/EventDetails/EventDetails.js b/frontend/frontend/src/components/EventDetails/EventDetails.js index 1dc232b..dedbaec 100644 --- a/frontend/frontend/src/components/EventDetails/EventDetails.js +++ b/frontend/frontend/src/components/EventDetails/EventDetails.js @@ -75,7 +75,7 @@ const EventDetails = () => {