diff --git a/client/src/app/authentication/auth.service.ts b/client/src/app/authentication/auth.service.ts index 0d86deefb6903edb9943838c011c88d46e122c42..ce40111e461ff0348ecb1c7f2c12f5c7e0eea5a6 100644 --- a/client/src/app/authentication/auth.service.ts +++ b/client/src/app/authentication/auth.service.ts @@ -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()); + } + } diff --git a/client/src/app/users/user-registration-form/user-registration-form.component.ts b/client/src/app/users/user-registration-form/user-registration-form.component.ts index ac3c25c7e7db69b2af0f6e03dd380725d905ea76..25cf7f669a89962b54b71983b54f4f03ea547e12 100644 --- a/client/src/app/users/user-registration-form/user-registration-form.component.ts +++ b/client/src/app/users/user-registration-form/user-registration-form.component.ts @@ -1,5 +1,6 @@ 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 => { diff --git a/client/src/app/users/user.service.ts b/client/src/app/users/user.service.ts index d5ad7a411b883902213d92f91576deec7b9ea75f..b56d03849b5795ecce38a162d4a0836678a28288 100644 --- a/client/src/app/users/user.service.ts +++ b/client/src/app/users/user.service.ts @@ -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>( diff --git a/server/src/config.ts b/server/src/config.ts index f2dc97f88fcb1a73d5db5ac435bb2c5d720eb9b0..5efc857437bdd1a97ecfe83102924c6def85d3f3 100644 --- a/server/src/config.ts +++ b/server/src/config.ts @@ -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, }; diff --git a/server/src/controllers/authController/index.ts b/server/src/controllers/authController/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..0171c6e78e6c3d536268f3380f452cad7f447751 --- /dev/null +++ b/server/src/controllers/authController/index.ts @@ -0,0 +1,64 @@ +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; + diff --git a/server/src/controllers/userController/index.ts b/server/src/controllers/userController/index.ts index 33b925ac4f38ca3feff091493942608d0a840a14..b0d49b9aeb5de3015d7700119d8fac43654ada7a 100644 --- a/server/src/controllers/userController/index.ts +++ b/server/src/controllers/userController/index.ts @@ -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) => { diff --git a/server/src/routes/routes.ts b/server/src/routes/routes.ts index fa6b3f5bf0ec6d8a743bc94cddf87a2ed2a0b1f1..5a3e995d620ba57055588511a2e1f0681113d6ea 100644 --- a/server/src/routes/routes.ts +++ b/server/src/routes/routes.ts @@ -1,6 +1,7 @@ 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