42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { env } from "@homarr/auth/env";
|
|
import { createLogger } from "@homarr/core/infrastructure/logs";
|
|
import { db, eq, inArray } from "@homarr/db";
|
|
import { sessions, users } from "@homarr/db/schema";
|
|
import { supportedAuthProviders } from "@homarr/definitions";
|
|
|
|
const logger = createLogger({ module: "sessionCleanup" });
|
|
|
|
/**
|
|
* Deletes sessions for users that have inactive auth providers.
|
|
* Sessions from other providers are deleted so they can no longer be used.
|
|
*/
|
|
export async function cleanupSessionsAsync() {
|
|
try {
|
|
const currentAuthProviders = env.AUTH_PROVIDERS;
|
|
|
|
const inactiveAuthProviders = supportedAuthProviders.filter((provider) => !currentAuthProviders.includes(provider));
|
|
const subQuery = db
|
|
.select({ id: users.id })
|
|
.from(users)
|
|
.where(inArray(users.provider, inactiveAuthProviders))
|
|
.as("sq");
|
|
const sessionsWithInactiveProviders = await db
|
|
.select({ userId: sessions.userId })
|
|
.from(sessions)
|
|
.rightJoin(subQuery, eq(sessions.userId, subQuery.id));
|
|
|
|
const userIds = sessionsWithInactiveProviders.map(({ userId }) => userId).filter((value) => value !== null);
|
|
await db.delete(sessions).where(inArray(sessions.userId, userIds));
|
|
|
|
if (sessionsWithInactiveProviders.length > 0) {
|
|
logger.info("Deleted sessions for inactive providers", {
|
|
count: userIds.length,
|
|
});
|
|
} else {
|
|
logger.debug("No sessions to delete");
|
|
}
|
|
} catch (error) {
|
|
logger.error(new Error("Failed to clean up sessions", { cause: error }));
|
|
}
|
|
}
|