From df5f82d47f032c1d459b0cd7c63c567a3309dd41 Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:01:43 -0300 Subject: [PATCH] feat: getMe on launch --- src/main/events/profile/get-me.ts | 101 ++++++------------ src/main/main.ts | 4 +- .../achievements/merge-achievements.ts | 10 +- src/main/services/hydra-api.ts | 3 +- src/main/services/user/get-user-data.ts | 43 ++++++++ 5 files changed, 89 insertions(+), 72 deletions(-) create mode 100644 src/main/services/user/get-user-data.ts diff --git a/src/main/events/profile/get-me.ts b/src/main/events/profile/get-me.ts index 474effbb..8ab78bf9 100644 --- a/src/main/events/profile/get-me.ts +++ b/src/main/events/profile/get-me.ts @@ -1,80 +1,43 @@ import { registerEvent } from "../register-event"; -import * as Sentry from "@sentry/electron/main"; -import { HydraApi, logger } from "@main/services"; +import { logger } from "@main/services"; import type { ProfileVisibility, UserDetails } from "@types"; -import { - userAuthRepository, - userSubscriptionRepository, -} from "@main/repository"; +import { userAuthRepository } from "@main/repository"; import { UserNotLoggedInError } from "@shared"; +import { getUserData } from "@main/services/user/get-user-data"; const getMe = async ( _event: Electron.IpcMainInvokeEvent ): Promise => { - return HydraApi.get(`/profile/me`) - .then((me) => { - userAuthRepository.upsert( - { - id: 1, - displayName: me.displayName, - profileImageUrl: me.profileImageUrl, - backgroundImageUrl: me.backgroundImageUrl, - userId: me.id, - }, - ["id"] - ); - - if (me.subscription) { - userSubscriptionRepository.upsert( - { - id: 1, - subscriptionId: me.subscription?.id || "", - status: me.subscription?.status || "", - planId: me.subscription?.plan.id || "", - planName: me.subscription?.plan.name || "", - expiresAt: me.subscription?.expiresAt || null, - user: { id: 1 }, - }, - ["id"] - ); - } else { - userSubscriptionRepository.delete({ id: 1 }); - } - - Sentry.setUser({ id: me.id, username: me.username }); - - return me; - }) - .catch(async (err) => { - if (err instanceof UserNotLoggedInError) { - return null; - } - logger.error("Failed to get logged user", err); - const loggedUser = await userAuthRepository.findOne({ where: { id: 1 } }); - - if (loggedUser) { - return { - ...loggedUser, - id: loggedUser.userId, - username: "", - bio: "", - profileVisibility: "PUBLIC" as ProfileVisibility, - subscription: loggedUser.subscription - ? { - id: loggedUser.subscription.subscriptionId, - status: loggedUser.subscription.status, - plan: { - id: loggedUser.subscription.planId, - name: loggedUser.subscription.planName, - }, - expiresAt: loggedUser.subscription.expiresAt, - } - : null, - }; - } - + return getUserData().catch(async (err) => { + if (err instanceof UserNotLoggedInError) { return null; - }); + } + logger.error("Failed to get logged user", err); + const loggedUser = await userAuthRepository.findOne({ where: { id: 1 } }); + + if (loggedUser) { + return { + ...loggedUser, + id: loggedUser.userId, + username: "", + bio: "", + profileVisibility: "PUBLIC" as ProfileVisibility, + subscription: loggedUser.subscription + ? { + id: loggedUser.subscription.subscriptionId, + status: loggedUser.subscription.status, + plan: { + id: loggedUser.subscription.planId, + name: loggedUser.subscription.planName, + }, + expiresAt: loggedUser.subscription.expiresAt, + } + : null, + }; + } + + return null; + }); }; registerEvent("getMe", getMe); diff --git a/src/main/main.ts b/src/main/main.ts index 69bc62e0..6794c204 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -12,6 +12,7 @@ import { UserPreferences } from "./entity"; import { RealDebridClient } from "./services/real-debrid"; import { HydraApi } from "./services/hydra-api"; import { uploadGamesBatch } from "./services/library-sync"; +import { getUserData } from "./services/user/get-user-data"; const loadState = async (userPreferences: UserPreferences | null) => { import("./events"); @@ -22,7 +23,8 @@ const loadState = async (userPreferences: UserPreferences | null) => { Ludusavi.addManifestToLudusaviConfig(); - HydraApi.setupApi().then(() => { + HydraApi.setupApi().then(async () => { + await getUserData().catch(() => {}); uploadGamesBatch(); }); diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index 05899e23..277b265e 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -7,6 +7,7 @@ import { WindowManager } from "../window-manager"; import { HydraApi } from "../hydra-api"; import { getUnlockedAchievements } from "@main/events/user/get-unlocked-achievements"; import { Game } from "@main/entity"; +import { achievementsLogger } from "../logger"; const saveAchievementsOnLocal = async ( objectId: string, @@ -117,6 +118,12 @@ export const mergeAchievements = async ( const mergedLocalAchievements = unlockedAchievements.concat(newAchievements); if (game.remoteId) { + achievementsLogger.log( + "Syncing achievements with cloud", + game.title, + game.objectID, + game.remoteId + ); await HydraApi.put( "/profile/games/achievements", { @@ -133,7 +140,8 @@ export const mergeAchievements = async ( publishNotification ); }) - .catch(() => { + .catch((err) => { + achievementsLogger.error(err); return saveAchievementsOnLocal( game.objectID, game.shop, diff --git a/src/main/services/hydra-api.ts b/src/main/services/hydra-api.ts index bea6d0a6..1b1c3663 100644 --- a/src/main/services/hydra-api.ts +++ b/src/main/services/hydra-api.ts @@ -44,7 +44,8 @@ export class HydraApi { return userSubscriptionRepository .findOne({ where: { id: 1 } }) .then((userSubscription) => { - if (userSubscription?.status !== "active") return false; + if (!userSubscription) return false; + return ( !userSubscription.expiresAt || userSubscription!.expiresAt > new Date() diff --git a/src/main/services/user/get-user-data.ts b/src/main/services/user/get-user-data.ts new file mode 100644 index 00000000..5035b296 --- /dev/null +++ b/src/main/services/user/get-user-data.ts @@ -0,0 +1,43 @@ +import type { UserDetails } from "@types"; +import { HydraApi } from "../hydra-api"; +import { + userAuthRepository, + userSubscriptionRepository, +} from "@main/repository"; +import * as Sentry from "@sentry/electron/main"; + +export const getUserData = () => { + return HydraApi.get(`/profile/me`).then(async (me) => { + userAuthRepository.upsert( + { + id: 1, + displayName: me.displayName, + profileImageUrl: me.profileImageUrl, + backgroundImageUrl: me.backgroundImageUrl, + userId: me.id, + }, + ["id"] + ); + + if (me.subscription) { + await userSubscriptionRepository.upsert( + { + id: 1, + subscriptionId: me.subscription?.id || "", + status: me.subscription?.status || "", + planId: me.subscription?.plan.id || "", + planName: me.subscription?.plan.name || "", + expiresAt: me.subscription?.expiresAt || null, + user: { id: 1 }, + }, + ["id"] + ); + } else { + await userSubscriptionRepository.delete({ id: 1 }); + } + + Sentry.setUser({ id: me.id, username: me.username }); + + return me; + }); +};