diff --git a/docs/src/pages/cursed-knowledge.tsx b/docs/src/pages/cursed-knowledge.tsx index 534d8e95d0..0db89fbfe7 100644 --- a/docs/src/pages/cursed-knowledge.tsx +++ b/docs/src/pages/cursed-knowledge.tsx @@ -13,6 +13,9 @@ import { mdiTrashCan, mdiWeb, mdiWrap, + mdiCloudKeyOutline, + mdiRegex, + mdiCodeJson, } from '@mdi/js'; import Layout from '@theme/Layout'; import React from 'react'; @@ -23,6 +26,30 @@ const withLanguage = (date: Date) => (language: string) => date.toLocaleDateStri type Item = Omit & { date: Date }; const items: Item[] = [ + { + icon: mdiRegex, + iconColor: 'purple', + title: 'Zitadel Actions are cursed', + description: + "Zitadel is cursed because its custom scripting feature is executed with a JS engine that doesn't support regex named capture groups.", + link: { + url: 'https://github.com/dop251/goja', + text: 'Go JS engine', + }, + date: new Date(2025, 5, 4), + }, + { + icon: mdiCloudKeyOutline, + iconColor: '#0078d4', + title: 'Entra is cursed', + description: + "Microsoft Entra supports PKCE, but doesn't include it in its OpenID discovery document. This leads to clients thinking PKCE isn't available.", + link: { + url: 'https://github.com/immich-app/immich/pull/18725', + text: '#18725', + }, + date: new Date(2025, 4, 30), + }, { icon: mdiCrop, iconColor: 'tomato', @@ -35,6 +62,17 @@ const items: Item[] = [ }, date: new Date(2025, 4, 5), }, + { + icon: mdiCodeJson, + iconColor: 'yellow', + title: 'YAML whitespace is cursed', + description: 'YAML whitespaces are often handled in unintuitive ways.', + link: { + url: 'https://github.com/immich-app/immich/pull/17309', + text: '#17309', + }, + date: new Date(2025, 3, 1), + }, { icon: mdiMicrosoftWindows, iconColor: '#357EC7', diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 29a17c795b..667f07ef3b 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -28,8 +28,10 @@ services: extra_hosts: - 'auth-server:host-gateway' depends_on: - - redis - - database + redis: + condition: service_started + database: + condition: service_healthy ports: - 2285:2285 @@ -45,3 +47,9 @@ services: POSTGRES_DB: immich ports: - 5435:5432 + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U postgres -d immich'] + interval: 1s + timeout: 5s + retries: 30 + start_period: 10s diff --git a/server/src/schema/migrations/1749067526135-UserOnboardingDefault.ts b/server/src/schema/migrations/1749067526135-UserOnboardingDefault.ts new file mode 100644 index 0000000000..376541410f --- /dev/null +++ b/server/src/schema/migrations/1749067526135-UserOnboardingDefault.ts @@ -0,0 +1,12 @@ +import { Kysely, sql } from 'kysely'; +import { UserMetadataKey } from 'src/enum'; + +export async function up(db: Kysely): Promise { + await sql`INSERT INTO user_metadata SELECT id, ${UserMetadataKey.ONBOARDING}, '{"isOnboarded": true}' FROM users + ON CONFLICT ("userId", key) DO NOTHING + `.execute(db); +} + +export async function down(db: Kysely): Promise { + await sql`DELETE FROM user_metadata WHERE key = ${UserMetadataKey.ONBOARDING}`.execute(db); +} diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index 59d4b5e6ea..71cd9de932 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -6,7 +6,7 @@ import AssetSelectControlBar from '$lib/components/photos-page/asset-select-control-bar.svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; - import { AssetStore } from '$lib/stores/assets-store.svelte'; + import { AssetStore } from '$lib/managers/timeline-manager/asset-store.svelte'; import { dragAndDropFilesStore } from '$lib/stores/drag-and-drop-files.store'; import { featureFlags } from '$lib/stores/server-config.store'; import { handlePromiseError } from '$lib/utils'; diff --git a/web/src/lib/components/asset-viewer/actions/action.ts b/web/src/lib/components/asset-viewer/actions/action.ts index 0918c86bfe..fd37d253aa 100644 --- a/web/src/lib/components/asset-viewer/actions/action.ts +++ b/web/src/lib/components/asset-viewer/actions/action.ts @@ -1,5 +1,5 @@ import type { AssetAction } from '$lib/constants'; -import type { TimelineAsset } from '$lib/stores/assets-store.svelte'; +import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import type { AlbumResponseDto } from '@immich/sdk'; type ActionMap = { diff --git a/web/src/lib/components/asset-viewer/actions/download-action.svelte b/web/src/lib/components/asset-viewer/actions/download-action.svelte index 89bf5b72cb..9a2e1a9553 100644 --- a/web/src/lib/components/asset-viewer/actions/download-action.svelte +++ b/web/src/lib/components/asset-viewer/actions/download-action.svelte @@ -2,7 +2,7 @@ import { shortcut } from '$lib/actions/shortcut'; import MenuOption from '$lib/components/shared-components/context-menu/menu-option.svelte'; import { authManager } from '$lib/managers/auth-manager.svelte'; - import type { TimelineAsset } from '$lib/stores/assets-store.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { downloadFile } from '$lib/utils/asset-utils'; import { getAssetInfo } from '@immich/sdk'; import { IconButton } from '@immich/ui'; diff --git a/web/src/lib/components/asset-viewer/actions/set-visibility-action.svelte b/web/src/lib/components/asset-viewer/actions/set-visibility-action.svelte index ab97427524..1b06bf8e21 100644 --- a/web/src/lib/components/asset-viewer/actions/set-visibility-action.svelte +++ b/web/src/lib/components/asset-viewer/actions/set-visibility-action.svelte @@ -3,7 +3,7 @@ import { AssetAction } from '$lib/constants'; import { modalManager } from '$lib/managers/modal-manager.svelte'; - import type { TimelineAsset } from '$lib/stores/assets-store.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { handleError } from '$lib/utils/handle-error'; import { AssetVisibility, updateAssets } from '@immich/sdk'; import { mdiLockOpenVariantOutline, mdiLockOutline } from '@mdi/js'; diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index eadecfff95..e5d2554e2c 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -10,7 +10,7 @@ import { authManager } from '$lib/managers/auth-manager.svelte'; import { closeEditorCofirm } from '$lib/stores/asset-editor.store'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; - import type { TimelineAsset } from '$lib/stores/assets-store.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { isShowDetail } from '$lib/stores/preferences.store'; import { SlideshowNavigation, SlideshowState, slideshowStore } from '$lib/stores/slideshow.store'; import { user } from '$lib/stores/user.store'; diff --git a/web/src/lib/components/asset-viewer/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte index 3dffc0e84c..9cb80fb2dd 100644 --- a/web/src/lib/components/asset-viewer/photo-viewer.svelte +++ b/web/src/lib/components/asset-viewer/photo-viewer.svelte @@ -4,7 +4,8 @@ import FaceEditor from '$lib/components/asset-viewer/face-editor/face-editor.svelte'; import BrokenAsset from '$lib/components/assets/broken-asset.svelte'; import { castManager } from '$lib/managers/cast-manager.svelte'; - import { photoViewerImgElement, type TimelineAsset } from '$lib/stores/assets-store.svelte'; + import { photoViewerImgElement } from '$lib/stores/assets-store.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; import { boundingBoxesArray } from '$lib/stores/people.store'; import { alwaysLoadOriginalFile } from '$lib/stores/preferences.store'; diff --git a/web/src/lib/components/assets/thumbnail/thumbnail.svelte b/web/src/lib/components/assets/thumbnail/thumbnail.svelte index 1f9a29268f..00fef98c09 100644 --- a/web/src/lib/components/assets/thumbnail/thumbnail.svelte +++ b/web/src/lib/components/assets/thumbnail/thumbnail.svelte @@ -18,7 +18,7 @@ import { thumbhash } from '$lib/actions/thumbhash'; import { authManager } from '$lib/managers/auth-manager.svelte'; - import type { TimelineAsset } from '$lib/stores/assets-store.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { mobileDevice } from '$lib/stores/mobile-device.svelte'; import { moveFocus } from '$lib/utils/focus-util'; import { currentUrlReplaceAssetId } from '$lib/utils/navigation'; @@ -231,7 +231,7 @@ {#if (!loaded || thumbError) && asset.thumbhash} import { getAssetControlContext } from '$lib/components/photos-page/asset-select-control-bar.svelte'; - import type { TimelineAsset } from '$lib/stores/assets-store.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { authManager } from '$lib/managers/auth-manager.svelte'; import type { OnLink, OnUnlink } from '$lib/utils/actions'; import { handleError } from '$lib/utils/handle-error'; diff --git a/web/src/lib/components/photos-page/actions/select-all-assets.svelte b/web/src/lib/components/photos-page/actions/select-all-assets.svelte index f07bfd53cc..d8a5ab2fdf 100644 --- a/web/src/lib/components/photos-page/actions/select-all-assets.svelte +++ b/web/src/lib/components/photos-page/actions/select-all-assets.svelte @@ -1,6 +1,7 @@