diff --git a/mobile/lib/services/api.service.dart b/mobile/lib/services/api.service.dart index 0f6fe8a10..c72a4bf1b 100644 --- a/mobile/lib/services/api.service.dart +++ b/mobile/lib/services/api.service.dart @@ -23,7 +23,6 @@ class ApiService implements Authentication { late MapApi mapApi; late PartnersApi partnersApi; late PeopleApi peopleApi; - late AuditApi auditApi; late SharedLinksApi sharedLinksApi; late SyncApi syncApi; late SystemConfigApi systemConfigApi; @@ -56,7 +55,6 @@ class ApiService implements Authentication { mapApi = MapApi(_apiClient); partnersApi = PartnersApi(_apiClient); peopleApi = PeopleApi(_apiClient); - auditApi = AuditApi(_apiClient); sharedLinksApi = SharedLinksApi(_apiClient); syncApi = SyncApi(_apiClient); systemConfigApi = SystemConfigApi(_apiClient); diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 5b0e067dc..d006ef38b 100644 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/devtools_options.yaml b/mobile/openapi/devtools_options.yaml deleted file mode 100644 index fa0b357c4..000000000 --- a/mobile/openapi/devtools_options.yaml +++ /dev/null @@ -1,3 +0,0 @@ -description: This file stores settings for Dart & Flutter DevTools. -documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states -extensions: diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 3455cdb4f..2a2b6d46a 100644 Binary files a/mobile/openapi/lib/api.dart and b/mobile/openapi/lib/api.dart differ diff --git a/mobile/openapi/lib/api/audit_api.dart b/mobile/openapi/lib/api/audit_api.dart deleted file mode 100644 index f6d71eafd..000000000 Binary files a/mobile/openapi/lib/api/audit_api.dart and /dev/null differ diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 3721652b8..49fbe9464 100644 Binary files a/mobile/openapi/lib/api_client.dart and b/mobile/openapi/lib/api_client.dart differ diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index b7c6ad5e0..6a917201a 100644 Binary files a/mobile/openapi/lib/api_helper.dart and b/mobile/openapi/lib/api_helper.dart differ diff --git a/mobile/openapi/lib/model/audit_deletes_response_dto.dart b/mobile/openapi/lib/model/audit_deletes_response_dto.dart deleted file mode 100644 index 6b1df74eb..000000000 Binary files a/mobile/openapi/lib/model/audit_deletes_response_dto.dart and /dev/null differ diff --git a/mobile/openapi/lib/model/entity_type.dart b/mobile/openapi/lib/model/entity_type.dart deleted file mode 100644 index 93a0d0d3c..000000000 Binary files a/mobile/openapi/lib/model/entity_type.dart and /dev/null differ diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 25d649e19..5b5c3a150 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -2079,65 +2079,6 @@ ] } }, - "/audit/deletes": { - "get": { - "operationId": "getAuditDeletes", - "parameters": [ - { - "name": "after", - "required": true, - "in": "query", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "entityType", - "required": true, - "in": "query", - "schema": { - "$ref": "#/components/schemas/EntityType" - } - }, - { - "name": "userId", - "required": false, - "in": "query", - "schema": { - "format": "uuid", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AuditDeletesResponseDto" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Audit" - ] - } - }, "/auth/admin-sign-up": { "post": { "operationId": "signUpAdmin", @@ -8643,24 +8584,6 @@ ], "type": "string" }, - "AuditDeletesResponseDto": { - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "needsFullSync": { - "type": "boolean" - } - }, - "required": [ - "ids", - "needsFullSync" - ], - "type": "object" - }, "AvatarResponse": { "properties": { "color": { @@ -9075,13 +8998,6 @@ }, "type": "object" }, - "EntityType": { - "enum": [ - "ASSET", - "ALBUM" - ], - "type": "string" - }, "ExifResponseDto": { "properties": { "city": { diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 0473b5603..d4b36a04f 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -449,10 +449,6 @@ export type AssetMediaReplaceDto = { fileCreatedAt: string; fileModifiedAt: string; }; -export type AuditDeletesResponseDto = { - ids: string[]; - needsFullSync: boolean; -}; export type SignUpDto = { email: string; name: string; @@ -1913,22 +1909,6 @@ export function playAssetVideo({ id, key }: { ...opts })); } -export function getAuditDeletes({ after, entityType, userId }: { - after: string; - entityType: EntityType; - userId?: string; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchJson<{ - status: 200; - data: AuditDeletesResponseDto; - }>(`/audit/deletes${QS.query(QS.explode({ - after, - entityType, - userId - }))}`, { - ...opts - })); -} export function signUpAdmin({ signUpDto }: { signUpDto: SignUpDto; }, opts?: Oazapfts.RequestOpts) { @@ -3499,10 +3479,6 @@ export enum AssetMediaSize { Preview = "preview", Thumbnail = "thumbnail" } -export enum EntityType { - Asset = "ASSET", - Album = "ALBUM" -} export enum ManualJobName { PersonCleanup = "person-cleanup", TagCleanup = "tag-cleanup", diff --git a/server/src/controllers/audit.controller.ts b/server/src/controllers/audit.controller.ts deleted file mode 100644 index 856a1cc75..000000000 --- a/server/src/controllers/audit.controller.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Controller, Get, Query } from '@nestjs/common'; -import { ApiTags } from '@nestjs/swagger'; -import { AuditDeletesDto, AuditDeletesResponseDto } from 'src/dtos/audit.dto'; -import { AuthDto } from 'src/dtos/auth.dto'; -import { Auth, Authenticated } from 'src/middleware/auth.guard'; -import { AuditService } from 'src/services/audit.service'; - -@ApiTags('Audit') -@Controller('audit') -export class AuditController { - constructor(private service: AuditService) {} - - @Get('deletes') - @Authenticated() - getAuditDeletes(@Auth() auth: AuthDto, @Query() dto: AuditDeletesDto): Promise { - return this.service.getDeletes(auth, dto); - } -} diff --git a/server/src/controllers/index.ts b/server/src/controllers/index.ts index f10bf601b..c9d63f8bc 100644 --- a/server/src/controllers/index.ts +++ b/server/src/controllers/index.ts @@ -4,7 +4,6 @@ import { APIKeyController } from 'src/controllers/api-key.controller'; import { AppController } from 'src/controllers/app.controller'; import { AssetMediaController } from 'src/controllers/asset-media.controller'; import { AssetController } from 'src/controllers/asset.controller'; -import { AuditController } from 'src/controllers/audit.controller'; import { AuthController } from 'src/controllers/auth.controller'; import { DownloadController } from 'src/controllers/download.controller'; import { DuplicateController } from 'src/controllers/duplicate.controller'; @@ -40,7 +39,6 @@ export const controllers = [ AppController, AssetController, AssetMediaController, - AuditController, AuthController, DownloadController, DuplicateController, diff --git a/server/src/services/audit.service.spec.ts b/server/src/services/audit.service.spec.ts index c64f6f207..f5e588cdd 100644 --- a/server/src/services/audit.service.spec.ts +++ b/server/src/services/audit.service.spec.ts @@ -1,17 +1,7 @@ import { BadRequestException } from '@nestjs/common'; import { FileReportItemDto } from 'src/dtos/audit.dto'; -import { - AssetFileType, - AssetPathType, - DatabaseAction, - EntityType, - JobStatus, - PersonPathType, - UserPathType, -} from 'src/enum'; +import { AssetFileType, AssetPathType, JobStatus, PersonPathType, UserPathType } from 'src/enum'; import { AuditService } from 'src/services/audit.service'; -import { auditStub } from 'test/fixtures/audit.stub'; -import { authStub } from 'test/fixtures/auth.stub'; import { newTestService, ServiceMocks } from 'test/utils'; describe(AuditService.name, () => { @@ -33,40 +23,6 @@ describe(AuditService.name, () => { }); }); - describe('getDeletes', () => { - it('should require full sync if the request is older than 100 days', async () => { - mocks.audit.getAfter.mockResolvedValue([]); - - const date = new Date(2022, 0, 1); - await expect(sut.getDeletes(authStub.admin, { after: date, entityType: EntityType.ASSET })).resolves.toEqual({ - needsFullSync: true, - ids: [], - }); - - expect(mocks.audit.getAfter).toHaveBeenCalledWith(date, { - action: DatabaseAction.DELETE, - userIds: [authStub.admin.user.id], - entityType: EntityType.ASSET, - }); - }); - - it('should get any new or updated assets and deleted ids', async () => { - mocks.audit.getAfter.mockResolvedValue([auditStub.delete.entityId]); - - const date = new Date(); - await expect(sut.getDeletes(authStub.admin, { after: date, entityType: EntityType.ASSET })).resolves.toEqual({ - needsFullSync: false, - ids: ['asset-deleted'], - }); - - expect(mocks.audit.getAfter).toHaveBeenCalledWith(date, { - action: DatabaseAction.DELETE, - userIds: [authStub.admin.user.id], - entityType: EntityType.ASSET, - }); - }); - }); - describe('getChecksums', () => { it('should fail if the file is not in the immich path', async () => { await expect(sut.getChecksums({ filenames: ['foo/bar'] })).rejects.toBeInstanceOf(BadRequestException); diff --git a/server/src/services/audit.service.ts b/server/src/services/audit.service.ts index a952a0e64..394846976 100644 --- a/server/src/services/audit.service.ts +++ b/server/src/services/audit.service.ts @@ -4,22 +4,12 @@ import { resolve } from 'node:path'; import { AUDIT_LOG_MAX_DURATION, JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; import { StorageCore } from 'src/cores/storage.core'; import { OnJob } from 'src/decorators'; -import { - AuditDeletesDto, - AuditDeletesResponseDto, - FileChecksumDto, - FileChecksumResponseDto, - FileReportItemDto, - PathEntityType, -} from 'src/dtos/audit.dto'; -import { AuthDto } from 'src/dtos/auth.dto'; +import { FileChecksumDto, FileChecksumResponseDto, FileReportItemDto, PathEntityType } from 'src/dtos/audit.dto'; import { AssetFileType, AssetPathType, - DatabaseAction, JobName, JobStatus, - Permission, PersonPathType, QueueName, StorageFolder, @@ -37,24 +27,6 @@ export class AuditService extends BaseService { return JobStatus.SUCCESS; } - async getDeletes(auth: AuthDto, dto: AuditDeletesDto): Promise { - const userId = dto.userId || auth.user.id; - await this.requireAccess({ auth, permission: Permission.TIMELINE_READ, ids: [userId] }); - - const audits = await this.auditRepository.getAfter(dto.after, { - userIds: [userId], - entityType: dto.entityType, - action: DatabaseAction.DELETE, - }); - - const duration = DateTime.now().diff(DateTime.fromJSDate(dto.after)); - - return { - needsFullSync: duration > AUDIT_LOG_MAX_DURATION, - ids: audits, - }; - } - async getChecksums(dto: FileChecksumDto) { const results: FileChecksumResponseDto[] = []; for (const filename of dto.filenames) {