All files / projects-dev/apps/mc/src/services encounters.ts

0% Statements 0/67
0% Branches 0/1
0% Functions 0/1
0% Lines 0/67

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68                                                                                                                                       
import type { ApiResponse } from "@jga/apis";
import { ApiResponseStatus } from "@jga/apis";
import type { EncounterInterface } from "$models";

import { Encounter } from "$models";

import { Service } from "./service";

export class EncountersService extends Service {
    // eslint-disable-next-line class-methods-use-this
    public loadJson(data: EncounterInterface[]): Encounter[] {
        const encounters: Encounter[] = [];

        for (const encounter of data) {
            encounters.push(
                new Encounter({
                    id: encounter.id,
                    scenario: encounter.scenario,
                    modularSets: encounter.modularSets,
                    heroes: encounter.heroes,
                    difficulty: encounter.difficulty,
                    result: encounter.result,
                    date: encounter.date == undefined ? undefined : new Date(encounter.date),
                }),
            );
        }

        return encounters;
    }

    public load(): Promise<Encounter[]> {
        // eslint-disable-next-line compat/compat
        return fetch(`${this.apiEndpoint}/encounters?sort=DESC&timestamp=${Date.now()}`)
            .then((response) => response.json())
            .then((result: ApiResponse<string, Encounter[]>) => this.extractResponse(result));
    }

    public async save(encounter: Partial<Encounter>): Promise<null | Encounter> {
        // eslint-disable-next-line compat/compat
        return fetch(`${this.apiEndpoint}/encounters`, {
            method: "POST",
            mode: "cors",
            headers: {
                "Content-Type": "application/json",
            },
            body: JSON.stringify(encounter),
        })
            .then((response) => response.json())
            .then((result: ApiResponse<string, Encounter>) => {
                if (ApiResponseStatus.SUCCESS === result.status) {
                    return result.data;
                }
                // eslint-disable-next-line no-console
                console.error(result.error);
                return null;
            });
    }

    protected extractResponse(result: ApiResponse<string, Encounter[]>): Encounter[] {
        if (ApiResponseStatus.SUCCESS === result.status) {
            return this.loadJson(result.data);
        }
        // eslint-disable-next-line no-console
        console.error(result.error);
        return [];
    }
}