mirror of
https://github.com/immich-app/immich.git
synced 2026-04-26 02:49:59 -04:00
138 lines
2.9 KiB
TypeScript
138 lines
2.9 KiB
TypeScript
import {
|
|
getAboutInfo,
|
|
getMyPreferences,
|
|
getMyUser,
|
|
logout,
|
|
type UserAdminResponseDto,
|
|
type UserPreferencesResponseDto,
|
|
} from '@immich/sdk';
|
|
import { browser } from '$app/environment';
|
|
import { goto } from '$app/navigation';
|
|
import { page } from '$app/state';
|
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
import { Route } from '$lib/route';
|
|
import { isSharedLinkRoute } from '$lib/utils/navigation';
|
|
|
|
class AuthManager {
|
|
isPurchased = $state(false);
|
|
isSharedLink = $derived(isSharedLinkRoute(page.route?.id));
|
|
params = $derived(this.isSharedLink ? { key: page.params.key, slug: page.params.slug } : {});
|
|
|
|
#user = $state<UserAdminResponseDto>();
|
|
#preferences = $state<UserPreferencesResponseDto>();
|
|
|
|
get authenticated() {
|
|
return !!(this.#user && this.#preferences);
|
|
}
|
|
|
|
get user() {
|
|
if (!this.#user) {
|
|
throw new TypeError('AuthManager.user is undefined');
|
|
}
|
|
|
|
return this.#user;
|
|
}
|
|
|
|
get preferences() {
|
|
if (!this.#preferences) {
|
|
throw new TypeError('AuthManager.preferences is undefined');
|
|
}
|
|
|
|
return this.#preferences;
|
|
}
|
|
|
|
constructor() {
|
|
eventManager.on({
|
|
SessionDelete: () => goto(Route.logout()),
|
|
});
|
|
}
|
|
|
|
async load() {
|
|
if (authManager.authenticated) {
|
|
return;
|
|
}
|
|
|
|
if (!this.#hasAuthCookie()) {
|
|
return;
|
|
}
|
|
|
|
return this.refresh();
|
|
}
|
|
|
|
async refresh() {
|
|
try {
|
|
const [user, preferences] = await Promise.all([getMyUser(), getMyPreferences()]);
|
|
this.#preferences = preferences;
|
|
this.#user = user;
|
|
|
|
if (user.license?.activatedAt) {
|
|
this.isPurchased = true;
|
|
} else {
|
|
// check server status
|
|
const serverInfo = await getAboutInfo().catch(() => {});
|
|
if (serverInfo?.licensed) {
|
|
this.isPurchased = true;
|
|
}
|
|
}
|
|
|
|
eventManager.emit('AuthUserLoaded', user);
|
|
} catch {
|
|
// noop
|
|
}
|
|
}
|
|
|
|
setUser(user: UserAdminResponseDto) {
|
|
this.#user = user;
|
|
}
|
|
|
|
setPreferences(preferences: UserPreferencesResponseDto) {
|
|
this.#preferences = preferences;
|
|
}
|
|
|
|
async logout() {
|
|
let redirectUri = Route.login();
|
|
|
|
try {
|
|
const response = await logout();
|
|
if (response.redirectUri) {
|
|
redirectUri = response.redirectUri;
|
|
}
|
|
} catch {
|
|
// noop
|
|
}
|
|
|
|
if (redirectUri.startsWith('/')) {
|
|
this.isPurchased = false;
|
|
|
|
this.reset();
|
|
eventManager.emit('AuthLogout');
|
|
|
|
await goto(redirectUri);
|
|
} else {
|
|
globalThis.location.href = redirectUri;
|
|
}
|
|
}
|
|
|
|
reset() {
|
|
this.#user = undefined;
|
|
this.#preferences = undefined;
|
|
}
|
|
|
|
#hasAuthCookie() {
|
|
if (!browser) {
|
|
return;
|
|
}
|
|
|
|
for (const cookie of document.cookie.split('; ')) {
|
|
const [name] = cookie.split('=');
|
|
if (name === 'immich_is_authenticated') {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export const authManager = new AuthManager();
|