From e5021187e96b78b53203bd95d08d6818aea47d17 Mon Sep 17 00:00:00 2001 From: "Thomas F. K. Jorna" Date: Wed, 14 Jul 2021 15:10:31 +0200 Subject: New Ignite 7.0.6 app --- app/services/api/api.ts | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 app/services/api/api.ts (limited to 'app/services/api/api.ts') diff --git a/app/services/api/api.ts b/app/services/api/api.ts new file mode 100644 index 0000000..15f6815 --- /dev/null +++ b/app/services/api/api.ts @@ -0,0 +1,102 @@ +import { ApisauceInstance, create, ApiResponse } from "apisauce" +import { getGeneralApiProblem } from "./api-problem" +import { ApiConfig, DEFAULT_API_CONFIG } from "./api-config" +import * as Types from "./api.types" + +/** + * Manages all requests to the API. + */ +export class Api { + /** + * The underlying apisauce instance which performs the requests. + */ + apisauce: ApisauceInstance + + /** + * Configurable options. + */ + config: ApiConfig + + /** + * Creates the api. + * + * @param config The configuration to use. + */ + constructor(config: ApiConfig = DEFAULT_API_CONFIG) { + this.config = config + } + + /** + * Sets up the API. This will be called during the bootup + * sequence and will happen before the first React component + * is mounted. + * + * Be as quick as possible in here. + */ + setup() { + // construct the apisauce instance + this.apisauce = create({ + baseURL: this.config.url, + timeout: this.config.timeout, + headers: { + Accept: "application/json", + }, + }) + } + + /** + * Gets a list of users. + */ + async getUsers(): Promise { + // make the api call + const response: ApiResponse = await this.apisauce.get(`/users`) + + // the typical ways to die when calling an api + if (!response.ok) { + const problem = getGeneralApiProblem(response) + if (problem) return problem + } + + const convertUser = (raw) => { + return { + id: raw.id, + name: raw.name, + } + } + + // transform the data into the format we are expecting + try { + const rawUsers = response.data + const resultUsers: Types.User[] = rawUsers.map(convertUser) + return { kind: "ok", users: resultUsers } + } catch { + return { kind: "bad-data" } + } + } + + /** + * Gets a single user by ID + */ + + async getUser(id: string): Promise { + // make the api call + const response: ApiResponse = await this.apisauce.get(`/users/${id}`) + + // the typical ways to die when calling an api + if (!response.ok) { + const problem = getGeneralApiProblem(response) + if (problem) return problem + } + + // transform the data into the format we are expecting + try { + const resultUser: Types.User = { + id: response.data.id, + name: response.data.name, + } + return { kind: "ok", user: resultUser } + } catch { + return { kind: "bad-data" } + } + } +} -- cgit v1.2.3