From 64e7d6f82dc59f9d0de2b8e8943878d182ea4aeb Mon Sep 17 00:00:00 2001 From: Bradley Date: Fri, 4 Jun 2021 11:11:00 -0700 Subject: [PATCH] Adding mock login and test data for RSVP get and submit. Must be removed along with reinstating DB connect calls if deploying real world production. --- .env | 6 +++++ README.md | 7 +++++- components/Login.js | 3 ++- pages/api/group.js | 55 +++++++++++++++++++++++++-------------------- pages/api/login.js | 30 ++++++++++++++----------- pages/api/rsvp.js | 6 ++++- pages/rsvp/[id].js | 23 ++++++++++++++++++- 7 files changed, 89 insertions(+), 41 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..46e6f5b --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +MONGO_URL= +SECRET_COOKIE_PASSWORD=fjdk47fh48djsk3jdh8f9hdjshaj3eu4 +ROOT_DOMAIN=localhost:3000 +NEXT_PUBLIC_CLOUD_NAME= +NEXT_PUBLIC_FOLDER_NAME= +SITE_ENV=TEST_SITE \ No newline at end of file diff --git a/README.md b/README.md index 15f194f..75d16b4 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,9 @@ Features include: - Travel information - RSVP forms -## Names, Dates, Locations are all hardcoded to a value +## Detailed Info + +Names, Dates, Locations are all hardcoded to a value The site implements a basic auth with [next-iron-session](https://github.com/vvo/next-iron-session) to protect access without knowing the password to the site. @@ -25,6 +27,9 @@ Adding, Updating, and Deleting of guests and groups is currently done manually o This admin branch is not included yet in this example site as no roles or permissions have been set up. However, this branch does include additional pages to add, edit, and delete these guests and groups. +*If deploying to production please remove all sections that have the following:* +```// TODO: REMOVE THIS WHEN TAKING YOUR SITE TO PRODUCTION``` + ## Tech Overall a typical NextJS Application using ReactJS and basic authentication. diff --git a/components/Login.js b/components/Login.js index 1669fb7..615f252 100644 --- a/components/Login.js +++ b/components/Login.js @@ -136,7 +136,6 @@ const Login = () => { > {errorMsg &&

Error: {errorMsg}

}
- Temp password is "weddingsite". PLEASE CHANGE FOR YOUR PRODUCTION SITE! +

Temp password is "weddingsite".

+

PLEASE CHANGE FOR YOUR PRODUCTION SITE!

{ return; } - await connectDb(); - - // const { id: groupId } = await req.body; - // console.log(`groupId: ${groupId}`); + // TODO: REMOVE THIS WHEN TAKING YOUR SITE TO PRODUCTION + // In production just await connectDB() + if (process.env.SITE_ENV !== 'TEST_SITE') { + await connectDb(); + } const response = {}; @@ -57,27 +58,33 @@ export default withSession(async (req, res) => { break; case 'POST': try { - const { groupId, guests, note } = body; - for (const guest of guests) { - // console.log(`Updating ${guest.id} with status ${guest.rsvpStatus}`); - const guestData = await Guest.findById(guest.id); - const accepted = guest?.rsvpStatus === 'accepted'; - guestData.rsvpStatus = - guest?.rsvpStatus !== 'invited' ? guest?.rsvpStatus : 'invited'; - guestData.dietaryNotes = guest?.dietaryNotes; - guestData.songRequests = guest?.songRequests; - guestData.plusOne = - (guestData?.hasPlusOne && guest?.plusOne && accepted) || false; - guestData.plusOneFirstName = - (guestData?.hasPlusOne && guest?.plusOneFirstName) || ''; - guestData.plusOneLastName = - (guestData?.hasPlusOne && guest?.plusOneLastName) || ''; - guestData.save(); + // TODO: REMOVE THIS WHEN TAKING YOUR SITE TO PRODUCTION + if (process.env.SITE_ENV === 'TEST_SITE') { + console.log('DONE!') + res.status(200).json(JSON.stringify({ message: 'SUCCESS' })); + } else { + const { groupId, guests, note } = body; + for (const guest of guests) { + // console.log(`Updating ${guest.id} with status ${guest.rsvpStatus}`); + const guestData = await Guest.findById(guest.id); + const accepted = guest?.rsvpStatus === 'accepted'; + guestData.rsvpStatus = + guest?.rsvpStatus !== 'invited' ? guest?.rsvpStatus : 'invited'; + guestData.dietaryNotes = guest?.dietaryNotes; + guestData.songRequests = guest?.songRequests; + guestData.plusOne = + (guestData?.hasPlusOne && guest?.plusOne && accepted) || false; + guestData.plusOneFirstName = + (guestData?.hasPlusOne && guest?.plusOneFirstName) || ''; + guestData.plusOneLastName = + (guestData?.hasPlusOne && guest?.plusOneLastName) || ''; + guestData.save(); + } + await Group.findByIdAndUpdate(groupId, { + note, + }); + res.status(200).json(JSON.stringify({ message: 'SUCCESS' })); } - await Group.findByIdAndUpdate(groupId, { - note, - }); - res.status(200).json(JSON.stringify({ message: 'SUCCESS' })); } catch (error) { const { response: fetchResponse } = error; console.error('error', error); diff --git a/pages/api/login.js b/pages/api/login.js index 7205081..c970768 100644 --- a/pages/api/login.js +++ b/pages/api/login.js @@ -7,7 +7,11 @@ const { compare } = bcrypt; export default withSession(async (req, res) => { const { username, password, penguin } = await req.body; - await connectDb(); + // TODO: REMOVE THIS IF GOING TO PRODUCTION + // In production just await connectDB() + if (process.env.SITE_ENV !== 'TEST_SITE') { + await connectDb(); + } try { if (username && password && penguin && penguin === 'penguin') { @@ -15,22 +19,22 @@ export default withSession(async (req, res) => { // TODO: REMOVE THIS IF GOING TO PRODUCTION if (process.env.SITE_ENV === 'TEST_SITE') { - const user = { isLoggedIn: isAuthorized, id: 'TEST_SITE_ID_123456' }; - req.session.set('user', user); - await req.session.save(); - res.json(user); - } - - const userData = await User.findOne({ username }); - const savedPassword = userData?.password || ''; - isAuthorized = await compare(password, savedPassword); - if (isAuthorized) { - const user = { isLoggedIn: isAuthorized, id: userData._id }; + const user = { isLoggedIn: true, id: 'TEST_SITE_ID_123456' }; req.session.set('user', user); await req.session.save(); res.json(user); } else { - res.status(400).json({ message: 'Unable to login' }); + const userData = await User.findOne({ username }); + const savedPassword = userData?.password || ''; + isAuthorized = await compare(password, savedPassword); + if (isAuthorized) { + const user = { isLoggedIn: isAuthorized, id: userData._id }; + req.session.set('user', user); + await req.session.save(); + res.json(user); + } else { + res.status(400).json({ message: 'Unable to login' }); + } } } else { res.status(400).json({ message: 'Unable to login' }); diff --git a/pages/api/rsvp.js b/pages/api/rsvp.js index 424953a..53f46b9 100644 --- a/pages/api/rsvp.js +++ b/pages/api/rsvp.js @@ -16,7 +16,11 @@ export default withSession(async (req, res) => { return; } - // const { method } = req; + // TODO: REMOVE THIS WHEN TAKING YOUR SITE TO PRODUCTION + if (process.env.SITE_ENV === 'TEST_SITE') { + res.status(200).json({ status: 'SUCCESS', groupId: 'TESTID_12345' }); + } + await connectDb(); const { firstName, lastName } = await req.body; diff --git a/pages/rsvp/[id].js b/pages/rsvp/[id].js index 481de4f..760c613 100644 --- a/pages/rsvp/[id].js +++ b/pages/rsvp/[id].js @@ -385,9 +385,30 @@ export default function SingleGroupPage({ group }) { export async function getServerSideProps({ params }) { try { + const group = {}; + + // TODO: REMOVE THIS WHEN TAKING YOUR SITE TO PRODUCTION + if (process.env.SITE_ENV === 'TEST_SITE') { + const group = {}; + group.id = params.id; + group.guests = [{ + id: 'TEST_GUEST_ID_12345', + firstName: 'Test', + lastName: 'Lastname', + rsvpStatus: false, + dietaryNotes: '', + songRequests: '', + hasPlusOne: true, + plusOne: false, + plusOneFirstName: '', + plusOneLastName: '', + }]; + group.note = ''; + return { props: { group } }; + } + await connectDb(); const groupData = await Group.findById(params.id); - const group = {}; group.id = params.id; const guestList = [];