From 81f2e509c5371fd5a56f7d2066ab8861d355f8d3 Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:09:24 -0300 Subject: [PATCH] feat: create HydraApi --- .env.example | 3 +- src/main/entity/user-preferences.entity.ts | 6 ++ src/main/main.ts | 3 + src/main/services/hydra-api.ts | 88 ++++++++++++++++++++++ src/main/vite-env.d.ts | 3 +- 5 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/main/services/hydra-api.ts diff --git a/.env.example b/.env.example index 636467e5..f55344d1 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,3 @@ MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY -MAIN_VITE_ONLINEFIX_USERNAME=YOUR_USERNAME -MAIN_VITE_ONLINEFIX_PASSWORD=YOUR_PASSWORD +MAIN_VITE_API_URL=API_URL diff --git a/src/main/entity/user-preferences.entity.ts b/src/main/entity/user-preferences.entity.ts index 92db958d..d25dfee1 100644 --- a/src/main/entity/user-preferences.entity.ts +++ b/src/main/entity/user-preferences.entity.ts @@ -37,4 +37,10 @@ export class UserPreferences { @UpdateDateColumn() updatedAt: Date; + + @Column("text", { default: "" }) + accessToken: string; + + @Column("text", { default: "" }) + refreshToken: string; } diff --git a/src/main/main.ts b/src/main/main.ts index d5998b5a..807e48b6 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -9,6 +9,7 @@ import { RealDebridClient } from "./services/real-debrid"; import { fetchDownloadSourcesAndUpdate } from "./helpers"; import { publishNewRepacksNotifications } from "./services/notifications"; import { MoreThan } from "typeorm"; +import { HydraApi } from "./services/hydra-api"; startMainLoop(); @@ -20,6 +21,8 @@ const loadState = async (userPreferences: UserPreferences | null) => { if (userPreferences?.realDebridApiToken) RealDebridClient.authorize(userPreferences?.realDebridApiToken); + HydraApi.createInstance(); + const [nextQueueItem] = await downloadQueueRepository.find({ order: { id: "DESC", diff --git a/src/main/services/hydra-api.ts b/src/main/services/hydra-api.ts new file mode 100644 index 00000000..e65d70d2 --- /dev/null +++ b/src/main/services/hydra-api.ts @@ -0,0 +1,88 @@ +import { userPreferencesRepository } from "@main/repository"; +import axios, { AxiosInstance } from "axios"; + +export class HydraApi { + private static instance: AxiosInstance; + + static authToken = ""; + static refreshToken = ""; + + static async createInstance() { + this.instance = axios.create({ + baseURL: import.meta.env.MAIN_VITE_API_URL, + }); + + const userPreferences = await userPreferencesRepository.findOne({ + where: { id: 1 }, + }); + + this.authToken = userPreferences?.accessToken ?? ""; + this.refreshToken = userPreferences?.refreshToken ?? ""; + + this.instance.interceptors.request.use( + (config) => { + config.headers.Authorization = `Bearer ${this.authToken}`; + return config; + }, + (error) => { + return Promise.reject(error); + } + ); + + this.instance.interceptors.response.use( + (response) => response, + async (error) => { + const originalRequest = error.config; + if (error.response.status === 401 && !originalRequest._retry) { + originalRequest._retry = true; + const refreshToken = this.refreshToken; + if (refreshToken) { + try { + const response = await axios.post( + `${import.meta.env.MAIN_VITE_API_URL}/auth/refresh`, + { refreshToken } + ); + const newAccessToken = response.data.accessToken; + this.authToken = newAccessToken; + + userPreferencesRepository.upsert( + { + id: 1, + accessToken: newAccessToken, + }, + ["id"] + ); + + originalRequest.headers.Authorization = `Bearer ${newAccessToken}`; + return axios(originalRequest); //recall Api with new token + } catch (error) { + this.authToken = ""; + this.refreshToken = ""; + return error; + } + } + + return error; + } + + return error; + } + ); + } + + static async get(url: string) { + return this.instance.get(url); + } + + static async post(url: string, data?: any) { + return this.instance.post(url, data); + } + + static async put(url, data?: any) { + return this.instance.put(url, data); + } + + static async patch(url, data?: any) { + return this.instance.patch(url, data); + } +} diff --git a/src/main/vite-env.d.ts b/src/main/vite-env.d.ts index 7542ff52..4dbec1d2 100644 --- a/src/main/vite-env.d.ts +++ b/src/main/vite-env.d.ts @@ -2,8 +2,7 @@ interface ImportMetaEnv { readonly MAIN_VITE_STEAMGRIDDB_API_KEY: string; - readonly MAIN_VITE_ONLINEFIX_USERNAME: string; - readonly MAIN_VITE_ONLINEFIX_PASSWORD: string; + readonly MAIN_VITE_API_URL: string; } interface ImportMeta {