From 7a7fb832a0708dee7b2cae20ffaa27ca6c6ce028 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 13 Jan 2025 23:34:10 +0000 Subject: [PATCH] Added services and resolvers for redemptions and related. --- .../resolvers/redeemable-action-resolver.ts | 14 +++++++ .../shared/resolvers/redemption-resolver.ts | 14 +++++++ .../resolvers/twitch-redemption-resolver.ts | 14 +++++++ .../redeemable-action.service.spec.ts | 16 ++++++++ .../services/redeemable-action.service.ts | 28 ++++++++++++++ .../services/redemption.service.spec.ts | 15 ++++++++ src/app/shared/services/redemption.service.ts | 38 +++++++++++++++++++ .../twitch-redemption.service.spec.ts | 16 ++++++++ .../services/twitch-redemption.service.ts | 30 +++++++++++++++ 9 files changed, 185 insertions(+) create mode 100644 src/app/shared/resolvers/redeemable-action-resolver.ts create mode 100644 src/app/shared/resolvers/redemption-resolver.ts create mode 100644 src/app/shared/resolvers/twitch-redemption-resolver.ts create mode 100644 src/app/shared/services/redeemable-action.service.spec.ts create mode 100644 src/app/shared/services/redeemable-action.service.ts create mode 100644 src/app/shared/services/redemption.service.spec.ts create mode 100644 src/app/shared/services/redemption.service.ts create mode 100644 src/app/shared/services/twitch-redemption.service.spec.ts create mode 100644 src/app/shared/services/twitch-redemption.service.ts diff --git a/src/app/shared/resolvers/redeemable-action-resolver.ts b/src/app/shared/resolvers/redeemable-action-resolver.ts new file mode 100644 index 0000000..03482a3 --- /dev/null +++ b/src/app/shared/resolvers/redeemable-action-resolver.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import RedeemableAction from '../models/redeemable_action'; +import { RedeemableActionService } from '../services/redeemable-action.service'; + +@Injectable({ providedIn: 'root' }) +export default class RedeemableActionResolver implements Resolve { + constructor(private service: RedeemableActionService) { } + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.service.fetch(); + } +} \ No newline at end of file diff --git a/src/app/shared/resolvers/redemption-resolver.ts b/src/app/shared/resolvers/redemption-resolver.ts new file mode 100644 index 0000000..39a94c6 --- /dev/null +++ b/src/app/shared/resolvers/redemption-resolver.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { RedemptionService } from '../services/redemption.service'; +import Redemption from '../models/redemption'; + +@Injectable({ providedIn: 'root' }) +export default class RedemptionResolver implements Resolve { + constructor(private service: RedemptionService) { } + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.service.fetch(); + } +} \ No newline at end of file diff --git a/src/app/shared/resolvers/twitch-redemption-resolver.ts b/src/app/shared/resolvers/twitch-redemption-resolver.ts new file mode 100644 index 0000000..f1af95a --- /dev/null +++ b/src/app/shared/resolvers/twitch-redemption-resolver.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Observable, of } from 'rxjs'; +import { TwitchRedemptionService } from '../services/twitch-redemption.service'; +import TwitchRedemption from '../models/twitch-redemption'; + +@Injectable({ providedIn: 'root' }) +export default class TwitchRedemptionResolver implements Resolve { + constructor(private service: TwitchRedemptionService) { } + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.service.fetch(); + } +} \ No newline at end of file diff --git a/src/app/shared/services/redeemable-action.service.spec.ts b/src/app/shared/services/redeemable-action.service.spec.ts new file mode 100644 index 0000000..653e76a --- /dev/null +++ b/src/app/shared/services/redeemable-action.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { RedeemableActionService } from './redeemable-action.service'; + +describe('RedeemableActionService', () => { + let service: RedeemableActionService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RedeemableActionService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/redeemable-action.service.ts b/src/app/shared/services/redeemable-action.service.ts new file mode 100644 index 0000000..ce21f56 --- /dev/null +++ b/src/app/shared/services/redeemable-action.service.ts @@ -0,0 +1,28 @@ +import { inject, Injectable } from '@angular/core'; +import { HermesClientService } from '../../hermes-client.service'; +import { map, of } from 'rxjs'; +import RedeemableAction from '../models/redeemable_action'; + +@Injectable({ + providedIn: 'root' +}) +export class RedeemableActionService { + private client = inject(HermesClientService); + private data: RedeemableAction[] = [] + loaded = false; + + + fetch() { + if (this.loaded) { + return of(this.data); + } + + const $ = this.client.filterByRequestType('get_redeemable_actions')!.pipe(map(d => d.data)); + $.subscribe(d => { + this.data = d; + this.loaded = true; + }); + this.client.fetchRedeemableActions(); + return $; + } +} diff --git a/src/app/shared/services/redemption.service.spec.ts b/src/app/shared/services/redemption.service.spec.ts new file mode 100644 index 0000000..4ce6aa2 --- /dev/null +++ b/src/app/shared/services/redemption.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed } from '@angular/core/testing'; +import { RedemptionService } from './redemption.service'; + +describe('RedemptionService', () => { + let service: RedemptionService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RedemptionService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/redemption.service.ts b/src/app/shared/services/redemption.service.ts new file mode 100644 index 0000000..863a9fb --- /dev/null +++ b/src/app/shared/services/redemption.service.ts @@ -0,0 +1,38 @@ +import { inject, Injectable } from '@angular/core'; +import Redemption from '../models/redemption'; +import { HermesClientService } from '../../hermes-client.service'; +import { map, Observable, of } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class RedemptionService { + private client = inject(HermesClientService); + private data: Redemption[] = [] + create$: Observable | undefined; + fetch$: Observable | undefined; + update$: Observable | undefined; + delete$: Observable | undefined; + loaded = false; + + constructor() { + this.create$ = this.client.filterByRequestType('create_redemption'); + this.update$ = this.client.filterByRequestType('update_redemption'); + this.delete$ = this.client.filterByRequestType('delete_redemption'); + } + + + fetch() { + if (this.loaded) { + return of(this.data); + } + + const $ = this.client.first(d => d.d.request.type == 'get_redemptions')!.pipe(map(d => d.d.data)); + $.subscribe(d => { + this.data = d; + this.loaded = true; + }); + this.client.fetchRedemptions(); + return $; + } +} diff --git a/src/app/shared/services/twitch-redemption.service.spec.ts b/src/app/shared/services/twitch-redemption.service.spec.ts new file mode 100644 index 0000000..e22ab80 --- /dev/null +++ b/src/app/shared/services/twitch-redemption.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { TwitchRedemptionService } from './twitch-redemption.service'; + +describe('TwitchRedemptionService', () => { + let service: TwitchRedemptionService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(TwitchRedemptionService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/twitch-redemption.service.ts b/src/app/shared/services/twitch-redemption.service.ts new file mode 100644 index 0000000..b62c55c --- /dev/null +++ b/src/app/shared/services/twitch-redemption.service.ts @@ -0,0 +1,30 @@ +import { HttpClient } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { environment } from '../../../environments/environment'; +import TwitchRedemption from '../models/twitch-redemption'; +import { of } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class TwitchRedemptionService { + private http = inject(HttpClient); + private twitchRedemptions: TwitchRedemption[] = []; + private loaded = false + + fetch(force: boolean = false) { + if (!force && this.loaded) + return of(this.twitchRedemptions); + + const $ = this.http.get(environment.API_HOST + '/twitch/redemptions', { + headers: { + 'Authorization': 'Bearer ' + localStorage.getItem('jwt'), + } + }); + $.subscribe(d => { + this.twitchRedemptions = d; + this.loaded = true; + }); + return $; + } +} \ No newline at end of file