diff options
| author | Gunther6070 <haydenhartman10@yahoo.com> | 2025-03-15 23:19:56 -0400 | 
|---|---|---|
| committer | Gunther6070 <haydenhartman10@yahoo.com> | 2025-03-15 23:19:56 -0400 | 
| commit | 47501b0d9765e64eba370ba80bbc7b2cd5940170 (patch) | |
| tree | abeda89cd86423119d5a895aa4240de83a974da5 /ufund-ui/src/app | |
| parent | 28e46060c8bcf7fd2adc19793bd63e27df4e7356 (diff) | |
| parent | d97d4d430113088c4f52f53c040d8705c66b410e (diff) | |
| download | JellySolutions-47501b0d9765e64eba370ba80bbc7b2cd5940170.tar.gz JellySolutions-47501b0d9765e64eba370ba80bbc7b2cd5940170.tar.bz2 JellySolutions-47501b0d9765e64eba370ba80bbc7b2cd5940170.zip  | |
Merge branch 'api-auth' of https://github.com/RIT-SWEN-261-02/team-project-2245-swen-261-02-2b into api-auth
Diffstat (limited to '')
| -rw-r--r-- | ufund-ui/src/app/app.component.ts | 10 | ||||
| -rw-r--r-- | ufund-ui/src/app/app.module.ts | 6 | ||||
| -rw-r--r-- | ufund-ui/src/app/components/dashboard/dashboard.component.html | 6 | ||||
| -rw-r--r-- | ufund-ui/src/app/components/funding-basket/funding-basket.component.ts | 16 | ||||
| -rw-r--r-- | ufund-ui/src/app/components/login/login.component.css | 12 | ||||
| -rw-r--r-- | ufund-ui/src/app/components/login/login.component.html | 4 | ||||
| -rw-r--r-- | ufund-ui/src/app/components/login/login.component.ts | 83 | ||||
| -rw-r--r-- | ufund-ui/src/app/services/users.service.ts | 14 | 
8 files changed, 130 insertions, 21 deletions
diff --git a/ufund-ui/src/app/app.component.ts b/ufund-ui/src/app/app.component.ts index a85d04b..6f4e1f5 100644 --- a/ufund-ui/src/app/app.component.ts +++ b/ufund-ui/src/app/app.component.ts @@ -1,7 +1,6 @@  import {Component, OnInit} from '@angular/core';  import {UsersService} from './services/users.service'; -import {BehaviorSubject, Observable, Subject} from 'rxjs'; -import {User} from './models/User'; +import {BehaviorSubject} from 'rxjs';  @Component({    selector: 'app-root', @@ -18,8 +17,11 @@ export class AppComponent implements OnInit {      ) {}      ngOnInit() { -        this.userService.getCurrentUser().subscribe(r => { -            this.currentUser$?.next("Logged in as " + r.username) +        this.userService.getCurrentUserSubject().subscribe(r => { +            this.currentUser$?.next(r +                ? "Logged in as " + r.username +                : "Logged out." +            )          })      } diff --git a/ufund-ui/src/app/app.module.ts b/ufund-ui/src/app/app.module.ts index fa54c58..9f525fe 100644 --- a/ufund-ui/src/app/app.module.ts +++ b/ufund-ui/src/app/app.module.ts @@ -12,6 +12,8 @@ import {HttpClientModule} from '@angular/common/http';  import {FormsModule} from '@angular/forms';  import {RouterLink, RouterLinkActive, RouterOutlet} from '@angular/router';  import {DashboardComponent} from './components/dashboard/dashboard.component'; +import {CommonModule} from '@angular/common'; +import {LoginComponent} from './components/login/login.component';  @NgModule({      declarations: [ @@ -21,7 +23,8 @@ import {DashboardComponent} from './components/dashboard/dashboard.component';          FundingBasketComponent,          CupboardComponent,          NeedListComponent, -        DashboardComponent +        DashboardComponent, +        LoginComponent,      ],      imports: [          BrowserModule, @@ -30,6 +33,7 @@ import {DashboardComponent} from './components/dashboard/dashboard.component';          RouterLink,          RouterLinkActive,          RouterOutlet, +        CommonModule,          HttpClientModule,      ],      providers: [], diff --git a/ufund-ui/src/app/components/dashboard/dashboard.component.html b/ufund-ui/src/app/components/dashboard/dashboard.component.html index f41ccef..c73849f 100644 --- a/ufund-ui/src/app/components/dashboard/dashboard.component.html +++ b/ufund-ui/src/app/components/dashboard/dashboard.component.html @@ -1,3 +1,5 @@  <p>dashboard works!</p> -<a routerLink="/cupboard">Go to the Cupboard</a> -<a routerLink="/basket">Go to my basket</a> +<ul> +    <li><a routerLink="/cupboard">Go to the Cupboard</a></li> +    <li><a routerLink="/basket">Go to my basket</a></li> +</ul> diff --git a/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts b/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts index 8b12306..c44aa27 100644 --- a/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts +++ b/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts @@ -1,4 +1,6 @@ -import { Component } from '@angular/core'; +import {Component, OnInit} from '@angular/core'; +import {Router} from '@angular/router'; +import {UsersService} from '../../services/users.service';  @Component({    selector: 'app-funding-basket', @@ -6,6 +8,16 @@ import { Component } from '@angular/core';    templateUrl: './funding-basket.component.html',    styleUrl: './funding-basket.component.css'  }) -export class FundingBasketComponent { +export class FundingBasketComponent implements OnInit{ +    constructor( +       private router: Router, +       private userService: UsersService +    ) {} + +    ngOnInit() { +        if (!this.userService.getCurrentUser()) { +            this.router.navigate(['/login'], {queryParams: {redir: this.router.url}}) +        } +    }  } diff --git a/ufund-ui/src/app/components/login/login.component.css b/ufund-ui/src/app/components/login/login.component.css index afd4bf1..435cc87 100644 --- a/ufund-ui/src/app/components/login/login.component.css +++ b/ufund-ui/src/app/components/login/login.component.css @@ -1,6 +1,16 @@ -:host { +:host, .border {    display: flex;    flex-direction: column;      max-width: 300px;      gap: 5px  } + +.border { +    border-style: solid; +    border-width: 1px; +    padding: 10px; +    margin: 10px; +    position: absolute; +    background-color: white; +    box-shadow: 0 0 10px 10px black; +} diff --git a/ufund-ui/src/app/components/login/login.component.html b/ufund-ui/src/app/components/login/login.component.html index 178ddbf..2cdb6d0 100644 --- a/ufund-ui/src/app/components/login/login.component.html +++ b/ufund-ui/src/app/components/login/login.component.html @@ -1,5 +1,7 @@ +<span *ngIf="next" style="color: red">You must be logged in to view this page</span>  <p>Login:</p>  <input placeholder="Username" type="text" #username>  <input placeholder="Password" type="password" #password>  <button type="button" (click)="login(username.value, password.value)">Login</button> -<button type="button">Create Account...</button> +<button type="button" (click)="signup(username.value, password.value)">Create Account</button> +<span *ngIf="statusText">{{statusText | async}}</span> diff --git a/ufund-ui/src/app/components/login/login.component.ts b/ufund-ui/src/app/components/login/login.component.ts index 50dd018..9d806f5 100644 --- a/ufund-ui/src/app/components/login/login.component.ts +++ b/ufund-ui/src/app/components/login/login.component.ts @@ -1,6 +1,7 @@ -import { Component } from '@angular/core' +import {Component, OnInit} from '@angular/core'  import {UsersService} from '../../services/users.service'; -import {Router} from '@angular/router'; +import {ActivatedRoute, Router} from '@angular/router'; +import {BehaviorSubject} from 'rxjs';  @Component({    selector: 'app-login', @@ -8,20 +9,92 @@ import {Router} from '@angular/router';    templateUrl: './login.component.html',    styleUrl: './login.component.css'  }) -export class LoginComponent { +export class LoginComponent implements OnInit { + +    protected next?: string | null; +    protected statusText = new BehaviorSubject("") +      constructor(          protected usersService: UsersService, -        private router: Router +        protected router: Router, +        private route: ActivatedRoute      ) {} +    ngOnInit() { +        this.next = this.route.snapshot.queryParamMap.get('redir') +    } +      login(username: string | null, password: string | null) { +        let next = this.next || '/dashboard'          console.log(`attempting to log in with ${username} ${password}`)          if (!username || !password) {              return;          }          this.usersService.login(username, password).then(() => { -            this.router.navigate(['/dashboard']); +            this.router.navigate([next]); +        }).catch(ex => { +            this.statusText.next("Unable to login: " + friendlyHttpStatus[ex.status]) +            console.log(ex) +        }) +    } + +    signup(username: string | null, password: string | null) { +        console.log(`attempting to sign up with ${username} ${password}`) +        if (!username || !password) { +            return; +        } + +        this.usersService.createUser(username, password).then(() => { +             this.statusText.next("Account created, click login.") +        }).catch(ex => { +            this.statusText.next("Unable to create account: " + friendlyHttpStatus[ex.status]) +            console.log(ex)          })      }  } + +// temporary +let friendlyHttpStatus: {[key: number]: string} = { +    200: 'OK', +    201: 'Created', +    202: 'Accepted', +    203: 'Non-Authoritative Information', +    204: 'No Content', +    205: 'Reset Content', +    206: 'Partial Content', +    300: 'Multiple Choices', +    301: 'Moved Permanently', +    302: 'Found', +    303: 'See Other', +    304: 'Not Modified', +    305: 'Use Proxy', +    306: 'Unused', +    307: 'Temporary Redirect', +    400: 'Bad Request', +    401: 'Unauthorized', +    402: 'Payment Required', +    403: 'Forbidden', +    404: 'Not Found', +    405: 'Method Not Allowed', +    406: 'Not Acceptable', +    407: 'Proxy Authentication Required', +    408: 'Request Timeout', +    409: 'Conflict', +    410: 'Gone', +    411: 'Length Required', +    412: 'Precondition Required', +    413: 'Request Entry Too Large', +    414: 'Request-URI Too Long', +    415: 'Unsupported Media Type', +    416: 'Requested Range Not Satisfiable', +    417: 'Expectation Failed', +    418: 'I\'m a teapot', +    429: 'Too Many Requests', +    500: 'Internal Server Error', +    501: 'Not Implemented', +    502: 'Bad Gateway', +    503: 'Service Unavailable', +    504: 'Gateway Timeout', +    505: 'HTTP Version Not Supported', +}; diff --git a/ufund-ui/src/app/services/users.service.ts b/ufund-ui/src/app/services/users.service.ts index 28cc266..c570ccf 100644 --- a/ufund-ui/src/app/services/users.service.ts +++ b/ufund-ui/src/app/services/users.service.ts @@ -1,6 +1,6 @@  import { Injectable } from '@angular/core';  import {HttpClient, HttpHeaders} from '@angular/common/http'; -import {firstValueFrom, Observable, of, Subject} from 'rxjs'; +import {BehaviorSubject, firstValueFrom, Observable} from 'rxjs';  import {User} from '../models/User';  @Injectable({ @@ -8,7 +8,7 @@ import {User} from '../models/User';  })  export class UsersService { -    private currentUser : Subject<User> = new Subject(); +    private currentUser : BehaviorSubject<User | null> = new BehaviorSubject<User | null>(null);      private apiKey: string = "";      private url = "http://localhost:8080/users" @@ -32,8 +32,8 @@ export class UsersService {          private http: HttpClient      ) {} -    createUser(data: User): Observable<User> { -        return this.http.post<User>(this.url, data, this.httpOptions) +    async createUser(username:string, password:string) { +        await firstValueFrom(this.http.post<User>(this.url, {username: username, password: password}, this.httpOptions))      }      getUser(id: string): Observable<User> { @@ -48,10 +48,14 @@ export class UsersService {          return this.http.delete<boolean>(`${this.url}/${id}`, this.httpOptions)      } -    getCurrentUser() { +    getCurrentUserSubject() {          return this.currentUser;      } +    getCurrentUser() { +        return this.currentUser.getValue() +    } +      async login(username: string, password: string) {          let res = this.http.post<string>(this.authUrl, {username: username, password: password}, this.httpOptions2);          this.apiKey = await firstValueFrom(res);  | 
