diff --git a/packages/core/src/db/users.ts b/packages/core/src/db/users.ts index 46279315..c175f5be 100644 --- a/packages/core/src/db/users.ts +++ b/packages/core/src/db/users.ts @@ -297,14 +297,17 @@ export class UserRepository { }); } - static async pruneUsers(maxDays: number = 30): Promise { + static async pruneUsers(maxDays: number = 30): Promise { try { const query = db.getDialect() === 'postgres' - ? `DELETE FROM users WHERE accessed_at < NOW() - INTERVAL ${maxDays} DAY` + ? `DELETE FROM users WHERE accessed_at < NOW() - INTERVAL '${maxDays} days'` : `DELETE FROM users WHERE accessed_at < datetime('now', '-' || ${maxDays} || ' days')`; - await db.execute(query); - logger.info(`Pruned users older than ${maxDays} days`); + + const result = await db.execute(query); + const deletedCount = result.changes || result.rowCount || 0; + logger.info(`Pruned ${deletedCount} users older than ${maxDays} days`); + return deletedCount; } catch (error) { logger.error('Failed to prune users:', error); return Promise.reject(new APIError(constants.ErrorCode.USER_ERROR)); diff --git a/packages/core/src/utils/env.ts b/packages/core/src/utils/env.ts index 60a80b85..4ad96495 100644 --- a/packages/core/src/utils/env.ts +++ b/packages/core/src/utils/env.ts @@ -284,6 +284,15 @@ export const Env = cleanEnv(process.env, { desc: 'Signature for the Stremio addons config', }), + PRUNE_INTERVAL: num({ + default: 86400, // 24 hours + desc: 'Interval for pruning inactive users in seconds', + }), + PRUNE_MAX_DAYS: num({ + default: 30, + desc: 'Maximum days of inactivity before pruning', + }), + DEFAULT_USER_AGENT: userAgent({ default: `AIOStreams/${metadata?.version || 'unknown'}`, desc: 'Default user agent for the addon', diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index 6686f0d2..a0c54702 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -14,9 +14,17 @@ async function initialiseDatabase() { } } +async function startAutoPrune() { + try { + await UserRepository.pruneUsers(Env.PRUNE_MAX_DAYS); + } catch {} + setTimeout(startAutoPrune, Env.PRUNE_INTERVAL * 1000); +} + async function start() { try { await initialiseDatabase(); + startAutoPrune(); app.listen(Env.PORT, () => { logger.info(`Server running on port ${Env.PORT}`); });