Auth: added

This commit is contained in:
2023-12-31 17:16:15 +01:00
parent 5c769bfa2f
commit dabd5ea0f0
17 changed files with 771 additions and 75 deletions

View File

@@ -1,13 +1,21 @@
import env from './environment'
import { Err, Succ } from '../services/globalService'
import db from './sequelize.config'
import Client from '../models/Client'
import Project from '../models/Project'
import Task from '../models/Task'
import User from '../models/User'
function connect() {
async function connect() {
if (!env.NORK.database) {
new Err(500, 'no database is in norkcfg.json')
return false
}
if (env.NORK.database.orm == 'sequelize') {
await User.sync()
await Client.sync()
await Project.sync()
await Task.sync({ alter: true })
db.sync()
.then(() => {
new Succ(200, 'connected to db')

View File

@@ -11,7 +11,10 @@ export async function get(req: Request, res: Response) {
}
export async function add(req: Request, res: Response) {
try {
const task = await Task.create(req.body)
const payload = req.body
payload.author_id = res.locals.user._id
console.log(payload)
const task = await Task.create(payload)
res.json(task)
} catch (error) {
res.status(500).send(error)

View File

@@ -0,0 +1,76 @@
import { Request, Response } from 'express'
import bcrypt from 'bcrypt'
import jwt from 'jsonwebtoken'
import env from '../config/environment'
import User from '../models/User'
import { Err, Succ } from '../services/globalService'
export async function login(req: Request, res: Response) {}
export async function signup(req: Request, res: Response) {
try {
const payload = req.body
payload.password = await bcrypt.hash(payload.password, 12)
const user = await User.create(payload)
res.status(201).json(new Succ(201, 'user was successfully signed up'))
} catch (err: any) {
new Err(500, err)
res.status(500).json(new Err(500, 'something went wrong'))
}
}
export async function signin(req: Request, res: Response) {
try {
const payload = req.body
const user: any = await User.findOne({ where: { email: payload.email } })
if (!user) {
res.cookie('jwt', '', { httpOnly: true, maxAge: 0 })
res.cookie('auth', false, { httpOnly: false, maxAge: 0 })
res.status(401).json(new Err(401, 'email or password is wrong'))
return
}
if (await bcrypt.compare(payload.password, user.password)) {
const maxAge = 3 * 24 * 60 * 60 // 3 days in seconds
const createToken = (id: any) => {
return jwt.sign({ id }, env.JWT_SECRET, {
expiresIn: maxAge
})
}
const token = createToken(user._id)
res.cookie('jwt', token, { httpOnly: true, maxAge: maxAge * 1000 })
res.cookie('auth', true, { httpOnly: false, maxAge: maxAge * 1000 })
res.json(new Succ(200, 'user is logged in'))
return
}
res.cookie('jwt', '', { httpOnly: true, maxAge: 0 })
res.cookie('auth', false, { httpOnly: false, maxAge: 0 })
res.status(401).json(new Err(401, 'email or password is wrong'))
} catch (err: any) {
new Err(500, err)
res.status(500).json(new Err(500, 'something went wrong'))
}
}
export function logout(req: Request, res: Response) {
res.cookie('jwt', '', { httpOnly: true, maxAge: 0 })
res.cookie('auth', false, { httpOnly: false, maxAge: 0 })
res.json(new Succ(200, 'user was logged out'))
}
export function status(req: Request, res: Response) {
try {
let userObject = res.locals.user
userObject.password = undefined
userObject.__v = undefined
res.status(200).json(new Succ(200, 'user is logged in', userObject))
} catch (error) {
res.status(500).json(new Err(500, 'somehting went wrong', error))
}
}

View File

@@ -6,7 +6,7 @@ import User from '../models/User' // uncomment this
export function requireAuth(req: Request, res: Response, next: NextFunction) {
const token = req.cookies.jwt
new Err(500, 'uncomment code in authMiddleware before using!')
//new Err(500, 'uncomment code in authMiddleware before using!')
if (token) {
jwt.verify(token, env.JWT_SECRET, async (err: any, decodedToken: any) => {
if (err) {
@@ -14,25 +14,16 @@ export function requireAuth(req: Request, res: Response, next: NextFunction) {
res.status(401).json(new Err(401, 'user is not authenticated'))
}
if (!err) {
const user = (async () => {
if (env.NORK.db.orm) {
if (env.NORK.db.orm == 'sequelize') {
return await User.findByPk(decodedToken.id)
}
if (env.NORK.db.orm == 'mongoose') {
return await User.findById(decodedToken.id)
}
} else {
return null
}
})()
const user = await User.findByPk(decodedToken.id)
console.log('TADY', user)
if (user === null) {
console.log('1')
res.status(401).json(new Err(401, 'user is not authenticated'))
return
}
res.locals.user = user
console.log('2')
new Succ(100, 'user is authenticated')
next()
}
@@ -40,6 +31,7 @@ export function requireAuth(req: Request, res: Response, next: NextFunction) {
}
if (!token) {
console.log('3')
res.status(401).json(new Err(401, 'user is not authenticated'))
}
}

44
api/src/models/Client.ts Normal file
View File

@@ -0,0 +1,44 @@
import { DataTypes, Model } from 'sequelize'
import path from 'path'
import db from '../config/sequelize.config'
import User from './User'
class Instance extends Model {}
Instance.init(
{
_id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
allowNull: false,
unique: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
hourlyRate: {
type: DataTypes.INTEGER,
allowNull: true
},
contact: {
type: DataTypes.STRING,
allowNull: true
},
author_id: {
type: DataTypes.UUID,
allowNull: false,
references: {
model: User,
key: '_id'
}
}
},
{
sequelize: db,
tableName: path.basename(__filename).split('.')[0].toLowerCase()
}
)
export default Instance

49
api/src/models/Project.ts Normal file
View File

@@ -0,0 +1,49 @@
import { DataTypes, Model } from 'sequelize'
import path from 'path'
import db from '../config/sequelize.config'
import User from './User'
import Client from './Client'
class Instance extends Model {}
Instance.init(
{
_id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
allowNull: false,
unique: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
hourlyRate: {
type: DataTypes.INTEGER,
allowNull: true
},
client_id: {
type: DataTypes.UUID,
allowNull: false,
references: {
model: Client,
key: '_id'
}
},
author_id: {
type: DataTypes.UUID,
allowNull: false,
references: {
model: User,
key: '_id'
}
}
},
{
sequelize: db,
tableName: path.basename(__filename).split('.')[0].toLowerCase()
}
)
export default Instance

View File

@@ -1,6 +1,9 @@
import { DataTypes, Model } from 'sequelize'
import path from 'path'
import db from '../config/sequelize.config'
import User from './User'
import Client from './Client'
import Project from './Project'
class Instance extends Model {}
@@ -14,14 +17,6 @@ Instance.init(
unique: true
},
title: {
type: DataTypes.STRING,
allowNull: false
},
client: {
type: DataTypes.STRING,
allowNull: true
},
project: {
type: DataTypes.STRING,
allowNull: true
},
@@ -32,6 +27,22 @@ Instance.init(
timeEnd: {
type: DataTypes.BIGINT,
allowNull: true
},
project_id: {
type: DataTypes.UUID,
allowNull: true,
references: {
model: Project,
key: '_id'
}
},
author_id: {
type: DataTypes.UUID,
allowNull: false,
references: {
model: User,
key: '_id'
}
}
},
{

View File

@@ -8,28 +8,29 @@ Instance.init(
{
_id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
allowNull: false,
unique: true,
unique: true
},
username: {
type: DataTypes.STRING,
allowNull: false,
allowNull: false
},
password: {
type: DataTypes.STRING,
allowNull: false,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
unique: true
}
},
{
sequelize: db,
tableName: path.basename(__filename).split('.')[0].toLowerCase(),
},
tableName: path.basename(__filename).split('.')[0].toLowerCase()
}
)
export default Instance

View File

@@ -1,8 +1,15 @@
import { Router } from 'express'
import * as taskController from "../controllers/taskController"
import * as taskController from '../controllers/taskController'
import * as userController from '../controllers/userController'
import { requireAuth } from '../middlewares/authMiddleware'
export const router = Router()
//const mws = [handleValidation.handleValidationError]
router.get("/task/get", taskController.get)
router.post("/task/add", taskController.add)
router.get('/task/get', requireAuth, taskController.get)
router.post('/task/add', requireAuth, taskController.add)
router.post('/auth/signup', userController.signup)
router.post('/auth/signin', userController.signin)
router.post('/auth/logout', requireAuth, userController.logout)
router.get('/auth/status', requireAuth, userController.status)