UNPKG

@aciiverse/fetcii

Version:

Simple fetch module primary designed for the aciifx backend

355 lines (232 loc) 10.3 kB
# fetcii > Einfaches Fetch-Modul primär für das aciiFX-Backend designed > [Here](/README.md) is the doc also in english. ## Entwickler\*Innen - [Flowtastisch](https://flowtastisch.com) ## Credits ### fetcii - [javascript](https://www.javascript.com/) - [typescript](https://github.com/Microsoft/TypeScript) ### fetcii (dev) - [concurrently](https://github.com/open-cli-tools/concurrently) - [express](https://github.com/expressjs/express) ## Features - einfaches fetch Modul 🎲 - inspiriert von odata v2 👀 - Unterstützung der vier Haupt CRUD Methoden 📓 - eingebautes error handling -> immer eine message 💬 - unterstützt automatisiert filter, top, skip, select query parameter ✨ - designed für aciiFX, aber auch anders nutzbar 🥑 ## Entwickeln mit fetcii ### Was du brauchst - NodeJS - TypeScript `npm install -g typescript` ### Installation 1. Installiere das fetcii Paket (Bsp.: yarn **oder** npm) yarn add @aciiverse/fetcii npm i @aciiverse/fetcii 2. Jetzt kannst du fetcii einfach importieren zB.: import { fetcii } from "@aciiverse/fetcii"; Damit siehst du alle Funktionen und Module innerhalb von fetcii. Module kannst du aber ebenfalls direkt importieren zB.: `import { users } from "@aciiverse/fetcii";` ## Entwickeln > Hier sind ein paar Beispiele, wie man die Funktionen benutzen kann: ### getcii #### Hole dir alle Spiele import { fetcii } from "@aciiverse/fetcii"; const url = 'http://localhost:3000/api/games'; // api url const result = await fetcii.getcii(url); // fetching (async await) if (result.err) { // -> error occured while fetching (frontend or backend) console.error(result.err?.message); // log error } else { // -> Success const games: Game[] = result.data?.data; // set data & assign own type (for typescript) // do what ever you want... console.log(result.data?.message); // log success message } > Wenn nur Spiel 6 - 20 ausgegeben werden soll, kannst du `top` & `skip` nutzen: const result = await fetcii.getcii(url, { top: 15, // get 15 games max skip: 5 // skip the first 5 games }); - Die Queryparameter kommen als `$top` und `$skip` an > Wenn alle Spiele absteigend nach dem `release` sortiert werden sollen: const orderBy: OrderByType = { property: 'release', ascending: false }; const result = await fetcii.getcii(url, { orderBy: orderBy }); - Der Queryparameter kommt als `$orderBy` an > Wenn alle Spiele aufsteigend nach dem `title` -> aufsteigend nach der `id` sortiert werden sollen: const orderBy: OrderByType = [ { property: 'title', ascending: true }, { property: 'id', ascending: true } ]; const result = await fetcii.getcii(url, { orderBy: orderBy }); - Der Queryparameter kommt als `$orderBy` an > Wenn nur der `title` und die `id` selektiert werden soll, kannst du `select` nutzen: const result = await fetcii.getcii(url, { select: ['title', 'id'] // select only the 'title' and 'id' }); - Der Queryparameter kommt als `$select` an > Wenn gefiltert werden soll, kann der neue Filtertyp mit dem Property `filter` verwendet werden: - Alle Spiele mit der id 1: const filters = new FilterCollection(); filters.add("id", [ { operator: CompareOperator.Equal, value: 1 }, ]); - Alle Spiele namens 'Minecraft' **oder** 'Portal 2': const filters = new FilterCollection(); filters.add( "title", [ { operator: CompareOperator.Equal, value: "Minecraft" }, { operator: CompareOperator.Equal, value: "Portal 2" }, ], false ); - Alle Spiele namens 'Minecraft' **oder** (Logik in aciiFX) zwischen 2020 **und** 2028 erschienen const filters = new FilterCollection(); filters.add("title", [ { operator: CompareOperator.Equal, value: "Minecraft" }, ]); filters.add( "release", [ { operator: CompareOperator.GreaterEqual, value: 2020 }, { operator: CompareOperator.LessEqual, value: 2028 }, ], false ); - Filter zuweisen: const result = await fetcii.getcii(url, { filters: filters.getAllFilters(), // set filters }); - Der Queryparameter kommt als `$filters` an #### Hole dir ein einzelnes Spiel import { fetcii } from "@aciiverse/fetcii"; const url = 'http://localhost:3000/api/games/:id'; // api url const result = await fetcii.getcii(url); // fetching (async await) if (result.err) { // -> error occured while fetching (frontend or backend) console.error(result.err?.message); // log error } else { // -> success const game: Game = result.data?.data; // set data & assign own type (for typescript) // do what ever you want... console.log(result.data?.message); // log success message } ### createcii #### Erstelle ein Spiel import { fetcii } from "@aciiverse/fetcii"; const url = 'http://localhost:3000/api/games', // api url data: Omit<Game, 'id'> = { // 'Omit' bewirkt, dass der type 'Game' ohne das property 'id' benutzt wird (typescript) title: 'Minecraft', language: 'Java', release: 2011 }; const result = await fetcii.createcii(url, data); // fetching (async await) if (result.err) { // -> error occured while fetching (frontend or backend) console.error(result.err?.message); // log error } else { // -> success const game: Game = result.data?.data; // set data & assign own type (for typescript) // do what ever you want... console.log(result.data?.message); // log success message } ### updatecii #### Bearbeite ein Spiel import { fetcii } from "@aciiverse/fetcii"; const url = 'http://localhost:3000/api/games/:id', // api url data: Game = { title: 'Portal 2', language: 'C++', release: 2011 }; const result = await fetcii.updatecii(url, data); // fetching (async await) if (result.err) { // -> error occured while fetching (frontend or backend) console.error(result.err?.message); // log error } else { // -> success const game: Game = result.data?.data; // set data & assign own type (for typescript) // do what ever you want... console.log(result.data?.message); // log success message } ### deletecii #### Lösche ein Spiel import { fetcii } from "@aciiverse/fetcii"; const url = 'http://localhost:3000/api/games/:id'; // api url const result = await removecii(url); // fetching (async await) if (result.err) { // -> error occured while fetching (frontend or backend) console.error(result.err?.message); // log error } else { // -> success // do what ever you want... console.log(result.data?.message); // log success message } ### Usermodul (best use with aciiFX) (user) #### users.saveData() - Nach einem Login kannst du den Token, Tokenverfallsdatum und die Userdaten speichern: const url = 'http://localhost:3000/api/users/login'; const result = await fetcii.createcii(url, { username: 'ezio', password: 'mySecretPassword' }); // validation if (result.err) { // -> error occured console.error(result.err?.message); // log error return; } const data = result.data; // save data users.saveData({ accessToken: data.token, userData: data.user, tokenExp: data.tokenExp }); #### users.getData() - Die Userdaten erhalten export interface UserData { uuid: string; username: string; email: string; registered: Date; lastLogin?: Date; verified: boolean; isAdmin: boolean; } const data: UserData = users.getData(); if (!data) return; // no data found #### users.getToken() - Den Access Token erhalten const token = users.getToken(); if (!token) return; // no token found - Mit dem Token kannst du getcii(), createcii(), updatecii() oder deletecii() ausführen. - `aciiFX` hat eingebaute middlewares, die den Token automatisch konsumieren const token = users.getToken(); if (!token) return; // no token found const url = 'http://localhost:3000/api/games', result = await fetcii.getcii(url, {}, token); // fetching (async await); #### users.deleteData() - Lösche die Daten, die du abgespeichert hast users.deleteData(); - Wenn du zB. initial beim Appstart prüfen willst, ob der Token abgelaufen ist, kannst du folgendes nutzen - Es kommt zurück, ob der Token abgelaufen ist - Wenn du nichts mitgibst, löscht er automatisch die Daten users.checkTokenExpired(); oder const expired = users.checkTokenExpired(); oder const expired = users.checkTokenExpired(true); oder users.checkTokenExpired(true); - Wenn die Daten nicht gelöscht werden sollen: const expired = users.checkTokenExpired(false);