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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 카지노
+ 슬롯
+
+
+
+
+ 전체
+ 에볼류션 카지노
+ 드림게임
+ 마이크로게이밍 카지노
+ 프라그마틱 카지노
+ 오리엔탈 게이밍
+ CQ9 카지노
+ 이주기
+ 비보 카지노
+ 보타 카지노
+
+
+
+
+ 전체금액
+ 배팅100만미만
+ 배팅100-300만
+ 배팅300-500만
+ 배팅500만이상
+ 당첨1000만초과
+
+
+
+
+ 아이디
+ 게임아이디
+ 닉네임
+ 게임종류
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0; else noCasino">
+
+
+
+
+
+ 상위
+
+
+ 유저
+
+
+ 게임
+
+
형식
+
+ 금액
+
+
+ 배팅
+
+
+ 데이터
+
+
콤프
+
+ 롤링
+
+
+ 배팅시간 등록시간
+
+
+
+
+
+
+
+
+
+ {{ casino.highRank }}
+
+
+
+ {{ casino.id }}
+ {{ casino.siteId }}
+ {{ casino.nickname }}
+
+
+
+
+ {{ casino.gameInfo1 }}
+ {{ casino.gameInfo2 }}
+ {{ casino.gameInfo3 }}
+
+
+
+
+ {{ casino.form }}
+
+
+
+
+ 당첨전{{ casino.beforeWinning }} 당첨{{
+ casino.winning
+ }}
+ 당첨후{{ casino.afterWinning }}
+
+
+
+
+ {{ casino.bettingInfo1 }}
+ {{ casino.bettingInfo2 }}
+ {{ casino.bettingInfo3 }}
+
+
+
+
+ {{ casino.data }}
+
+
+
+
+ {{ casino.comp }}
+
+
+
+
+ 본사:{{ casino.mainofficeName }}({{
+ casino.mainofficePercent
+ }}%,{{ casino.mainofficePoint }}P) 대본:{{
+ casino.branchName
+ }}({{ casino.branchPercent }}%,{{ casino.branchPoint }}P)
+ 부본:{{ casino.divisionName }}({{
+ casino.divisionPercent
+ }}%,{{ casino.divisionPoint }}P) 총판:{{
+ casino.officeName
+ }}({{ casino.officePercent }}%,{{ casino.officePoint }}P)
+ 매장:{{ casino.storeName }}({{ casino.storePercent }}%,{{
+ casino.storePoint
+ }}P) 회원:{{ casino.memberName }}({{
+ casino.memberPercent
+ }}%,{{ casino.memberPoint }}P)
+
+
+
+
+ {{ casino.bettingTime }}
+ {{ casino.registrationTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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": "카지노배팅리스트"
}