user refactoring
This commit is contained in:
		
							parent
							
								
									dfd73c445a
								
							
						
					
					
						commit
						5fa9a68295
					
				| @ -1,40 +1,26 @@ | |||||||
| import { NgModule, APP_INITIALIZER } from '@angular/core'; | import { NgModule, APP_INITIALIZER } from '@angular/core'; | ||||||
| import { HTTP_INTERCEPTORS } from '@angular/common/http'; | import { HTTP_INTERCEPTORS } from '@angular/common/http'; | ||||||
| import { UserModule } from './pages/users/user/user.module'; |  | ||||||
| 
 | 
 | ||||||
| import { AppService } from './service/app.service'; | import { CookieService } from 'ngx-cookie-service'; | ||||||
| import { API_BASE_URL } from 'src/shared/common/type/injection-token.type'; | 
 | ||||||
|  | import { BasicAuthHtppInterceptorService } from './interceptor/basic-auth.http-interceptor'; | ||||||
|  | import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; | ||||||
| 
 | 
 | ||||||
| export function initApp(appService: AppService) { |  | ||||||
|   return () => appService.initApp(); |  | ||||||
| } |  | ||||||
| @NgModule({ | @NgModule({ | ||||||
|   imports: [UserModule.forRoot()], |   imports: [], | ||||||
|   exports: [], |   exports: [], | ||||||
|   providers: [ |   providers: [ | ||||||
|     AppService, |     CookieService, | ||||||
|     // ...GUARDS,
 |  | ||||||
|     // CookieService,
 |  | ||||||
|     // ClipboardService,
 |  | ||||||
|     { |     { | ||||||
|       provide: APP_INITIALIZER, |       provide: HTTP_INTERCEPTORS, | ||||||
|       useFactory: initApp, |       useClass: BasicAuthHtppInterceptorService, | ||||||
|       deps: [AppService], |  | ||||||
|       multi: true |       multi: true | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       provide: API_BASE_URL, |       provide: API_BASE_URL, | ||||||
|       useValue: 'http://localhost:8088/api', |       useValue: 'http://localhost:8088/api', | ||||||
|       multi: true |       multi: true | ||||||
|     }, |     } | ||||||
|     // { provide: HTTP_INTERCEPTORS, useClass: AuthHttpInterceptor, multi: true },
 |  | ||||||
|     { provide: 'virtualScroller.scrollThrottlingTime', useValue: 0 }, |  | ||||||
|     { provide: 'virtualScroller.scrollDebounceTime', useValue: 0 }, |  | ||||||
|     { provide: 'virtualScroller.scrollAnimationTime', useValue: 750 }, |  | ||||||
|     { provide: 'virtualScroller.scrollbarWidth', useValue: undefined }, |  | ||||||
|     { provide: 'virtualScroller.scrollbarHeight', useValue: undefined }, |  | ||||||
|     { provide: 'virtualScroller.checkResizeInterval', useValue: 1000 }, |  | ||||||
|     { provide: 'virtualScroller.resizeBypassRefreshThreshold', useValue: 5 } |  | ||||||
|   ] |   ] | ||||||
| }) | }) | ||||||
| export class AppProviderModule {} | export class AppProviderModule { } | ||||||
|  | |||||||
| @ -23,7 +23,9 @@ import { appFuseConfig } from './app.fuse'; | |||||||
| 
 | 
 | ||||||
| import { LayoutModule } from './layout/layout.module'; | import { LayoutModule } from './layout/layout.module'; | ||||||
| 
 | 
 | ||||||
| import { AuthModule } from 'src/shared/auth/auth.module'; | import { AuthModule } from 'src/modules/auth/auth.module'; | ||||||
|  | import { DashboardModule } from 'src/modules/dashboard/dashboard.module'; | ||||||
|  | import { UserModule } from 'src/modules/user/user.module'; | ||||||
| 
 | 
 | ||||||
| import { from } from 'rxjs'; | import { from } from 'rxjs'; | ||||||
| @NgModule({ | @NgModule({ | ||||||
| @ -54,6 +56,9 @@ import { from } from 'rxjs'; | |||||||
|     LayoutModule, |     LayoutModule, | ||||||
| 
 | 
 | ||||||
|     AuthModule.forRoot(), |     AuthModule.forRoot(), | ||||||
|  |     DashboardModule.forRoot(), | ||||||
|  |     UserModule.forRoot(), | ||||||
|  | 
 | ||||||
|   ], |   ], | ||||||
|   declarations: [AppComponent], |   declarations: [AppComponent], | ||||||
|   providers: [], |   providers: [], | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								src/app/interceptor/basic-auth.http-interceptor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/app/interceptor/basic-auth.http-interceptor.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | import { Injectable } from '@angular/core'; | ||||||
|  | import { | ||||||
|  |   HttpInterceptor, | ||||||
|  |   HttpRequest, | ||||||
|  |   HttpHandler | ||||||
|  | } from '@angular/common/http'; | ||||||
|  | 
 | ||||||
|  | import { AuthService } from 'src/modules/auth/service/auth.service'; | ||||||
|  | 
 | ||||||
|  | @Injectable({ | ||||||
|  |   providedIn: 'root' | ||||||
|  | }) | ||||||
|  | export class BasicAuthHtppInterceptorService implements HttpInterceptor { | ||||||
|  |   constructor(private authService: AuthService) {} | ||||||
|  | 
 | ||||||
|  |   intercept(req: HttpRequest<any>, next: HttpHandler) { | ||||||
|  |     if (sessionStorage.getItem('username') && sessionStorage.getItem('token')) { | ||||||
|  |       req = req.clone({ | ||||||
|  |         setHeaders: { | ||||||
|  |           Authorization: sessionStorage.getItem('token') | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |     return next.handle(req); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -6,7 +6,7 @@ import { take } from 'rxjs/operators'; | |||||||
| import { FuseConfigService } from 'src/@fuse/services/config.service'; | import { FuseConfigService } from 'src/@fuse/services/config.service'; | ||||||
| import { fuseAnimations } from 'src/@fuse/animations'; | import { fuseAnimations } from 'src/@fuse/animations'; | ||||||
| 
 | 
 | ||||||
| import { AuthService } from 'src/shared/auth/service/auth.service'; | import { AuthService } from 'src/modules/auth/service/auth.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'authentication', |   selector: 'authentication', | ||||||
| @ -67,7 +67,7 @@ export class AuthenticationComponent implements OnInit { | |||||||
|     let userName = this.loginForm.get('username').value; |     let userName = this.loginForm.get('username').value; | ||||||
|     let password = this.loginForm.get('password').value; |     let password = this.loginForm.get('password').value; | ||||||
| 
 | 
 | ||||||
|     this._authService.login(userName, password) |     this._authService.authenticate(userName, password) | ||||||
|       .pipe(take(1)) |       .pipe(take(1)) | ||||||
|       .subscribe( |       .subscribe( | ||||||
|         res => { |         res => { | ||||||
|  | |||||||
| @ -1,48 +0,0 @@ | |||||||
| import { HttpClient, HttpHeaders } from '@angular/common/http'; |  | ||||||
| import { Observable, throwError } from 'rxjs'; |  | ||||||
| import { AbstractService, httpOptions } from './abstract.service'; |  | ||||||
| import { Base } from '../../../../../shared/common/model/base.model'; |  | ||||||
| 
 |  | ||||||
| export abstract class AbstractRestService<T extends Base> extends AbstractService<T> { |  | ||||||
|   public constructor(httpClient: HttpClient, apiEntryPoint: string) { |  | ||||||
|     super(httpClient, apiEntryPoint); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public getAll(): Observable<T[]> { |  | ||||||
|     return this.httpClient.get<T[]>(this.apiEntryPoint); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public get(id: string | number): Observable<T> { |  | ||||||
|     return this.httpClient.get<T>(this.apiEntryPoint + `/${id}`, httpOptions); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public save(model: T): Observable<T> { |  | ||||||
|     return model.id ? this.update(model) : this.add(model); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public add(model: T): Observable<T> { |  | ||||||
|     return this.httpClient.put<T>( |  | ||||||
|       this.apiEntryPoint, |  | ||||||
|       JSON.stringify(model), |  | ||||||
|       httpOptions |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public update(model: T): Observable<T> { |  | ||||||
|     if (!model.id) { |  | ||||||
|       throwError('id of model is not valid'); |  | ||||||
|     } |  | ||||||
|     return this.httpClient.post<T>( |  | ||||||
|       `${this.apiEntryPoint}`, |  | ||||||
|       JSON.stringify(model), |  | ||||||
|       httpOptions |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public delete(id: string | number): Observable<T> { |  | ||||||
|     return this.httpClient.delete<T>( |  | ||||||
|       `${this.apiEntryPoint}/${id}`, |  | ||||||
|       httpOptions |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -1,18 +0,0 @@ | |||||||
| import { HttpClient, HttpHeaders } from '@angular/common/http'; |  | ||||||
| import { Base } from '../../../../../shared/common/model/base.model'; |  | ||||||
| 
 |  | ||||||
| export const httpOptions = { |  | ||||||
|   headers: new HttpHeaders({ |  | ||||||
|     'Content-Type': 'application/json' |  | ||||||
|   }) |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export abstract class AbstractService<T extends Base> { |  | ||||||
| 
 |  | ||||||
|   public constructor( |  | ||||||
|     protected httpClient: HttpClient, |  | ||||||
|     protected apiEntryPoint: string, |  | ||||||
|   ) { |  | ||||||
| 
 |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -34,30 +34,32 @@ | |||||||
| 
 | 
 | ||||||
|     <!-- CONTENT CARD --> |     <!-- CONTENT CARD --> | ||||||
|     <div class="content-card"> |     <div class="content-card"> | ||||||
|       <mat-table class="users-table" #table matSort [@animateStagger]="{ value: '50' }" fusePerfectScrollbar> |       <mat-table class="users-table" #table [dataSource]="dataSource" matSort [@animateStagger]="{ value: '50' }" | ||||||
|  |         fusePerfectScrollbar> | ||||||
|         <!-- ID/Nickname Column --> |         <!-- ID/Nickname Column --> | ||||||
|         <ng-container matColumnDef="id"> |         <ng-container matColumnDef="username"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>아이디/닉네임</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>아이디/닉네임</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="text-truncate">{{ order.id }}</p> |             <p class="text-truncate">{{ user.username }}</p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| 
 | 
 | ||||||
|         <!-- Phone Column --> |         <!-- Phone Column --> | ||||||
|         <ng-container matColumnDef="phone"> |         <ng-container matColumnDef="phone"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>연락처</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>연락처</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order" fxHide fxShow.gt-sm> |           <mat-cell *matCellDef="let user" fxHide fxShow.gt-sm> | ||||||
|             <p class="text-truncate">{{ order.reference }}</p> |             <!-- <p class="text-truncate">{{ user.phone }}</p> --> | ||||||
|  |             <p class="text-truncate">010-3004-2001</p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| 
 | 
 | ||||||
|         <!-- Status Column --> |         <!-- Status Column --> | ||||||
|         <ng-container matColumnDef="status"> |         <ng-container matColumnDef="status"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>상태</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>상태</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="text-truncate"> |             <p class="text-truncate"> | ||||||
|               {{ order.customer.firstName }} |               <!-- {{ user.status }} --> | ||||||
|               {{ order.customer.lastName }} |               정상 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -65,9 +67,10 @@ | |||||||
|         <!-- Total Price Column --> |         <!-- Total Price Column --> | ||||||
|         <ng-container matColumnDef="totalPrice"> |         <ng-container matColumnDef="totalPrice"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-md>보유금</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-md>보유금</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order" fxHide fxShow.gt-md> |           <mat-cell *matCellDef="let user" fxHide fxShow.gt-md> | ||||||
|             <p class="total-price text-truncate"> |             <p class="total-price text-truncate"> | ||||||
|               {{ order.total | currency: 'USD':'symbol' }} |               <!-- {{ user.totalprice | currency: 'USD':'symbol' }} --> | ||||||
|  |               1,000,000 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -75,9 +78,10 @@ | |||||||
|         <!-- Point Column --> |         <!-- Point Column --> | ||||||
|         <ng-container matColumnDef="point"> |         <ng-container matColumnDef="point"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>포인트</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>포인트</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order" fxHide fxShow.gt-sm> |           <mat-cell *matCellDef="let user" fxHide fxShow.gt-sm> | ||||||
|             <p class="text-truncate"> |             <p class="text-truncate"> | ||||||
|               {{ order.payment.method }} |               <!-- {{ user.point }} --> | ||||||
|  |               5000 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -85,9 +89,11 @@ | |||||||
|         <!-- Level Column --> |         <!-- Level Column --> | ||||||
|         <ng-container matColumnDef="level"> |         <ng-container matColumnDef="level"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>레벨</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>레벨</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <!-- <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> --> | ||||||
|               {{ order.status[0].name }} |             <p class="text-truncate"> | ||||||
|  |               <!-- {{ user.level }} --> | ||||||
|  |               브론즈 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -95,9 +101,10 @@ | |||||||
|         <!-- Charge Money Column --> |         <!-- Charge Money Column --> | ||||||
|         <ng-container matColumnDef="chargeMoney"> |         <ng-container matColumnDef="chargeMoney"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>충전금</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>충전금</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate "> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.chargeMoney }} --> | ||||||
|  |               1,000,000 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -105,9 +112,10 @@ | |||||||
|         <!-- Exchange Money Column --> |         <!-- Exchange Money Column --> | ||||||
|         <ng-container matColumnDef="exchangeMoney"> |         <ng-container matColumnDef="exchangeMoney"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>환전금</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>환전금</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate "> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.exchangeMoney }} --> | ||||||
|  |               0 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -115,9 +123,10 @@ | |||||||
|         <!-- Revenue Money Column --> |         <!-- Revenue Money Column --> | ||||||
|         <ng-container matColumnDef="revenueMoney"> |         <ng-container matColumnDef="revenueMoney"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>수익금</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>수익금</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate"> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.revenueMoney }} --> | ||||||
|  |               1,000,000 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -125,9 +134,10 @@ | |||||||
|         <!-- Number of Bets Column --> |         <!-- Number of Bets Column --> | ||||||
|         <ng-container matColumnDef="numberOfBets"> |         <ng-container matColumnDef="numberOfBets"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>배팅건</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>배팅건</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate"> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.betNumberof }} --> | ||||||
|  |               10 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -135,9 +145,10 @@ | |||||||
|         <!-- Referrals Column --> |         <!-- Referrals Column --> | ||||||
|         <ng-container matColumnDef="referrals"> |         <ng-container matColumnDef="referrals"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>추천수</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>추천수</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate"> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.referrals }} --> | ||||||
|  |               10 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -145,9 +156,10 @@ | |||||||
|         <!-- Recommender Column --> |         <!-- Recommender Column --> | ||||||
|         <ng-container matColumnDef="recommender"> |         <ng-container matColumnDef="recommender"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>추천인</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>추천인</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate"> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.recommender }} --> | ||||||
|  |               test | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -155,9 +167,10 @@ | |||||||
|         <!-- Coupon Status Column --> |         <!-- Coupon Status Column --> | ||||||
|         <ng-container matColumnDef="couponStatus"> |         <ng-container matColumnDef="couponStatus"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>쿠폰현황</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>쿠폰현황</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate"> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.coupon }} --> | ||||||
|  |               10 | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -165,9 +178,9 @@ | |||||||
|         <!-- Register Date Column --> |         <!-- Register Date Column --> | ||||||
|         <ng-container matColumnDef="registerDate"> |         <ng-container matColumnDef="registerDate"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>가입날짜</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>가입날짜</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order" fxHide fxShow.gt-sm> |           <mat-cell *matCellDef="let user" fxHide fxShow.gt-sm> | ||||||
|             <p class="text-truncate"> |             <p class="text-truncate"> | ||||||
|               {{ order.date }} |               {{ user.createAt }} | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -175,9 +188,9 @@ | |||||||
|         <!-- Recent Connect Date Column --> |         <!-- Recent Connect Date Column --> | ||||||
|         <ng-container matColumnDef="recentConnectDate"> |         <ng-container matColumnDef="recentConnectDate"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>최근접속일</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header fxHide fxShow.gt-sm>최근접속일</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order" fxHide fxShow.gt-sm> |           <mat-cell *matCellDef="let user" fxHide fxShow.gt-sm> | ||||||
|             <p class="text-truncate"> |             <p class="text-truncate"> | ||||||
|               {{ order.date }} |               {{ user.updateAt }} | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| @ -185,9 +198,9 @@ | |||||||
|         <!-- Recent Connect IP Column --> |         <!-- Recent Connect IP Column --> | ||||||
|         <ng-container matColumnDef="recentConnectIp"> |         <ng-container matColumnDef="recentConnectIp"> | ||||||
|           <mat-header-cell *matHeaderCellDef mat-sort-header>최근접속IP</mat-header-cell> |           <mat-header-cell *matHeaderCellDef mat-sort-header>최근접속IP</mat-header-cell> | ||||||
|           <mat-cell *matCellDef="let order"> |           <mat-cell *matCellDef="let user"> | ||||||
|             <p class="status text-truncate h6 p-4" [ngClass]="order.status[0].color"> |             <p class="text-truncate"> | ||||||
|               {{ order.status[0].name }} |               <!-- {{ user.recentConnectIp }} --> | ||||||
|             </p> |             </p> | ||||||
|           </mat-cell> |           </mat-cell> | ||||||
|         </ng-container> |         </ng-container> | ||||||
|  | |||||||
| @ -4,7 +4,8 @@ import { | |||||||
|   OnDestroy, |   OnDestroy, | ||||||
|   OnInit, |   OnInit, | ||||||
|   ViewChild, |   ViewChild, | ||||||
|   ViewEncapsulation |   ViewEncapsulation, | ||||||
|  |   AfterViewInit | ||||||
| } from '@angular/core'; | } from '@angular/core'; | ||||||
| import { MatPaginator } from '@angular/material/paginator'; | import { MatPaginator } from '@angular/material/paginator'; | ||||||
| import { MatSort } from '@angular/material/sort'; | import { MatSort } from '@angular/material/sort'; | ||||||
| @ -17,8 +18,11 @@ import { FuseUtils } from 'src/@fuse/utils'; | |||||||
| 
 | 
 | ||||||
| import { takeUntil } from 'rxjs/internal/operators'; | import { takeUntil } from 'rxjs/internal/operators'; | ||||||
| 
 | 
 | ||||||
| import { User } from '../../../../../../shared/user/model/user.model'; | import { Page } from 'src/modules/common/data/model/page'; | ||||||
| import { UserService } from '../../service/user.service'; | import { User } from 'src/modules/user/model/user.model'; | ||||||
|  | import { UserService } from 'src/modules/user/service/user.service'; | ||||||
|  | import { UsersDataSource } from './user-list.data-source'; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-user-user-list', |   selector: 'app-user-user-list', | ||||||
| @ -27,10 +31,11 @@ import { UserService } from '../../service/user.service'; | |||||||
|   animations: fuseAnimations, |   animations: fuseAnimations, | ||||||
|   encapsulation: ViewEncapsulation.None |   encapsulation: ViewEncapsulation.None | ||||||
| }) | }) | ||||||
| export class UserListComponent implements OnInit, OnDestroy { | export class UserListComponent implements OnInit, OnDestroy, AfterViewInit { | ||||||
|  |   dataSource: UsersDataSource | null; | ||||||
| 
 | 
 | ||||||
|   displayedColumns = [ |   displayedColumns = [ | ||||||
|     'id', |     'username', | ||||||
|     'phone', |     'phone', | ||||||
|     'status', |     'status', | ||||||
|     'totalPrice', |     'totalPrice', | ||||||
| @ -48,9 +53,6 @@ export class UserListComponent implements OnInit, OnDestroy { | |||||||
|     'recentConnectIp' |     'recentConnectIp' | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   total: number; |  | ||||||
|   userList: User[]; |  | ||||||
| 
 |  | ||||||
|   @ViewChild(MatPaginator, { static: true }) |   @ViewChild(MatPaginator, { static: true }) | ||||||
|   paginator: MatPaginator; |   paginator: MatPaginator; | ||||||
| 
 | 
 | ||||||
| @ -82,7 +84,24 @@ export class UserListComponent implements OnInit, OnDestroy { | |||||||
|    * On init |    * On init | ||||||
|    */ |    */ | ||||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||||
|     this.fetchUserList(); |     this.dataSource = new UsersDataSource( | ||||||
|  |       this.userService, | ||||||
|  |       this.paginator, | ||||||
|  |       this.sort | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     fromEvent(this.filter.nativeElement, 'keyup') | ||||||
|  |       .pipe( | ||||||
|  |         takeUntil(this._unsubscribeAll), | ||||||
|  |         debounceTime(150), | ||||||
|  |         distinctUntilChanged() | ||||||
|  |       ) | ||||||
|  |       .subscribe(() => { | ||||||
|  |         if (!this.dataSource) { | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  |         this.dataSource.filter = this.filter.nativeElement.value; | ||||||
|  |       }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -94,14 +113,5 @@ export class UserListComponent implements OnInit, OnDestroy { | |||||||
|     this._unsubscribeAll.complete(); |     this._unsubscribeAll.complete(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   fetchUserList() { |   ngAfterViewInit(): void { } | ||||||
|     this.userService.getAllUsers().pipe( |  | ||||||
|       map((userList: User[]) => { |  | ||||||
| 
 |  | ||||||
|         if (userList && 0 < userList.length) { |  | ||||||
|           console.log(userList); |  | ||||||
|         } |  | ||||||
|       }) |  | ||||||
|     ).subscribe(); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,62 @@ | |||||||
|  | import { DataSource } from '@angular/cdk/table'; | ||||||
|  | 
 | ||||||
|  | import { BehaviorSubject, Observable, merge } from 'rxjs'; | ||||||
|  | import { switchMap, map } from 'rxjs/operators'; | ||||||
|  | 
 | ||||||
|  | import { MatPaginator } from '@angular/material/paginator'; | ||||||
|  | import { MatSort } from '@angular/material/sort'; | ||||||
|  | import { CollectionViewer } from '@angular/cdk/collections'; | ||||||
|  | 
 | ||||||
|  | import { User } from 'src/modules/user/model/user.model'; | ||||||
|  | import { UserService } from 'src/modules/user/service/user.service'; | ||||||
|  | 
 | ||||||
|  | export class UsersDataSource extends DataSource<User> { | ||||||
|  |   private filterSubject = new BehaviorSubject(''); | ||||||
|  | 
 | ||||||
|  |   constructor( | ||||||
|  |     private userService: UserService, | ||||||
|  |     private paginator: MatPaginator, | ||||||
|  |     private sort: MatSort | ||||||
|  |   ) { | ||||||
|  |     super(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Filter
 | ||||||
|  |   get filter(): string { | ||||||
|  |     return this.filterSubject.value; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   set filter(filter: string) { | ||||||
|  |     this.filterSubject.next(filter); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   connect( | ||||||
|  |     collectionViewer: CollectionViewer | ||||||
|  |   ): Observable<User[] | readonly User[]> { | ||||||
|  |     const displayDataChanges = [ | ||||||
|  |       this.paginator.page, | ||||||
|  |       this.sort.sortChange, | ||||||
|  |       this.filterSubject | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     return merge(...displayDataChanges).pipe( | ||||||
|  |       switchMap(() => { | ||||||
|  |         const filter = this.filter; | ||||||
|  |         const sortActive = this.sort.active; | ||||||
|  |         const sortDirection = this.sort.direction; | ||||||
|  |         const pageIndex = this.paginator.pageIndex; | ||||||
|  |         const pageSize = this.paginator.pageSize; | ||||||
|  | 
 | ||||||
|  |         return this.userService.getAllUsers().pipe( | ||||||
|  |           map(page => { | ||||||
|  |             return page.content; | ||||||
|  |           }) | ||||||
|  |         ); | ||||||
|  |       }) | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   disconnect(collectionViewer: CollectionViewer): void { | ||||||
|  |     this.filterSubject.complete(); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -1,18 +0,0 @@ | |||||||
| import { Injectable } from '@angular/core'; |  | ||||||
| import { HttpClient } from '@angular/common/http'; |  | ||||||
| import { Observable } from 'rxjs'; |  | ||||||
| import { environment } from '../../../../../environments/environment'; |  | ||||||
| import { User } from '../../../../../shared/user/model/user.model'; |  | ||||||
| import { AbstractRestService } from '../../../common/util/service/abstract-rest.service'; |  | ||||||
| 
 |  | ||||||
| @Injectable() |  | ||||||
| export class UserService extends AbstractRestService<User> { |  | ||||||
| 
 |  | ||||||
|   public constructor(httpClient: HttpClient) { |  | ||||||
|     super(httpClient, environment.apiEntryPoint + '/users'); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public getAllUsers(): Observable<User[]> { |  | ||||||
|     return this.httpClient.get<User[]>(`${this.apiEntryPoint}`); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -26,9 +26,6 @@ import { MatStepperModule } from '@angular/material/stepper'; | |||||||
| 
 | 
 | ||||||
| import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; | import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; | ||||||
| 
 | 
 | ||||||
| import { UserStoreModule } from './user-store.module'; |  | ||||||
| import { SERVICES } from './service'; |  | ||||||
| 
 |  | ||||||
| @NgModule({ | @NgModule({ | ||||||
|   imports: [ |   imports: [ | ||||||
|     MatButtonModule, |     MatButtonModule, | ||||||
| @ -62,19 +59,4 @@ import { SERVICES } from './service'; | |||||||
|   declarations: [...COMPONENTS], |   declarations: [...COMPONENTS], | ||||||
| 
 | 
 | ||||||
| }) | }) | ||||||
| export class UserModule { | export class UserModule { } | ||||||
|   public static forRoot(): ModuleWithProviders<UserRootModule> { |  | ||||||
|     return { |  | ||||||
|       ngModule: UserRootModule, |  | ||||||
|       providers: [...SERVICES] |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @NgModule({ |  | ||||||
|   imports: [ |  | ||||||
|     UserStoreModule, |  | ||||||
|   ], |  | ||||||
|   exports: [] |  | ||||||
| }) |  | ||||||
| export class UserRootModule { } |  | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ import { map } from 'rxjs/operators'; | |||||||
| import { JwtSigninResponse } from '../model/jwt-signin-response.model'; | import { JwtSigninResponse } from '../model/jwt-signin-response.model'; | ||||||
| 
 | 
 | ||||||
| import { CookieService } from 'ngx-cookie-service'; | import { CookieService } from 'ngx-cookie-service'; | ||||||
| import { API_BASE_URL } from 'src/shared/common/type/injection-token.type'; | import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; | ||||||
| 
 | 
 | ||||||
| @Injectable({ providedIn: 'root' }) | @Injectable({ providedIn: 'root' }) | ||||||
| export class AuthService { | export class AuthService { | ||||||
| @ -16,7 +16,7 @@ export class AuthService { | |||||||
|     @Inject(API_BASE_URL) private apiBaseUrl: string |     @Inject(API_BASE_URL) private apiBaseUrl: string | ||||||
|   ) { } |   ) { } | ||||||
| 
 | 
 | ||||||
|   public login( |   public authenticate( | ||||||
|     username: string, |     username: string, | ||||||
|     password: string |     password: string | ||||||
|   ): Observable<JwtSigninResponse> { |   ): Observable<JwtSigninResponse> { | ||||||
| @ -1,5 +1,5 @@ | |||||||
| import { Action } from '@ngrx/store'; | import { Action } from '@ngrx/store'; | ||||||
| import { User } from 'src/shared/user/model/user.model'; | import { User } from 'src/modules/user/model/user.model'; | ||||||
| 
 | 
 | ||||||
| export enum ActionType { | export enum ActionType { | ||||||
|   LoginProcessing = '[account.auth] LoginProcessing', |   LoginProcessing = '[account.auth] LoginProcessing', | ||||||
| @ -1,5 +1,5 @@ | |||||||
| import { Selector, createSelector } from '@ngrx/store'; | import { Selector, createSelector } from '@ngrx/store'; | ||||||
| import { User } from 'src/shared/user/model/user.model'; | import { User } from 'src/modules/user/model/user.model'; | ||||||
| 
 | 
 | ||||||
| export interface State { | export interface State { | ||||||
|   processing: boolean; |   processing: boolean; | ||||||
							
								
								
									
										22
									
								
								src/modules/common/common.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/modules/common/common.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | import { NgModule, ModuleWithProviders } from '@angular/core'; | ||||||
|  | import { CommonModule as AngularCommonModule } from '@angular/common'; | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [], | ||||||
|  |   exports: [] | ||||||
|  | }) | ||||||
|  | export class CommonRootModule {} | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   declarations: [], | ||||||
|  |   imports: [AngularCommonModule], | ||||||
|  |   exports: [] | ||||||
|  | }) | ||||||
|  | export class CommonModule { | ||||||
|  |   public static forRoot(): ModuleWithProviders<CommonRootModule> { | ||||||
|  |     return { | ||||||
|  |       ngModule: CommonRootModule, | ||||||
|  |       providers: [] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								src/modules/common/data/model/audit.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/modules/common/data/model/audit.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | export interface DateAudit { | ||||||
|  |   createdAt: Date; | ||||||
|  |   updatedAt: Date; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface UserDateAuditEntity extends DateAudit { | ||||||
|  |   createdBy: number; | ||||||
|  |   updatedBy: number; | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								src/modules/common/data/model/page.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/modules/common/data/model/page.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | export interface Sort { | ||||||
|  |   empty: boolean; | ||||||
|  |   sorted: true; | ||||||
|  |   unsorted: boolean; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface Pageable { | ||||||
|  |   offset: number; | ||||||
|  |   pageNumber: number; | ||||||
|  |   pageSize: number; | ||||||
|  |   paged: boolean; | ||||||
|  |   sort: Sort; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface Page<T> { | ||||||
|  |   content: T[] | null; | ||||||
|  |   empty: boolean; | ||||||
|  |   first: boolean; | ||||||
|  |   last: boolean; | ||||||
|  |   number: number; | ||||||
|  |   numberOfElements: number; | ||||||
|  |   pageable: Pageable; | ||||||
|  |   size: number; | ||||||
|  |   sort: Sort; | ||||||
|  |   totalElements: number; | ||||||
|  |   totalPages: number; | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								src/modules/dashboard/dashboard-store.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/modules/dashboard/dashboard-store.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | import { NgModule, ModuleWithProviders } from '@angular/core'; | ||||||
|  | import { StoreModule } from '@ngrx/store'; | ||||||
|  | import { EffectsModule } from '@ngrx/effects'; | ||||||
|  | 
 | ||||||
|  | import { reducer, Effects } from './store'; | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [ | ||||||
|  |     StoreModule.forFeature('dashboard', reducer), | ||||||
|  |     EffectsModule.forFeature([Effects]) | ||||||
|  |   ] | ||||||
|  | }) | ||||||
|  | export class DashboardStoreModule {} | ||||||
							
								
								
									
										24
									
								
								src/modules/dashboard/dashboard.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/modules/dashboard/dashboard.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | import { NgModule, ModuleWithProviders } from '@angular/core'; | ||||||
|  | import { CommonModule } from '@angular/common'; | ||||||
|  | import { SERVICES } from './service'; | ||||||
|  | import { DashboardStoreModule } from './dashboard-store.module'; | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   declarations: [], | ||||||
|  |   imports: [CommonModule, DashboardStoreModule], | ||||||
|  |   exports: [] | ||||||
|  | }) | ||||||
|  | export class DashboardModule { | ||||||
|  |   public static forRoot(): ModuleWithProviders<DashboardRootModule> { | ||||||
|  |     return { | ||||||
|  |       ngModule: DashboardRootModule, | ||||||
|  |       providers: [SERVICES] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [], | ||||||
|  |   exports: [] | ||||||
|  | }) | ||||||
|  | export class DashboardRootModule {} | ||||||
							
								
								
									
										8
									
								
								src/modules/dashboard/model/Dashboard.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/modules/dashboard/model/Dashboard.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | export interface Dashboard { | ||||||
|  |   id: number; | ||||||
|  |   title: string; | ||||||
|  |   description: string; | ||||||
|  |   url: string; | ||||||
|  |   sortOrder: number; | ||||||
|  |   display: boolean; | ||||||
|  | } | ||||||
							
								
								
									
										50
									
								
								src/modules/dashboard/service/dashboard.service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/modules/dashboard/service/dashboard.service.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | import { Injectable, Inject } from '@angular/core'; | ||||||
|  | import { HttpClient, HttpHeaders } from '@angular/common/http'; | ||||||
|  | 
 | ||||||
|  | import { Observable } from 'rxjs'; | ||||||
|  | import { Dashboard } from '../model/Dashboard'; | ||||||
|  | import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; | ||||||
|  | 
 | ||||||
|  | @Injectable({ | ||||||
|  |   providedIn: 'root' | ||||||
|  | }) | ||||||
|  | export class DashboardService { | ||||||
|  |   constructor( | ||||||
|  |     @Inject(API_BASE_URL) private apiBaseUrl: string, | ||||||
|  |     private httpClient: HttpClient | ||||||
|  |   ) {} | ||||||
|  | 
 | ||||||
|  |   public getDashboards(): Observable<Dashboard[]> { | ||||||
|  |     return this.httpClient.get<Dashboard[]>( | ||||||
|  |       `${this.apiBaseUrl}/dashboards`, | ||||||
|  |       {} | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public updateDashboardDisplay( | ||||||
|  |     id: number, | ||||||
|  |     display: boolean | ||||||
|  |   ): Observable<Dashboard> { | ||||||
|  |     return this.httpClient.put<Dashboard>( | ||||||
|  |       `${this.apiBaseUrl}/dashboards/${id}/display/${display}`, | ||||||
|  |       {} | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public updateDashboardSortOrder( | ||||||
|  |     id: number, | ||||||
|  |     targetSortOrder: number | ||||||
|  |   ): Observable<Dashboard> { | ||||||
|  |     return this.httpClient.put<Dashboard>( | ||||||
|  |       `${this.apiBaseUrl}/dashboards/${id}/sort_order/${targetSortOrder}`, | ||||||
|  |       {} | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public deleteDashboard(id: number): Observable<void> { | ||||||
|  |     return this.httpClient.delete<void>( | ||||||
|  |       `${this.apiBaseUrl}/dashboards/${id}`, | ||||||
|  |       {} | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								src/modules/dashboard/service/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/modules/dashboard/service/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | import { DashboardService } from './dashboard.service'; | ||||||
|  | 
 | ||||||
|  | export const SERVICES = [DashboardService]; | ||||||
							
								
								
									
										60
									
								
								src/modules/dashboard/store/action.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/modules/dashboard/store/action.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | import { createAction, props } from '@ngrx/store'; | ||||||
|  | 
 | ||||||
|  | import { Dashboard } from '../model/Dashboard'; | ||||||
|  | 
 | ||||||
|  | export const addDashboard = createAction( | ||||||
|  |   '[Dashboard] Add Dashboard', | ||||||
|  |   props<{ dashboard: Dashboard }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const addDashboardSuccess = createAction( | ||||||
|  |   '[Dashboard] Add Dashboard Success', | ||||||
|  |   props<{ dashboard: Dashboard }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const addDashboardFailure = createAction( | ||||||
|  |   '[Dashboard] Add Dashboard Failure', | ||||||
|  |   props<{ dashboard: Dashboard; error: any }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const loadDashboards = createAction('[Dashboard] Load Dashboards'); | ||||||
|  | 
 | ||||||
|  | export const loadDashboardsSuccess = createAction( | ||||||
|  |   '[Dashboard] Load Dashboards Success', | ||||||
|  |   props<{ dashboards: Dashboard[] }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const loadDashboardsFailure = createAction( | ||||||
|  |   '[Dashboard] Load Dashboards Failure', | ||||||
|  |   props<{ error: any }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const modifyDashboard = createAction( | ||||||
|  |   '[Dashboard] Modify Dashboard', | ||||||
|  |   props<{ dashboard: Dashboard }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const modifyDashboardSuccess = createAction( | ||||||
|  |   '[Dashboard] Modify Dashboard Success', | ||||||
|  |   props<{ dashboard: Dashboard }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const modifyDashboardFailure = createAction( | ||||||
|  |   '[Dashboard] Modify Dashboard Failure', | ||||||
|  |   props<{ dashboard: Dashboard; error: any }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const removeDashboard = createAction( | ||||||
|  |   '[Dashboard] Remove Dashboard', | ||||||
|  |   props<{ id: number }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const removeDashboardSuccess = createAction( | ||||||
|  |   '[Dashboard] Remove Dashboard Success', | ||||||
|  |   props<{ id: number }>() | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | export const removeDashboardFailure = createAction( | ||||||
|  |   '[Dashboard] Remove Dashboard Failure', | ||||||
|  |   props<{ id: number; error: any }>() | ||||||
|  | ); | ||||||
							
								
								
									
										52
									
								
								src/modules/dashboard/store/effect.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/modules/dashboard/store/effect.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | |||||||
|  | import { Injectable } from '@angular/core'; | ||||||
|  | 
 | ||||||
|  | import { Actions, ofType, createEffect } from '@ngrx/effects'; | ||||||
|  | 
 | ||||||
|  | import { of } from 'rxjs'; | ||||||
|  | import { map, catchError, switchMap, mergeMap } from 'rxjs/operators'; | ||||||
|  | 
 | ||||||
|  | import { | ||||||
|  |   loadDashboards, | ||||||
|  |   loadDashboardsSuccess, | ||||||
|  |   loadDashboardsFailure, | ||||||
|  |   addDashboard, | ||||||
|  |   removeDashboard, | ||||||
|  |   removeDashboardSuccess, | ||||||
|  |   removeDashboardFailure | ||||||
|  | } from './action'; | ||||||
|  | import { DashboardService } from '../service/dashboard.service'; | ||||||
|  | import { Dashboard } from '../model/Dashboard'; | ||||||
|  | 
 | ||||||
|  | @Injectable() | ||||||
|  | export class Effects { | ||||||
|  |   loadDashboards$ = createEffect(() => | ||||||
|  |     this.actions$.pipe( | ||||||
|  |       ofType(loadDashboards), | ||||||
|  |       switchMap(() => | ||||||
|  |         this.dashboardService.getDashboards().pipe( | ||||||
|  |           map((dashboards: Dashboard[]) => | ||||||
|  |             loadDashboardsSuccess({ dashboards }) | ||||||
|  |           ), | ||||||
|  |           catchError(error => of(loadDashboardsFailure({ error }))) | ||||||
|  |         ) | ||||||
|  |       ) | ||||||
|  |     ) | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  |   removeBookFromCollection$ = createEffect(() => | ||||||
|  |     this.actions$.pipe( | ||||||
|  |       ofType(removeDashboard), | ||||||
|  |       mergeMap(({ id }) => | ||||||
|  |         this.dashboardService.deleteDashboard(id).pipe( | ||||||
|  |           map(() => removeDashboardSuccess({ id })), | ||||||
|  |           catchError(error => of(removeDashboardFailure({ id, error }))) | ||||||
|  |         ) | ||||||
|  |       ) | ||||||
|  |     ) | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  |   constructor( | ||||||
|  |     private actions$: Actions, | ||||||
|  |     private dashboardService: DashboardService | ||||||
|  |   ) {} | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								src/modules/dashboard/store/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/modules/dashboard/store/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | export * from './action'; | ||||||
|  | export * from './effect'; | ||||||
|  | export * from './reducer'; | ||||||
|  | export * from './state'; | ||||||
							
								
								
									
										11
									
								
								src/modules/dashboard/store/reducer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/modules/dashboard/store/reducer.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | import { createReducer, on } from '@ngrx/store'; | ||||||
|  | 
 | ||||||
|  | import { State, initialState } from './state'; | ||||||
|  | import { loadDashboardsSuccess } from './action'; | ||||||
|  | 
 | ||||||
|  | export const reducer = createReducer( | ||||||
|  |   initialState, | ||||||
|  |   on(loadDashboardsSuccess, (state, { dashboards }) => ({ | ||||||
|  |     dashboards: dashboards | ||||||
|  |   })) | ||||||
|  | ); | ||||||
							
								
								
									
										25
									
								
								src/modules/dashboard/store/state.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/modules/dashboard/store/state.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | import { Selector, createSelector } from '@ngrx/store'; | ||||||
|  | import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; | ||||||
|  | 
 | ||||||
|  | export interface State { | ||||||
|  |   dashboards: Dashboard[] | null; | ||||||
|  |   currentDashboard: Dashboard | null; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const initialState: State = { | ||||||
|  |   dashboards: null, | ||||||
|  |   currentDashboard: null | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export function getSelectors<S>(selector: Selector<any, State>) { | ||||||
|  |   return { | ||||||
|  |     selectDashboards: createSelector( | ||||||
|  |       selector, | ||||||
|  |       (state: State) => state.dashboards | ||||||
|  |     ), | ||||||
|  |     selectCurrentDashboard: createSelector( | ||||||
|  |       selector, | ||||||
|  |       (state: State) => state.currentDashboard | ||||||
|  |     ) | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								src/modules/user/model/role.model.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/modules/user/model/role.model.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | export enum RoleName { | ||||||
|  |   ROLE_SUPER_ADMIN = 'ROLE_SUPER_ADMIN', | ||||||
|  |   ROLE_ADMIN = 'ROLE_ADMIN', | ||||||
|  |   ROLE_USER = 'ROLE_USER' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface Role { | ||||||
|  |   id: number; | ||||||
|  |   name: RoleName; | ||||||
|  | } | ||||||
| @ -1,6 +1,7 @@ | |||||||
| import { Base } from '../../common/model/base.model'; | import { Role } from './role.model'; | ||||||
|  | import { DateAudit } from 'src/modules/common/data/model/audit'; | ||||||
| 
 | 
 | ||||||
| export interface User extends Base { | export interface User extends DateAudit { | ||||||
|   username?: string; |   username?: string; | ||||||
|   nickname?: string; |   nickname?: string; | ||||||
|   email?: string; |   email?: string; | ||||||
							
								
								
									
										19
									
								
								src/modules/user/service/user.service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/modules/user/service/user.service.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | import { Injectable, Inject } from '@angular/core'; | ||||||
|  | import { HttpClient } from '@angular/common/http'; | ||||||
|  | import { Observable } from 'rxjs'; | ||||||
|  | import { User } from 'src/modules/user/model/user.model'; | ||||||
|  | import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; | ||||||
|  | import { Page } from 'src/modules/common/data/model/page'; | ||||||
|  | 
 | ||||||
|  | @Injectable() | ||||||
|  | export class UserService { | ||||||
|  | 
 | ||||||
|  |   constructor( | ||||||
|  |     @Inject(API_BASE_URL) private apiBaseUrl: string, | ||||||
|  |     private httpClient: HttpClient | ||||||
|  |   ) { } | ||||||
|  | 
 | ||||||
|  |   public getAllUsers(): Observable<Page<User>> { | ||||||
|  |     return this.httpClient.get<Page<User>>(`${this.apiBaseUrl}/users`, {}); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								src/modules/user/user.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/modules/user/user.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | import { NgModule, ModuleWithProviders } from '@angular/core'; | ||||||
|  | import { CommonModule } from '@angular/common'; | ||||||
|  | import { SERVICES } from './service'; | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [], | ||||||
|  |   exports: [] | ||||||
|  | }) | ||||||
|  | export class UserRootModule { } | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |   declarations: [], | ||||||
|  |   imports: [CommonModule], | ||||||
|  |   exports: [] | ||||||
|  | }) | ||||||
|  | export class UserModule { | ||||||
|  |   public static forRoot(): ModuleWithProviders<UserRootModule> { | ||||||
|  |     return { | ||||||
|  |       ngModule: UserRootModule, | ||||||
|  |       providers: [SERVICES] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -1,7 +0,0 @@ | |||||||
| 
 |  | ||||||
| export interface Base { |  | ||||||
|   id?: string; |  | ||||||
| 
 |  | ||||||
|   createDate?: Date; |  | ||||||
|   updateDate?: Date; |  | ||||||
| } |  | ||||||
| @ -1,10 +0,0 @@ | |||||||
| export interface PageClient { |  | ||||||
|   // content: Client[];
 |  | ||||||
|   totalPages: number; |  | ||||||
|   totalElements: number; |  | ||||||
|   last: boolean; |  | ||||||
|   size: number; |  | ||||||
|   first: boolean; |  | ||||||
|   sort: string; |  | ||||||
|   numberOfElements: number; |  | ||||||
| } |  | ||||||
| @ -6,7 +6,6 @@ | |||||||
|     "deprecation": { |     "deprecation": { | ||||||
|       "severity": "warning" |       "severity": "warning" | ||||||
|     }, |     }, | ||||||
|     "completed-docs": false, |  | ||||||
|     "component-class-suffix": true, |     "component-class-suffix": true, | ||||||
|     "contextual-lifecycle": true, |     "contextual-lifecycle": true, | ||||||
|     "directive-class-suffix": true, |     "directive-class-suffix": true, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user