Skip to content
Snippets Groups Projects
Commit 3dc3322a authored by Jonny Ngo Luong's avatar Jonny Ngo Luong
Browse files

Merge branch '22-auth-endepunkter' into 'master'

Resolve "Flytte endepunkter av bruker registrering og login til sin egen kontroller `authenticationController`"

Closes #22

See merge request !14
parents 235c855c dd9705d4
No related branches found
No related tags found
1 merge request!14Resolve "Flytte endepunkter av bruker registrering og login til sin egen kontroller `authenticationController`"
......@@ -13,7 +13,8 @@ interface IUserLogin {
providedIn: 'root'
})
export class AuthService {
loginUrl = "api/user/login"
loginUrl = "api/auth/login";
registrationUrl = "api/auth/register";
constructor(private http: HttpClient, private router: Router) { }
......@@ -67,4 +68,29 @@ export class AuthService {
localStorage.removeItem("token");
}
/**
* Register an user, if not duplicate, add to database.
*/
registerUser(user: User): Promise<string> {
return new Promise<string>(
(resolve, reject) => {
this.register_user(user).subscribe((data: any) => {
try {
resolve(data.data);
} catch (err: any) {
reject(err);
}
},
(err: any) => {
console.log(err.message);
reject(err);
});
}
);
}
private register_user(user: User) {
return this.http.post(this.registrationUrl, user.serialize());
}
}
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from 'src/app/authentication/auth.service';
import { User } from 'src/app/models/user.model';
import { UserService } from '../user.service';
......@@ -15,7 +16,7 @@ export class UserRegistrationFormComponent implements OnInit {
statusMessage: string = "";
constructor(private userService: UserService, private router: Router) { }
constructor(private userService: UserService, private authService: AuthService, private router: Router) { }
ngOnInit(): void {
}
......@@ -53,7 +54,7 @@ export class UserRegistrationFormComponent implements OnInit {
});
// Adds user to database and changes page afterwards
this.userService.addUser(newUser).then(status => {
this.authService.registerUser(newUser).then(status => {
console.log("User was added: " + JSON.stringify(status));
this.router.navigateByUrl("/");
}).catch(error => {
......
......@@ -12,61 +12,11 @@ interface IUserLogin {
})
export class UserService {
userUrl = "api/user/"
loginUrl = "api/user/login"
constructor(private http: HttpClient) { }
/**
* Get request of user from database on login request.
*/
login(body: IUserLogin): Promise<string> {
return new Promise<string>(
(resolve, reject) => {
this.login_user(body).subscribe((data: any) => {
try {
resolve(data.data);
} catch (err: any) {
reject(err);
}
},
(err: any) => {
console.log(err.message);
reject(err);
});
}
);
}
private login_user(body: IUserLogin) {
return this.http.post(this.loginUrl, body);
}
/**
* Adds user to database.
*/
addUser(user: User): Promise<string> {
return new Promise<string>(
(resolve, reject) => {
this.add_user(user).subscribe((data: any) => {
try {
resolve(data.data);
} catch (err: any) {
reject(err);
}
},
(err: any) => {
console.log(err.message);
reject(err);
});
}
);
}
private add_user(user: User) {
return this.http.post(this.userUrl, user.serialize());
}
/**
* Get post from database by id.
* Get user from database by id.
*/
getUser(id: number): Promise<User> {
return new Promise<User>(
......
......@@ -17,6 +17,4 @@ export default {
JWT_KEY : env.JWT_KEY || "",
HOST: env.HOST || "localhost",
PORT: env.HTTPPORT || 3000,
ACCESS_TOKEN_SECRET: env.ACCESS_TOKEN_SECRET,
REFRESH_TOKEN_SECRET: env.REFRESH_TOKEN_SECRET,
};
import { Response, Request } from "express";
import query from '../../services/db_query';
import express from 'express';
import IUser from '../../models/user';
import * as jwt from 'jsonwebtoken';
import config from '../../config';
const router = express.Router();
// Post register user `/api/auth/register`
router.route('/register').post(async (request: Request, response: Response) => {
const {username, email, password, create_time} = request.body;
try {
// Check valid request data parameters
const user_data: IUser = {
"username": username,
"email": email,
"password": password,
};
if (Object.values(user_data).filter(p => p == undefined).length > 0) return response.status(500).send("Error");
// Check for user duplicates
const duplicate_input = "SELECT userId, username, email, create_time FROM user WHERE username=? AND password=?;"
const user = await query(duplicate_input,[user_data.username, user_data.password]);
const retrievedUserObj = Object.values(JSON.parse(JSON.stringify(user.data)))[0];
if (retrievedUserObj) {
return response.status(403).send("There exists an user with the same username or emails given!");
}
// If there is no duplicates, create new user
const input = (`INSERT INTO user(username, email, password) VALUES (?,?,?)`)
return response.status(200).json(
await query(input,Object.values(user_data))
);
} catch (error) {
return response.status(400).send("Bad Request");
}
});
// Post auth token with username and password `/api/auth/login`
router.route('/login').post(async (request: Request, response: Response) => {
const {username, password} = request.body;
try {
const input = "SELECT userId, username, email, create_time FROM user WHERE username=? AND password=?;"
const user = await query(input,[username, password]);
// Check if an user object is retrieved
const userObj = Object.values(JSON.parse(JSON.stringify(user.data)))[0];
if (userObj) {
const jwt_token = jwt.sign({data: user.data}, config.JWT_KEY.replace(/\\n/gm, '\n'), {
algorithm: 'RS256',
expiresIn: 3600*24, // 24 hours
});
response.status(200).json({
token: jwt_token,
});
} else {
return response.status(401).send("Invalid combination of username and password given!");
}
} catch (error) {
return response.status(400).send("Bad Request");
console.log(error);
}
});
export default router;
......@@ -2,8 +2,6 @@ import { Response, Request } from "express";
import query from '../../services/db_query';
import express from 'express';
import IUser from '../../models/user';
import * as jwt from 'jsonwebtoken';
import config from '../../config';
import authenticateToken from '../../middlewares/auth';
const router = express.Router();
......@@ -48,31 +46,6 @@ router.route('/:userId').get(authenticateToken, async (request: Request, respons
}
});
// Get user with username and password `/api/user/`
router.route('/login').post(async (request: Request, response: Response) => {
const {username, password} = request.body;
try {
const input = "SELECT userId, username, email, create_time FROM user WHERE username=? AND password=?;"
const user = await query(input,[username, password]);
// Check if an user object is retrieved
const userObj = Object.values(JSON.parse(JSON.stringify(user.data)))[0];
if (userObj) {
const jwt_token = jwt.sign({data: user.data}, config.JWT_KEY.replace(/\\n/gm, '\n'), {
algorithm: 'RS256',
expiresIn: 3600*24, // 24 hours
});
response.status(200).json({
token: jwt_token,
});
} else {
response.status(403).send("Invalid combination of username and password given!");
}
} catch (error) {
response.status(400).send("Bad Request");
console.log(error);
}
});
/* ============================= UPDATE ============================= */
// Update user from id `/api/user/:id`
router.route('/:userId').put(async (request: Request, response: Response) => {
......
import postController from '../controllers/postController';
import categoryController from '../controllers/categoryController';
import userController from '../controllers/userController';
import authController from '../controllers/authController';
import express from 'express';
const router = express.Router();
......@@ -9,5 +10,6 @@ const router = express.Router();
router.use("/post", postController);
router.use("/category", categoryController);
router.use("/user", userController);
router.use("/auth", authController);
export default router;
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment