diff options
Diffstat (limited to 'frontend/src/app')
15 files changed, 140 insertions, 100 deletions
diff --git a/frontend/src/app/_pages/login-page/login-page.component.html b/frontend/src/app/_pages/login-page/login-page.component.html index b8620e2f..906eaba6 100644 --- a/frontend/src/app/_pages/login-page/login-page.component.html +++ b/frontend/src/app/_pages/login-page/login-page.component.html @@ -1,39 +1,43 @@ -<div *ngIf="pageLoaded" style="min-height: 100vh; position: relative;"> - +<div style="min-height: 100vh; position: relative;"> + <!-- TODO : <app-navbar [activeNav]="'login'"></app-navbar>--> - + <div class="container p-5 rounded-3 shadow-sm border" style="max-width: 50em; margin-top: 50px;"> <h3 class="text-center pb-5">Prijavite se</h3> <form> <!-- Email input --> <div class="form-outline mb-4"> <label class="form-label" for="email">Email adresa</label> - <input [(ngModel)]="email" name="email" type="email" id="email" class="form-control form-control-lg" placeholder="Unesite email adresu..." /> + <input [(ngModel)]="email" name="email" type="email" id="email" class="form-control form-control-lg" + placeholder="Unesite email adresu..." /> </div> - + <!-- Password input --> <div class="form-outline mb-3"> <label class="form-label" for="password">Lozinka</label> - <input [(ngModel)]="password" name="password" type="password" id="password" class="form-control form-control-lg" placeholder="Unesite lozinku..." /> + <input [(ngModel)]="password" name="password" type="password" id="password" + class="form-control form-control-lg" placeholder="Unesite lozinku..." /> </div> - + <div class="text-center text-lg-start mt-4 pt-2"> <!-- Pogresna lozinka --> - <p *ngIf="wrongCreds" class="small fw-bold mt-2 pt-1 mb-0 text-danger">Lozinka ili e-mail su pogrešni</p> + <p *ngIf="wrongCreds" class="small fw-bold mt-2 pt-1 mb-0 text-danger">Lozinka ili e-mail su pogrešni + </p> <!-- Nepotvrdjena registracija <p *ngIf="notApproved" class="small fw-bold mt-2 pt-1 mb-0 text-danger">Vaša registracija još uvek nije potvrđena</p>--> <br> - - <button type="button" class="btn btn-primary btn-lg" style="padding-left: 2.5rem; padding-right: 2.5rem;" - (click)="onSubmit()">Prijava + + <button type="button" class="btn btn-primary btn-lg" + style="padding-left: 2.5rem; padding-right: 2.5rem;" (click)="onSubmit()">Prijava </button> - - <p class="small fw-bold mt-2 pt-1 mb-0">Još uvek nemate nalog? - <a routerLink="/register" class="link-danger">Registrujte se</a></p> + + <p class="small fw-bold mt-2 pt-1 mb-0">Još uvek nemate nalog? + <a routerLink="/register" class="link-danger">Registrujte se</a> + </p> </div> </form> </div> - + <!-- TODO: <app-footer></app-footer>--> </div>
\ No newline at end of file diff --git a/frontend/src/app/_pages/login-page/login-page.component.ts b/frontend/src/app/_pages/login-page/login-page.component.ts index c041003d..fec5e16e 100644 --- a/frontend/src/app/_pages/login-page/login-page.component.ts +++ b/frontend/src/app/_pages/login-page/login-page.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; +import { response } from 'express'; import { AuthService } from 'src/app/_services/auth.service'; //import { LoginService } from 'src/app/_services/login.service'; @@ -9,8 +10,6 @@ import { AuthService } from 'src/app/_services/auth.service'; styleUrls: ['./login-page.component.css'] }) export class LoginPageComponent implements OnInit { - - public pageLoaded: boolean = false; //ako korisnik ne sme da ima pristup stranici (vec je ulogovan itd), ona ne sme ni da se ucita email: string = ''; password: string = ''; @@ -20,26 +19,21 @@ export class LoginPageComponent implements OnInit { pattEmail: RegExp = /^[a-zA-Z0-9]+([\.\-\+][a-zA-Z0-9]+)*\@([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}$/; constructor( - private activatedRoute: ActivatedRoute, private authService: AuthService - //private loginService: LoginService ) { } ngOnInit(): void { - /*this.authService.checkAccess(this.activatedRoute, this, - (self: any) => self.pageLoaded = true; - );*/ } onSubmit() { - //this.wrongCreds = false; - //this.notApproved = false; RAZMOTRITI - - if (this.pattEmail.test(this.email)) { - //this.loginService.login(this.email, this.password); + if (!this.pattEmail.test(this.email)) { + console.warn('Bad email!'); + return; } else { - //this.wrongCreds = true; + this.authService.login(this.email, this.password).subscribe((response) => { + console.log(response) + }) } } diff --git a/frontend/src/app/_pages/only-authorized/only-authorized.component.css b/frontend/src/app/_pages/only-authorized/only-authorized.component.css new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/frontend/src/app/_pages/only-authorized/only-authorized.component.css diff --git a/frontend/src/app/_pages/only-authorized/only-authorized.component.html b/frontend/src/app/_pages/only-authorized/only-authorized.component.html new file mode 100644 index 00000000..27bbcf09 --- /dev/null +++ b/frontend/src/app/_pages/only-authorized/only-authorized.component.html @@ -0,0 +1 @@ +<p>only-authorized works!</p> diff --git a/frontend/src/app/_pages/only-authorized/only-authorized.component.spec.ts b/frontend/src/app/_pages/only-authorized/only-authorized.component.spec.ts new file mode 100644 index 00000000..82a01f63 --- /dev/null +++ b/frontend/src/app/_pages/only-authorized/only-authorized.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnlyAuthorizedComponent } from './only-authorized.component'; + +describe('OnlyAuthorizedComponent', () => { + let component: OnlyAuthorizedComponent; + let fixture: ComponentFixture<OnlyAuthorizedComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ OnlyAuthorizedComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(OnlyAuthorizedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/_pages/only-authorized/only-authorized.component.ts b/frontend/src/app/_pages/only-authorized/only-authorized.component.ts new file mode 100644 index 00000000..be88365f --- /dev/null +++ b/frontend/src/app/_pages/only-authorized/only-authorized.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-only-authorized', + templateUrl: './only-authorized.component.html', + styleUrls: ['./only-authorized.component.css'] +}) +export class OnlyAuthorizedComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/frontend/src/app/_pages/register-page/register-page.component.ts b/frontend/src/app/_pages/register-page/register-page.component.ts index d51358de..e8d4c036 100644 --- a/frontend/src/app/_pages/register-page/register-page.component.ts +++ b/frontend/src/app/_pages/register-page/register-page.component.ts @@ -1,8 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; import { Router } from '@angular/router'; import { AuthService } from 'src/app/_services/auth.service'; -import { RegisterService } from 'src/app/_services/register.service'; @Component({ selector: 'app-register-page', @@ -10,9 +8,6 @@ import { RegisterService } from 'src/app/_services/register.service'; styleUrls: ['./register-page.component.css'] }) export class RegisterPageComponent implements OnInit { - - public pageLoaded: boolean = false; - firstName: string = ''; lastName: string = ''; nickName: string = ''; @@ -33,19 +28,11 @@ export class RegisterPageComponent implements OnInit { pattPassword: RegExp = /.{6,30}$/; constructor( - private activatedRoute: ActivatedRoute, private router: Router, private authService: AuthService, - private registerService: RegisterService ) { } ngOnInit(): void { - /*this.authService.checkAccess(this.activatedRoute, this, - (self: any) => - { - self.pageLoaded = true; - } - );*/ } isCorrectName(element: string): boolean { @@ -124,25 +111,25 @@ export class RegisterPageComponent implements OnInit { if (!(this.wrongFirstNameBool || this.wrongLastNameBool || this.wrongNickNameBool || this.wrongEmailBool || this.wrongPass1Bool || this.wrongPass2Bool)) { //sve ok, registruj ga - let user = { - firstName: this.firstName, - lastName: this.lastName, - nickName: this.nickName, - email: this.email, - password: this.pass1 - } - - /*this.registerService.createUser(user, this) - .subscribe( - (response) => { - if () - this.router.navigate(['/login']); //registracija uspesna, idi na login - else if () - alert('Nalog sa unetim email-om već postoji!'); - } - ); - */ + let user = { + firstName: this.firstName, + lastName: this.lastName, + nickName: this.nickName, + email: this.email, + password: this.pass1 } + + this.authService.register(user) + .subscribe( + (response) => { + console.log(response); + /*if () + this.router.navigate(['/login']); //registracija uspesna, idi na login + else if () + alert('Nalog sa unetim email-om već postoji!');*/ + } + ); + } } diff --git a/frontend/src/app/_services/register.service.spec.ts b/frontend/src/app/_services/auth-guard.service.spec.ts index 2ba39608..35afd377 100644 --- a/frontend/src/app/_services/register.service.spec.ts +++ b/frontend/src/app/_services/auth-guard.service.spec.ts @@ -1,13 +1,13 @@ import { TestBed } from '@angular/core/testing'; -import { RegisterService } from './register.service'; +import { AuthGuardService } from './auth-guard.service'; -describe('RegisterService', () => { - let service: RegisterService; +describe('AuthGuardService', () => { + let service: AuthGuardService; beforeEach(() => { TestBed.configureTestingModule({}); - service = TestBed.inject(RegisterService); + service = TestBed.inject(AuthGuardService); }); it('should be created', () => { diff --git a/frontend/src/app/_services/auth-guard.service.ts b/frontend/src/app/_services/auth-guard.service.ts new file mode 100644 index 00000000..b6d3678d --- /dev/null +++ b/frontend/src/app/_services/auth-guard.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { AuthService } from './auth.service'; + + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuardService implements CanActivate { + + constructor(private auth: AuthService, private router: Router) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> { + if (this.auth.isAuthenticated()) { + return true; + } + this.router.navigate(['login']); + return false; + } +} diff --git a/frontend/src/app/_services/auth.service.ts b/frontend/src/app/_services/auth.service.ts index af27fdec..d1012d37 100644 --- a/frontend/src/app/_services/auth.service.ts +++ b/frontend/src/app/_services/auth.service.ts @@ -1,9 +1,31 @@ import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { JwtHelperService } from '@auth0/angular-jwt'; +import { CookieService } from 'ngx-cookie-service'; +import { API_SETTINGS } from 'src/config'; + +const jwtHelper = new JwtHelperService(); @Injectable({ providedIn: 'root' }) export class AuthService { - constructor() { } + constructor(private http: HttpClient, private cookie: CookieService) { } + + login(username: string, password: string) { + return this.http.post(`${API_SETTINGS.apiURL}/login`, { username, password }); + } + + register(user: any) { + return this.http.post(`${API_SETTINGS.apiURL}/register`, user); + } + + isAuthenticated(): boolean { + if (this.cookie.check('token')) { + var token = this.cookie.get('token'); + return !jwtHelper.isTokenExpired(token); + } + return false; + } } diff --git a/frontend/src/app/_services/register.service.ts b/frontend/src/app/_services/register.service.ts deleted file mode 100644 index 93074c06..00000000 --- a/frontend/src/app/_services/register.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class RegisterService { - - constructor() { } -} diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 3fe2bc13..1868e56c 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -2,11 +2,14 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { LoginPageComponent } from './_pages/login-page/login-page.component'; +import { OnlyAuthorizedComponent } from './_pages/only-authorized/only-authorized.component'; import { RegisterPageComponent } from './_pages/register-page/register-page.component'; +import { AuthGuardService } from './_services/auth-guard.service'; const routes: Routes = [ { path: 'login', component: LoginPageComponent }, - { path: 'register', component: RegisterPageComponent } + { path: 'register', component: RegisterPageComponent }, + { path: 'only-authorized', component: OnlyAuthorizedComponent, canActivate: [AuthGuardService] } ]; @NgModule({ diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 39d75e89..9ccd7ddb 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -8,12 +8,14 @@ import { AppComponent } from './app.component'; import { LoginPageComponent } from './_pages/login-page/login-page.component'; import { RegisterPageComponent } from './_pages/register-page/register-page.component'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { OnlyAuthorizedComponent } from './_pages/only-authorized/only-authorized.component'; @NgModule({ declarations: [ AppComponent, LoginPageComponent, - RegisterPageComponent + RegisterPageComponent, + OnlyAuthorizedComponent ], imports: [ BrowserModule, diff --git a/frontend/src/app/auth.service.spec.ts b/frontend/src/app/auth.service.spec.ts deleted file mode 100644 index f1251cac..00000000 --- a/frontend/src/app/auth.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { AuthService } from './auth.service'; - -describe('AuthService', () => { - let service: AuthService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(AuthService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/auth.service.ts b/frontend/src/app/auth.service.ts deleted file mode 100644 index af27fdec..00000000 --- a/frontend/src/app/auth.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class AuthService { - - constructor() { } -} |