Added services and resolvers for redemptions and related.

This commit is contained in:
Tom 2025-01-13 23:34:10 +00:00
parent fee2c4e12f
commit 7a7fb832a0
9 changed files with 185 additions and 0 deletions

View File

@ -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<RedeemableAction[]> {
constructor(private service: RedeemableActionService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<RedeemableAction[]> {
return this.service.fetch();
}
}

View File

@ -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<Redemption[]> {
constructor(private service: RedemptionService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Redemption[]> {
return this.service.fetch();
}
}

View File

@ -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<TwitchRedemption[]> {
constructor(private service: TwitchRedemptionService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<TwitchRedemption[]> {
return this.service.fetch();
}
}

View File

@ -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();
});
});

View File

@ -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 $;
}
}

View File

@ -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();
});
});

View File

@ -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<any> | undefined;
fetch$: Observable<any> | undefined;
update$: Observable<any> | undefined;
delete$: Observable<any> | 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 $;
}
}

View File

@ -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();
});
});

View File

@ -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<TwitchRedemption[]>(environment.API_HOST + '/twitch/redemptions', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('jwt'),
}
});
$.subscribe(d => {
this.twitchRedemptions = d;
this.loaded = true;
});
return $;
}
}