Add API code

This commit is contained in:
2025-05-26 02:37:43 +02:00
parent 3e1ce6904f
commit cd65f06c5f
7 changed files with 179 additions and 0 deletions

View File

@ -0,0 +1,30 @@
import {deleteData, postData, putData} from "../fetchApi.tsx";
import type IPlayer from "../types/IPlayer.ts";
export function AddPlayer(apiUri: string, steamId: bigint){
return putData(`${apiUri}/Actions/Player/${steamId}`) as Promise<IPlayer>;
}
export function DeletePlayer(apiUri: string, steamId: bigint){
return deleteData(`${apiUri}/Actions/Player/${steamId}`) as Promise<void>;
}
export function UpdatePlayerData(apiUri: string, steamId: bigint){
return postData(`${apiUri}/Actions/Update/Player/${steamId}/All`) as Promise<void>;
}
export function UpdatePlayerInfo(apiUri: string, steamId: bigint){
return postData(`${apiUri}/Actions/Update/Player/${steamId}/Info`) as Promise<void>;
}
export function UpdatePlayerOwnedGames(apiUri: string, steamId: bigint){
return postData(`${apiUri}/Actions/Update/Player/${steamId}/OwnedGames`) as Promise<void>;
}
export function UpdatePlayerTimeTracked(apiUri: string, steamId: bigint){
return postData(`${apiUri}/Actions/Update/Player/${steamId}/TimeTracked`) as Promise<void>;
}
export function UpdateAll(apiUri: string){
return postData(`${apiUri}/Actions/All`) as Promise<void>;
}

View File

@ -0,0 +1,27 @@
import {getData} from "../fetchApi.tsx";
import type IPlayer from "../types/IPlayer.ts";
import type IGame from "../types/IGame.ts";
export function GetPlayers(apiUri: string){
return getData(`${apiUri}/Data/Players`) as Promise<IPlayer[]>;
}
export function GetPlayer(apiUri: string, steamdId: bigint){
return getData(`${apiUri}/Data/Player/${steamdId}`) as Promise<IPlayer>;
}
export function GetGamesOfPlayer(apiUri: string, steamdId: bigint){
return getData(`${apiUri}/Data/Player/${steamdId}/Games`) as Promise<IGame[]>;
}
export function GetGames(apiUri: string){
return getData(`${apiUri}/Data/Games`) as Promise<IGame[]>;
}
export function GetGame(apiUri: string, appId: bigint){
return getData(`${apiUri}/Data/Game/${appId}`) as Promise<IGame>;
}
export function GetPlayersOfGame(apiUri: string, appId: bigint){
return getData(`${apiUri}/Data/Game/${appId}/Players`) as Promise<IPlayer[]>;
}

View File

@ -0,0 +1,18 @@
import {getData} from "../fetchApi.tsx";
import type ITrackedTime from "../types/ITrackedTime.ts";
export function GetTimelines(apiUri: string, steamId: bigint){
return getData(`${apiUri}/TimeTrack/${steamId}`) as Promise<Map<bigint, ITrackedTime[]>>;
}
export function GetTimelineGame(apiUri: string, steamId: bigint, appId: bigint){
return getData(`${apiUri}/TimeTrack/${steamId}/${appId}`) as Promise<ITrackedTime[]>;
}
export function GetTotal(apiUri: string, steamId: bigint){
return getData(`${apiUri}/TimeTrack/${steamId}/Total`) as unknown as Promise<bigint>;
}
export function GetTotalPerGame(apiUri: string, steamId: bigint){
return getData(`${apiUri}/TimeTrack/${steamId}/Total/PerGame`) as Promise<Map<bigint, bigint>>;
}

89
src/api/fetchApi.tsx Normal file
View File

@ -0,0 +1,89 @@
import {createContext} from "react";
export const ApiUriContext = createContext<string>("");
export function getData(uri: string) : Promise<object | undefined> {
return makeRequestWrapper("GET", uri, null);
}
export function postData(uri: string, content?: object | string | number | boolean | null) : Promise<object | undefined> {
return makeRequestWrapper("POST", uri, content);
}
export function deleteData(uri: string) : Promise<void> {
return makeRequestWrapper("DELETE", uri, null) as Promise<void>;
}
export function patchData(uri: string, content: object | string | number | boolean) : Promise<object | undefined> {
return makeRequestWrapper("patch", uri, content);
}
export function putData(uri: string, content?: object | string | number | boolean | null) : Promise<object | undefined> {
return makeRequestWrapper("PUT", uri, content);
}
function makeRequestWrapper(method: string, uri: string, content?: object | string | number | null | boolean) : Promise<object | undefined>{
return makeRequest(method, uri, content)
.then((result) => result as Promise<object>)
.catch((e) => {
console.warn(e);
return Promise.resolve(undefined);
});
}
let currentlyRequestedEndpoints: string[] = [];
function makeRequest(method: string, uri: string, content?: object | string | number | null | boolean) : Promise<object | void> {
const id = method + uri;
if(currentlyRequestedEndpoints.find(x => x == id) != undefined)
return Promise.reject(`Already requested: ${method} ${uri}`);
currentlyRequestedEndpoints.push(id);
return fetch(uri,
{
method: method,
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: content ? JSON.stringify(content) : null
})
.then(function(response){
if(!response.ok){
if(response.status === 503){
currentlyRequestedEndpoints.splice(currentlyRequestedEndpoints.indexOf(id), 1)
let retryHeaderVal = response.headers.get("Retry-After");
let seconds = 10;
if(retryHeaderVal === null){
return response.text().then(text => {
seconds = parseInt(text);
return new Promise(resolve => setTimeout(resolve, seconds * 1000))
.then(() => {
return makeRequest(method, uri, content);
});
});
}else {
seconds = parseInt(retryHeaderVal);
return new Promise(resolve => setTimeout(resolve, seconds * 1000))
.then(() => {
return makeRequest(method, uri, content);
});
}
}else
throw new Error(response.statusText);
}
let json = response.json();
return json.then((json) => json).catch(() => null);
})
.catch(function(err : Error){
console.error(`Error ${method}ing Data ${uri}\n${err}`);
return Promise.reject();
}).finally(() => currentlyRequestedEndpoints.splice(currentlyRequestedEndpoints.indexOf(id), 1));
}
export function isValidUri(uri: string) : boolean{
try {
new URL(uri);
return true;
} catch (err) {
return false;
}
}

4
src/api/types/IGame.ts Normal file
View File

@ -0,0 +1,4 @@
export default interface IGame {
appId: bigint,
name: string
}

7
src/api/types/IPlayer.ts Normal file
View File

@ -0,0 +1,7 @@
export default interface IPlayer {
steamId: bigint,
name: string,
profileUrl: string,
avatarUrl: string,
updatedAt: Date
}

View File

@ -0,0 +1,4 @@
export default interface ITrackedTime {
timeStamp: Date,
timePlayed: bigint
}