This commit is contained in:
rgrgogu
2026-05-05 23:18:47 +08:00
parent 5aeb959e92
commit a8f10a25d7
38 changed files with 5992 additions and 2 deletions
+41
View File
@@ -0,0 +1,41 @@
/***********************************************************************************************************************************************************************
* File Name: db.config.js
* Type of Program: Configuration
* Description: Sequelize PostgreSQL connection instance.
* Reads credentials from environment variables and exposes a single
* authenticated Sequelize instance used across all models.
* Author: rgrgogu
* Date Created: Oct. 6, 2025
***********************************************************************************************************************************************************************
* HOW TO USE:
* const sequelize = require('./config/db.config');
* // Then use sequelize.define() or import your models directly.
***********************************************************************************************************************************************************************/
require('dotenv').config();
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASSWORD,
{
host: process.env.DB_HOST,
port: process.env.DB_PORT || 5432,
dialect: 'postgres',
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false, // or provide CA cert if strict
},
},
logging: process.env.NODE_ENV === 'development' ? console.log : false,
pool: {
max: 10,
min: 0,
acquire: 30000,
idle: 10000,
},
}
);
module.exports = sequelize;
+70
View File
@@ -0,0 +1,70 @@
/***********************************************************************************************************************************************************************
* File Name: passport.config.js
* Type of Program: Configuration
* Description: Passport.js strategy configuration.
* Registers the Google OAuth 2.0 strategy. On first login via Google
* a new user record is auto-created with reg_type="google".
* Returns a signed JWT payload after successful authentication.
* Author: rgrgogu
* Date Created: Oct. 6, 2025
***********************************************************************************************************************************************************************
* HOW TO USE:
* In server.js:
* require('./config/passport.config');
* app.use(passport.initialize());
* In routes:
* router.get('/google', passport.authenticate('google', { scope: ['profile', 'email'] }));
* router.get('/google/callback', passport.authenticate('google', { session: false }), handler);
***********************************************************************************************************************************************************************/
const passport = require('passport');
const { Strategy: GoogleStrategy } = require('passport-google-oauth20');
const mdl_Users = require('../models/users/users.mdl');
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: process.env.GOOGLE_CALLBACK_URL,
},
async (accessToken, refreshToken, profile, done) => {
try {
const email = profile.emails?.[0]?.value;
if (!email) return done(new Error('No email returned from Google'), null);
let user = await mdl_Users.findOne({ where: { email } });
if (!user) {
// Auto-register Google users as 'user' acc_type
user = await mdl_Users.create({
email,
reg_type: 'google',
acc_type: 'user',
is_active: true,
is_verified: true, // Google accounts are pre-verified
personal_info: {
name: {
given_name: profile.name?.givenName || '',
last_name: profile.name?.familyName || '',
full_name: profile.displayName || '',
},
avatar: {
url: profile.photos?.[0]?.value || null,
},
},
});
}
if (!user.is_active) {
return done(null, false, { message: 'Account is deactivated.' });
}
return done(null, user);
} catch (err) {
return done(err, null);
}
}
)
);
module.exports = passport;