Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f1ec5b724 | |||
| 00ce6354f0 |
+1
-1
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
+1
-1
@@ -68,6 +68,6 @@
|
|||||||
"micromatch": "^4.0.8"
|
"micromatch": "^4.0.8"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.19.0"
|
"node": "22.20.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
+1
-1
@@ -57,6 +57,6 @@
|
|||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.19.0"
|
"node": "22.20.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
+1
-1
@@ -52,6 +52,6 @@
|
|||||||
"vitest": "^3.0.0"
|
"vitest": "^3.0.0"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.19.0"
|
"node": "22.20.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[tools]
|
[tools]
|
||||||
node = "22.19.0"
|
node = "22.20.0"
|
||||||
flutter = "3.35.4"
|
flutter = "3.35.4"
|
||||||
pnpm = "10.15.1"
|
pnpm = "10.15.1"
|
||||||
|
|
||||||
|
|||||||
@@ -130,9 +130,9 @@ class SyncStreamService {
|
|||||||
// to acknowledge that the client has processed all the backfill events
|
// to acknowledge that the client has processed all the backfill events
|
||||||
case SyncEntityType.syncAckV1:
|
case SyncEntityType.syncAckV1:
|
||||||
return;
|
return;
|
||||||
// No-op. SyncCompleteV1 is used to signal the completion of the sync process
|
// SyncCompleteV1 is used to signal the completion of the sync process. Cleanup stale assets and signal completion
|
||||||
case SyncEntityType.syncCompleteV1:
|
case SyncEntityType.syncCompleteV1:
|
||||||
return;
|
return _syncStreamRepository.pruneAssets();
|
||||||
// Request to reset the client state. Clear everything related to remote entities
|
// Request to reset the client state. Clear everything related to remote entities
|
||||||
case SyncEntityType.syncResetV1:
|
case SyncEntityType.syncResetV1:
|
||||||
return _syncStreamRepository.reset();
|
return _syncStreamRepository.reset();
|
||||||
|
|||||||
@@ -591,6 +591,40 @@ class SyncStreamRepository extends DriftDatabaseRepository {
|
|||||||
rethrow;
|
rethrow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> pruneAssets() async {
|
||||||
|
try {
|
||||||
|
await _db.transaction(() async {
|
||||||
|
final authQuery = _db.authUserEntity.selectOnly()
|
||||||
|
..addColumns([_db.authUserEntity.id])
|
||||||
|
..limit(1);
|
||||||
|
final currentUserId = await authQuery.map((row) => row.read(_db.authUserEntity.id)).getSingleOrNull();
|
||||||
|
if (currentUserId == null) {
|
||||||
|
_logger.warning('No authenticated user found during pruneAssets. Skipping asset pruning.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final partnerQuery = _db.partnerEntity.selectOnly()
|
||||||
|
..addColumns([_db.partnerEntity.sharedById])
|
||||||
|
..where(_db.partnerEntity.sharedWithId.equals(currentUserId));
|
||||||
|
final partnerIds = await partnerQuery.map((row) => row.read(_db.partnerEntity.sharedById)).get();
|
||||||
|
|
||||||
|
final validUsers = {currentUserId, ...partnerIds.nonNulls};
|
||||||
|
|
||||||
|
// Asset is not owned by the current user or any of their partners and is not part of any (shared) album
|
||||||
|
// Likely a stale asset that was previously shared but has been removed
|
||||||
|
await _db.remoteAssetEntity.deleteWhere((asset) {
|
||||||
|
return asset.ownerId.isNotIn(validUsers) &
|
||||||
|
asset.id.isNotInQuery(
|
||||||
|
_db.remoteAlbumAssetEntity.selectOnly()..addColumns([_db.remoteAlbumAssetEntity.assetId]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch (error, stack) {
|
||||||
|
_logger.severe('Error: pruneAssets', error, stack);
|
||||||
|
// We do not rethrow here as this is a client-only cleanup and should not affect the sync process
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension on AssetTypeEnum {
|
extension on AssetTypeEnum {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
@@ -28,6 +28,6 @@
|
|||||||
"directory": "open-api/typescript-sdk"
|
"directory": "open-api/typescript-sdk"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.19.0"
|
"node": "22.20.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
+8
-23
@@ -1,50 +1,35 @@
|
|||||||
FROM ghcr.io/immich-app/base-server-dev:202509210934@sha256:b5ce2d7eaf379d4cf15efd4bab180d8afc8a80d20b36c9800f4091aca6ae267e AS builder
|
FROM ghcr.io/immich-app/base-server-dev:202509210934@sha256:b5ce2d7eaf379d4cf15efd4bab180d8afc8a80d20b36c9800f4091aca6ae267e AS builder
|
||||||
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
|
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
|
||||||
CI=1 \
|
CI=1 \
|
||||||
COREPACK_HOME=/tmp \
|
COREPACK_HOME=/tmp
|
||||||
PNPM_HOME=/pnpm \
|
|
||||||
PATH="/pnpm:$PATH"
|
|
||||||
|
|
||||||
RUN npm install --global corepack@latest && \
|
RUN npm install --global corepack@latest && \
|
||||||
corepack enable pnpm && \
|
corepack enable pnpm
|
||||||
pnpm config set store-dir "$PNPM_HOME"
|
|
||||||
|
|
||||||
FROM builder AS server
|
FROM builder AS server
|
||||||
|
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
COPY ./package* ./pnpm* .pnpmfile.cjs ./
|
||||||
COPY ./server ./server/
|
COPY ./server ./server/
|
||||||
RUN --mount=type=cache,id=pnpm-server,target=/pnpm \
|
RUN SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile build && \
|
||||||
--mount=type=bind,source=package.json,target=package.json \
|
|
||||||
--mount=type=bind,source=.pnpmfile.cjs,target=.pnpmfile.cjs \
|
|
||||||
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
|
|
||||||
--mount=type=bind,source=pnpm-workspace.yaml,target=pnpm-workspace.yaml \
|
|
||||||
SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile build && \
|
|
||||||
SHARP_FORCE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile --prod --no-optional deploy /output/server-pruned
|
SHARP_FORCE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile --prod --no-optional deploy /output/server-pruned
|
||||||
|
|
||||||
FROM builder AS web
|
FROM builder AS web
|
||||||
|
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
COPY ./package* ./pnpm* .pnpmfile.cjs ./
|
||||||
COPY ./web ./web/
|
COPY ./web ./web/
|
||||||
COPY ./i18n ./i18n/
|
COPY ./i18n ./i18n/
|
||||||
COPY ./open-api ./open-api/
|
COPY ./open-api ./open-api/
|
||||||
RUN --mount=type=cache,id=pnpm-web,target=/pnpm \
|
RUN SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install && \
|
||||||
--mount=type=bind,source=package.json,target=package.json \
|
|
||||||
--mount=type=bind,source=.pnpmfile.cjs,target=.pnpmfile.cjs \
|
|
||||||
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
|
|
||||||
--mount=type=bind,source=pnpm-workspace.yaml,target=pnpm-workspace.yaml \
|
|
||||||
SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install && \
|
|
||||||
pnpm --filter @immich/sdk --filter immich-web build
|
pnpm --filter @immich/sdk --filter immich-web build
|
||||||
|
|
||||||
FROM builder AS cli
|
FROM builder AS cli
|
||||||
|
|
||||||
|
COPY ./package* ./pnpm* .pnpmfile.cjs ./
|
||||||
COPY ./cli ./cli/
|
COPY ./cli ./cli/
|
||||||
COPY ./open-api ./open-api/
|
COPY ./open-api ./open-api/
|
||||||
RUN --mount=type=cache,id=pnpm-cli,target=/pnpm \
|
RUN pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install && \
|
||||||
--mount=type=bind,source=package.json,target=package.json \
|
|
||||||
--mount=type=bind,source=.pnpmfile.cjs,target=.pnpmfile.cjs \
|
|
||||||
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
|
|
||||||
--mount=type=bind,source=pnpm-workspace.yaml,target=pnpm-workspace.yaml \
|
|
||||||
pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install && \
|
|
||||||
pnpm --filter @immich/sdk --filter @immich/cli build && \
|
pnpm --filter @immich/sdk --filter @immich/cli build && \
|
||||||
pnpm --filter @immich/cli --prod --no-optional deploy /output/cli-pruned
|
pnpm --filter @immich/cli --prod --no-optional deploy /output/cli-pruned
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -161,7 +161,7 @@
|
|||||||
"vitest": "^3.0.0"
|
"vitest": "^3.0.0"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.19.0"
|
"node": "22.20.0"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"sharp": "^0.34.3"
|
"sharp": "^0.34.3"
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
22.19.0
|
22.20.0
|
||||||
|
|||||||
+1
-1
@@ -107,6 +107,6 @@
|
|||||||
"vitest": "^3.0.0"
|
"vitest": "^3.0.0"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.19.0"
|
"node": "22.20.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user