From 1426cb91bb34777219ea032d71e0943e1d194f10 Mon Sep 17 00:00:00 2001 From: JUNG YI DAM Date: Thu, 7 Jul 2022 01:35:36 +0000 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=EC=A7=80=EB=85=B8=EB=B0=B0=ED=8C=85?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/app.routing.ts | 7 + src/app/mock-api/apps/game/casino/api.ts | 214 ++++++++++ src/app/mock-api/apps/game/casino/data.ts | 57 +++ src/app/mock-api/common/navigation/data.ts | 7 + src/app/mock-api/index.ts | 2 + .../admin/game/casino/casino.module.ts | 42 ++ .../admin/game/casino/casino.routing.ts | 15 + .../admin/game/casino/components/index.ts | 3 + .../casino/components/list.component.html | 369 ++++++++++++++++++ .../game/casino/components/list.component.ts | 190 +++++++++ .../game/casino/models/casino-pagination.ts | 8 + .../admin/game/casino/models/casino.ts | 53 +++ .../game/casino/resolvers/casino.resolver.ts | 84 ++++ .../game/casino/services/casino.service.ts | 151 +++++++ src/assets/i18n/en.json | 3 +- src/assets/i18n/ko.json | 3 +- 16 files changed, 1206 insertions(+), 2 deletions(-) create mode 100644 src/app/mock-api/apps/game/casino/api.ts create mode 100644 src/app/mock-api/apps/game/casino/data.ts create mode 100644 src/app/modules/admin/game/casino/casino.module.ts create mode 100644 src/app/modules/admin/game/casino/casino.routing.ts create mode 100644 src/app/modules/admin/game/casino/components/index.ts create mode 100644 src/app/modules/admin/game/casino/components/list.component.html create mode 100644 src/app/modules/admin/game/casino/components/list.component.ts create mode 100644 src/app/modules/admin/game/casino/models/casino-pagination.ts create mode 100644 src/app/modules/admin/game/casino/models/casino.ts create mode 100644 src/app/modules/admin/game/casino/resolvers/casino.resolver.ts create mode 100644 src/app/modules/admin/game/casino/services/casino.service.ts diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts index b6b63ba..4a00f96 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -181,6 +181,13 @@ export const appRoutes: Route[] = [ (m: any) => m.PowerballModule ), }, + { + path: 'casino', + loadChildren: () => + import('app/modules/admin/game/casino/casino.module').then( + (m: any) => m.CasinoModule + ), + }, ], }, ], diff --git a/src/app/mock-api/apps/game/casino/api.ts b/src/app/mock-api/apps/game/casino/api.ts new file mode 100644 index 0000000..0503056 --- /dev/null +++ b/src/app/mock-api/apps/game/casino/api.ts @@ -0,0 +1,214 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { casinos as casinosData } from './data'; + +@Injectable({ + providedIn: 'root', +}) +export class GameCasinoMockApi { + private _casinos: any[] = casinosData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void { + // ----------------------------------------------------------------------------------------------------- + // @ Casinos - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/game/casino/casinos', 300) + .reply(({ request }) => { + // Get available queries + const search = request.params.get('search'); + const sort = request.params.get('sort') || 'name'; + const order = request.params.get('order') || 'asc'; + const page = parseInt(request.params.get('page') ?? '1', 10); + const size = parseInt(request.params.get('size') ?? '10', 10); + + // Clone the casinos + let casinos: any[] | null = cloneDeep(this._casinos); + + // Sort the casinos + if (sort === 'sku' || sort === 'name' || sort === 'active') { + casinos.sort((a, b) => { + const fieldA = a[sort].toString().toUpperCase(); + const fieldB = b[sort].toString().toUpperCase(); + return order === 'asc' + ? fieldA.localeCompare(fieldB) + : fieldB.localeCompare(fieldA); + }); + } else { + casinos.sort((a, b) => + order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort] + ); + } + + // If search exists... + if (search) { + // Filter the casinos + casinos = casinos.filter( + (contact: any) => + contact.name && + contact.name.toLowerCase().includes(search.toLowerCase()) + ); + } + + // Paginate - Start + const casinosLength = casinos.length; + + // Calculate pagination details + const begin = page * size; + const end = Math.min(size * (page + 1), casinosLength); + const lastPage = Math.max(Math.ceil(casinosLength / size), 1); + + // Prepare the pagination object + let pagination = {}; + + // If the requested page number is bigger than + // the last possible page number, return null for + // casinos but also send the last possible page so + // the app can navigate to there + if (page > lastPage) { + casinos = null; + pagination = { + lastPage, + }; + } else { + // Paginate the results by size + casinos = casinos.slice(begin, end); + + // Prepare the pagination mock-api + pagination = { + length: casinosLength, + size: size, + page: page, + lastPage: lastPage, + startIndex: begin, + endIndex: end - 1, + }; + } + + // Return the response + return [ + 200, + { + casinos, + pagination, + }, + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Casino - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/game/casino/casino') + .reply(({ request }) => { + // Get the id from the params + const id = request.params.get('id'); + + // Clone the casinos + const casinos = cloneDeep(this._casinos); + + // Find the casino + const casino = casinos.find((item: any) => item.id === id); + + // Return the response + return [200, casino]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Casino - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService.onPost('api/apps/gmae/casino/casino').reply(() => { + // Generate a new casino + const newCasino = { + id: FuseMockApiUtils.guid(), + startDate: '', + finishDate: '', + totalBetting: '', + winningMoney: '', + proceedingMoney: '', + calculate: '', + index: '', + division: '', + rank: '', + nickname: '', + bettingProgress: '', + odds: '', + bettingMoney: '', + hitMoney: '', + bettingTime: '', + result: '', + delete: '', + }; + + // Unshift the new casino + this._casinos.unshift(newCasino); + + // Return the response + return [200, newCasino]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Casino - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/game/casino/casino') + .reply(({ request }) => { + // Get the id and casino + const id = request.body.id; + const casino = cloneDeep(request.body.casino); + + // Prepare the updated casino + let updatedCasino = null; + + // Find the casino and update it + this._casinos.forEach((item, index, casinos) => { + if (item.id === id) { + // Update the casino + casinos[index] = assign({}, casinos[index], casino); + + // Store the updated casino + updatedCasino = casinos[index]; + } + }); + + // Return the response + return [200, updatedCasino]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Casino - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/game/casino/casino') + .reply(({ request }) => { + // Get the id + const id = request.params.get('id'); + + // Find the casino and delete it + this._casinos.forEach((item, index) => { + if (item.id === id) { + this._casinos.splice(index, 1); + } + }); + + // Return the response + return [200, true]; + }); + } +} diff --git a/src/app/mock-api/apps/game/casino/data.ts b/src/app/mock-api/apps/game/casino/data.ts new file mode 100644 index 0000000..bb6b3d7 --- /dev/null +++ b/src/app/mock-api/apps/game/casino/data.ts @@ -0,0 +1,57 @@ +/* eslint-disable */ + +export const casinos = [ + { + startDate: '2022-06-01 00:00', + finishDate: '2022-06-21 23:59', + availableBetting: 12440000, + bettingMoney: 12751000, + winningMoney: 12198950, + cancel: 10000, + betWinCancel: 542050, + mainofficeRolling: 60202, + branchRolling: 36390, + divisionRolling: 24828, + officeRolling: 24752, + storeRolling: 13451, + memberRolling: 81037, + totalrolling: 240660, + highRank: '[매장]kgon5', + gameId: 'ks1_1007', + siteId: 'aa100', + nickname: 'aa100', + gameName: '에볼류션 카지노', + gameInfo1: 'Speed Baccarat J', + gameInfo2: '62ae9beb396a5971c3921297', + gameInfo3: '62ae9bdd396a5971c3921033', + form: '패', + beforeWinning: 69831, + winning: 0, + afterWinning: 69831, + bettingInfo1: 'Banker', + bettingInfo2: 8000, + bettingInfo3: 0, + data: '데이터확인', + comp: '-', + mainofficeName: '', + mainofficePercent: '', + mainofficePoint: '', + branchName: '', + branchPercent: '', + branchPoint: '', + divisionName: '', + divisionPercent: '', + divisionPoint: '', + officeName: '', + officePercent: '', + officePoint: '', + storeName: '', + storePercent: '', + storePoint: '', + memberName: '', + memberPercent: '', + memberPoint: '', + bettingTime: '2022-06-01 23:22', + registrationTime: '2022-06-01 23:22', + }, +]; diff --git a/src/app/mock-api/common/navigation/data.ts b/src/app/mock-api/common/navigation/data.ts index 4d377da..f757f77 100644 --- a/src/app/mock-api/common/navigation/data.ts +++ b/src/app/mock-api/common/navigation/data.ts @@ -85,6 +85,13 @@ export const defaultNavigation: FuseNavigationItem[] = [ icon: 'heroicons_outline:academic-cap', link: '/game/powerball', }, + { + id: 'game.casino', + title: 'Casino', + type: 'basic', + icon: 'heroicons_outline:academic-cap', + link: '/game/casino', + }, ], }, ]; diff --git a/src/app/mock-api/index.ts b/src/app/mock-api/index.ts index 857e063..6419b72 100644 --- a/src/app/mock-api/index.ts +++ b/src/app/mock-api/index.ts @@ -24,6 +24,7 @@ import { TasksMockApi } from 'app/mock-api/apps/tasks/api'; import { UserMockApi } from 'app/mock-api/common/user/api'; import { BankDepositMockApi } from './apps/bank/deposit/api'; import { GamePowerballMockApi } from './apps/game/powerball/api'; +import { GameCasinoMockApi } from './apps/game/casino/api'; export const mockApiServices = [ AcademyMockApi, @@ -52,4 +53,5 @@ export const mockApiServices = [ UserMockApi, BankDepositMockApi, GamePowerballMockApi, + GameCasinoMockApi, ]; diff --git a/src/app/modules/admin/game/casino/casino.module.ts b/src/app/modules/admin/game/casino/casino.module.ts new file mode 100644 index 0000000..7261cc9 --- /dev/null +++ b/src/app/modules/admin/game/casino/casino.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatRippleModule } from '@angular/material/core'; +import { MatSortModule } from '@angular/material/sort'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +import { TranslocoModule } from '@ngneat/transloco'; + +import { SharedModule } from 'app/shared/shared.module'; + +import { COMPONENTS } from './components'; + +import { casinoRoutes } from './casino.routing'; + +@NgModule({ + declarations: [COMPONENTS], + imports: [ + TranslocoModule, + SharedModule, + RouterModule.forChild(casinoRoutes), + + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatPaginatorModule, + MatProgressBarModule, + MatRippleModule, + MatSortModule, + MatSelectModule, + MatTooltipModule, + ], +}) +export class CasinoModule {} diff --git a/src/app/modules/admin/game/casino/casino.routing.ts b/src/app/modules/admin/game/casino/casino.routing.ts new file mode 100644 index 0000000..2e13133 --- /dev/null +++ b/src/app/modules/admin/game/casino/casino.routing.ts @@ -0,0 +1,15 @@ +import { Route } from '@angular/router'; + +import { ListComponent } from './components/list.component'; + +import { CasinosResolver } from './resolvers/casino.resolver'; + +export const casinoRoutes: Route[] = [ + { + path: '', + component: ListComponent, + resolve: { + deposits: CasinosResolver, + }, + }, +]; diff --git a/src/app/modules/admin/game/casino/components/index.ts b/src/app/modules/admin/game/casino/components/index.ts new file mode 100644 index 0000000..04759eb --- /dev/null +++ b/src/app/modules/admin/game/casino/components/index.ts @@ -0,0 +1,3 @@ +import { ListComponent } from './list.component'; + +export const COMPONENTS = [ListComponent]; diff --git a/src/app/modules/admin/game/casino/components/list.component.html b/src/app/modules/admin/game/casino/components/list.component.html new file mode 100644 index 0000000..99cc46c --- /dev/null +++ b/src/app/modules/admin/game/casino/components/list.component.html @@ -0,0 +1,369 @@ +
+ +
+ +
+ +
+ +
Casino
+ +
+ + + + + + + 카지노 + 슬롯 + + + + + 전체 + 에볼류션 카지노 + 드림게임 + 마이크로게이밍 카지노 + 프라그마틱 카지노 + 오리엔탈 게이밍 + CQ9 카지노 + 이주기 + 비보 카지노 + 보타 카지노 + + + + + 전체금액 + 배팅100만미만 + 배팅100-300만 + 배팅300-500만 + 배팅500만이상 + 당첨1000만초과 + + + + + 아이디 + 게임아이디 + 닉네임 + 게임종류 + + + + + + + + + +
+
+ + +
+ +
+ + +
+ +
+
+ + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+
+ + +
+ There are no casino! +
+
+
+
+
diff --git a/src/app/modules/admin/game/casino/components/list.component.ts b/src/app/modules/admin/game/casino/components/list.component.ts new file mode 100644 index 0000000..b04c502 --- /dev/null +++ b/src/app/modules/admin/game/casino/components/list.component.ts @@ -0,0 +1,190 @@ +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, + ViewChild, + ViewEncapsulation, +} from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, +} from '@angular/forms'; +import { MatCheckboxChange } from '@angular/material/checkbox'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { + debounceTime, + map, + merge, + Observable, + Subject, + switchMap, + takeUntil, +} from 'rxjs'; +import { fuseAnimations } from '@fuse/animations'; +import { FuseConfirmationService } from '@fuse/services/confirmation'; + +import { Casino } from '../models/casino'; +import { CasinoPagination } from '../models/casino-pagination'; +import { CasinoService } from '../services/casino.service'; + +@Component({ + selector: 'casino-list', + templateUrl: './list.component.html', + styles: [ + /* language=SCSS */ + ` + .inventory-grid { + grid-template-columns: 60px auto 40px; + + @screen sm { + grid-template-columns: 60px auto 60px 72px; + } + + @screen md { + grid-template-columns: 60px 60px auto 112px 72px; + } + + @screen lg { + grid-template-columns: 60px 60px auto 112px 96px 96px 72px; + } + } + `, + ], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + animations: fuseAnimations, +}) +export class ListComponent implements OnInit, AfterViewInit, OnDestroy { + @ViewChild(MatPaginator) private _paginator!: MatPaginator; + @ViewChild(MatSort) private _sort!: MatSort; + + casinos$!: Observable; + + isLoading = false; + searchInputControl = new FormControl(); + selectedCasino?: Casino; + pagination?: CasinoPagination; + + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseConfirmationService: FuseConfirmationService, + private _formBuilder: FormBuilder, + private _casinoService: CasinoService + ) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the pagination + this._casinoService.pagination$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((pagination: CasinoPagination | undefined) => { + // Update the pagination + this.pagination = pagination; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the products + this.casinos$ = this._casinoService.casinos$; + } + + /** + * After view init + */ + ngAfterViewInit(): void { + if (this._sort && this._paginator) { + // Set the initial sort + this._sort.sort({ + id: 'nickname', + start: 'asc', + disableClear: true, + }); + + // Mark for check + this._changeDetectorRef.markForCheck(); + + // If the casino changes the sort order... + this._sort.sortChange + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Reset back to the first page + this._paginator.pageIndex = 0; + }); + + // Get products if sort or page changes + merge(this._sort.sortChange, this._paginator.page) + .pipe( + switchMap(() => { + this.isLoading = true; + return this._casinoService.getCasinos( + this._paginator.pageIndex, + this._paginator.pageSize, + this._sort.active, + this._sort.direction + ); + }), + map(() => { + this.isLoading = false; + }) + ) + .subscribe(); + } + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(null); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Create product + */ + __createProduct(): void {} + + /** + * Toggle product details + * + * @param productId + */ + __toggleDetails(productId: string): void {} + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + __trackByFn(index: number, item: any): any { + return item.id || index; + } +} diff --git a/src/app/modules/admin/game/casino/models/casino-pagination.ts b/src/app/modules/admin/game/casino/models/casino-pagination.ts new file mode 100644 index 0000000..0dfc295 --- /dev/null +++ b/src/app/modules/admin/game/casino/models/casino-pagination.ts @@ -0,0 +1,8 @@ +export interface CasinoPagination { + length: number; + size: number; + page: number; + lastPage: number; + startIndex: number; + endIndex: number; +} diff --git a/src/app/modules/admin/game/casino/models/casino.ts b/src/app/modules/admin/game/casino/models/casino.ts new file mode 100644 index 0000000..2041c72 --- /dev/null +++ b/src/app/modules/admin/game/casino/models/casino.ts @@ -0,0 +1,53 @@ +export interface Casino { + id?: string; + startDate?: string; + finishDate?: string; + availableBetting?: number; + bettingMoney?: number; + winningMoney?: number; + cancel?: number; + betWinCancel?: number; + mainofficeRolling?: number; + branchRolling?: number; + divisionRolling?: number; + officeRolling?: number; + storeRolling?: number; + memberRolling?: number; + totalrolling?: number; + highRank?: string; + siteId?: string; + nickname?: string; + gameName?: string; + gameInfo1?: string; + gameInfo2?: string; + gameInfo3?: string; + form?: string; + beforeWinning?: number; + winning?: number; + afterWinning?: number; + bettingInfo1?: string; + bettingInfo2?: number; + bettingInfo3?: number; + data?: string; + comp?: string; + mainofficeName?: string; + mainofficePercent?: number; + mainofficePoint?: number; + branchName?: string; + branchPercent?: number; + branchPoint?: number; + divisionName?: string; + divisionPercent?: number; + divisionPoint?: number; + officeName?: string; + officePercent?: number; + officePoint?: number; + storeName?: string; + storePercent?: number; + storePoint?: number; + memberName?: string; + memberPercent?: number; + memberPoint?: number; + bettingTime?: string; + registrationTime?: string; +} diff --git a/src/app/modules/admin/game/casino/resolvers/casino.resolver.ts b/src/app/modules/admin/game/casino/resolvers/casino.resolver.ts new file mode 100644 index 0000000..9e935d1 --- /dev/null +++ b/src/app/modules/admin/game/casino/resolvers/casino.resolver.ts @@ -0,0 +1,84 @@ +import { Injectable } from '@angular/core'; +import { + ActivatedRouteSnapshot, + Resolve, + Router, + RouterStateSnapshot, +} from '@angular/router'; +import { catchError, Observable, throwError } from 'rxjs'; + +import { Casino } from '../models/casino'; +import { CasinoPagination } from '../models/casino-pagination'; +import { CasinoService } from '../services/casino.service'; + +@Injectable({ + providedIn: 'root', +}) +export class CasinoResolver implements Resolve { + /** + * Constructor + */ + constructor(private _casinoService: CasinoService, private _router: Router) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ): Observable { + return this._casinoService.getCasinoById(route.paramMap.get('id')).pipe( + // Error here means the requested product is not available + catchError((error) => { + // Log the error + console.error(error); + + // Get the parent url + const parentUrl = state.url.split('/').slice(0, -1).join('/'); + + // Navigate to there + this._router.navigateByUrl(parentUrl); + + // Throw an error + return throwError(error); + }) + ); + } +} + +@Injectable({ + providedIn: 'root', +}) +export class CasinosResolver implements Resolve { + /** + * Constructor + */ + constructor(private _casinoService: CasinoService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ): Observable<{ + pagination: CasinoPagination; + casinos: Casino[]; + }> { + return this._casinoService.getCasinos(); + } +} diff --git a/src/app/modules/admin/game/casino/services/casino.service.ts b/src/app/modules/admin/game/casino/services/casino.service.ts new file mode 100644 index 0000000..22dcc57 --- /dev/null +++ b/src/app/modules/admin/game/casino/services/casino.service.ts @@ -0,0 +1,151 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { + BehaviorSubject, + filter, + map, + Observable, + of, + switchMap, + take, + tap, + throwError, +} from 'rxjs'; + +import { Casino } from '../models/casino'; +import { CasinoPagination } from '../models/casino-pagination'; + +@Injectable({ + providedIn: 'root', +}) +export class CasinoService { + // Private + private __pagination = new BehaviorSubject( + undefined + ); + private __casino = new BehaviorSubject(undefined); + private __casinos = new BehaviorSubject(undefined); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for pagination + */ + get pagination$(): Observable { + return this.__pagination.asObservable(); + } + + /** + * Getter for casino + */ + get casino$(): Observable { + return this.__casino.asObservable(); + } + + /** + * Getter for casinos + */ + get casinos$(): Observable { + return this.__casinos.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get casinos + * + * + * @param page + * @param size + * @param sort + * @param order + * @param search + */ + getCasinos( + page: number = 0, + size: number = 10, + sort: string = 'nickname', + order: 'asc' | 'desc' | '' = 'asc', + search: string = '' + ): Observable<{ + pagination: CasinoPagination; + casinos: Casino[]; + }> { + return this._httpClient + .get<{ pagination: CasinoPagination; casinos: Casino[] }>( + 'api/apps/game/casino/casinos', + { + params: { + page: '' + page, + size: '' + size, + sort, + order, + search, + }, + } + ) + .pipe( + tap((response) => { + this.__pagination.next(response.pagination); + this.__casinos.next(response.casinos); + }) + ); + } + + /** + * Get product by id + */ + getCasinoById(id: string | null): Observable { + return this.__casinos.pipe( + take(1), + map((casinos) => { + // Find the product + const casino = casinos?.find((item) => item.id === id) || undefined; + + // Update the product + this.__casino.next(casino); + + // Return the product + return casino; + }), + switchMap((product) => { + if (!product) { + return throwError('Could not found product with id of ' + id + '!'); + } + + return of(product); + }) + ); + } + + /** + * Create product + */ + createCasino(): Observable { + return this.casinos$.pipe( + take(1), + switchMap((casinos) => + this._httpClient.post('api/apps/game/casino/product', {}).pipe( + map((newCasino) => { + // Update the casinos with the new product + if (!!casinos) { + this.__casinos.next([newCasino, ...casinos]); + } + + // Return the new product + return newCasino; + }) + ) + ) + ); + } +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 391154b..6f09d38 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -8,5 +8,6 @@ "Analytics": "Analytics", "Deposit": "Deposit", "Withdraw": "Withdraw", - "Powerball": "Powerball" + "Powerball": "Powerball", + "Casino": "Casino" } diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 12263c3..ccfa38a 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -8,5 +8,6 @@ "Analytics": "Analytics", "Deposit": "입금관리", "Withdraw": "출금관리", - "Powerball": "파워볼" + "Powerball": "파워볼", + "Casino": "카지노배팅리스트" }