diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache index 9aec138..09b2b17 100644 --- a/.firebase/hosting.YnVpbGQ.cache +++ b/.firebase/hosting.YnVpbGQ.cache @@ -1,33 +1,35 @@ -index.html,1725860405793,6310d84ffdca1cba888ffec82dec1bd853728243a85f931c7bbb1ea501234ed9 -robots.txt,1725860392506,391d14b3c2f8c9143a27a28c7399585142228d4d1bdbe2c87ac946de411fa9a2 -logo192.png,1725860392504,f66564670b5bfe49f3f04a5b63107bae60f4a7736f1d3b83aa0115f7acf45150 -favicon.ico,1725860392503,1463be9bedc82e16f9364eec7a1f5152cbe56229401381eed65c1496cb884407 -asset-manifest.json,1725860405804,4e32ba450098f872b3a581873dc770a8b5c91d6d56f58e07f8ffe31b70c53ef7 -logo512.png,1725860392505,2356e0b814e58a349935c8de17226873d615d088a867d591fef48a64c80c9a2f -static/media/exit.5b9b641b90012b1192056a8c7e1b8c45.svg,1725860405791,4ff12475566874f3f3d3be8e8c97ca14a7b9292a04481947610725c16bb1599d -static/media/coffee.46aafd6dd9e4a1d3460e80ff9969dc6e.svg,1725860405791,f27933e7a7e8113c7a2be9eba7492922dd5918b77575f02a8ad595cb079e5547 -static/media/infinity.d099870a8639593717e3b17aea138c92.svg,1725860405791,70485bc15570a561994193d7e3e6b08a1f2de236248676255b871c8697e4c577 -manifest.json,1725860392505,4e1d3adad9ce7e17c0d13fac197f1c27091906f4ecf3909c9f51247bff345118 -static/media/cardo-greek-ext-400-normal.134b821611b16e279388.woff2,1725860405791,f47df12ed94c7e7bb8a2e37e21d10cde4a47fd41eeda611d924a55187ad01466 -static/media/cardo-latin-400-normal.4911b85d7a3867b3911f.woff2,1725860405791,8f43ac21350311e2925bf981b9fd8da34935abad28c7b1028c2ca2756af003f3 -static/media/cardo-greek-400-normal.79d37e879083ce714bd7.woff2,1725860405791,074bc81d8ca5a2111b391b121b56d17a67601361e97404d3d7792dbda1dbe5bd -static/media/cardo-greek-400-normal.82ddcf833fd34281b75d.woff,1725860405791,3b4c19d6c84e7a572ee345b68fc874deeec43d4690c7d590a9029fddf3dbddf5 -static/media/bracket.910c02ed0a238012f80f22086064c5d9.svg,1725860405791,fc713f945dd7cd2ca06c86d392ebdea3a6cf04a3e009e72877aec5e3be787486 -static/media/cardo-greek-ext-400-normal.f2008e9d17e15badfffd.woff,1725860405791,f3e91ac60b6103eb6065b6d12d6adb656d95b1ab9904f98d15916b49849385ec -static/js/main.4e103dc0.js.LICENSE.txt,1725860405805,fd222b36f412805419e026feba067f18ca36cf439c430ae6dfd4bf072d541304 -static/js/453.18d94f3f.chunk.js,1725860405805,0c85c1b7dd1771b07c17867a1b4cc9147aac500e2761b78e5f43c3af5a990b97 -static/js/453.18d94f3f.chunk.js.map,1725860405805,01852c42a7189dcf6095a7437716308dcf1058fbf9afeee17e1d113d8fc0016f -static/css/main.f0edc1a0.css,1725860405805,1c87f7cfa7da9415d7b6abe70cf41d8705f1d751ee0f4d6b406baafbb9bcca8b -static/css/main.f0edc1a0.css.map,1725860405805,1a40319fdab387a87e11b7c3aadf554d86722ada29a129ba316b832bcdbaefa0 -static/media/cardo-latin-ext-400-normal.d90efa9a5c52b57c81be.woff2,1725860405792,ac5c40b8f0f0170763306cbd56736ea93f3bc8a46bd69691097be496e3b9a604 -static/media/cardo-latin-400-normal.a3fc903c20de90e51735.woff,1725860405791,cf7c3f21e093e6af8f4490da55d497398a38ff9485afae511311013338b8fe82 -static/media/cardo-latin-ext-400-normal.448cff0b9a0afb700151.woff,1725860405791,b285c4d668a7c861ca15b7dd3e126f26f6c06449c41a2c823a10146b0550089c -static/media/Blackmild Regular.5b441560e0d850038d0f.otf,1725860405791,60300d3ccf8a22a528b216703a9677022b27e7f05fe71f9768e58220c132a4c9 -static/media/Cinzel-VariableFont_wght.2d087b545bf495f3d86d.ttf,1725860405791,3394f58fb0427fbe8d8dcc90863079661330c57c41d22309fabdda6f9bbbf7e3 -static/media/Cardo-Regular.4ad75d4da97e1cf6655b.ttf,1725860405791,9441d454efe51434f20f9f848652531e4caa3ffa57a3c7d2caa08370b01b2c63 -static/media/card.1d7fa489536497609c42.png,1725860405805,aed32aacda18dd89590e88b93da24764ec4c8d3a94f9390d90b241fb88f20788 -static/js/main.4e103dc0.js,1725860405805,20a9e0c99d6ba25a839ea31b3fcceb3d71c1e6835061ddb862bc51a56f0cf0ca -static/media/applogo.9a90eed8f247993fa372.png,1725860405805,162fdef5335b42be3160731c6f9472f17d8a47b1a91f0f14f2a4fcf3b46559cd -static/media/titlecard.420823b8e1f5db1380e4.png,1725860405806,77bccf483368ffe9622e590756dac4c2011d125589802b193a9d9ac79f1ddf0b -static/media/cardback.6c07d542c2853cbf82d3.png,1725860405806,4cd2749fe35df98d738b7504afe8469dbdd2ba23101544b81c9592be8c5321f4 -static/js/main.4e103dc0.js.map,1725860405807,61fad40e9da546f6b8440539286164bb2d5d301525c6149d772184ed61d7dc04 +robots.txt,1726876647544,391d14b3c2f8c9143a27a28c7399585142228d4d1bdbe2c87ac946de411fa9a2 +manifest.json,1726876647544,4e1d3adad9ce7e17c0d13fac197f1c27091906f4ecf3909c9f51247bff345118 +index.html,1726876659230,354b28bc9760fd2b17eab90a8d858fc8e52f9564c0c63c37be8a99d181e133e7 +asset-manifest.json,1726876659241,afa5940bbd1bc504018bd4f1fddfedc7ec8465288067dd8d8f933e89e71b170d +favicon.ico,1726876647541,6048ca490d966978cc92b22151024057c5643b3bc69f6cdf9856fba38e8877fa +static/media/exit.5b9b641b90012b1192056a8c7e1b8c45.svg,1726876659228,4ff12475566874f3f3d3be8e8c97ca14a7b9292a04481947610725c16bb1599d +static/media/infinity.d099870a8639593717e3b17aea138c92.svg,1726876659228,70485bc15570a561994193d7e3e6b08a1f2de236248676255b871c8697e4c577 +static/media/coffee.46aafd6dd9e4a1d3460e80ff9969dc6e.svg,1726876659228,f27933e7a7e8113c7a2be9eba7492922dd5918b77575f02a8ad595cb079e5547 +static/media/cardo-latin-400-normal.4911b85d7a3867b3911f.woff2,1726876659228,8f43ac21350311e2925bf981b9fd8da34935abad28c7b1028c2ca2756af003f3 +static/media/cardo-greek-400-normal.79d37e879083ce714bd7.woff2,1726876659228,074bc81d8ca5a2111b391b121b56d17a67601361e97404d3d7792dbda1dbe5bd +static/media/cardo-greek-400-normal.82ddcf833fd34281b75d.woff,1726876659228,3b4c19d6c84e7a572ee345b68fc874deeec43d4690c7d590a9029fddf3dbddf5 +static/media/cardo-greek-ext-400-normal.134b821611b16e279388.woff2,1726876659228,f47df12ed94c7e7bb8a2e37e21d10cde4a47fd41eeda611d924a55187ad01466 +static/media/bracket.910c02ed0a238012f80f22086064c5d9.svg,1726876659228,fc713f945dd7cd2ca06c86d392ebdea3a6cf04a3e009e72877aec5e3be787486 +static/media/cardo-greek-ext-400-normal.f2008e9d17e15badfffd.woff,1726876659228,f3e91ac60b6103eb6065b6d12d6adb656d95b1ab9904f98d15916b49849385ec +static/js/main.cce1692b.js.LICENSE.txt,1726876659241,fd222b36f412805419e026feba067f18ca36cf439c430ae6dfd4bf072d541304 +static/js/453.18d94f3f.chunk.js,1726876659241,0c85c1b7dd1771b07c17867a1b4cc9147aac500e2761b78e5f43c3af5a990b97 +static/js/453.18d94f3f.chunk.js.map,1726876659242,01852c42a7189dcf6095a7437716308dcf1058fbf9afeee17e1d113d8fc0016f +static/css/main.59a52c37.css,1726876659242,cb1aee4c30f148e3e41a58b1f43c2b03814942da517af2d341db473565473725 +static/css/main.59a52c37.css.map,1726876659241,bcdda2feb46a3e91c65dcaabd8cc9bab2ee623d259e7fee95565b88ef3e7aa1d +static/media/cardo-latin-ext-400-normal.d90efa9a5c52b57c81be.woff2,1726876659228,ac5c40b8f0f0170763306cbd56736ea93f3bc8a46bd69691097be496e3b9a604 +static/media/cardo-latin-400-normal.a3fc903c20de90e51735.woff,1726876659228,cf7c3f21e093e6af8f4490da55d497398a38ff9485afae511311013338b8fe82 +static/media/cardo-latin-ext-400-normal.448cff0b9a0afb700151.woff,1726876659228,b285c4d668a7c861ca15b7dd3e126f26f6c06449c41a2c823a10146b0550089c +static/media/CyarenLogo.d899a3de152d4020e373.png,1726876659241,06d88a03004c107e8170e6995d20c27ef9383ff8ac1fd3c8432f119eb3b6431a +static/media/Blackmild Regular.5b441560e0d850038d0f.otf,1726876659227,60300d3ccf8a22a528b216703a9677022b27e7f05fe71f9768e58220c132a4c9 +logo192.png,1726876647542,1a626b8669164ea8df1bc1b55b3fba2844f6e258f86204ebcadc2e283d8d7d0a +static/media/Cinzel-VariableFont_wght.2d087b545bf495f3d86d.ttf,1726876659227,3394f58fb0427fbe8d8dcc90863079661330c57c41d22309fabdda6f9bbbf7e3 +static/media/logo.9ad0b2edab4ef5fc261b.png,1726876659241,cf3180ffbfd0da385f809b161518dd1f9ae74b33b803ae92ab1f689f518620a5 +static/media/Cardo-Regular.4ad75d4da97e1cf6655b.ttf,1726876659228,9441d454efe51434f20f9f848652531e4caa3ffa57a3c7d2caa08370b01b2c63 +static/media/card.1d7fa489536497609c42.png,1726876659241,aed32aacda18dd89590e88b93da24764ec4c8d3a94f9390d90b241fb88f20788 +logo512.png,1726876647543,3d55e276f6674ba35ec7f6da0170e3e7b3c0016d0a84ee80f11954f7ab341862 +static/js/main.cce1692b.js,1726876659243,38fa9b797c454b23fa57226e91c0299f19185c48629de59381d4937bd38f98ab +static/media/applogo.9a90eed8f247993fa372.png,1726876659241,162fdef5335b42be3160731c6f9472f17d8a47b1a91f0f14f2a4fcf3b46559cd +static/media/titlecard.420823b8e1f5db1380e4.png,1726876659243,77bccf483368ffe9622e590756dac4c2011d125589802b193a9d9ac79f1ddf0b +static/media/cardback.6c07d542c2853cbf82d3.png,1726876659242,4cd2749fe35df98d738b7504afe8469dbdd2ba23101544b81c9592be8c5321f4 +static/js/main.cce1692b.js.map,1726876659242,c5543305e62b653f85b5c8d20534d0d3766509eecec9ea27d6e93ae218dfadea diff --git a/.firebaseignore b/.firebaseignore new file mode 100644 index 0000000..8bae803 --- /dev/null +++ b/.firebaseignore @@ -0,0 +1 @@ +**/*.xcf diff --git a/.gitignore b/.gitignore index 71255bc..f27256e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ yarn-error.log* # storybook *storybook.log + +**/*.xcf diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index adf05de..85b4498 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/database-debug.log b/database-debug.log index 3e5ee87..173e92e 100644 --- a/database-debug.log +++ b/database-debug.log @@ -1,9 +1,9 @@ -21:13:22.421 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started -21:13:22.572 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000 -21:13:31.975 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO com.firebase.core.namespace.NamespaceActor - fibonacci-fold-default-rtdb successfully activated FBKV (SurveyIdle(0)) wait: 121ms, init: 0ms -21:13:32.035 [NamespaceSystem-blocking-namespace-operation-dispatcher-6] INFO com.firebase.core.namespace.StateManager - Namespace fibonacci-fold-default-rtdb status Active to Active -21:14:00.571 [FirebaseWorkerPool-1-2] WARN com.firebase.core.persistence.backend.dummy.EmulatorMetadataPersistence - Multiple projectIds are not recommended in single project mode. Requested +22:11:37.220 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started +22:11:37.437 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000 +22:11:46.657 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO com.firebase.core.namespace.NamespaceActor - fibonacci-fold-default-rtdb successfully activated FBKV (SurveyIdle(0)) wait: 152ms, init: 0ms +22:11:46.748 [NamespaceSystem-blocking-namespace-operation-dispatcher-6] INFO com.firebase.core.namespace.StateManager - Namespace fibonacci-fold-default-rtdb status Active to Active +22:11:51.139 [FirebaseWorkerPool-1-3] WARN com.firebase.core.persistence.backend.dummy.EmulatorMetadataPersistence - Multiple projectIds are not recommended in single project mode. Requested namespace fake-project-id, but the emulator is configured for fibonacci-fold-default-rtdb. To opt-out of single project mode add/set the singleProjectMode: false property in the firebase.json emulators config. -21:14:00.575 [NamespaceSystem-akka.actor.default-dispatcher-10] INFO com.firebase.core.namespace.NamespaceActor - fake-project-id successfully activated FBKV (SurveyIdle(0)) wait: 1ms, init: 0ms +22:11:51.147 [NamespaceSystem-akka.actor.default-dispatcher-5] INFO com.firebase.core.namespace.NamespaceActor - fake-project-id successfully activated FBKV (SurveyIdle(0)) wait: 3ms, init: 0ms diff --git a/database.rules.json b/database.rules.json index a994485..259d617 100644 --- a/database.rules.json +++ b/database.rules.json @@ -1,11 +1,11 @@ { "rules": { - ".read": "auth != null", - ".write": "auth != null", + ".read": "auth != null && auth.provider == 'anonymous'", + ".write": "auth != null && auth.provider == 'anonymous'", "users": { "$uid": { - ".read": "$uid === auth.uid", - ".write": "$uid === auth.uid" + ".read": "$uid === auth.uid && auth.provider == 'anonymous'", + ".write": "$uid === auth.uid && auth.provider == 'anonymous'" } } } diff --git a/package.json b/package.json index 10e10ad..4a42684 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.7.7", "crypto-js": "^4.2.0", "firebase": "^10.13.0", "react": "^18.3.1", diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..114de5e --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,30 @@ +# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN + +PassengerAppRoot "/home/cyarsflu/nodejs_app" +PassengerBaseURI "/" +PassengerNodejs "/home/cyarsflu/nodevenv/nodejs_app/20/bin/node" +PassengerAppType node +PassengerStartupFile server.js + +# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END + + + RewriteEngine On + RewriteBase / + + # Allow API requests to be handled by the Node.js app directly + RewriteCond %{REQUEST_URI} ^/api/ [NC] + RewriteRule ^ - [L] + + # Redirect all other routes to index.html for React frontend routing + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^ /index.html [L] + + +# DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN + + + + +# DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END diff --git a/public/favicon.ico b/public/favicon.ico index a11777c..f701ec1 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html index ef643e6..868291c 100644 --- a/public/index.html +++ b/public/index.html @@ -5,13 +5,10 @@ - + - React App + Fibonacci's Fold diff --git a/public/logo192.png b/public/logo192.png index fc44b0a..dbed278 100644 Binary files a/public/logo192.png and b/public/logo192.png differ diff --git a/public/logo512.png b/public/logo512.png index a4e47a6..f4a0511 100644 Binary files a/public/logo512.png and b/public/logo512.png differ diff --git a/server/app.js b/server/app.js new file mode 100644 index 0000000..712a311 --- /dev/null +++ b/server/app.js @@ -0,0 +1,25 @@ +const express = require('express'); +const session = require('express-session'); +const app = express(); +const dotenv = require('dotenv'); + +// Load environment variables +dotenv.config(); + +// Ensure that SESSION_SECRET is defined +if (!process.env.SESSIONS_SECRET) { + console.error('FATAL ERROR: SESSIONS_SECRET is not defined.'); + process.exit(1); +} + +// Middleware +app.use(express.json()); +app.use( + session({ + secret: process.env.SESSIONS_SECRET, + resave: false, + saveUninitialized: true, + }) +); + +module.exports = app; diff --git a/server/authRoutes.js b/server/authRoutes.js new file mode 100644 index 0000000..75cbbdc --- /dev/null +++ b/server/authRoutes.js @@ -0,0 +1,151 @@ +const express = require('express'); +const router = express.Router(); +const passport = require('passport'); +const GoogleStrategy = require('passport-google-oauth20').Strategy; +const jwt = require('jsonwebtoken'); +const db = require('./db'); +const { generateUniqueId } = require('../shared/utils/crypto'); + +// Check user session (GET) +router.get('/api/auth/session', (req, res) => { + const token = req.cookies.token; + + if (!token) { + return res.json({ userId: null }); + } + + try { + // Verify the token + const decoded = jwt.verify(token, process.env.JWT_SECRET); + res.json({ userId: decoded.userId }); + } catch (error) { + console.error('Invalid token:', error); + res.status(401).json({ userId: null, error: 'Invalid token' }); + } +}); + +// Sign in anonymously (POST) +router.post('/api/auth/signin-anonymous', async (req, res) => { + const userId = generateUniqueId(); // Generate unique ID for anonymous user + + try { + // Insert the anonymous user into the database (no sensitive data, just ID) + await db.query('INSERT INTO users (id, provider) VALUES (?, ?)', [ + userId, + 'anonymous', + ]); + + // Generate JWT token for the anonymous user + const token = jwt.sign( + { userId, provider: 'anonymous' }, + process.env.JWT_SECRET, + { expiresIn: '1h' } + ); + + // Set the JWT in an httpOnly cookie for better security + res.cookie('token', token, { httpOnly: true }); + + res.status(200).json({ message: 'Anonymous user signed in' }); + } catch (error) { + console.error('Error creating anonymous user:', error); + res.status(500).json({ error: 'Server error' }); + } +}); + +router.post('/api/auth/refresh-token', (req, res) => { + const refreshToken = req.cookies.refreshToken; + if (!refreshToken) return res.status(403).send('Refresh token required'); + + // Verify the refresh token and issue a new JWT + try { + const decoded = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET); + const newToken = jwt.sign( + { userId: decoded.userId }, + process.env.JWT_SECRET, + { expiresIn: '1h' } + ); + res.cookie('token', newToken, { httpOnly: true }); + res.json({ message: 'Token refreshed' }); + } catch (error) { + res.status(403).send('Invalid refresh token'); + } +}); + +// Initialize Passport +router.use(passport.initialize()); + +// Google OAuth Strategy +passport.use( + new GoogleStrategy( + { + clientID: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + callbackURL: '/api/auth/google/callback', + }, + async (accessToken, refreshToken, profile, done) => { + const googleId = profile.id; // This is the unique ID from Google + + try { + // Insert the Google user into the database if they don't exist + await db.query( + 'INSERT INTO users (id, provider) VALUES (?, ?) ON DUPLICATE KEY UPDATE id = id', + [googleId, 'google'] + ); + + // Generate JWT token for the Google user + const token = jwt.sign( + { userId: googleId, provider: 'google' }, + process.env.JWT_SECRET, + { expiresIn: '1h' } + ); + + // Pass the token back + return done(null, token); + } catch (error) { + return done(error); + } + } + ) +); + +// Start Google OAuth login +router.get( + '/api/auth/google', + passport.authenticate('google', { scope: ['profile', 'email'] }) +); + +// Callback route for Google OAuth +router.get( + '/api/auth/google/callback', + passport.authenticate('google', { failureRedirect: '/' }), + (req, res) => { + // After successful authentication, generate the JWT (which is in req.user) + const token = req.user; // Passport's Google strategy should return the JWT + + // Set the JWT in an httpOnly cookie + res.cookie('token', token, { httpOnly: true }); + + // Redirect to the frontend dashboard or a secure page without the token in the URL + res.redirect('/dashboard'); + } +); + +// Example of a protected route (no need for query token) +router.get('/dashboard', (req, res) => { + // Extract token from cookies (JWT is automatically sent as a cookie) + const token = req.cookies.token; + + if (!token) { + return res.status(403).send('Token is required'); + } + + try { + // Verify the token and decode it + const decoded = jwt.verify(token, process.env.JWT_SECRET); + res.send(`Welcome, user with ID: ${decoded.userId}`); + } catch (err) { + res.status(403).send('Invalid token'); + } +}); + +module.exports = router; diff --git a/server/db.js b/server/db.js new file mode 100644 index 0000000..5dabfce --- /dev/null +++ b/server/db.js @@ -0,0 +1,15 @@ +const mysql = require('mysql2/promise'); +const dotenv = require('dotenv'); + +// Load environment variables +dotenv.config(); + +// Create a MySQL connection pool with promises +const db = mysql.createPool({ + host: process.env.MYSQL_HOST, + user: process.env.MYSQL_USER, + password: process.env.MYSQL_PASSWORD, + database: process.env.MYSQL_DATABASE, +}); + +module.exports = db; diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..5a7f7bd --- /dev/null +++ b/server/package.json @@ -0,0 +1,19 @@ +{ + "name": "fibonacci-fold-server", + "version": "1.0.0", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "crypto-js": "^4.2.0", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "express-session": "^1.18.0", + "jsonwebtoken": "^9.0.2", + "mysql2": "^2.3.3", + "passport": "^0.7.0", + "passport-google-oauth20": "^2.0.0", + "uuid": "^10.0.0" + } +} diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..f3cdba0 --- /dev/null +++ b/server/server.js @@ -0,0 +1,113 @@ +const authRoutes = require('./authRoutes'); +const app = require('./app'); +const db = require('./db'); + +// Routes +app.use(authRoutes); // Use the auth routes + +// Create new session +app.post('/api/session', async (req, res) => { + const sessionId = req.body.sessionId; + const query = 'INSERT INTO sessions (id) VALUES (?)'; + await db.query(query, [sessionId], (err, result) => { + if (err) return res.status(500).json({ error: err }); + res.status(200).json({ sessionId }); + }); +}); + +// Add user to session +app.post('/api/session/:sessionId/user', async (req, res) => { + const { sessionId } = req.params; + const { userId, provider } = req.body; + + // Insert the user into the `users` table if they don't already exist + const userQuery = ` + INSERT INTO users (id, provider) + VALUES (?, ?) + ON DUPLICATE KEY UPDATE id = id`; // If the user already exists, do nothing + + // Insert the user into the `session_users` table for this session + const sessionUserQuery = ` + INSERT INTO session_users (session_id, user_id, provider) + VALUES (?, ?, ?) + ON DUPLICATE KEY UPDATE session_id = session_id`; // If the user is already in the session, do nothing + + // Insert the initial vote (-1) for the user in this session + const voteQuery = ` + INSERT INTO votes (session_id, user_id, vote) + VALUES (?, ?, -1) + ON DUPLICATE KEY UPDATE vote = -1`; // If a vote already exists, reset it to -1 + + try { + // Insert the user into the `users` table + await db.query(userQuery, [userId, provider]); + + // Add the user to the `session_users` table + await db.query(sessionUserQuery, [sessionId, userId, provider]); + + // Set the initial vote for the user in the session + await db.query(voteQuery, [sessionId, userId]); + + res.status(200).json({ userId }); + } catch (err) { + console.error('Error adding user to session:', err); + res.status(500).json({ error: 'Server error' }); + } +}); + +// Get users in a session +app.get('/api/session/:sessionId/users', async (req, res) => { + const { sessionId } = req.params; + const query = ` + SELECT users.id, users.username + FROM votes + JOIN users ON votes.user_id = users.id + WHERE session_id = ? + `; + + try { + const [results] = await db.query(query, [sessionId]); + console.log('Query results:', results); // Log query result + res.status(200).json(results); + } catch (err) { + console.error('Error fetching session users:', err); + res.status(500).json({ error: 'Server error' }); + } +}); + +app.delete('/api/session/:sessionId/votes/:userId', async (req, res) => { + const { sessionId, userId } = req.params; + const query = 'DELETE FROM votes WHERE session_id = ? AND user_id = ?'; + + try { + const [result] = await db.query(query, [sessionId, userId]); + res + .status(200) + .json({ success: true, message: 'Vote removed successfully' }); + } catch (error) { + console.error('Error removing vote:', error); + res.status(500).json({ error: 'Server error' }); + } +}); + +app.delete('/api/session/:sessionId/users/:userId', async (req, res) => { + const { sessionId, userId } = req.params; + const query = + 'DELETE FROM session_users WHERE session_id = ? AND user_id = ?'; + + try { + const [result] = await db.query(query, [sessionId, userId]); + res + .status(200) + .json({ success: true, message: 'User removed successfully' }); + } catch (error) { + console.error('Error removing user:', error); + res.status(500).json({ error: 'Server error' }); + } +}); + +// Start the server +const PORT = process.env.PORT || 5000; +app.listen(PORT, () => { + console.log(`Server is running on port ${PORT}`); +}); diff --git a/server/stderr.log b/server/stderr.log new file mode 100644 index 0000000..f133ada --- /dev/null +++ b/server/stderr.log @@ -0,0 +1,1267 @@ +MySQL query error: Error: getaddrinfo ENOTFOUND server269.web-hosting.com:3306 + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:31:31 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:346:12) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:280:10) + at jsonParser (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/body-parser/lib/types/json.js:113:7) { + code: 'ENOTFOUND', + errno: -3008, + sql: undefined, + sqlState: undefined, + sqlMessage: undefined +} +MySQL query error: Error: getaddrinfo ENOTFOUND server269.web-hosting.com:3306 + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:31:31 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:346:12) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:280:10) + at jsonParser (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/body-parser/lib/types/json.js:113:7) { + code: 'ENOTFOUND', + errno: -3008, + sql: undefined, + sqlState: undefined, + sqlMessage: undefined +} +MySQL query error: Error: Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:26:31 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:346:12) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:280:10) + at jsonParser (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/body-parser/lib/types/json.js:113:7) { + code: 'ER_NO_SUCH_TABLE', + errno: 1146, + sql: 'SELECT * FROM my_table', + sqlState: '42S02', + sqlMessage: "Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist" +} +MySQL query error: Error: Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:26:31 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:346:12) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:280:10) + at jsonParser (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/body-parser/lib/types/json.js:113:7) { + code: 'ER_NO_SUCH_TABLE', + errno: 1146, + sql: 'SELECT * FROM my_table', + sqlState: '42S02', + sqlMessage: "Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist" +} +MySQL query error: Error: Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:26:31 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:346:12) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:280:10) + at jsonParser (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/body-parser/lib/types/json.js:113:7) { + code: 'ER_NO_SUCH_TABLE', + errno: 1146, + sql: 'SELECT * FROM my_table', + sqlState: '42S02', + sqlMessage: "Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist" +} +MySQL query error: Error: Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:26:31 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:346:12) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:280:10) + at jsonParser (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/body-parser/lib/types/json.js:113:7) { + code: 'ER_NO_SUCH_TABLE', + errno: 1146, + sql: 'SELECT * FROM my_table', + sqlState: '42S02', + sqlMessage: "Table 'cyarsflu_fibonacci-fold.my_table' doesn't exist" +} +Error connecting to MySQL: Error: Access denied for user 'your-mysql-username'@'localhost' (using password: YES) + at Packet.asError (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/packets/packet.js:728:17) + at ClientHandshake.execute (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/commands/command.js:29:26) + at Connection.handlePacket (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/connection.js:456:32) + at PacketParser.onPacket (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/connection.js:85:12) + at PacketParser.executeStart (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/packet_parser.js:75:16) + at Socket. (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/connection.js:92:25) + at Socket.emit (node:events:519:28) + at addChunk (node:internal/streams/readable:559:12) + at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) + at Readable.push (node:internal/streams/readable:390:5) { + code: 'ER_ACCESS_DENIED_ERROR', + errno: 1045, + sqlState: '28000', + sqlMessage: "Access denied for user 'your-mysql-username'@'localhost' (using password: YES)", + sql: undefined +} +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'express-session' +Require stack: +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/server.js:4:17) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'express-session' +Require stack: +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/server.js:4:17) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'express-session' +Require stack: +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/server.js:4:17) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'express-session' +Require stack: +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/server.js:4:17) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'express-session' +Require stack: +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/server.js:4:17) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './db' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:3:12) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module './utils' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:4:26) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module '../shared/utils/crypto' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:4:30) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module '../shared/utils/crypto' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:4:30) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module '../shared/utils/crypto' +Require stack: +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/nodejs_app/authRoutes.js:4:30) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'uuid' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:1:24) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'uuid' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:1:24) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'uuid' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:1:24) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'crypto-js' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:2:18) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'crypto-js' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:2:18) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'crypto-js' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:2:18) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +node:internal/modules/cjs/loader:1228 + throw err; + ^ + +Error: Cannot find module 'crypto-js' +Require stack: +- /home/cyarsflu/shared/utils/crypto.js +- /home/cyarsflu/nodejs_app/authRoutes.js +- /home/cyarsflu/nodejs_app/server.js +- /usr/local/lsws/fcgi-bin/lsnode.js + at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15) + at Module._load (node:internal/modules/cjs/loader:1051:27) + at Module.require (node:internal/modules/cjs/loader:1311:19) + at require (node:internal/modules/helpers:179:18) + at Object. (/home/cyarsflu/shared/utils/crypto.js:2:18) + at Module._compile (node:internal/modules/cjs/loader:1469:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) + at Module.load (node:internal/modules/cjs/loader:1288:32) + at Module._load (node:internal/modules/cjs/loader:1104:12) + at Module.require (node:internal/modules/cjs/loader:1311:19) { + code: 'MODULE_NOT_FOUND', + requireStack: [ + '/home/cyarsflu/shared/utils/crypto.js', + '/home/cyarsflu/nodejs_app/authRoutes.js', + '/home/cyarsflu/nodejs_app/server.js', + '/usr/local/lsws/fcgi-bin/lsnode.js' + ] +} + +Node.js v20.17.0 +Error creating anonymous user: Error: You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. To learn how to use async/await or Promises check out documentation at https://www.npmjs.com/package/mysql2#using-promise-wrapper, or the mysql2 documentation at https://github.com/sidorares/node-mysql2/tree/master/documentation/Promise-Wrapper.md + at Query.then (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/lib/commands/query.js:43:11) + at process.processTicksAndRejections (node:internal/process/task_queues:95:5) +Error fetching session users: Error: Unknown column 'session_id' in 'where clause' + at PromisePool.query (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/mysql2/promise.js:341:22) + at /home/cyarsflu/nodejs_app/server.js:71:32 + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at next (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:149:13) + at Route.dispatch (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/route.js:119:3) + at Layer.handle [as handle_request] (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/layer.js:95:5) + at /home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:284:15 + at param (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:365:14) + at param (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:376:14) + at Function.process_params (/home/cyarsflu/nodevenv/nodejs_app/20/lib/node_modules/express/lib/router/index.js:421:3) { + code: 'ER_BAD_FIELD_ERROR', + errno: 1054, + sql: '\n' + + ' SELECT * \n' + + ' FROM users\n' + + " WHERE session_id = '62c57e189a9507575e9e3037aba0'\n" + + ' ', + sqlState: '42S22', + sqlMessage: "Unknown column 'session_id' in 'where clause'" +} diff --git a/server/tmp/restart.txt b/server/tmp/restart.txt new file mode 100644 index 0000000..e69de29 diff --git a/shared/utils/crypto.js b/shared/utils/crypto.js new file mode 100644 index 0000000..5a57e99 --- /dev/null +++ b/shared/utils/crypto.js @@ -0,0 +1,14 @@ +const { v4: uuidv4 } = require('uuid'); +const CryptoJS = require('crypto-js'); + +// Generate a session ID hash +const generateUniqueId = () => { + const uuid = uuidv4(); + const hash = CryptoJS.SHA256(uuid).toString(); + // Use the first 28 characters of the hash + return hash.substring(0, 28); +}; + +module.exports = { + generateUniqueId, +}; diff --git a/src/App.jsx b/src/App.jsx index 53733f7..f797cac 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,11 +5,13 @@ import { Route, Navigate, } from 'react-router-dom'; -import Lobby from './components/Lobby/Lobby'; -import VotingTable from './components/VotingTable/VotingTable'; -import UserSessionListener from './components/UserSessionListener/UserSessionListener'; -import { signInAnonymously, onAuthStateChanged } from 'firebase/auth'; -import { auth } from './services/firebase'; +import Lobby from './components/Lobby'; +import VotingTable from './components/VotingTable'; +import UserSessionListener from './components/UserSessionListener'; +import axios from 'axios'; +import cyarenLogo from './assets/images/CyarenLogo.png'; +import cardLogo from './assets/images/logo.png'; +import styles from './App.module.css'; const App = () => { const [userId, setUserId] = useState(''); @@ -21,37 +23,67 @@ const App = () => { }; useEffect(() => { - // Sign in the user anonymously - signInAnonymously(auth).catch((error) => { - console.error('Anonymous sign-in error:', error); - }); - - // Handle user state changes - onAuthStateChanged(auth, (user) => { - if (user) { - console.log('User is signed in:', user); - } else { - console.log('User is signed out'); - } - setLoading(false); - }); + // Check if there's a user session by making a request to the backend + axios + .get('/api/auth/session') + .then((response) => { + const { userId } = response.data; + if (userId) { + setUserId(userId); // User is logged in + } else { + // If no user session exists, create an anonymous user session + axios + .post('/api/auth/signin-anonymous') + .then((response) => { + setUserId(response.data.userId); + }) + .catch((error) => { + console.error('Error signing in anonymously:', error); + }); + } + }) + .catch((error) => { + console.error('Error checking user session:', error); + }) + .finally(() => { + setLoading(false); + }); }, []); return ( - - } - loading={loading} - /> - } - /> - } /> - +
+
+ + } + loading={loading} + /> + } + /> + } /> + +
+
+
+ cyaren-logo +
+ card-logo + card-logo +
+
); }; diff --git a/src/App.module.css b/src/App.module.css new file mode 100644 index 0000000..a33157a --- /dev/null +++ b/src/App.module.css @@ -0,0 +1,69 @@ +.app { + display: flex; + flex-flow: column nowrap; + align-items: center; + height: 100%; +} + +.app section.header { + flex: 1 auto; + display: flex; + flex-flow: column nowrap; + align-items: center; + width: 100%; +} + +.app section.footer { + display: flex; + flex-flow: column nowrap; + align-items: center; + margin: 0; + padding-bottom: 20px; + position: relative; + user-select: none; + width: 10%; +} + +.app section.footer .logoEnvelope { + width: 0; + overflow: hidden; + opacity: 0; + transition: + opacity 0.2s ease-in-out, + width 0.2s ease-in-out; + display: flex; + align-items: center; + justify-content: center; +} + +.app section.footer:hover .logoEnvelope { + width: 140px; + opacity: 1; + text-align: center; +} + +.cyaren { + /* width: calc(10%); */ + width: 140px; + min-width: 140px; +} + +.cardLogo { + width: calc(2%); + min-width: 30px; + position: absolute; + opacity: 0.1; + transition: + margin 0.2s ease-in-out, + opacity 0.2s ease-in-out; +} + +.app section.footer:hover .moveLeft { + margin-right: 120px; + opacity: 1; +} + +.app section.footer:hover .moveRight { + margin-left: 120px; + opacity: 1; +} diff --git a/src/assets/fonts/fonts.css b/src/assets/fonts/fonts.css index af5e266..559eea0 100644 --- a/src/assets/fonts/fonts.css +++ b/src/assets/fonts/fonts.css @@ -1,14 +1,6 @@ -@font-face { - font-family: 'blackmild-regular'; - src: url('/src/assets/fonts/Blackmild\ Regular/Blackmild\ Regular.otf') - format('opentype'); - font-weight: normal; - font-style: normal; -} - @font-face { font-family: 'cardo-regular'; - src: url('/src/assets/fonts/Cardo/Cardo-Regular.ttf') format('opentype'); + src: url('/src/assets/fonts/Cardo/Cardo-Regular.ttf') format('truetype'); font-weight: normal; font-style: normal; } @@ -16,7 +8,7 @@ @font-face { font-family: 'cinzel'; src: url('/src/assets/fonts/Cinzel/Cinzel-VariableFont_wght.ttf') - format('opentype'); + format('truetype'); font-weight: normal; font-style: normal; } diff --git a/src/assets/images/CyarenLogo.png b/src/assets/images/CyarenLogo.png new file mode 100644 index 0000000..2e69824 Binary files /dev/null and b/src/assets/images/CyarenLogo.png differ diff --git a/src/assets/images/applogo.xcf b/src/assets/images/applogo.xcf index 37e5c7c..c1ef28b 100644 Binary files a/src/assets/images/applogo.xcf and b/src/assets/images/applogo.xcf differ diff --git a/src/assets/images/bracket.svg b/src/assets/images/bracket.svg new file mode 100644 index 0000000..bdb31fd --- /dev/null +++ b/src/assets/images/bracket.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/images/card.xcf b/src/assets/images/card.xcf index 636aa5c..e70aa72 100644 Binary files a/src/assets/images/card.xcf and b/src/assets/images/card.xcf differ diff --git a/src/assets/images/cardback.xcf b/src/assets/images/cardback.xcf index dc6f30a..2d9e185 100644 Binary files a/src/assets/images/cardback.xcf and b/src/assets/images/cardback.xcf differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..a4c26dd Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/smalllogo.png b/src/assets/images/smalllogo.png new file mode 100644 index 0000000..e3e8218 Binary files /dev/null and b/src/assets/images/smalllogo.png differ diff --git a/src/assets/images/titlecard-mini.png b/src/assets/images/titlecard-mini.png new file mode 100644 index 0000000..53425d2 Binary files /dev/null and b/src/assets/images/titlecard-mini.png differ diff --git a/src/assets/images/titlecard.xcf b/src/assets/images/titlecard.xcf index 37c9449..178540b 100644 Binary files a/src/assets/images/titlecard.xcf and b/src/assets/images/titlecard.xcf differ diff --git a/src/components/BoardCard copy/index.jsx b/src/components/BoardCard copy/index.jsx new file mode 100644 index 0000000..7d4f0b7 --- /dev/null +++ b/src/components/BoardCard copy/index.jsx @@ -0,0 +1,29 @@ +import React, { useEffect, useState } from 'react'; +import VoteValue from '../VoteValue'; +import cardBack from '../../assets/images/cardback.png'; +import cardFront from '../../assets/images/cardfront.png'; +import styles from './BoardCard.module.css'; + +const BoardCard = ({ vote, isDimmed, isRevealed = true }) => { + const [isFlipped, setIsFlipped] = useState(false); + + useEffect(() => { + if (isRevealed) { + setTimeout(() => setIsFlipped(true), 300); + } else if (isFlipped) { + setIsFlipped(false); + } + }, [isFlipped, isRevealed]); + + return ( +
+
+ card-back + card-front + +
+
+ ); +}; + +export default BoardCard; diff --git a/src/components/BoardCard/BoardCard.jsx b/src/components/BoardCard/index.jsx similarity index 94% rename from src/components/BoardCard/BoardCard.jsx rename to src/components/BoardCard/index.jsx index 4a45967..4d03942 100644 --- a/src/components/BoardCard/BoardCard.jsx +++ b/src/components/BoardCard/index.jsx @@ -1,7 +1,7 @@ import React from 'react'; import cardBack from '../../assets/images/cardback.png'; import { ReactComponent as BracketIcon } from '../../assets/images/bracket.svg'; -import FrontCard from '../FrontCard/FrontCard'; +import FrontCard from '../FrontCard'; import styles from './BoardCard.module.css'; const BoardCard = ({ username, vote, isRevealed, isDimmed, isHighlighted }) => { diff --git a/src/components/FrontCard/FrontCard.jsx b/src/components/FrontCard/index.jsx similarity index 90% rename from src/components/FrontCard/FrontCard.jsx rename to src/components/FrontCard/index.jsx index c5faa48..187d190 100644 --- a/src/components/FrontCard/FrontCard.jsx +++ b/src/components/FrontCard/index.jsx @@ -1,6 +1,6 @@ import React from 'react'; import card from '../../assets/images/card.png'; -import VoteValue from '../VoteValue/VoteValue'; +import VoteValue from '../VoteValue'; import styles from './FrontCard.module.css'; const FrontCard = ({ value, className }) => { diff --git a/src/components/LoadingRoute/index.jsx b/src/components/LoadingRoute/index.jsx new file mode 100644 index 0000000..9b713f2 --- /dev/null +++ b/src/components/LoadingRoute/index.jsx @@ -0,0 +1,14 @@ +import React, { Fragment } from 'react'; +import { Route } from 'react-router-dom'; + +const LoadingRoute = ({ loading = false, element, ...rest }) => { + debugger; + console.log('this.type', this.type); + return } />; +}; + +// const LoadingRoute = Route; + +// console.log('LoadingRoute', LoadingRoute); + +export default LoadingRoute; diff --git a/src/components/Lobby/Lobby.jsx b/src/components/Lobby/index.jsx similarity index 52% rename from src/components/Lobby/Lobby.jsx rename to src/components/Lobby/index.jsx index aff220d..61b33a6 100644 --- a/src/components/Lobby/Lobby.jsx +++ b/src/components/Lobby/index.jsx @@ -1,11 +1,9 @@ import React, { useState, useEffect } from 'react'; -import { ref, onValue, set } from 'firebase/database'; -import { realtimeDb } from '../../services/firebase'; -import { generateUniqueId } from '../../utils/crypto'; +import { useNavigate, useParams } from 'react-router-dom'; import appLogo from '../../assets/images/applogo.png'; import styles from './Lobby.module.css'; -import { useNavigate, useParams } from 'react-router-dom'; -import { auth } from '../../services/firebase'; +import api from '../../services/api'; +import { generateUniqueId } from '../../shared/utils/crypto'; const Lobby = ({ onJoinSession = () => {} }) => { const navigate = useNavigate(); @@ -18,60 +16,40 @@ const Lobby = ({ onJoinSession = () => {} }) => { // Get or generate the session ID if (!sessionId) { const newSessionId = generateUniqueId(); - // Update the URL with the session ID if it wasn't already there navigate(`/lobby/${newSessionId}`); + } else { + // Fetch users in the session + api + .get(`/api/session/${sessionId}/users`) + .then((response) => { + setUsers(response.data); + }) + .catch((error) => { + console.error('Error fetching users:', error); + }); } - - const sessionRef = ref(realtimeDb, `sessions/${sessionId}/users`); - - // Listen for changes to the session users data - const unsubscribe = onValue(sessionRef, (snapshot) => { - const users = snapshot.val(); - if (!users) return; - - const userList = Object.entries(users).map(([uid, userInfo]) => ({ - uid, - username: userInfo.username, - })); - setUsers(userList); - }); - - return () => { - unsubscribe(); - }; }, [navigate, sessionId]); const handleJoinSession = async () => { - const user = auth.currentUser; - const userId = user ? user.uid : generateUniqueId(); + const userId = generateUniqueId(); // Generate unique ID for user - // Check if the uid is already part of the session - if (users.includes(userId)) { + // Check if the username is already taken + if (users.some((user) => user.username === username)) { setIsUsernameTaken(true); return; - } else { - // Set the initial vote for the user - const voteRef = ref(realtimeDb, `sessions/${sessionId}/votes/${userId}`); - await set(voteRef, -1); + } - // Add the user to the session's user list with their uid and username - const userRef = ref(realtimeDb, `sessions/${sessionId}/users/${userId}`); - await set(userRef, { - username: username, - uid: userId, - }); - - // Also save the current session ID under the user's record in the database - const userSessionRef = ref(realtimeDb, `users/${userId}`); - await set(userSessionRef, { - currentSessionId: `session/${sessionId}`, - }); + // Add the user to the session + try { + await api.post(`/api/session/${sessionId}/user`, { userId, username }); // Call the onJoinSession callback with the username onJoinSession(userId); // Navigate to the session navigate(`/session/${sessionId}`); + } catch (error) { + console.error('Error joining session:', error); } }; @@ -103,8 +81,8 @@ const Lobby = ({ onJoinSession = () => {} }) => {

Current Users In Session

- {users.map(({ uid, username }) => ( -
{username}
+ {users.map(({ id, username }) => ( +
{username}
))}
diff --git a/src/components/ProfileMenuButton/ProfileMenuButton.module.css b/src/components/ProfileMenuButton/ProfileMenuButton.module.css new file mode 100644 index 0000000..b86dd72 --- /dev/null +++ b/src/components/ProfileMenuButton/ProfileMenuButton.module.css @@ -0,0 +1,80 @@ +.root { + position: absolute; + top: 10px; + right: 35px; +} + +/* Container for the entire menu */ +.menuContainer { + position: relative; + display: inline-block; + text-align: center; +} + +/* Label with circular border */ +.menuLabel { + width: 20px; + height: 20px; + padding: 0.5rem; + border: 2px solid #f0dcb1; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + user-select: none; +} + +/* Container for the buttons */ +.menuButtons { + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + display: none; + background-color: transparent; + padding: 4px 0; + box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); + z-index: 1000; + min-width: 100px; +} + +/* Buttons styling */ +.menuButtons button { + display: block; + width: 100%; + margin: 8px 0; + background-color: #f0dcb1; + border: 1px solid #1b191a; + border-radius: 4px; + color: #1b191a; + padding: 4px 4px; + cursor: pointer; + font-weight: 800; + user-select: none; + box-shadow: 2px 2px 5px rgba(0, 0, 0, 1); + transition: background-color 0.3s ease; +} + +.menuButtons button:hover { + box-shadow: 2px 2px 5px rgba(0, 0, 0, 1); + background-color: #cdba95; +} + +.menuButtons button:active { + box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); + background-color: #f0dcb1; + transform: scale(0.95); +} + +/* Show buttons on hover */ +.menuContainer:hover .menuButtons { + display: block; +} + +.menuContainer .invite { +} + +.menuContainer .invite .checkmark { + font-weight: 800; +} diff --git a/src/components/ProfileMenuButton/index.jsx b/src/components/ProfileMenuButton/index.jsx new file mode 100644 index 0000000..e1cb522 --- /dev/null +++ b/src/components/ProfileMenuButton/index.jsx @@ -0,0 +1,49 @@ +import React, { useState, useEffect, useRef } from 'react'; + +import styles from './ProfileMenuButton.module.css'; +import { getAcronym } from '../../utils/strings'; + +const ProfileMenuButton = ({ username, className, onLogout, onInvite }) => { + const [isInviteCopied, setIsInviteCopied] = useState(false); + const acronym = getAcronym(username).slice(0, 2); + const timeoutIdRef = useRef(null); + + async function handleInvite() { + try { + await onInvite(); + setIsInviteCopied(true); + timeoutIdRef.current = setTimeout(() => { + setIsInviteCopied(false); + }, 2000); + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + // Cleanup the timeout if the component unmounts before the timeout is complete + return () => clearTimeout(timeoutIdRef.current); + }, []); + + return ( +
+
+
{acronym}
+
+ + +
+
+
+ ); +}; + +export default ProfileMenuButton; diff --git a/src/components/Results/Results.jsx b/src/components/Results/index.jsx similarity index 94% rename from src/components/Results/Results.jsx rename to src/components/Results/index.jsx index 7da4b8b..b76b9f2 100644 --- a/src/components/Results/Results.jsx +++ b/src/components/Results/index.jsx @@ -1,6 +1,6 @@ import React from 'react'; import styles from './Results.module.css'; -import VoteValue from '../VoteValue/VoteValue'; +import VoteValue from '../VoteValue'; const Results = ({ votes }) => { const voteCounts = Object.values(votes).reduce((acc, vote) => { diff --git a/src/components/UserSessionListener/UserSessionListener.jsx b/src/components/UserSessionListener/UserSessionListener.jsx deleted file mode 100644 index fcc13b0..0000000 --- a/src/components/UserSessionListener/UserSessionListener.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import { useEffect, useState } from 'react'; -import { ref, onValue, remove } from 'firebase/database'; -import { realtimeDb } from '../../services/firebase'; -import { useNavigate } from 'react-router-dom'; -import { generateUniqueId } from '../../utils/crypto'; -import { auth } from '../../services/firebase'; - -const UserSessionListener = () => { - const navigate = useNavigate(); - const user = auth.currentUser; - const userId = user ? user.uid : generateUniqueId(); - const [isRedirecting, setIsRedirecting] = useState(false); - - useEffect(() => { - const userRef = ref(realtimeDb, `users/${userId}/currentSessionId`); - - const unsubscribe = onValue(userRef, async (snapshot) => { - const currentSessionId = snapshot.val() || generateUniqueId(); - - // Only redirect if the user is not already being redirected - if ( - !isRedirecting && - currentSessionId && - currentSessionId.startsWith('lobby') - ) { - setIsRedirecting(true); - - console.log(`Removing user from: users/${userId}`); - - // Remove the entire user entry from the database - const fullUserRef = ref(realtimeDb, `users/${userId}`); - await remove(fullUserRef); - - navigate(`/${currentSessionId}`); - - setIsRedirecting(false); - } - }); - - return () => unsubscribe(); - }, [userId, navigate, isRedirecting]); - - return null; -}; - -export default UserSessionListener; diff --git a/src/components/UserSessionListener/index.jsx b/src/components/UserSessionListener/index.jsx new file mode 100644 index 0000000..dc6a514 --- /dev/null +++ b/src/components/UserSessionListener/index.jsx @@ -0,0 +1,48 @@ +import { useEffect, useState } from 'react'; +import api from '../../services/api'; // Import the Axios instance with the interceptor +import { useNavigate } from 'react-router-dom'; +import { generateUniqueId } from '../../shared/utils/crypto'; + +const UserSessionListener = () => { + const navigate = useNavigate(); + const [isRedirecting, setIsRedirecting] = useState(false); + + const userId = generateUniqueId(); // Use the unique ID generator for anonymous users + + useEffect(() => { + const fetchUserSession = async () => { + try { + // Get the user's current session ID from the API + const response = await api.get(`/users/${userId}/session`); + + const currentSessionId = + response.data.currentSessionId || generateUniqueId(); + + // Only redirect if the user is not already being redirected + if ( + !isRedirecting && + currentSessionId && + currentSessionId.startsWith('lobby') + ) { + setIsRedirecting(true); + + // Delete the user from the session via API + await api.delete(`/users/${userId}`); + + // Redirect to the session + navigate(`/${currentSessionId}`); + + setIsRedirecting(false); + } + } catch (error) { + console.error('Error fetching user session:', error); + } + }; + + fetchUserSession(); + }, [userId, navigate, isRedirecting]); + + return null; +}; + +export default UserSessionListener; diff --git a/src/components/VoteCard/VoteCard.module.css b/src/components/VoteCard/VoteCard.module.css index 93088a1..9de0707 100644 --- a/src/components/VoteCard/VoteCard.module.css +++ b/src/components/VoteCard/VoteCard.module.css @@ -1,3 +1,9 @@ +button.voteCard { + font-family: 'Cardo', serif; + font-weight: 400; + font-style: normal; +} + .voteCard { width: 50px; height: 75px; @@ -31,12 +37,6 @@ z-index: 1; } -.cardo-regular { - font-family: 'Cardo', serif; - font-weight: 400; - font-style: normal; -} - .shadow { position: absolute; width: 50px; diff --git a/src/components/VoteCard/VoteCard.jsx b/src/components/VoteCard/index.jsx similarity index 83% rename from src/components/VoteCard/VoteCard.jsx rename to src/components/VoteCard/index.jsx index dfc69cd..b21e700 100644 --- a/src/components/VoteCard/VoteCard.jsx +++ b/src/components/VoteCard/index.jsx @@ -1,12 +1,12 @@ import React from 'react'; import styles from './VoteCard.module.css'; -import FrontCard from '../FrontCard/FrontCard'; +import FrontCard from '../FrontCard'; const VoteCard = ({ number, isSelected, onClick, className }) => { return (