mirror of
https://github.com/immich-app/immich.git
synced 2026-02-22 17:00:32 +09:00
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker / pre-job (push) Has been cancelled
Docker / Re-Tag ML () (push) Has been cancelled
Docker / Re-Tag ML (-armnn) (push) Has been cancelled
Docker / Re-Tag ML (-cuda) (push) Has been cancelled
Docker / Re-Tag ML (-openvino) (push) Has been cancelled
Docker / Re-Tag ML (-rknn) (push) Has been cancelled
Docker / Re-Tag ML (-rocm) (push) Has been cancelled
Docker / Re-Tag Server () (push) Has been cancelled
Docker / Build and Push ML (armnn, linux/arm64, -armnn) (push) Has been cancelled
Docker / Build and Push ML (cpu) (push) Has been cancelled
Docker / Build and Push ML (cuda, linux/amd64, -cuda) (push) Has been cancelled
Docker / Build and Push ML (openvino, linux/amd64, -openvino) (push) Has been cancelled
Docker / Build and Push ML (rknn, linux/arm64, -rknn) (push) Has been cancelled
Docker / Build and Push ML (rocm, linux/amd64, {"linux/amd64": "mich"}, -rocm) (push) Has been cancelled
Docker / Build and Push Server (push) Has been cancelled
Docker / Docker Build & Push Server Success (push) Has been cancelled
Docker / Docker Build & Push ML Success (push) Has been cancelled
Docs build / pre-job (push) Has been cancelled
Docs build / Docs Build (push) Has been cancelled
Zizmor / Zizmor (push) Has been cancelled
Manage release PR / bump (push) Has been cancelled
Static Code Analysis / pre-job (push) Has been cancelled
Static Code Analysis / Run Dart Code Analysis (push) Has been cancelled
Test / pre-job (push) Has been cancelled
Test / Test & Lint Server (push) Has been cancelled
Test / Unit Test CLI (push) Has been cancelled
Test / Unit Test CLI (Windows) (push) Has been cancelled
Test / Lint Web (push) Has been cancelled
Test / Test Web (push) Has been cancelled
Test / Test i18n (push) Has been cancelled
Test / End-to-End Lint (push) Has been cancelled
Test / Medium Tests (Server) (push) Has been cancelled
Test / End-to-End Tests (Server & CLI) (ubuntu-24.04-arm) (push) Has been cancelled
Test / End-to-End Tests (Server & CLI) (ubuntu-latest) (push) Has been cancelled
Test / End-to-End Tests (Web) (ubuntu-24.04-arm) (push) Has been cancelled
Test / End-to-End Tests (Web) (ubuntu-latest) (push) Has been cancelled
Test / End-to-End Tests Success (push) Has been cancelled
Test / Unit Test Mobile (push) Has been cancelled
Test / Unit Test ML (push) Has been cancelled
Test / .github Files Formatting (push) Has been cancelled
Test / ShellCheck (push) Has been cancelled
Test / OpenAPI Clients (push) Has been cancelled
Test / SQL Schema Checks (push) Has been cancelled
108 lines
3.9 KiB
TypeScript
108 lines
3.9 KiB
TypeScript
import { Body, Controller, Delete, Get, Header, HttpCode, HttpStatus, Post, Res } from '@nestjs/common';
|
|
import { ApiTags } from '@nestjs/swagger';
|
|
import { Response } from 'express';
|
|
import { Endpoint, HistoryBuilder } from 'src/decorators';
|
|
import { AssetResponseDto } from 'src/dtos/asset-response.dto';
|
|
import { AuthDto } from 'src/dtos/auth.dto';
|
|
import {
|
|
AssetDeltaSyncDto,
|
|
AssetDeltaSyncResponseDto,
|
|
AssetFullSyncDto,
|
|
SyncAckDeleteDto,
|
|
SyncAckDto,
|
|
SyncAckSetDto,
|
|
SyncStreamDto,
|
|
} from 'src/dtos/sync.dto';
|
|
import { ApiTag, Permission } from 'src/enum';
|
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
|
import { GlobalExceptionFilter } from 'src/middleware/global-exception.filter';
|
|
import { SyncService } from 'src/services/sync.service';
|
|
|
|
@ApiTags(ApiTag.Sync)
|
|
@Controller('sync')
|
|
export class SyncController {
|
|
constructor(
|
|
private service: SyncService,
|
|
private errorService: GlobalExceptionFilter,
|
|
) {}
|
|
|
|
@Post('full-sync')
|
|
@Authenticated()
|
|
@HttpCode(HttpStatus.OK)
|
|
@Endpoint({
|
|
summary: 'Get full sync for user',
|
|
description: 'Retrieve all assets for a full synchronization for the authenticated user.',
|
|
history: new HistoryBuilder().added('v1').deprecated('v2'),
|
|
})
|
|
getFullSyncForUser(@Auth() auth: AuthDto, @Body() dto: AssetFullSyncDto): Promise<AssetResponseDto[]> {
|
|
return this.service.getFullSync(auth, dto);
|
|
}
|
|
|
|
@Post('delta-sync')
|
|
@Authenticated()
|
|
@HttpCode(HttpStatus.OK)
|
|
@Endpoint({
|
|
summary: 'Get delta sync for user',
|
|
description: 'Retrieve changed assets since the last sync for the authenticated user.',
|
|
history: new HistoryBuilder().added('v1').deprecated('v2'),
|
|
})
|
|
getDeltaSync(@Auth() auth: AuthDto, @Body() dto: AssetDeltaSyncDto): Promise<AssetDeltaSyncResponseDto> {
|
|
return this.service.getDeltaSync(auth, dto);
|
|
}
|
|
|
|
@Post('stream')
|
|
@Authenticated({ permission: Permission.SyncStream })
|
|
@Header('Content-Type', 'application/jsonlines+json')
|
|
@HttpCode(HttpStatus.OK)
|
|
@Endpoint({
|
|
summary: 'Stream sync changes',
|
|
description:
|
|
'Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes.',
|
|
history: new HistoryBuilder().added('v1').beta('v1').stable('v2'),
|
|
})
|
|
async getSyncStream(@Auth() auth: AuthDto, @Res() res: Response, @Body() dto: SyncStreamDto) {
|
|
try {
|
|
await this.service.stream(auth, res, dto);
|
|
} catch (error: Error | any) {
|
|
res.setHeader('Content-Type', 'application/json');
|
|
this.errorService.handleError(res, error);
|
|
}
|
|
}
|
|
|
|
@Get('ack')
|
|
@Authenticated({ permission: Permission.SyncCheckpointRead })
|
|
@Endpoint({
|
|
summary: 'Retrieve acknowledgements',
|
|
description: 'Retrieve the synchronization acknowledgments for the current session.',
|
|
history: new HistoryBuilder().added('v1').beta('v1').stable('v2'),
|
|
})
|
|
getSyncAck(@Auth() auth: AuthDto): Promise<SyncAckDto[]> {
|
|
return this.service.getAcks(auth);
|
|
}
|
|
|
|
@Post('ack')
|
|
@Authenticated({ permission: Permission.SyncCheckpointUpdate })
|
|
@HttpCode(HttpStatus.NO_CONTENT)
|
|
@Endpoint({
|
|
summary: 'Acknowledge changes',
|
|
description:
|
|
'Send a list of synchronization acknowledgements to confirm that the latest changes have been received.',
|
|
history: new HistoryBuilder().added('v1').beta('v1').stable('v2'),
|
|
})
|
|
sendSyncAck(@Auth() auth: AuthDto, @Body() dto: SyncAckSetDto) {
|
|
return this.service.setAcks(auth, dto);
|
|
}
|
|
|
|
@Delete('ack')
|
|
@Authenticated({ permission: Permission.SyncCheckpointDelete })
|
|
@HttpCode(HttpStatus.NO_CONTENT)
|
|
@Endpoint({
|
|
summary: 'Delete acknowledgements',
|
|
description: 'Delete specific synchronization acknowledgments.',
|
|
history: new HistoryBuilder().added('v1').beta('v1').stable('v2'),
|
|
})
|
|
deleteSyncAck(@Auth() auth: AuthDto, @Body() dto: SyncAckDeleteDto): Promise<void> {
|
|
return this.service.deleteAcks(auth, dto);
|
|
}
|
|
}
|