Browse Source

ADD user account logic

master
astria 4 weeks ago
parent
commit
cefddbdde7
  1. 3
      .gitignore
  2. 53
      backend/app/controllers/users.controller.js
  3. 31
      backend/app/middlewares/users.middlewares.js
  4. 11
      backend/app/routes/users.routes.js
  5. 20
      backend/app/services/db.services.js
  6. 16
      backend/app/services/users.services.js
  7. 36
      backend/index.js
  8. 1194
      backend/package-lock.json
  9. 10
      backend/package.json

3
.gitignore

@ -1,3 +1,4 @@
.idea/
backend/node_modules/
frontend/node_modules/
frontend/node_modules/
.env

53
backend/app/controllers/users.controller.js

@ -0,0 +1,53 @@
import {createUserService, getUserByEmailServices} from '../services/users.services.js';
import bcrypt from 'bcrypt';
export async function createUser(req,res) {
const { username, email, password } = req.body;
const user = {
username,
email,
password
}
user.password = await bcrypt.hash(password, 12);
try {
await createUserService(user);
res.status(201).send({
message: 'User created successfully',
data:{
"username": username,
"email": email,
}
});
} catch (error) {
console.log(error);
res.status(500).json({
error: 500,
message: error.message,
})
}
}
export async function logUser(req,res) {
const email = req.body.email;
const password = req.body.password;
const response = await getUserByEmailServices(email);
const userData = response.rows[0];
const isPasswordValid = await bcrypt.compare(password, userData.password);
if (isPasswordValid) {
res.status(200).send({
message: 'User logged successfully',
})
} else {
res.status(401).send({
"error": 401,
"message": "Bad Credentials"
})
}
}

31
backend/app/middlewares/users.middlewares.js

@ -0,0 +1,31 @@
import {getUserByEmailServices} from "../services/users.services.js";
export async function doUserAlreadyExists(req,res,next){
const email = req.body.email;
const request = await getUserByEmailServices(email);
if (request.rows && request.rows.length > 0) {
return res.status(409).json({
error: 409,
message: `Email already exists`,
})
}
next();
}
export async function doUserExists(req,res,next){
console.log(req.body);
const email = req.body.email;
const request = await getUserByEmailServices(email);
if (request.rows && request.rows.length > 0) {
next()
} else {
return res.json({
error: 401,
message: 'Bad Credentials'
})
}
}

11
backend/app/routes/users.routes.js

@ -0,0 +1,11 @@
import {Router} from "express";
import {createUser, logUser} from "../controllers/users.controller.js";
import {doUserAlreadyExists, doUserExists} from "../middlewares/users.middlewares.js";
const router = Router();
router.post("/register", [doUserAlreadyExists], createUser);
router.post("/login", [doUserExists], logUser);
export default router;

20
backend/app/services/db.services.js

@ -0,0 +1,20 @@
import pg from "pg";
async function query(query,values) {
const client = await new pg.Client({
user: process.env.PG_USER,
password: process.env.PG_PASSWORD,
host: process.env.PG_HOST,
database: "spotifine",
});
client.connect();
const res = await client.query(query,values);
await client.end();
return res;
}
export default query;

16
backend/app/services/users.services.js

@ -0,0 +1,16 @@
import db from './db.services.js';
export async function createUserService(user) {
const query = "INSERT INTO users (username, password, email) VALUES ($1, $2, $3)";
const values = [user.username, user.password, user.email];
const res = await db(query, values);
return res.ok;
}
export async function getUserByEmailServices(email) {
const query = "SELECT * FROM users WHERE email = $1";
const values = [email];
return await db(query, values);
}

36
backend/index.js

@ -0,0 +1,36 @@
import express from 'express';
import dotenv from 'dotenv';
import cors from 'cors';
import UserRouter from "./app/routes/users.routes.js";
console.clear()
dotenv.config({
path: `../.env`,
});
const app = express();
const port = process.env.BACKEND_PORT || 3000;
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));
app.use(cors());
app.use((err, req, res, next) => {
console.log(err);
res.status(500).json({
message: err.message,
})
})
app.use("/users", UserRouter);
app.get('/', (req, res) => {
res.send("Welcome");
})
app.listen(port, () => {
console.log(`Server started on port ${port}`);
})

1194
backend/package-lock.json

File diff suppressed because it is too large

10
backend/package.json

@ -7,9 +7,17 @@
"type": "module",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"dev": "nodemon ."
},
"devDependencies": {
"nodemon": "^3.1.11"
},
"dependencies": {
"bcrypt": "^6.0.0",
"cors": "^2.8.5",
"dotenv": "^17.2.3",
"express": "^5.1.0",
"multer": "^2.0.2",
"pg": "^8.16.3"
}
}

Loading…
Cancel
Save