Auth: added
This commit is contained in:
@@ -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')
|
||||
|
@@ -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)
|
||||
|
76
api/src/controllers/userController.ts
Normal file
76
api/src/controllers/userController.ts
Normal 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))
|
||||
}
|
||||
}
|
@@ -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
44
api/src/models/Client.ts
Normal 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
49
api/src/models/Project.ts
Normal 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
|
@@ -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'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user