Skip to content

Commit

Permalink
user registration create
Browse files Browse the repository at this point in the history
  • Loading branch information
iamrahimi committed Dec 30, 2024
1 parent ab36733 commit e710621
Show file tree
Hide file tree
Showing 13 changed files with 445 additions and 9 deletions.
288 changes: 288 additions & 0 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"description": "Back-End Repo for Team 1 of Baboon/Bald Eagle Practicum",
"main": "app.js",
"scripts": {
"dev": "nodemon src/server.js",
"dev": "nodemon src/server.js",
"seed": "node prisma/seed.js"
},
"author": "",
Expand All @@ -16,6 +16,8 @@
"dotenv": "^16.4.7",
"express": "^4.18.2",
"express-favicon": "^2.0.4",
"joi": "^17.13.3",
"jsonwebtoken": "^9.0.2",
"mongoose": "^7.0.1",
"morgan": "^1.10.0",
"pg": "^8.13.1",
Expand Down
14 changes: 7 additions & 7 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ datasource db {

model users {
user_id Int @id @default(autoincrement())
username String @unique
email String @unique
password_hash String
username String @unique @db.VarChar(50)
email String @unique @db.VarChar(50)
password_hash String @db.VarChar(255)
role_id Int
user_role user_role[] @relation("users")
comments comments[] @relation("user-comments")
Expand All @@ -28,7 +28,7 @@ model users {

model roles{
role_id Int @id @default(autoincrement())
role_name String @unique
role_name String @unique @db.VarChar(50)
roles user_role[] @relation("roles")
}
Expand All @@ -43,11 +43,11 @@ model user_role{

model projects {
project_id Int @id @default(autoincrement())
name String
name String @db.VarChar(255)
description String
tags String
github_link String
youtube_link String?
github_link String? @db.VarChar(50)
youtube_link String? @db.VarChar(50)
is_public Boolean
owner users @relation("users-projects", fields: [created_by], references: [user_id])
created_by Int
Expand Down
4 changes: 4 additions & 0 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ const favicon = require('express-favicon');
const logger = require('morgan');

const mainRouter = require('./routes/mainRouter.js');
const authRouter = require('./routes/authRouter');
const userRouter = require('./routes/userRouter');

// middleware
app.use(cors());
Expand All @@ -16,5 +18,7 @@ app.use(favicon(__dirname + '/public/favicon.ico'));

// routes
app.use('/api/v1', mainRouter);
app.use('/api/v1', authRouter);
app.use('/api/v1', userRouter);

module.exports = app;
35 changes: 35 additions & 0 deletions src/controllers/authController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const mainController = {};
const bcrypt = require('bcryptjs')

const { PrismaClient } = require ("@prisma/client");
const { Public } = require('@prisma/client/runtime/library');
const prisma = new PrismaClient();

mainController.register = async (req, res) => {

const {username, email, password_hash, role} = req.body;
password = await hashPassword(password_hash)
console.log(username, email, password_hash, role);
const user = await prisma.users.create({data:{
username: username,
email: email,
password_hash: password,
role_id:12
}})

return res.json({
message: 'This is a full stack app!',
data: user,
});
};


async function hashPassword(password) {
const salt = await bcrypt.genSalt(10)
password = await bcrypt.hash(password, salt)
console.log(password);
return password;
}


module.exports = mainController;
15 changes: 15 additions & 0 deletions src/controllers/userController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const { createUser } = require('../services/userService');

const createUserController = async (req, res) => {
try {
const user = await createUser(req.body);
res.status(201).json(user);
} catch (error) {
console.log(error)
res.status(400).json({ error: error.message });
}
};

module.exports = {
createUserController,
};
33 changes: 33 additions & 0 deletions src/middlewares/prismaValidationMiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const userSchema = require('../models/userSchema');
const bcrypt = require('bcryptjs');

const prismaValidationMiddleware = async (params, next) => {

if (params.model === 'users' && params.action === 'create') {

const userInput = params.args.data;
// Validate input data
const { error } = userSchema.validate(userInput);
if (error) {
throw new Error(`Validation Error: ${error.message}`);
}
}

// Intercept User model actions
if (params.model === 'users') {

if (params.action === 'create' || params.action === 'update') {
const userInput = params.args.data;

if (userInput && userInput.password_hash) {
// Hash the password
const salt = await bcrypt.genSalt(10);
userInput.password_hash = await bcrypt.hash(userInput.password_hash, salt);
}
}
}

return next(params);
};

module.exports = prismaValidationMiddleware;
10 changes: 10 additions & 0 deletions src/models/userSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const Joi = require('joi');

const userSchema = Joi.object({
username: Joi.string().min(2).max(50).required(),
email: Joi.string().email().required(),
password_hash: Joi.string().min(8).required(),
role_id:Joi.number()
});

module.exports = userSchema;
9 changes: 9 additions & 0 deletions src/prisma/prismaClient.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const { PrismaClient } = require('@prisma/client');
const prismaValidationMiddleware = require('../middlewares/prismaValidationMiddleware');

const prisma = new PrismaClient();

// Apply the middleware
prisma.$use(prismaValidationMiddleware);

module.exports = prisma;
8 changes: 8 additions & 0 deletions src/routes/authRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const express = require('express');
const router = express.Router();
const {register} = require('../controllers/authController.js');
const { route } = require('./authRouter.js');

router.route('/register').post(register)

module.exports = router;
8 changes: 8 additions & 0 deletions src/routes/userRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const express = require('express');
const { createUserController } = require('../controllers/userController');

const router = express.Router();

router.post('/users', createUserController);

module.exports = router;
3 changes: 2 additions & 1 deletion src/server.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { PORT = 8001 } = process.env;
require('dotenv').config();
const PORT = process.env.PORT || 8000;
const app = require("./app");

const connectDB = require("./db/connect");
Expand Down
23 changes: 23 additions & 0 deletions src/services/userService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const prisma = require('../prisma/prismaClient');

const createUser = async (userData) => {
try {
const user = await prisma.users.create({
data: userData,
});
return user;
} catch (error) {
if (error.code === 'P2002') {
// Unique constraint error
throw new Error(`Field ${error.meta.target} must be unique`);
} else {
// Log the error and rethrow it
console.error('Unexpected error:', error);
throw new Error('An unexpected error occurred');
}
}
};

module.exports = {
createUser,
};

0 comments on commit e710621

Please sign in to comment.