From 6151faf64bac0f8440ade6a2ed9dbcfea49439d8 Mon Sep 17 00:00:00 2001 From: pa Date: Wed, 18 Mar 2026 21:26:22 +0900 Subject: [PATCH] uncommit changes related to Avatar DB log cleanup feature --- package-lock.json | 78 +++---- package.json | 4 +- src/components/AvatarInfo.vue | 2 - src/stores/auth.js | 3 +- src/stores/settings/advanced.js | 194 +++++++++--------- .../Settings/components/Tabs/AdvancedTab.vue | 49 ++--- 6 files changed, 157 insertions(+), 173 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb02de33..c22ee038 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@kamiya4047/eslint-plugin-pretty-import": "^0.1.6", "@pinia/testing": "^1.0.3", "@sentry/vite-plugin": "^4.9.1", - "@sentry/vue": "^10.43.0", + "@sentry/vue": "^10.44.0", "@sigma/edge-curve": "^3.1.0", "@sigma/node-border": "^3.0.0", "@tailwindcss/vite": "^4.2.1", @@ -42,7 +42,7 @@ "cross-env": "^10.1.0", "dayjs": "^1.11.20", "echarts": "^6.0.0", - "electron": "^39.8.2", + "electron": "^39.8.3", "electron-builder": "^26.8.1", "embla-carousel-vue": "^8.6.0", "eslint": "^9.39.4", @@ -2903,54 +2903,54 @@ "license": "MIT" }, "node_modules/@sentry-internal/browser-utils": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.43.0.tgz", - "integrity": "sha512-8zYTnzhAPvNkVH1Irs62wl0J/c+0QcJ62TonKnzpSFUUD3V5qz8YDZbjIDGfxy+1EB9fO0sxtddKCzwTHF/MbQ==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.44.0.tgz", + "integrity": "sha512-z9xz3T/v+MnfHY6kdUCmOZI8CiAl3LlKYtGH2p3rAsrxhwX+BTnUp01VhMVnEZIDgUXNt3AhJac+4kcDIPu1Hg==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "10.43.0" + "@sentry/core": "10.44.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.43.0.tgz", - "integrity": "sha512-YoXuwluP6eOcQxTeTtaWb090++MrLyWOVsUTejzUQQ6LFL13Jwt+bDPF1kvBugMq4a7OHw/UNKQfd6//rZMn2g==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.44.0.tgz", + "integrity": "sha512-yNS2EGK1bNm8YUI+Orzpa7yr05Da+b1VEe/9x7dl7gTjw/+tfutoXlG6Y+iFZBB3gQ9QU+nxZAhU+KcxiPEURw==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "10.43.0" + "@sentry/core": "10.44.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.43.0.tgz", - "integrity": "sha512-khCXlGrlH1IU7P5zCEAJFestMeH97zDVCekj8OsNNDtN/1BmCJ46k6Xi0EqAUzdJgrOLJeLdoYdgtiIjovZ8Sg==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.44.0.tgz", + "integrity": "sha512-KDmoqBsRmkaoc+eKLR2CbScd2eBmLcw+1+D441lLttAO3WWhvYyCaYdu/HIGGUoybuSgt+IcpCJdi7hFuCvYqw==", "dev": true, "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.43.0", - "@sentry/core": "10.43.0" + "@sentry-internal/browser-utils": "10.44.0", + "@sentry/core": "10.44.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.43.0.tgz", - "integrity": "sha512-ZIw1UNKOFXo1LbPCJPMAx9xv7D8TMZQusLDUgb6BsPQJj0igAuwd7KRGTkjjgnrwBp2O/sxcQFRhQhknWk7QPg==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.44.0.tgz", + "integrity": "sha512-RA7XgYZWHY7M+vaHvuMxDFT51wCs4puS2smElM5oh+j3YqbFXY7P16fOCwIAGoyI4gVsj8aTeBgVqUmrmzhAXQ==", "dev": true, "license": "MIT", "dependencies": { - "@sentry-internal/replay": "10.43.0", - "@sentry/core": "10.43.0" + "@sentry-internal/replay": "10.44.0", + "@sentry/core": "10.44.0" }, "engines": { "node": ">=18" @@ -2967,17 +2967,17 @@ } }, "node_modules/@sentry/browser": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.43.0.tgz", - "integrity": "sha512-2V3I3sXi3SMeiZpKixd9ztokSgK27cmvsD9J5oyOyjhGLTW/6QKCwHbKnluMgQMXq20nixQk5zN4wRjRUma3sg==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.44.0.tgz", + "integrity": "sha512-UpMx5forbVKieNULma3gT2SsLYqsYT4nLXa6s1io/Y8BFej9sH2dD5ExA8TrkQThQwAWFI3qKsQzYnF+EX/Bfg==", "dev": true, "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.43.0", - "@sentry-internal/feedback": "10.43.0", - "@sentry-internal/replay": "10.43.0", - "@sentry-internal/replay-canvas": "10.43.0", - "@sentry/core": "10.43.0" + "@sentry-internal/browser-utils": "10.44.0", + "@sentry-internal/feedback": "10.44.0", + "@sentry-internal/replay": "10.44.0", + "@sentry-internal/replay-canvas": "10.44.0", + "@sentry/core": "10.44.0" }, "engines": { "node": ">=18" @@ -3178,9 +3178,9 @@ } }, "node_modules/@sentry/core": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.43.0.tgz", - "integrity": "sha512-l0SszQAPiQGWl/ferw8GP3ALyHXiGiRKJaOvNmhGO+PrTQyZTZ6OYyPnGijAFRg58dE1V3RCH/zw5d2xSUIiNg==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.44.0.tgz", + "integrity": "sha512-aa7CiDaNFZvHpqd97LJhuskolfJ/4IH5xyuVVLnv7l6B0v9KTwskPUxb0tH1ej3FxuzfH+i8iTiTFuqpfHS3QA==", "dev": true, "license": "MIT", "engines": { @@ -3202,14 +3202,14 @@ } }, "node_modules/@sentry/vue": { - "version": "10.43.0", - "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-10.43.0.tgz", - "integrity": "sha512-PYBJVHfd7JwnQv92sTnsfLVNwVEKY2wQzXt9aux6QNcKh4g3pyK68PoEBrcCSEHpUb7zs3lJedk3+aeX+kN7fw==", + "version": "10.44.0", + "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-10.44.0.tgz", + "integrity": "sha512-XAjvUPhfqkEULt3kly4fSmwQ7fi9XuBWU8Hq9Fme3WN3Ti5q1lTqFBvxlpGeUDKzb2g/J9NVRq9G10m7d438Fg==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/browser": "10.43.0", - "@sentry/core": "10.43.0" + "@sentry/browser": "10.44.0", + "@sentry/core": "10.44.0" }, "engines": { "node": ">=18" @@ -6489,9 +6489,9 @@ } }, "node_modules/electron": { - "version": "39.8.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.2.tgz", - "integrity": "sha512-uwNJHeqm8pzQEZf/KX4XM1fJctZpHcA0Za/MlP9mOg0FAWHbKo6yRC33QbdfLX7PeNjYZC3I3nnVhE5L2CLqxw==", + "version": "39.8.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.3.tgz", + "integrity": "sha512-ZhetvWz2qbI2WbBHdK/utR8I5bi1pYWJdit9tP0sGzs42CpsAFyu/FirXE88NWSh+3U8X6Wuf9jjDEYvAyrxNw==", "dev": true, "hasInstallScript": true, "license": "MIT", diff --git a/package.json b/package.json index 84498142..f1ca4cda 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@kamiya4047/eslint-plugin-pretty-import": "^0.1.6", "@pinia/testing": "^1.0.3", "@sentry/vite-plugin": "^4.9.1", - "@sentry/vue": "^10.43.0", + "@sentry/vue": "^10.44.0", "@sigma/edge-curve": "^3.1.0", "@sigma/node-border": "^3.0.0", "@tailwindcss/vite": "^4.2.1", @@ -62,7 +62,7 @@ "cross-env": "^10.1.0", "dayjs": "^1.11.20", "echarts": "^6.0.0", - "electron": "^39.8.2", + "electron": "^39.8.3", "electron-builder": "^26.8.1", "embla-carousel-vue": "^8.6.0", "eslint": "^9.39.4", diff --git a/src/components/AvatarInfo.vue b/src/components/AvatarInfo.vue index 02596387..ac6c01e3 100644 --- a/src/components/AvatarInfo.vue +++ b/src/components/AvatarInfo.vue @@ -21,11 +21,9 @@ import { useI18n } from 'vue-i18n'; import { TooltipWrapper } from './ui/tooltip'; - import { useAvatarStore } from '../stores'; import { getAvatarName, showAvatarAuthorDialog } from '../coordinators/avatarCoordinator'; const { t } = useI18n(); - const avatarStore = useAvatarStore(); const props = defineProps({ imageurl: String, diff --git a/src/stores/auth.js b/src/stores/auth.js index 9c0e07b5..e8099880 100644 --- a/src/stores/auth.js +++ b/src/stores/auth.js @@ -839,8 +839,7 @@ export const useAuthStore = defineStore('Auth', () => { */ async function loginComplete() { await database.initUserTables(userStore.currentUser.id); - // [Disabled] Avatar DB log auto-cleanup on login - // advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id); + advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id); watchState.isLoggedIn = true; AppApi.CheckGameRunning(); // restore state from hot-reload } diff --git a/src/stores/settings/advanced.js b/src/stores/settings/advanced.js index 54510223..04efe8e3 100644 --- a/src/stores/settings/advanced.js +++ b/src/stores/settings/advanced.js @@ -529,103 +529,100 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => { ); } - // [Disabled] Avatar DB log cleanup - setAvatarAutoCleanup - // async function setAvatarAutoCleanup(value) { - // avatarAutoCleanup.value = value; - // await configRepository.setString('VRCX_avatarAutoCleanup', value); - // } + async function setAvatarAutoCleanup(value) { + avatarAutoCleanup.value = value; + await configRepository.setString('VRCX_avatarAutoCleanup', value); + } - // /** - // * @param {number|null} days - Number of days to keep. Null means delete all. - // */ - // [Disabled] Avatar DB log cleanup - purgeAvatarFeedData - // async function purgeAvatarFeedData(days) { - // let cutoffDate = null; - // if (days !== null) { - // const cutoff = new Date(); - // cutoff.setDate(cutoff.getDate() - days); - // cutoffDate = cutoff.toJSON(); - // } - // - // purgeInProgress.value = true; - // const msgBox = toast.warning( - // t( - // 'view.settings.advanced.advanced.database_cleanup.purge_in_progress' - // ), - // { duration: Infinity } - // ); - // - // try { - // await database.purgeAvatarFeedData(cutoffDate); - // await database.vacuum(); - // toast.dismiss(msgBox); - // toast.success( - // t( - // 'view.settings.advanced.advanced.database_cleanup.purge_complete' - // ) - // ); - // // Brief delay before restart to show success message - // await new Promise((resolve) => - // setTimeout(resolve, 1500) - // ); - // VRCXUpdaterStore.restartVRCX(false); - // } catch (err) { - // console.error(err); - // toast.dismiss(msgBox); - // toast.error(t('view.settings.advanced.advanced.database_cleanup.purge_failed', { error: err })); - // } finally { - // purgeInProgress.value = false; - // } - // } + /** + * @param {number|null} days - Number of days to keep. Null means delete all. + */ + async function purgeAvatarFeedData(days) { + let cutoffDate = null; + if (days !== null) { + const cutoff = new Date(); + cutoff.setDate(cutoff.getDate() - days); + cutoffDate = cutoff.toJSON(); + } + + purgeInProgress.value = true; + const msgBox = toast.warning( + t( + 'view.settings.advanced.advanced.database_cleanup.purge_in_progress' + ), + { duration: Infinity } + ); + + try { + await database.purgeAvatarFeedData(cutoffDate); + await database.vacuum(); + toast.dismiss(msgBox); + toast.success( + t( + 'view.settings.advanced.advanced.database_cleanup.purge_complete' + ) + ); + // Brief delay before restart to show success message + await new Promise((resolve) => + setTimeout(resolve, 1500) + ); + VRCXUpdaterStore.restartVRCX(false); + } catch (err) { + console.error(err); + toast.dismiss(msgBox); + toast.error(t('view.settings.advanced.advanced.database_cleanup.purge_failed', { error: err })); + } finally { + purgeInProgress.value = false; + } + } - // /** - // * Run auto-cleanup on startup if configured and enough time has passed. - // * Reads config directly from configRepository to avoid race condition - // * with initAdvancedSettings not having completed yet. - // * @param {string} userId - Current user ID for per-user cleanup tracking. - // */ - // [Disabled] Avatar DB log cleanup - runAvatarAutoCleanup - // async function runAvatarAutoCleanup(userId) { - // const cleanupSetting = await configRepository.getString( - // 'VRCX_avatarAutoCleanup', - // 'Off' - // ); - // if (cleanupSetting === 'Off') return; - // - // const configKey = `VRCX_lastAvatarCleanupDate_${userId}`; - // const lastCleanupStr = await configRepository.getString( - // configKey, - // '' - // ); - // const now = new Date(); - // - // if (lastCleanupStr) { - // const lastCleanup = new Date(lastCleanupStr); - // const daysSinceLastCleanup = - // (now - lastCleanup) / (1000 * 60 * 60 * 24); - // if (daysSinceLastCleanup < 7) return; - // } - // - // const days = parseInt(cleanupSetting, 10); - // if (isNaN(days) || days <= 0) return; - // - // const cutoff = new Date(); - // cutoff.setDate(cutoff.getDate() - days); - // const cutoffDate = cutoff.toJSON(); - // - // try { - // await database.purgeAvatarFeedData(cutoffDate); - // await configRepository.setString( - // configKey, - // now.toJSON() - // ); - // console.log( - // `Auto-cleaned avatar feed data older than ${days} days` - // ); - // } catch (err) { - // console.error('Avatar auto-cleanup failed:', err); - // } - // } + /** + * Run auto-cleanup on startup if configured and enough time has passed. + * Reads config directly from configRepository to avoid race condition + * with initAdvancedSettings not having completed yet. + * @param {string} userId - Current user ID for per-user cleanup tracking. + */ + async function runAvatarAutoCleanup(userId) { + const cleanupSetting = await configRepository.getString( + 'VRCX_avatarAutoCleanup', + 'Off' + ); + if (cleanupSetting === 'Off') return; + + const configKey = `VRCX_lastAvatarCleanupDate_${userId}`; + const lastCleanupStr = await configRepository.getString( + configKey, + '' + ); + const now = new Date(); + + if (lastCleanupStr) { + const lastCleanup = new Date(lastCleanupStr); + const daysSinceLastCleanup = + (now - lastCleanup) / (1000 * 60 * 60 * 24); + if (daysSinceLastCleanup < 7) return; + } + + const days = parseInt(cleanupSetting, 10); + if (isNaN(days) || days <= 0) return; + + const cutoff = new Date(); + cutoff.setDate(cutoff.getDate() - days); + const cutoffDate = cutoff.toJSON(); + + try { + await database.purgeAvatarFeedData(cutoffDate); + await configRepository.setString( + configKey, + now.toJSON() + ); + console.log( + `Auto-cleaned avatar feed data older than ${days} days` + ); + } catch (err) { + console.error('Avatar auto-cleanup failed:', err); + } + } async function setSaveInstanceEmoji() { saveInstanceEmoji.value = !saveInstanceEmoji.value; @@ -1174,10 +1171,9 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => { setProgressPieFilter, setShowConfirmationOnSwitchAvatar, setGameLogDisabled, - // [Disabled] Avatar DB log cleanup exports - // setAvatarAutoCleanup, - // purgeAvatarFeedData, - // runAvatarAutoCleanup, + setAvatarAutoCleanup, + purgeAvatarFeedData, + runAvatarAutoCleanup, setUGCFolderPath, cropPrintsChanged, setAutoDeleteOldPrints, diff --git a/src/views/Settings/components/Tabs/AdvancedTab.vue b/src/views/Settings/components/Tabs/AdvancedTab.vue index 48e94888..23a83232 100644 --- a/src/views/Settings/components/Tabs/AdvancedTab.vue +++ b/src/views/Settings/components/Tabs/AdvancedTab.vue @@ -165,7 +165,6 @@ {{ t('view.settings.advanced.advanced.sqlite_table_size.event') }} - + - + @@ -298,16 +296,13 @@