diff --git a/src/main/events/library/remove-game-from-library.ts b/src/main/events/library/remove-game-from-library.ts index 9139696b..dbb73ffc 100644 --- a/src/main/events/library/remove-game-from-library.ts +++ b/src/main/events/library/remove-game-from-library.ts @@ -19,8 +19,8 @@ const removeGameFromLibrary = async ( const removeRemoveGameFromLibrary = async (gameId: number) => { const game = await gameRepository.findOne({ where: { id: gameId } }); - if (game?.remoteId && HydraApi.isLoggedIn()) { - HydraApi.delete(`/games/${game.remoteId}`); + if (game?.remoteId) { + HydraApi.delete(`/games/${game.remoteId}`).catch(); } }; diff --git a/src/main/events/misc/is-user-logged-in.ts b/src/main/events/misc/is-user-logged-in.ts deleted file mode 100644 index f5f79e15..00000000 --- a/src/main/events/misc/is-user-logged-in.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { registerEvent } from "../register-event"; -import { HydraApi } from "@main/services"; - -const isUserLoggedIn = async (_event: Electron.IpcMainInvokeEvent) => { - return HydraApi.isLoggedIn(); -}; - -registerEvent("isUserLoggedIn", isUserLoggedIn); diff --git a/src/main/events/profile/get-me.ts b/src/main/events/profile/get-me.ts index e8aa72d8..e625ff1e 100644 --- a/src/main/events/profile/get-me.ts +++ b/src/main/events/profile/get-me.ts @@ -1,15 +1,12 @@ import { registerEvent } from "../register-event"; import * as Sentry from "@sentry/electron/main"; import { HydraApi } from "@main/services"; -import { UserProfile } from "@types"; +import { UserNotLoggedInError, UserProfile } from "@types"; import { userAuthRepository } from "@main/repository"; -import { logger } from "@main/services"; const getMe = async ( _event: Electron.IpcMainInvokeEvent ): Promise => { - if (!HydraApi.isLoggedIn()) return null; - return HydraApi.get(`/profile/me`) .then((response) => { const me = response.data; @@ -29,7 +26,10 @@ const getMe = async ( return me; }) .catch((err) => { - logger.error("getMe", err.message); + if (err instanceof UserNotLoggedInError) { + return null; + } + return userAuthRepository.findOne({ where: { id: 1 } }); }); }; diff --git a/src/main/events/profile/update-profile.ts b/src/main/events/profile/update-profile.ts index fbed0606..fe79d345 100644 --- a/src/main/events/profile/update-profile.ts +++ b/src/main/events/profile/update-profile.ts @@ -26,9 +26,11 @@ const updateProfile = async ( _event: Electron.IpcMainInvokeEvent, displayName: string, newProfileImagePath: string | null -): Promise => { +) => { if (!newProfileImagePath) { - return (await patchUserProfile(displayName)).data; + return patchUserProfile(displayName).then( + (response) => response.data as UserProfile + ); } const stats = fs.statSync(newProfileImagePath); @@ -51,11 +53,11 @@ const updateProfile = async ( }); return profileImageUrl; }) - .catch(() => { - return undefined; - }); + .catch(() => undefined); - return (await patchUserProfile(displayName, profileImageUrl)).data; + return patchUserProfile(displayName, profileImageUrl).then( + (response) => response.data as UserProfile + ); }; registerEvent("updateProfile", updateProfile); diff --git a/src/main/events/user/get-user.ts b/src/main/events/user/get-user.ts index 5b4dfae5..596df084 100644 --- a/src/main/events/user/get-user.ts +++ b/src/main/events/user/get-user.ts @@ -9,8 +9,6 @@ const getUser = async ( _event: Electron.IpcMainInvokeEvent, userId: string ): Promise => { - if (!HydraApi.isLoggedIn()) return null; - try { const response = await HydraApi.get(`/user/${userId}`); const profile = response.data; diff --git a/src/main/main.ts b/src/main/main.ts index 1abd8c2f..4bda8ad8 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -22,8 +22,8 @@ const loadState = async (userPreferences: UserPreferences | null) => { if (userPreferences?.realDebridApiToken) RealDebridClient.authorize(userPreferences?.realDebridApiToken); - HydraApi.setupApi().then(async () => { - if (HydraApi.isLoggedIn()) uploadGamesBatch(); + HydraApi.setupApi().then(() => { + uploadGamesBatch(); }); const [nextQueueItem] = await downloadQueueRepository.find({ diff --git a/src/main/services/hydra-api.ts b/src/main/services/hydra-api.ts index 505ea209..5aa6635d 100644 --- a/src/main/services/hydra-api.ts +++ b/src/main/services/hydra-api.ts @@ -5,6 +5,7 @@ import url from "url"; import { uploadGamesBatch } from "./library-sync"; import { clearGamesRemoteIds } from "./library-sync/clear-games-remote-id"; import { logger } from "./logger"; +import { UserNotLoggedInError } from "@types"; export class HydraApi { private static instance: AxiosInstance; @@ -19,7 +20,7 @@ export class HydraApi { expirationTimestamp: 0, }; - static isLoggedIn() { + private static isLoggedIn() { return this.userAuth.authToken !== ""; } @@ -127,10 +128,6 @@ export class HydraApi { } private static async revalidateAccessTokenIfExpired() { - if (!this.isLoggedIn()) { - throw new Error("user is not logged in"); - } - const now = new Date(); if (this.userAuth.expirationTimestamp < now.getTime()) { @@ -188,6 +185,8 @@ export class HydraApi { }; static async get(url: string) { + if (!this.isLoggedIn()) throw new UserNotLoggedInError(); + await this.revalidateAccessTokenIfExpired(); return this.instance .get(url, this.getAxiosConfig()) @@ -195,6 +194,8 @@ export class HydraApi { } static async post(url: string, data?: any) { + if (!this.isLoggedIn()) throw new UserNotLoggedInError(); + await this.revalidateAccessTokenIfExpired(); return this.instance .post(url, data, this.getAxiosConfig()) @@ -202,6 +203,8 @@ export class HydraApi { } static async put(url: string, data?: any) { + if (!this.isLoggedIn()) throw new UserNotLoggedInError(); + await this.revalidateAccessTokenIfExpired(); return this.instance .put(url, data, this.getAxiosConfig()) @@ -209,6 +212,8 @@ export class HydraApi { } static async patch(url: string, data?: any) { + if (!this.isLoggedIn()) throw new UserNotLoggedInError(); + await this.revalidateAccessTokenIfExpired(); return this.instance .patch(url, data, this.getAxiosConfig()) @@ -216,6 +221,8 @@ export class HydraApi { } static async delete(url: string) { + if (!this.isLoggedIn()) throw new UserNotLoggedInError(); + await this.revalidateAccessTokenIfExpired(); return this.instance .delete(url, this.getAxiosConfig()) diff --git a/src/main/services/library-sync/create-game.ts b/src/main/services/library-sync/create-game.ts index 8f935bef..183b58a7 100644 --- a/src/main/services/library-sync/create-game.ts +++ b/src/main/services/library-sync/create-game.ts @@ -3,23 +3,23 @@ import { HydraApi } from "../hydra-api"; import { gameRepository } from "@main/repository"; export const createGame = async (game: Game) => { - if (!HydraApi.isLoggedIn()) return; - HydraApi.post(`/games`, { objectId: game.objectID, playTimeInMilliseconds: Math.trunc(game.playTimeInMilliseconds), shop: game.shop, lastTimePlayed: game.lastTimePlayed, - }).then((response) => { - const { - id: remoteId, - playTimeInMilliseconds, - lastTimePlayed, - } = response.data; + }) + .then((response) => { + const { + id: remoteId, + playTimeInMilliseconds, + lastTimePlayed, + } = response.data; - gameRepository.update( - { objectID: game.objectID }, - { remoteId, playTimeInMilliseconds, lastTimePlayed } - ); - }); + gameRepository.update( + { objectID: game.objectID }, + { remoteId, playTimeInMilliseconds, lastTimePlayed } + ); + }) + .catch(); }; diff --git a/src/main/services/library-sync/merge-with-remote-games.ts b/src/main/services/library-sync/merge-with-remote-games.ts index 3a2db640..a0482c6c 100644 --- a/src/main/services/library-sync/merge-with-remote-games.ts +++ b/src/main/services/library-sync/merge-with-remote-games.ts @@ -2,8 +2,6 @@ import { gameRepository } from "@main/repository"; import { HydraApi } from "../hydra-api"; import { steamGamesWorker } from "@main/workers"; import { getSteamAppAsset } from "@main/helpers"; -import { logger } from "../logger"; -import { AxiosError } from "axios"; export const mergeWithRemoteGames = async () => { try { @@ -62,11 +60,5 @@ export const mergeWithRemoteGames = async () => { } } } - } catch (err) { - if (err instanceof AxiosError) { - logger.error("getRemoteGames", err.message); - } else { - logger.error("getRemoteGames", err); - } - } + } catch (err) {} }; diff --git a/src/main/services/library-sync/update-game-playtime.ts b/src/main/services/library-sync/update-game-playtime.ts index 3a7cca22..70d88d50 100644 --- a/src/main/services/library-sync/update-game-playtime.ts +++ b/src/main/services/library-sync/update-game-playtime.ts @@ -6,10 +6,8 @@ export const updateGamePlaytime = async ( deltaInMillis: number, lastTimePlayed: Date ) => { - if (!HydraApi.isLoggedIn()) return; - HydraApi.put(`/games/${game.remoteId}`, { playTimeDeltaInSeconds: Math.trunc(deltaInMillis / 1000), lastTimePlayed, - }); + }).catch(); }; diff --git a/src/main/services/library-sync/upload-games-batch.ts b/src/main/services/library-sync/upload-games-batch.ts index 63eee82a..2f9f33ed 100644 --- a/src/main/services/library-sync/upload-games-batch.ts +++ b/src/main/services/library-sync/upload-games-batch.ts @@ -2,9 +2,6 @@ import { gameRepository } from "@main/repository"; import { chunk } from "lodash-es"; import { IsNull } from "typeorm"; import { HydraApi } from "../hydra-api"; -import { logger } from "../logger"; -import { AxiosError } from "axios"; - import { mergeWithRemoteGames } from "./merge-with-remote-games"; import { WindowManager } from "../window-manager"; @@ -27,18 +24,12 @@ export const uploadGamesBatch = async () => { lastTimePlayed: game.lastTimePlayed, }; }) - ); + ).catch(); } await mergeWithRemoteGames(); if (WindowManager.mainWindow) WindowManager.mainWindow.webContents.send("on-library-batch-complete"); - } catch (err) { - if (err instanceof AxiosError) { - logger.error("uploadGamesBatch", err.response, err.message); - } else { - logger.error("uploadGamesBatch", err); - } - } + } catch (err) {} }; diff --git a/src/preload/index.ts b/src/preload/index.ts index ecabe9e8..0cadbc03 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -112,7 +112,6 @@ contextBridge.exposeInMainWorld("electron", { getDefaultDownloadsPath: () => ipcRenderer.invoke("getDefaultDownloadsPath"), isPortableVersion: () => ipcRenderer.invoke("isPortableVersion"), openExternal: (src: string) => ipcRenderer.invoke("openExternal", src), - isUserLoggedIn: () => ipcRenderer.invoke("isUserLoggedIn"), showOpenDialog: (options: Electron.OpenDialogOptions) => ipcRenderer.invoke("showOpenDialog", options), platform: process.platform, diff --git a/src/renderer/src/app.tsx b/src/renderer/src/app.tsx index 27fa2646..afce9622 100644 --- a/src/renderer/src/app.tsx +++ b/src/renderer/src/app.tsx @@ -93,14 +93,8 @@ export function App() { dispatch(setProfileBackground(profileBackground)); } - window.electron.isUserLoggedIn().then((isLoggedIn) => { - if (isLoggedIn) { - fetchUserDetails().then((response) => { - if (response) updateUserDetails(response); - }); - } else { - clearUserDetails(); - } + fetchUserDetails().then((response) => { + if (response) updateUserDetails(response); }); }, [fetchUserDetails, updateUserDetails, dispatch]); diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index ae89bb8b..48fa7aae 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -100,7 +100,6 @@ declare global { /* Misc */ openExternal: (src: string) => Promise; - isUserLoggedIn: () => Promise; getVersion: () => Promise; ping: () => string; getDefaultDownloadsPath: () => Promise; diff --git a/src/types/index.ts b/src/types/index.ts index 71071620..9027af1e 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -290,3 +290,10 @@ export interface DownloadSource { createdAt: Date; updatedAt: Date; } + +export class UserNotLoggedInError extends Error { + constructor() { + super("user not logged in"); + this.name = "UserNotLoggedInError"; + } +}