mirror of
https://github.com/immich-app/immich.git
synced 2024-12-22 01:47:08 +02:00
parent
0c13c63bb6
commit
6d9e7694b1
@ -1,4 +1,4 @@
|
|||||||
import { AssetResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { AssetResponseDto } from 'src/dtos/asset-response.dto';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
|
|
||||||
export const assetApi = {
|
export const assetApi = {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { LoginResponseDto } from 'src/domain/auth/auth.dto';
|
import { LoginResponseDto } from 'src/dtos/auth.dto';
|
||||||
import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
|
import { UserResponseDto } from 'src/dtos/user.dto';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
import { adminSignupStub, loginResponseStub, loginStub } from 'test/fixtures/auth.stub';
|
import { adminSignupStub, loginResponseStub, loginStub } from 'test/fixtures/auth.stub';
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { CreateLibraryDto, LibraryResponseDto, ScanLibraryDto } from 'src/domain/library/library.dto';
|
import { CreateLibraryDto, LibraryResponseDto, ScanLibraryDto } from 'src/dtos/library.dto';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
|
|
||||||
export const libraryApi = {
|
export const libraryApi = {
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { api } from 'e2e/client';
|
import { api } from 'e2e/client';
|
||||||
import fs from 'node:fs/promises';
|
import fs from 'node:fs/promises';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { LoginResponseDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { LibraryResponseDto } from 'src/domain/library/library.dto';
|
|
||||||
import { LibraryService } from 'src/domain/library/library.service';
|
import { LibraryService } from 'src/domain/library/library.service';
|
||||||
|
import { LoginResponseDto } from 'src/dtos/auth.dto';
|
||||||
|
import { LibraryResponseDto } from 'src/dtos/library.dto';
|
||||||
import { AssetType } from 'src/entities/asset.entity';
|
import { AssetType } from 'src/entities/asset.entity';
|
||||||
import { LibraryType } from 'src/entities/library.entity';
|
import { LibraryType } from 'src/entities/library.entity';
|
||||||
import { StorageEventType } from 'src/interfaces/storage.repository';
|
import { StorageEventType } from 'src/interfaces/storage.repository';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { api } from 'e2e/client';
|
import { api } from 'e2e/client';
|
||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
import { LibraryController } from 'src/controllers/library.controller';
|
import { LibraryController } from 'src/controllers/library.controller';
|
||||||
import { LoginResponseDto } from 'src/domain/auth/auth.dto';
|
import { LoginResponseDto } from 'src/dtos/auth.dto';
|
||||||
import { LibraryType } from 'src/entities/library.entity';
|
import { LibraryType } from 'src/entities/library.entity';
|
||||||
import request from 'supertest';
|
import request from 'supertest';
|
||||||
import { errorStub } from 'test/fixtures/error.stub';
|
import { errorStub } from 'test/fixtures/error.stub';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Command, CommandRunner, InquirerService, Question, QuestionSet } from 'nest-commander';
|
import { Command, CommandRunner, InquirerService, Question, QuestionSet } from 'nest-commander';
|
||||||
import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { UserService } from 'src/domain/user/user.service';
|
import { UserService } from 'src/domain/user/user.service';
|
||||||
|
import { UserResponseDto } from 'src/dtos/user.dto';
|
||||||
|
|
||||||
@Command({
|
@Command({
|
||||||
name: 'reset-admin-password',
|
name: 'reset-admin-password',
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query, Res } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query, Res } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
|
import { ActivityService } from 'src/domain/activity/activity.service';
|
||||||
import {
|
import {
|
||||||
ActivityCreateDto,
|
ActivityCreateDto,
|
||||||
ActivityDto,
|
ActivityDto,
|
||||||
ActivityResponseDto,
|
ActivityResponseDto,
|
||||||
ActivitySearchDto,
|
ActivitySearchDto,
|
||||||
ActivityStatisticsResponseDto,
|
ActivityStatisticsResponseDto,
|
||||||
} from 'src/domain/activity/activity.dto';
|
} from 'src/dtos/activity.dto';
|
||||||
import { ActivityService } from 'src/domain/activity/activity.service';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { AlbumCountResponseDto, AlbumResponseDto } from 'src/domain/album/album-response.dto';
|
|
||||||
import { AlbumService } from 'src/domain/album/album.service';
|
import { AlbumService } from 'src/domain/album/album.service';
|
||||||
import { AddUsersDto } from 'src/domain/album/dto/album-add-users.dto';
|
import {
|
||||||
import { CreateAlbumDto } from 'src/domain/album/dto/album-create.dto';
|
AddUsersDto,
|
||||||
import { UpdateAlbumDto } from 'src/domain/album/dto/album-update.dto';
|
AlbumCountResponseDto,
|
||||||
import { AlbumInfoDto } from 'src/domain/album/dto/album.dto';
|
AlbumInfoDto,
|
||||||
import { GetAlbumsDto } from 'src/domain/album/dto/get-albums.dto';
|
AlbumResponseDto,
|
||||||
import { BulkIdResponseDto, BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
CreateAlbumDto,
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
GetAlbumsDto,
|
||||||
|
UpdateAlbumDto,
|
||||||
|
} from 'src/dtos/album.dto';
|
||||||
|
import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
|
||||||
import { ParseMeUUIDPipe, UUIDParamDto } from 'src/validation';
|
import { ParseMeUUIDPipe, UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,13 +1,8 @@
|
|||||||
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import {
|
|
||||||
APIKeyCreateDto,
|
|
||||||
APIKeyCreateResponseDto,
|
|
||||||
APIKeyResponseDto,
|
|
||||||
APIKeyUpdateDto,
|
|
||||||
} from 'src/domain/api-key/api-key.dto';
|
|
||||||
import { APIKeyService } from 'src/domain/api-key/api-key.service';
|
import { APIKeyService } from 'src/domain/api-key/api-key.service';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto, APIKeyUpdateDto } from 'src/dtos/api-key.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,25 +1,22 @@
|
|||||||
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common';
|
||||||
import { ApiOperation, ApiTags } from '@nestjs/swagger';
|
import { ApiOperation, ApiTags } from '@nestjs/swagger';
|
||||||
import { AssetService } from 'src/domain/asset/asset.service';
|
import { AssetService } from 'src/domain/asset/asset.service';
|
||||||
import { AssetJobsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
import { SearchService } from 'src/domain/search/search.service';
|
||||||
import { UpdateStackParentDto } from 'src/domain/asset/dto/asset-stack.dto';
|
import { AssetResponseDto, MemoryLaneResponseDto } from 'src/dtos/asset-response.dto';
|
||||||
import { AssetStatsDto, AssetStatsResponseDto } from 'src/domain/asset/dto/asset-statistics.dto';
|
|
||||||
import {
|
import {
|
||||||
AssetBulkDeleteDto,
|
AssetBulkDeleteDto,
|
||||||
AssetBulkUpdateDto,
|
AssetBulkUpdateDto,
|
||||||
|
AssetJobsDto,
|
||||||
|
AssetStatsDto,
|
||||||
|
AssetStatsResponseDto,
|
||||||
DeviceIdDto,
|
DeviceIdDto,
|
||||||
RandomAssetsDto,
|
RandomAssetsDto,
|
||||||
UpdateAssetDto,
|
UpdateAssetDto,
|
||||||
} from 'src/domain/asset/dto/asset.dto';
|
} from 'src/dtos/asset.dto';
|
||||||
import { MapMarkerDto } from 'src/domain/asset/dto/map-marker.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { MemoryLaneDto } from 'src/domain/asset/dto/memory-lane.dto';
|
import { MapMarkerDto, MapMarkerResponseDto, MemoryLaneDto, MetadataSearchDto } from 'src/dtos/search.dto';
|
||||||
import { TimeBucketAssetDto, TimeBucketDto } from 'src/domain/asset/dto/time-bucket.dto';
|
import { UpdateStackParentDto } from 'src/dtos/stack.dto';
|
||||||
import { AssetResponseDto, MemoryLaneResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { TimeBucketAssetDto, TimeBucketDto, TimeBucketResponseDto } from 'src/dtos/time-bucket.dto';
|
||||||
import { MapMarkerResponseDto } from 'src/domain/asset/response-dto/map-marker-response.dto';
|
|
||||||
import { TimeBucketResponseDto } from 'src/domain/asset/response-dto/time-bucket-response.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { MetadataSearchDto } from 'src/domain/search/dto/search.dto';
|
|
||||||
import { SearchService } from 'src/domain/search/search.service';
|
|
||||||
import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
|
||||||
import { Route } from 'src/middleware/file-upload.interceptor';
|
import { Route } from 'src/middleware/file-upload.interceptor';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { Body, Controller, Get, Post, Query } from '@nestjs/common';
|
import { Body, Controller, Get, Post, Query } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
import { AuditService } from 'src/domain/audit/audit.service';
|
||||||
import {
|
import {
|
||||||
AuditDeletesDto,
|
AuditDeletesDto,
|
||||||
AuditDeletesResponseDto,
|
AuditDeletesResponseDto,
|
||||||
@ -7,9 +8,8 @@ import {
|
|||||||
FileChecksumResponseDto,
|
FileChecksumResponseDto,
|
||||||
FileReportDto,
|
FileReportDto,
|
||||||
FileReportFixDto,
|
FileReportFixDto,
|
||||||
} from 'src/domain/audit/audit.dto';
|
} from 'src/dtos/audit.dto';
|
||||||
import { AuditService } from 'src/domain/audit/audit.service';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { AdminRoute, Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { AdminRoute, Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('Audit')
|
@ApiTags('Audit')
|
||||||
|
@ -2,6 +2,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Req,
|
|||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
import { IMMICH_ACCESS_COOKIE, IMMICH_AUTH_TYPE_COOKIE, IMMICH_IS_AUTHENTICATED } from 'src/domain/auth/auth.constant';
|
import { IMMICH_ACCESS_COOKIE, IMMICH_AUTH_TYPE_COOKIE, IMMICH_IS_AUTHENTICATED } from 'src/domain/auth/auth.constant';
|
||||||
|
import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
|
||||||
import {
|
import {
|
||||||
AuthDeviceResponseDto,
|
AuthDeviceResponseDto,
|
||||||
AuthDto,
|
AuthDto,
|
||||||
@ -11,9 +12,8 @@ import {
|
|||||||
LogoutResponseDto,
|
LogoutResponseDto,
|
||||||
SignUpDto,
|
SignUpDto,
|
||||||
ValidateAccessTokenResponseDto,
|
ValidateAccessTokenResponseDto,
|
||||||
} from 'src/domain/auth/auth.dto';
|
} from 'src/dtos/auth.dto';
|
||||||
import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
|
import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
|
||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { Auth, Authenticated, GetLoginDetails, PublicRoute } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, GetLoginDetails, PublicRoute } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { Body, Controller, HttpCode, HttpStatus, Next, Param, Post, Res, StreamableFile } from '@nestjs/common';
|
import { Body, Controller, HttpCode, HttpStatus, Next, Param, Post, Res, StreamableFile } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { NextFunction, Response } from 'express';
|
import { NextFunction, Response } from 'express';
|
||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { DownloadInfoDto, DownloadResponseDto } from 'src/domain/download/download.dto';
|
|
||||||
import { DownloadService } from 'src/domain/download/download.service';
|
import { DownloadService } from 'src/domain/download/download.service';
|
||||||
|
import { AssetIdsDto } from 'src/dtos/asset.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { DownloadInfoDto, DownloadResponseDto } from 'src/dtos/download.dto';
|
||||||
import { asStreamableFile, sendFile } from 'src/immich/app.utils';
|
import { asStreamableFile, sendFile } from 'src/immich/app.utils';
|
||||||
import { Auth, Authenticated, FileResponse, SharedLinkRoute } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, FileResponse, SharedLinkRoute } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Body, Controller, Get, Param, Put, Query } from '@nestjs/common';
|
import { Body, Controller, Get, Param, Put, Query } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { AssetFaceResponseDto, FaceDto, PersonResponseDto } from 'src/domain/person/person.dto';
|
|
||||||
import { PersonService } from 'src/domain/person/person.service';
|
import { PersonService } from 'src/domain/person/person.service';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { AssetFaceResponseDto, FaceDto, PersonResponseDto } from 'src/dtos/person.dto';
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Body, Controller, Get, Param, Put } from '@nestjs/common';
|
import { Body, Controller, Get, Param, Put } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { AllJobStatusResponseDto, JobCommandDto, JobIdParamDto, JobStatusDto } from 'src/domain/job/job.dto';
|
|
||||||
import { JobService } from 'src/domain/job/job.service';
|
import { JobService } from 'src/domain/job/job.service';
|
||||||
|
import { AllJobStatusResponseDto, JobCommandDto, JobIdParamDto, JobStatusDto } from 'src/dtos/job.dto';
|
||||||
import { Authenticated } from 'src/middleware/auth.guard';
|
import { Authenticated } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('Job')
|
@ApiTags('Job')
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
import { LibraryService } from 'src/domain/library/library.service';
|
||||||
import {
|
import {
|
||||||
CreateLibraryDto,
|
CreateLibraryDto,
|
||||||
LibraryResponseDto,
|
LibraryResponseDto,
|
||||||
@ -9,8 +10,7 @@ import {
|
|||||||
UpdateLibraryDto,
|
UpdateLibraryDto,
|
||||||
ValidateLibraryDto,
|
ValidateLibraryDto,
|
||||||
ValidateLibraryResponseDto,
|
ValidateLibraryResponseDto,
|
||||||
} from 'src/domain/library/library.dto';
|
} from 'src/dtos/library.dto';
|
||||||
import { LibraryService } from 'src/domain/library/library.service';
|
|
||||||
import { AdminRoute, Authenticated } from 'src/middleware/auth.guard';
|
import { AdminRoute, Authenticated } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import { Body, Controller, Get, HttpStatus, Post, Redirect, Req, Res } from '@nestjs/common';
|
import { Body, Controller, Get, HttpStatus, Post, Redirect, Req, Res } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
|
import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
|
||||||
import {
|
import {
|
||||||
AuthDto,
|
AuthDto,
|
||||||
LoginResponseDto,
|
LoginResponseDto,
|
||||||
OAuthAuthorizeResponseDto,
|
OAuthAuthorizeResponseDto,
|
||||||
OAuthCallbackDto,
|
OAuthCallbackDto,
|
||||||
OAuthConfigDto,
|
OAuthConfigDto,
|
||||||
} from 'src/domain/auth/auth.dto';
|
} from 'src/dtos/auth.dto';
|
||||||
import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
|
import { UserResponseDto } from 'src/dtos/user.dto';
|
||||||
import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { Auth, Authenticated, GetLoginDetails, PublicRoute } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, GetLoginDetails, PublicRoute } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('OAuth')
|
@ApiTags('OAuth')
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
|
||||||
import { ApiQuery, ApiTags } from '@nestjs/swagger';
|
import { ApiQuery, ApiTags } from '@nestjs/swagger';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { PartnerResponseDto, UpdatePartnerDto } from 'src/domain/partner/partner.dto';
|
|
||||||
import { PartnerService } from 'src/domain/partner/partner.service';
|
import { PartnerService } from 'src/domain/partner/partner.service';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { PartnerResponseDto, UpdatePartnerDto } from 'src/dtos/partner.dto';
|
||||||
import { PartnerDirection } from 'src/interfaces/partner.repository';
|
import { PartnerDirection } from 'src/interfaces/partner.repository';
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import { Body, Controller, Get, Next, Param, Post, Put, Query, Res } from '@nestjs/common';
|
import { Body, Controller, Get, Next, Param, Post, Put, Query, Res } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { NextFunction, Response } from 'express';
|
import { NextFunction, Response } from 'express';
|
||||||
import { BulkIdResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
import { PersonService } from 'src/domain/person/person.service';
|
||||||
import { AssetResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { BulkIdResponseDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AssetResponseDto } from 'src/dtos/asset-response.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import {
|
import {
|
||||||
AssetFaceUpdateDto,
|
AssetFaceUpdateDto,
|
||||||
MergePersonDto,
|
MergePersonDto,
|
||||||
@ -14,8 +15,7 @@ import {
|
|||||||
PersonSearchDto,
|
PersonSearchDto,
|
||||||
PersonStatisticsResponseDto,
|
PersonStatisticsResponseDto,
|
||||||
PersonUpdateDto,
|
PersonUpdateDto,
|
||||||
} from 'src/domain/person/person.dto';
|
} from 'src/dtos/person.dto';
|
||||||
import { PersonService } from 'src/domain/person/person.service';
|
|
||||||
import { sendFile } from 'src/immich/app.utils';
|
import { sendFile } from 'src/immich/app.utils';
|
||||||
import { Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
import { Body, Controller, Get, HttpCode, HttpStatus, Post, Query } from '@nestjs/common';
|
import { Body, Controller, Get, HttpCode, HttpStatus, Post, Query } from '@nestjs/common';
|
||||||
import { ApiOperation, ApiTags } from '@nestjs/swagger';
|
import { ApiOperation, ApiTags } from '@nestjs/swagger';
|
||||||
import { AssetResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { SearchService } from 'src/domain/search/search.service';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AssetResponseDto } from 'src/dtos/asset-response.dto';
|
||||||
import { PersonResponseDto } from 'src/domain/person/person.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { SearchSuggestionRequestDto } from 'src/domain/search/dto/search-suggestion.dto';
|
import { PersonResponseDto } from 'src/dtos/person.dto';
|
||||||
import {
|
import {
|
||||||
MetadataSearchDto,
|
MetadataSearchDto,
|
||||||
PlacesResponseDto,
|
PlacesResponseDto,
|
||||||
SearchDto,
|
SearchDto,
|
||||||
|
SearchExploreResponseDto,
|
||||||
SearchPeopleDto,
|
SearchPeopleDto,
|
||||||
SearchPlacesDto,
|
SearchPlacesDto,
|
||||||
|
SearchResponseDto,
|
||||||
|
SearchSuggestionRequestDto,
|
||||||
SmartSearchDto,
|
SmartSearchDto,
|
||||||
} from 'src/domain/search/dto/search.dto';
|
} from 'src/dtos/search.dto';
|
||||||
import { SearchExploreResponseDto } from 'src/domain/search/response-dto/search-explore.response.dto';
|
|
||||||
import { SearchResponseDto } from 'src/domain/search/response-dto/search-response.dto';
|
|
||||||
import { SearchService } from 'src/domain/search/search.service';
|
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('Search')
|
@ApiTags('Search')
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { Controller, Get, HttpCode, HttpStatus, Post } from '@nestjs/common';
|
import { Controller, Get, HttpCode, HttpStatus, Post } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
import { ServerInfoService } from 'src/domain/server-info/server-info.service';
|
||||||
import {
|
import {
|
||||||
ServerConfigDto,
|
ServerConfigDto,
|
||||||
ServerFeaturesDto,
|
ServerFeaturesDto,
|
||||||
@ -9,8 +10,7 @@ import {
|
|||||||
ServerStatsResponseDto,
|
ServerStatsResponseDto,
|
||||||
ServerThemeDto,
|
ServerThemeDto,
|
||||||
ServerVersionResponseDto,
|
ServerVersionResponseDto,
|
||||||
} from 'src/domain/server-info/server-info.dto';
|
} from 'src/dtos/server-info.dto';
|
||||||
import { ServerInfoService } from 'src/domain/server-info/server-info.service';
|
|
||||||
import { AdminRoute, Authenticated, PublicRoute } from 'src/middleware/auth.guard';
|
import { AdminRoute, Authenticated, PublicRoute } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('Server Info')
|
@ApiTags('Server Info')
|
||||||
|
@ -1,13 +1,17 @@
|
|||||||
import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, Req, Res } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, Req, Res } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
|
||||||
import { AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { IMMICH_SHARED_LINK_ACCESS_COOKIE } from 'src/domain/auth/auth.constant';
|
import { IMMICH_SHARED_LINK_ACCESS_COOKIE } from 'src/domain/auth/auth.constant';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { SharedLinkResponseDto } from 'src/domain/shared-link/shared-link-response.dto';
|
|
||||||
import { SharedLinkCreateDto, SharedLinkEditDto, SharedLinkPasswordDto } from 'src/domain/shared-link/shared-link.dto';
|
|
||||||
import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
|
import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
|
||||||
|
import { AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AssetIdsDto } from 'src/dtos/asset.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import {
|
||||||
|
SharedLinkCreateDto,
|
||||||
|
SharedLinkEditDto,
|
||||||
|
SharedLinkPasswordDto,
|
||||||
|
SharedLinkResponseDto,
|
||||||
|
} from 'src/dtos/shared-link.dto';
|
||||||
import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { Body, Controller, Get, Put, Query } from '@nestjs/common';
|
import { Body, Controller, Get, Put, Query } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { SystemConfigDto } from 'src/domain/system-config/dto/system-config.dto';
|
|
||||||
import { SystemConfigTemplateStorageOptionDto } from 'src/domain/system-config/response-dto/system-config-template-storage-option.dto';
|
|
||||||
import { MapThemeDto } from 'src/domain/system-config/system-config-map-theme.dto';
|
import { MapThemeDto } from 'src/domain/system-config/system-config-map-theme.dto';
|
||||||
import { SystemConfigService } from 'src/domain/system-config/system-config.service';
|
import { SystemConfigService } from 'src/domain/system-config/system-config.service';
|
||||||
|
import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto';
|
||||||
|
import { SystemConfigDto } from 'src/dtos/system-config.dto';
|
||||||
import { AdminRoute, Authenticated } from 'src/middleware/auth.guard';
|
import { AdminRoute, Authenticated } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('System Config')
|
@ApiTags('System Config')
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
import { Body, Controller, Delete, Get, Param, Patch, Post, Put } from '@nestjs/common';
|
import { Body, Controller, Delete, Get, Param, Patch, Post, Put } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
|
||||||
import { AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { AssetResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { TagResponseDto } from 'src/domain/tag/tag-response.dto';
|
|
||||||
import { CreateTagDto, UpdateTagDto } from 'src/domain/tag/tag.dto';
|
|
||||||
import { TagService } from 'src/domain/tag/tag.service';
|
import { TagService } from 'src/domain/tag/tag.service';
|
||||||
|
import { AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AssetResponseDto } from 'src/dtos/asset-response.dto';
|
||||||
|
import { AssetIdsDto } from 'src/dtos/asset.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { CreateTagDto, TagResponseDto, UpdateTagDto } from 'src/dtos/tag.dto';
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
import { UUIDParamDto } from 'src/validation';
|
import { UUIDParamDto } from 'src/validation';
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common';
|
import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common';
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
import { BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { TrashService } from 'src/domain/trash/trash.service';
|
import { TrashService } from 'src/domain/trash/trash.service';
|
||||||
|
import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
||||||
|
|
||||||
@ApiTags('Trash')
|
@ApiTags('Trash')
|
||||||
|
@ -16,14 +16,10 @@ import {
|
|||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger';
|
import { ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger';
|
||||||
import { NextFunction, Response } from 'express';
|
import { NextFunction, Response } from 'express';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { CreateProfileImageDto } from 'src/domain/user/dto/create-profile-image.dto';
|
|
||||||
import { CreateUserDto } from 'src/domain/user/dto/create-user.dto';
|
|
||||||
import { DeleteUserDto } from 'src/domain/user/dto/delete-user.dto';
|
|
||||||
import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
|
|
||||||
import { CreateProfileImageResponseDto } from 'src/domain/user/response-dto/create-profile-image-response.dto';
|
|
||||||
import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { UserService } from 'src/domain/user/user.service';
|
import { UserService } from 'src/domain/user/user.service';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { CreateProfileImageDto, CreateProfileImageResponseDto } from 'src/dtos/user-profile.dto';
|
||||||
|
import { CreateUserDto, DeleteUserDto, UpdateUserDto, UserResponseDto } from 'src/dtos/user.dto';
|
||||||
import { sendFile } from 'src/immich/app.utils';
|
import { sendFile } from 'src/immich/app.utils';
|
||||||
import { AdminRoute, Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard';
|
import { AdminRoute, Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard';
|
||||||
import { FileUploadInterceptor, Route } from 'src/middleware/file-upload.interceptor';
|
import { FileUploadInterceptor, Route } from 'src/middleware/file-upload.interceptor';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
|
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { SharedLinkEntity } from 'src/entities/shared-link.entity';
|
import { SharedLinkEntity } from 'src/entities/shared-link.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
import { setDifference, setIsEqual, setUnion } from 'src/utils';
|
import { setDifference, setIsEqual, setUnion } from 'src/utils';
|
||||||
|
@ -6,7 +6,7 @@ import { load as loadYaml } from 'js-yaml';
|
|||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
import { QueueName } from 'src/domain/job/job.constants';
|
import { QueueName } from 'src/domain/job/job.constants';
|
||||||
import { SystemConfigDto } from 'src/domain/system-config/dto/system-config.dto';
|
import { SystemConfigDto } from 'src/dtos/system-config.dto';
|
||||||
import {
|
import {
|
||||||
AudioCodec,
|
AudioCodec,
|
||||||
CQMode,
|
CQMode,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { BadRequestException, ForbiddenException } from '@nestjs/common';
|
import { BadRequestException, ForbiddenException } from '@nestjs/common';
|
||||||
import sanitize from 'sanitize-filename';
|
import sanitize from 'sanitize-filename';
|
||||||
import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
|
import { UserResponseDto } from 'src/dtos/user.dto';
|
||||||
import { LibraryType } from 'src/entities/library.entity';
|
import { LibraryType } from 'src/entities/library.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
||||||
|
@ -10,8 +10,8 @@ import {
|
|||||||
ReactionLevel,
|
ReactionLevel,
|
||||||
ReactionType,
|
ReactionType,
|
||||||
mapActivity,
|
mapActivity,
|
||||||
} from 'src/domain/activity/activity.dto';
|
} from 'src/dtos/activity.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { ActivityEntity } from 'src/entities/activity.entity';
|
import { ActivityEntity } from 'src/entities/activity.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
import { IActivityRepository } from 'src/interfaces/activity.repository';
|
import { IActivityRepository } from 'src/interfaces/activity.repository';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
import { ReactionType } from 'src/domain/activity/activity.dto';
|
|
||||||
import { ActivityService } from 'src/domain/activity/activity.service';
|
import { ActivityService } from 'src/domain/activity/activity.service';
|
||||||
|
import { ReactionType } from 'src/dtos/activity.dto';
|
||||||
import { IActivityRepository } from 'src/interfaces/activity.repository';
|
import { IActivityRepository } from 'src/interfaces/activity.repository';
|
||||||
import { activityStub } from 'test/fixtures/activity.stub';
|
import { activityStub } from 'test/fixtures/activity.stub';
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
import { authStub } from 'test/fixtures/auth.stub';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { AlbumService } from 'src/domain/album/album.service';
|
import { AlbumService } from 'src/domain/album/album.service';
|
||||||
import { BulkIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.repository';
|
import { IAlbumRepository } from 'src/interfaces/album.repository';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
import { IUserRepository } from 'src/interfaces/user.repository';
|
import { IUserRepository } from 'src/interfaces/user.repository';
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import {
|
import {
|
||||||
|
AddUsersDto,
|
||||||
AlbumCountResponseDto,
|
AlbumCountResponseDto,
|
||||||
|
AlbumInfoDto,
|
||||||
AlbumResponseDto,
|
AlbumResponseDto,
|
||||||
|
CreateAlbumDto,
|
||||||
|
GetAlbumsDto,
|
||||||
|
UpdateAlbumDto,
|
||||||
mapAlbum,
|
mapAlbum,
|
||||||
mapAlbumWithAssets,
|
mapAlbumWithAssets,
|
||||||
mapAlbumWithoutAssets,
|
mapAlbumWithoutAssets,
|
||||||
} from 'src/domain/album/album-response.dto';
|
} from 'src/dtos/album.dto';
|
||||||
import { AddUsersDto } from 'src/domain/album/dto/album-add-users.dto';
|
import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { CreateAlbumDto } from 'src/domain/album/dto/album-create.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { UpdateAlbumDto } from 'src/domain/album/dto/album-update.dto';
|
|
||||||
import { AlbumInfoDto } from 'src/domain/album/dto/album.dto';
|
|
||||||
import { GetAlbumsDto } from 'src/domain/album/dto/get-albums.dto';
|
|
||||||
import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { AlbumEntity } from 'src/entities/album.entity';
|
import { AlbumEntity } from 'src/entities/album.entity';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
import { ArrayNotEmpty } from 'class-validator';
|
|
||||||
import { ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class AddUsersDto {
|
|
||||||
@ValidateUUID({ each: true })
|
|
||||||
@ArrayNotEmpty()
|
|
||||||
sharedUserIds!: string[];
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsString } from 'class-validator';
|
|
||||||
import { Optional, ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class CreateAlbumDto {
|
|
||||||
@IsString()
|
|
||||||
@ApiProperty()
|
|
||||||
albumName!: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
description?: string;
|
|
||||||
|
|
||||||
@ValidateUUID({ optional: true, each: true })
|
|
||||||
sharedWithUserIds?: string[];
|
|
||||||
|
|
||||||
@ValidateUUID({ optional: true, each: true })
|
|
||||||
assetIds?: string[];
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsEnum, IsString } from 'class-validator';
|
|
||||||
import { AssetOrder } from 'src/entities/album.entity';
|
|
||||||
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class UpdateAlbumDto {
|
|
||||||
@Optional()
|
|
||||||
@IsString()
|
|
||||||
albumName?: string;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
@IsString()
|
|
||||||
description?: string;
|
|
||||||
|
|
||||||
@ValidateUUID({ optional: true })
|
|
||||||
albumThumbnailAssetId?: string;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isActivityEnabled?: boolean;
|
|
||||||
|
|
||||||
@IsEnum(AssetOrder)
|
|
||||||
@Optional()
|
|
||||||
@ApiProperty({ enum: AssetOrder, enumName: 'AssetOrder' })
|
|
||||||
order?: AssetOrder;
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
import { ValidateBoolean } from 'src/validation';
|
|
||||||
|
|
||||||
export class AlbumInfoDto {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
withoutAssets?: boolean;
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
import { ValidateBoolean, ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class GetAlbumsDto {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
/**
|
|
||||||
* true: only shared albums
|
|
||||||
* false: only non-shared own albums
|
|
||||||
* undefined: shared and owned albums
|
|
||||||
*/
|
|
||||||
shared?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only returns albums that contain the asset
|
|
||||||
* Ignores the shared parameter
|
|
||||||
* undefined: get all albums
|
|
||||||
*/
|
|
||||||
@ValidateUUID({ optional: true })
|
|
||||||
assetId?: string;
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto } from 'src/domain/api-key/api-key.dto';
|
import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto } from 'src/dtos/api-key.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { APIKeyEntity } from 'src/entities/api-key.entity';
|
import { APIKeyEntity } from 'src/entities/api-key.entity';
|
||||||
import { IKeyRepository } from 'src/interfaces/api-key.repository';
|
import { IKeyRepository } from 'src/interfaces/api-key.repository';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
|
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
|
||||||
import { when } from 'jest-when';
|
import { when } from 'jest-when';
|
||||||
import { AssetService, UploadFieldName } from 'src/domain/asset/asset.service';
|
import { AssetService } from 'src/domain/asset/asset.service';
|
||||||
import { AssetJobName } from 'src/domain/asset/dto/asset-ids.dto';
|
|
||||||
import { AssetStatsResponseDto } from 'src/domain/asset/dto/asset-statistics.dto';
|
|
||||||
import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
import { JobName } from 'src/domain/job/job.constants';
|
import { JobName } from 'src/domain/job/job.constants';
|
||||||
|
import { mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
|
import { AssetJobName, AssetStatsResponseDto, UploadFieldName } from 'src/dtos/asset.dto';
|
||||||
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.repository';
|
import { IAssetStackRepository } from 'src/interfaces/asset-stack.repository';
|
||||||
import { AssetStats, IAssetRepository, TimeBucketSize } from 'src/interfaces/asset.repository';
|
import { AssetStats, IAssetRepository, TimeBucketSize } from 'src/interfaces/asset.repository';
|
||||||
|
@ -6,25 +6,29 @@ import sanitize from 'sanitize-filename';
|
|||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
|
import { SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { AssetJobName, AssetJobsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
import { mimeTypes } from 'src/domain/domain.constant';
|
||||||
import { UpdateStackParentDto } from 'src/domain/asset/dto/asset-stack.dto';
|
import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
|
||||||
import { AssetStatsDto, mapStats } from 'src/domain/asset/dto/asset-statistics.dto';
|
import { IAssetDeletionJob, ISidecarWriteJob } from 'src/domain/job/job.interface';
|
||||||
import { AssetBulkDeleteDto, AssetBulkUpdateDto, UpdateAssetDto } from 'src/domain/asset/dto/asset.dto';
|
|
||||||
import { MapMarkerDto } from 'src/domain/asset/dto/map-marker.dto';
|
|
||||||
import { MemoryLaneDto } from 'src/domain/asset/dto/memory-lane.dto';
|
|
||||||
import { TimeBucketAssetDto, TimeBucketDto } from 'src/domain/asset/dto/time-bucket.dto';
|
|
||||||
import {
|
import {
|
||||||
AssetResponseDto,
|
AssetResponseDto,
|
||||||
MemoryLaneResponseDto,
|
MemoryLaneResponseDto,
|
||||||
SanitizedAssetResponseDto,
|
SanitizedAssetResponseDto,
|
||||||
mapAsset,
|
mapAsset,
|
||||||
} from 'src/domain/asset/response-dto/asset-response.dto';
|
} from 'src/dtos/asset-response.dto';
|
||||||
import { MapMarkerResponseDto } from 'src/domain/asset/response-dto/map-marker-response.dto';
|
import {
|
||||||
import { TimeBucketResponseDto } from 'src/domain/asset/response-dto/time-bucket-response.dto';
|
AssetBulkDeleteDto,
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
AssetBulkUpdateDto,
|
||||||
import { mimeTypes } from 'src/domain/domain.constant';
|
AssetJobName,
|
||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
|
AssetJobsDto,
|
||||||
import { IAssetDeletionJob, ISidecarWriteJob } from 'src/domain/job/job.interface';
|
AssetStatsDto,
|
||||||
|
UpdateAssetDto,
|
||||||
|
UploadFieldName,
|
||||||
|
mapStats,
|
||||||
|
} from 'src/dtos/asset.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { MapMarkerDto, MapMarkerResponseDto, MemoryLaneDto } from 'src/dtos/search.dto';
|
||||||
|
import { UpdateStackParentDto } from 'src/dtos/stack.dto';
|
||||||
|
import { TimeBucketAssetDto, TimeBucketDto, TimeBucketResponseDto } from 'src/dtos/time-bucket.dto';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { LibraryType } from 'src/entities/library.entity';
|
import { LibraryType } from 'src/entities/library.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
@ -39,13 +43,6 @@ import { ISystemConfigRepository } from 'src/interfaces/system-config.repository
|
|||||||
import { IUserRepository } from 'src/interfaces/user.repository';
|
import { IUserRepository } from 'src/interfaces/user.repository';
|
||||||
import { usePagination } from 'src/utils';
|
import { usePagination } from 'src/utils';
|
||||||
|
|
||||||
export enum UploadFieldName {
|
|
||||||
ASSET_DATA = 'assetData',
|
|
||||||
LIVE_PHOTO_DATA = 'livePhotoData',
|
|
||||||
SIDECAR_DATA = 'sidecarData',
|
|
||||||
PROFILE_DATA = 'file',
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UploadRequest {
|
export interface UploadRequest {
|
||||||
auth: AuthDto | null;
|
auth: AuthDto | null;
|
||||||
fieldName: UploadFieldName;
|
fieldName: UploadFieldName;
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsEnum } from 'class-validator';
|
|
||||||
import { ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class AssetIdsDto {
|
|
||||||
@ValidateUUID({ each: true })
|
|
||||||
assetIds!: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum AssetJobName {
|
|
||||||
REGENERATE_THUMBNAIL = 'regenerate-thumbnail',
|
|
||||||
REFRESH_METADATA = 'refresh-metadata',
|
|
||||||
TRANSCODE_VIDEO = 'transcode-video',
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AssetJobsDto extends AssetIdsDto {
|
|
||||||
@ApiProperty({ enumName: 'AssetJobName', enum: AssetJobName })
|
|
||||||
@IsEnum(AssetJobName)
|
|
||||||
name!: AssetJobName;
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { AssetType } from 'src/entities/asset.entity';
|
|
||||||
import { AssetStats } from 'src/interfaces/asset.repository';
|
|
||||||
import { ValidateBoolean } from 'src/validation';
|
|
||||||
|
|
||||||
export class AssetStatsDto {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isArchived?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isFavorite?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isTrashed?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AssetStatsResponseDto {
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
images!: number;
|
|
||||||
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
videos!: number;
|
|
||||||
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
total!: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const mapStats = (stats: AssetStats): AssetStatsResponseDto => {
|
|
||||||
return {
|
|
||||||
images: stats[AssetType.IMAGE],
|
|
||||||
videos: stats[AssetType.VIDEO],
|
|
||||||
total: Object.values(stats).reduce((total, value) => total + value, 0),
|
|
||||||
};
|
|
||||||
};
|
|
@ -1,75 +0,0 @@
|
|||||||
import { Type } from 'class-transformer';
|
|
||||||
import {
|
|
||||||
IsDateString,
|
|
||||||
IsInt,
|
|
||||||
IsLatitude,
|
|
||||||
IsLongitude,
|
|
||||||
IsNotEmpty,
|
|
||||||
IsPositive,
|
|
||||||
IsString,
|
|
||||||
ValidateIf,
|
|
||||||
} from 'class-validator';
|
|
||||||
import { BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class DeviceIdDto {
|
|
||||||
@IsNotEmpty()
|
|
||||||
@IsString()
|
|
||||||
deviceId!: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const hasGPS = (o: { latitude: undefined; longitude: undefined }) =>
|
|
||||||
o.latitude !== undefined || o.longitude !== undefined;
|
|
||||||
const ValidateGPS = () => ValidateIf(hasGPS);
|
|
||||||
|
|
||||||
export class UpdateAssetBase {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isFavorite?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isArchived?: boolean;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
@IsDateString()
|
|
||||||
dateTimeOriginal?: string;
|
|
||||||
|
|
||||||
@ValidateGPS()
|
|
||||||
@IsLatitude()
|
|
||||||
@IsNotEmpty()
|
|
||||||
latitude?: number;
|
|
||||||
|
|
||||||
@ValidateGPS()
|
|
||||||
@IsLongitude()
|
|
||||||
@IsNotEmpty()
|
|
||||||
longitude?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AssetBulkUpdateDto extends UpdateAssetBase {
|
|
||||||
@ValidateUUID({ each: true })
|
|
||||||
ids!: string[];
|
|
||||||
|
|
||||||
@ValidateUUID({ optional: true })
|
|
||||||
stackParentId?: string;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
removeParent?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class UpdateAssetDto extends UpdateAssetBase {
|
|
||||||
@Optional()
|
|
||||||
@IsString()
|
|
||||||
description?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class RandomAssetsDto {
|
|
||||||
@Optional()
|
|
||||||
@IsInt()
|
|
||||||
@IsPositive()
|
|
||||||
@Type(() => Number)
|
|
||||||
count?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AssetBulkDeleteDto extends BulkIdsDto {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
force?: boolean;
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
import { ValidateBoolean, ValidateDate } from 'src/validation';
|
|
||||||
|
|
||||||
export class MapMarkerDto {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isArchived?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isFavorite?: boolean;
|
|
||||||
|
|
||||||
@ValidateDate({ optional: true })
|
|
||||||
fileCreatedAfter?: Date;
|
|
||||||
|
|
||||||
@ValidateDate({ optional: true })
|
|
||||||
fileCreatedBefore?: Date;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
withPartners?: boolean;
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { Type } from 'class-transformer';
|
|
||||||
import { IsInt, Max, Min } from 'class-validator';
|
|
||||||
|
|
||||||
export class MemoryLaneDto {
|
|
||||||
@IsInt()
|
|
||||||
@Type(() => Number)
|
|
||||||
@Max(31)
|
|
||||||
@Min(1)
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
day!: number;
|
|
||||||
|
|
||||||
@IsInt()
|
|
||||||
@Type(() => Number)
|
|
||||||
@Max(12)
|
|
||||||
@Min(1)
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
month!: number;
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
|
|
||||||
export class MapMarkerResponseDto {
|
|
||||||
@ApiProperty()
|
|
||||||
id!: string;
|
|
||||||
|
|
||||||
@ApiProperty({ format: 'double' })
|
|
||||||
lat!: number;
|
|
||||||
|
|
||||||
@ApiProperty({ format: 'double' })
|
|
||||||
lon!: number;
|
|
||||||
|
|
||||||
@ApiProperty()
|
|
||||||
city!: string | null;
|
|
||||||
|
|
||||||
@ApiProperty()
|
|
||||||
state!: string | null;
|
|
||||||
|
|
||||||
@ApiProperty()
|
|
||||||
country!: string | null;
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
import { SmartInfoEntity } from 'src/entities/smart-info.entity';
|
|
||||||
|
|
||||||
export class SmartInfoResponseDto {
|
|
||||||
tags?: string[] | null;
|
|
||||||
objects?: string[] | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mapSmartInfo(entity: SmartInfoEntity): SmartInfoResponseDto {
|
|
||||||
return {
|
|
||||||
tags: entity.tags,
|
|
||||||
objects: entity.objects,
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
|
|
||||||
export class TimeBucketResponseDto {
|
|
||||||
@ApiProperty({ type: 'string' })
|
|
||||||
timeBucket!: string;
|
|
||||||
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
count!: number;
|
|
||||||
}
|
|
@ -3,6 +3,8 @@ import { DateTime } from 'luxon';
|
|||||||
import { resolve } from 'node:path';
|
import { resolve } from 'node:path';
|
||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
||||||
|
import { AUDIT_LOG_MAX_DURATION } from 'src/domain/domain.constant';
|
||||||
|
import { JOBS_ASSET_PAGINATION_SIZE } from 'src/domain/job/job.constants';
|
||||||
import {
|
import {
|
||||||
AuditDeletesDto,
|
AuditDeletesDto,
|
||||||
AuditDeletesResponseDto,
|
AuditDeletesResponseDto,
|
||||||
@ -10,10 +12,8 @@ import {
|
|||||||
FileChecksumResponseDto,
|
FileChecksumResponseDto,
|
||||||
FileReportItemDto,
|
FileReportItemDto,
|
||||||
PathEntityType,
|
PathEntityType,
|
||||||
} from 'src/domain/audit/audit.dto';
|
} from 'src/dtos/audit.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { AUDIT_LOG_MAX_DURATION } from 'src/domain/domain.constant';
|
|
||||||
import { JOBS_ASSET_PAGINATION_SIZE } from 'src/domain/job/job.constants';
|
|
||||||
import { DatabaseAction } from 'src/entities/audit.entity';
|
import { DatabaseAction } from 'src/entities/audit.entity';
|
||||||
import { AssetPathType, PersonPathType, UserPathType } from 'src/entities/move.entity';
|
import { AssetPathType, PersonPathType, UserPathType } from 'src/entities/move.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
|
@ -3,8 +3,8 @@ import { IncomingHttpHeaders } from 'node:http';
|
|||||||
import { Issuer, generators } from 'openid-client';
|
import { Issuer, generators } from 'openid-client';
|
||||||
import { Socket } from 'socket.io';
|
import { Socket } from 'socket.io';
|
||||||
import { AuthType } from 'src/domain/auth/auth.constant';
|
import { AuthType } from 'src/domain/auth/auth.constant';
|
||||||
import { AuthDto, SignUpDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { AuthService } from 'src/domain/auth/auth.service';
|
import { AuthService } from 'src/domain/auth/auth.service';
|
||||||
|
import { AuthDto, SignUpDto } from 'src/dtos/auth.dto';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import { IKeyRepository } from 'src/interfaces/api-key.repository';
|
import { IKeyRepository } from 'src/interfaces/api-key.repository';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
||||||
|
@ -35,8 +35,8 @@ import {
|
|||||||
SignUpDto,
|
SignUpDto,
|
||||||
mapLoginResponse,
|
mapLoginResponse,
|
||||||
mapUserToken,
|
mapUserToken,
|
||||||
} from 'src/domain/auth/auth.dto';
|
} from 'src/dtos/auth.dto';
|
||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
|
||||||
import { SystemConfig } from 'src/entities/system-config.entity';
|
import { SystemConfig } from 'src/entities/system-config.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
import { when } from 'jest-when';
|
import { when } from 'jest-when';
|
||||||
import { DownloadResponseDto } from 'src/domain/download/download.dto';
|
|
||||||
import { DownloadService } from 'src/domain/download/download.service';
|
import { DownloadService } from 'src/domain/download/download.service';
|
||||||
|
import { DownloadResponseDto } from 'src/dtos/download.dto';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.repository';
|
import { IStorageRepository } from 'src/interfaces/storage.repository';
|
||||||
import { CacheControl, ImmichFileResponse } from 'src/utils';
|
import { CacheControl, ImmichFileResponse } from 'src/utils';
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { parse } from 'node:path';
|
import { parse } from 'node:path';
|
||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { mimeTypes } from 'src/domain/domain.constant';
|
import { mimeTypes } from 'src/domain/domain.constant';
|
||||||
import { DownloadArchiveInfo, DownloadInfoDto, DownloadResponseDto } from 'src/domain/download/download.dto';
|
import { AssetIdsDto } from 'src/dtos/asset.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { DownloadArchiveInfo, DownloadInfoDto, DownloadResponseDto } from 'src/dtos/download.dto';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
|
import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
import { ConcurrentQueueName, JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
|
import { ConcurrentQueueName, JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
|
||||||
import { AllJobStatusResponseDto, JobCommandDto, JobStatusDto } from 'src/domain/job/job.dto';
|
import { mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
|
import { AllJobStatusResponseDto, JobCommandDto, JobStatusDto } from 'src/dtos/job.dto';
|
||||||
import { AssetType } from 'src/entities/asset.entity';
|
import { AssetType } from 'src/entities/asset.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
|
@ -5,8 +5,8 @@ import { Stats } from 'node:fs';
|
|||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
|
import { SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { JobName } from 'src/domain/job/job.constants';
|
import { JobName } from 'src/domain/job/job.constants';
|
||||||
import { ILibraryFileJob, ILibraryRefreshJob } from 'src/domain/job/job.interface';
|
import { ILibraryFileJob, ILibraryRefreshJob } from 'src/domain/job/job.interface';
|
||||||
import { mapLibrary } from 'src/domain/library/library.dto';
|
|
||||||
import { LibraryService } from 'src/domain/library/library.service';
|
import { LibraryService } from 'src/domain/library/library.service';
|
||||||
|
import { mapLibrary } from 'src/dtos/library.dto';
|
||||||
import { AssetType } from 'src/entities/asset.entity';
|
import { AssetType } from 'src/entities/asset.entity';
|
||||||
import { LibraryType } from 'src/entities/library.entity';
|
import { LibraryType } from 'src/entities/library.entity';
|
||||||
import { SystemConfig, SystemConfigKey } from 'src/entities/system-config.entity';
|
import { SystemConfig, SystemConfigKey } from 'src/entities/system-config.entity';
|
||||||
|
@ -22,7 +22,7 @@ import {
|
|||||||
ValidateLibraryImportPathResponseDto,
|
ValidateLibraryImportPathResponseDto,
|
||||||
ValidateLibraryResponseDto,
|
ValidateLibraryResponseDto,
|
||||||
mapLibrary,
|
mapLibrary,
|
||||||
} from 'src/domain/library/library.dto';
|
} from 'src/dtos/library.dto';
|
||||||
import { AssetType } from 'src/entities/asset.entity';
|
import { AssetType } from 'src/entities/asset.entity';
|
||||||
import { LibraryEntity, LibraryType } from 'src/entities/library.entity';
|
import { LibraryEntity, LibraryType } from 'src/entities/library.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
|
@ -13,7 +13,7 @@ import {
|
|||||||
VAAPIConfig,
|
VAAPIConfig,
|
||||||
VP9Config,
|
VP9Config,
|
||||||
} from 'src/domain/media/media.util';
|
} from 'src/domain/media/media.util';
|
||||||
import { SystemConfigFFmpegDto } from 'src/domain/system-config/dto/system-config-ffmpeg.dto';
|
import { SystemConfigFFmpegDto } from 'src/dtos/system-config-ffmpeg.dto';
|
||||||
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
||||||
import { AssetPathType } from 'src/entities/move.entity';
|
import { AssetPathType } from 'src/entities/move.entity';
|
||||||
import {
|
import {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { SystemConfigFFmpegDto } from 'src/domain/system-config/dto/system-config-ffmpeg.dto';
|
import { SystemConfigFFmpegDto } from 'src/dtos/system-config-ffmpeg.dto';
|
||||||
import { CQMode, ToneMapping, TranscodeHWAccel, TranscodeTarget, VideoCodec } from 'src/entities/system-config.entity';
|
import { CQMode, ToneMapping, TranscodeHWAccel, TranscodeTarget, VideoCodec } from 'src/entities/system-config.entity';
|
||||||
import {
|
import {
|
||||||
AudioStreamInfo,
|
AudioStreamInfo,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
import { PartnerResponseDto } from 'src/domain/partner/partner.dto';
|
|
||||||
import { PartnerService } from 'src/domain/partner/partner.service';
|
import { PartnerService } from 'src/domain/partner/partner.service';
|
||||||
|
import { PartnerResponseDto } from 'src/dtos/partner.dto';
|
||||||
import { UserAvatarColor } from 'src/entities/user.entity';
|
import { UserAvatarColor } from 'src/entities/user.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
import { IPartnerRepository, PartnerDirection } from 'src/interfaces/partner.repository';
|
import { IPartnerRepository, PartnerDirection } from 'src/interfaces/partner.repository';
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { PartnerResponseDto, UpdatePartnerDto } from 'src/domain/partner/partner.dto';
|
import { PartnerResponseDto, UpdatePartnerDto } from 'src/dtos/partner.dto';
|
||||||
import { mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
import { mapUser } from 'src/dtos/user.dto';
|
||||||
import { PartnerEntity } from 'src/entities/partner.entity';
|
import { PartnerEntity } from 'src/entities/partner.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
import { IPartnerRepository, PartnerDirection, PartnerIds } from 'src/interfaces/partner.repository';
|
import { IPartnerRepository, PartnerDirection, PartnerIds } from 'src/interfaces/partner.repository';
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { BadRequestException, NotFoundException } from '@nestjs/common';
|
import { BadRequestException, NotFoundException } from '@nestjs/common';
|
||||||
import { BulkIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { JobName } from 'src/domain/job/job.constants';
|
import { JobName } from 'src/domain/job/job.constants';
|
||||||
import { PersonResponseDto, mapFaces, mapPerson } from 'src/domain/person/person.dto';
|
|
||||||
import { PersonService } from 'src/domain/person/person.service';
|
import { PersonService } from 'src/domain/person/person.service';
|
||||||
|
import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { PersonResponseDto, mapFaces, mapPerson } from 'src/dtos/person.dto';
|
||||||
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
||||||
import { Colorspace, SystemConfigKey } from 'src/entities/system-config.entity';
|
import { Colorspace, SystemConfigKey } from 'src/entities/system-config.entity';
|
||||||
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
|
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
|
||||||
|
@ -2,13 +2,13 @@ import { BadRequestException, Inject, Injectable, NotFoundException } from '@nes
|
|||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { StorageCore } from 'src/cores/storage.core';
|
import { StorageCore } from 'src/cores/storage.core';
|
||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
|
import { SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { BulkIdErrorReason, BulkIdResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { mimeTypes } from 'src/domain/domain.constant';
|
import { mimeTypes } from 'src/domain/domain.constant';
|
||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from 'src/domain/job/job.constants';
|
import { JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from 'src/domain/job/job.constants';
|
||||||
import { IBaseJob, IDeferrableJob, IEntityJob } from 'src/domain/job/job.interface';
|
import { IBaseJob, IDeferrableJob, IEntityJob } from 'src/domain/job/job.interface';
|
||||||
import { FACE_THUMBNAIL_SIZE } from 'src/domain/media/media.constant';
|
import { FACE_THUMBNAIL_SIZE } from 'src/domain/media/media.constant';
|
||||||
|
import { BulkIdErrorReason, BulkIdResponseDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import {
|
import {
|
||||||
AssetFaceResponseDto,
|
AssetFaceResponseDto,
|
||||||
AssetFaceUpdateDto,
|
AssetFaceUpdateDto,
|
||||||
@ -23,7 +23,7 @@ import {
|
|||||||
PersonUpdateDto,
|
PersonUpdateDto,
|
||||||
mapFaces,
|
mapFaces,
|
||||||
mapPerson,
|
mapPerson,
|
||||||
} from 'src/domain/person/person.dto';
|
} from 'src/dtos/person.dto';
|
||||||
import { PersonPathType } from 'src/entities/move.entity';
|
import { PersonPathType } from 'src/entities/move.entity';
|
||||||
import { PersonEntity } from 'src/entities/person.entity';
|
import { PersonEntity } from 'src/entities/person.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
|
|
||||||
import { Optional } from 'src/validation';
|
|
||||||
|
|
||||||
export enum SearchSuggestionType {
|
|
||||||
COUNTRY = 'country',
|
|
||||||
STATE = 'state',
|
|
||||||
CITY = 'city',
|
|
||||||
CAMERA_MAKE = 'camera-make',
|
|
||||||
CAMERA_MODEL = 'camera-model',
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SearchSuggestionRequestDto {
|
|
||||||
@IsEnum(SearchSuggestionType)
|
|
||||||
@IsNotEmpty()
|
|
||||||
@ApiProperty({ enumName: 'SearchSuggestionType', enum: SearchSuggestionType })
|
|
||||||
type!: SearchSuggestionType;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
country?: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
state?: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
make?: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
model?: string;
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
import { AssetResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
|
|
||||||
class SearchExploreItem {
|
|
||||||
value!: string;
|
|
||||||
data!: AssetResponseDto;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SearchExploreResponseDto {
|
|
||||||
fieldName!: string;
|
|
||||||
items!: SearchExploreItem[];
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { AlbumResponseDto } from 'src/domain/album/album-response.dto';
|
|
||||||
import { AssetResponseDto } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
|
|
||||||
class SearchFacetCountResponseDto {
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
count!: number;
|
|
||||||
value!: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
class SearchFacetResponseDto {
|
|
||||||
fieldName!: string;
|
|
||||||
counts!: SearchFacetCountResponseDto[];
|
|
||||||
}
|
|
||||||
|
|
||||||
class SearchAlbumResponseDto {
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
total!: number;
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
count!: number;
|
|
||||||
items!: AlbumResponseDto[];
|
|
||||||
facets!: SearchFacetResponseDto[];
|
|
||||||
}
|
|
||||||
|
|
||||||
class SearchAssetResponseDto {
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
total!: number;
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
count!: number;
|
|
||||||
items!: AssetResponseDto[];
|
|
||||||
facets!: SearchFacetResponseDto[];
|
|
||||||
nextPage!: string | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SearchResponseDto {
|
|
||||||
albums!: SearchAlbumResponseDto;
|
|
||||||
assets!: SearchAssetResponseDto;
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
|
||||||
import { SearchDto } from 'src/domain/search/dto/search.dto';
|
|
||||||
import { SearchService } from 'src/domain/search/search.service';
|
import { SearchService } from 'src/domain/search/search.service';
|
||||||
|
import { mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
|
import { SearchDto } from 'src/dtos/search.dto';
|
||||||
import { SystemConfigKey } from 'src/entities/system-config.entity';
|
import { SystemConfigKey } from 'src/entities/system-config.entity';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
|
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
|
import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { PersonResponseDto } from 'src/domain/person/person.dto';
|
import { PersonResponseDto } from 'src/dtos/person.dto';
|
||||||
import { SearchSuggestionRequestDto, SearchSuggestionType } from 'src/domain/search/dto/search-suggestion.dto';
|
|
||||||
import {
|
import {
|
||||||
MetadataSearchDto,
|
MetadataSearchDto,
|
||||||
PlacesResponseDto,
|
PlacesResponseDto,
|
||||||
SearchDto,
|
SearchDto,
|
||||||
SearchPeopleDto,
|
SearchPeopleDto,
|
||||||
SearchPlacesDto,
|
SearchPlacesDto,
|
||||||
|
SearchResponseDto,
|
||||||
|
SearchSuggestionRequestDto,
|
||||||
|
SearchSuggestionType,
|
||||||
SmartSearchDto,
|
SmartSearchDto,
|
||||||
mapPlaces,
|
mapPlaces,
|
||||||
} from 'src/domain/search/dto/search.dto';
|
} from 'src/dtos/search.dto';
|
||||||
import { SearchResponseDto } from 'src/domain/search/response-dto/search-response.dto';
|
|
||||||
import { AssetOrder } from 'src/entities/album.entity';
|
import { AssetOrder } from 'src/entities/album.entity';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
|
@ -11,7 +11,7 @@ import {
|
|||||||
ServerPingResponse,
|
ServerPingResponse,
|
||||||
ServerStatsResponseDto,
|
ServerStatsResponseDto,
|
||||||
UsageByUserDto,
|
UsageByUserDto,
|
||||||
} from 'src/domain/server-info/server-info.dto';
|
} from 'src/dtos/server-info.dto';
|
||||||
import { SystemMetadataKey } from 'src/entities/system-metadata.entity';
|
import { SystemMetadataKey } from 'src/entities/system-metadata.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
|
import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsEnum, IsString } from 'class-validator';
|
|
||||||
import { SharedLinkType } from 'src/entities/shared-link.entity';
|
|
||||||
import { Optional, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation';
|
|
||||||
|
|
||||||
export class SharedLinkCreateDto {
|
|
||||||
@IsEnum(SharedLinkType)
|
|
||||||
@ApiProperty({ enum: SharedLinkType, enumName: 'SharedLinkType' })
|
|
||||||
type!: SharedLinkType;
|
|
||||||
|
|
||||||
@ValidateUUID({ each: true, optional: true })
|
|
||||||
assetIds?: string[];
|
|
||||||
|
|
||||||
@ValidateUUID({ optional: true })
|
|
||||||
albumId?: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
description?: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
password?: string;
|
|
||||||
|
|
||||||
@ValidateDate({ optional: true, nullable: true })
|
|
||||||
expiresAt?: Date | null = null;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
allowUpload?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
allowDownload?: boolean = true;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
showMetadata?: boolean = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SharedLinkEditDto {
|
|
||||||
@Optional()
|
|
||||||
description?: string;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
password?: string;
|
|
||||||
|
|
||||||
@Optional({ nullable: true })
|
|
||||||
expiresAt?: Date | null;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
allowUpload?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
allowDownload?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
showMetadata?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Few clients cannot send null to set the expiryTime to never.
|
|
||||||
* Setting this flag and not sending expiryAt is considered as null instead.
|
|
||||||
* Clients that can send null values can ignore this.
|
|
||||||
*/
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
changeExpiryTime?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SharedLinkPasswordDto {
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
@ApiProperty({ example: 'password' })
|
|
||||||
password?: string;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
token?: string;
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common';
|
import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { AssetIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
|
import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
|
||||||
|
import { AssetIdErrorReason } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { SharedLinkType } from 'src/entities/shared-link.entity';
|
import { SharedLinkType } from 'src/entities/shared-link.entity';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
||||||
import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
|
import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
import { BadRequestException, ForbiddenException, Inject, Injectable, UnauthorizedException } from '@nestjs/common';
|
import { BadRequestException, ForbiddenException, Inject, Injectable, UnauthorizedException } from '@nestjs/common';
|
||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
import { AssetIdsDto } from 'src/dtos/asset.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import {
|
import {
|
||||||
|
SharedLinkCreateDto,
|
||||||
|
SharedLinkEditDto,
|
||||||
|
SharedLinkPasswordDto,
|
||||||
SharedLinkResponseDto,
|
SharedLinkResponseDto,
|
||||||
mapSharedLink,
|
mapSharedLink,
|
||||||
mapSharedLinkWithoutMetadata,
|
mapSharedLinkWithoutMetadata,
|
||||||
} from 'src/domain/shared-link/shared-link-response.dto';
|
} from 'src/dtos/shared-link.dto';
|
||||||
import { SharedLinkCreateDto, SharedLinkEditDto, SharedLinkPasswordDto } from 'src/domain/shared-link/shared-link.dto';
|
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { SharedLinkEntity, SharedLinkType } from 'src/entities/shared-link.entity';
|
import { SharedLinkEntity, SharedLinkType } from 'src/entities/shared-link.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
export class SystemConfigTemplateStorageOptionDto {
|
|
||||||
yearOptions!: string[];
|
|
||||||
monthOptions!: string[];
|
|
||||||
weekOptions!: string[];
|
|
||||||
dayOptions!: string[];
|
|
||||||
hourOptions!: string[];
|
|
||||||
minuteOptions!: string[];
|
|
||||||
secondOptions!: string[];
|
|
||||||
presetOptions!: string[];
|
|
||||||
}
|
|
@ -3,8 +3,6 @@ import { OnEvent } from '@nestjs/event-emitter';
|
|||||||
import { instanceToPlain } from 'class-transformer';
|
import { instanceToPlain } from 'class-transformer';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
|
import { SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { SystemConfigDto, mapConfig } from 'src/domain/system-config/dto/system-config.dto';
|
|
||||||
import { SystemConfigTemplateStorageOptionDto } from 'src/domain/system-config/response-dto/system-config-template-storage-option.dto';
|
|
||||||
import {
|
import {
|
||||||
supportedDayTokens,
|
supportedDayTokens,
|
||||||
supportedHourTokens,
|
supportedHourTokens,
|
||||||
@ -15,6 +13,8 @@ import {
|
|||||||
supportedWeekTokens,
|
supportedWeekTokens,
|
||||||
supportedYearTokens,
|
supportedYearTokens,
|
||||||
} from 'src/domain/system-config/system-config.constants';
|
} from 'src/domain/system-config/system-config.constants';
|
||||||
|
import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto';
|
||||||
|
import { SystemConfigDto, mapConfig } from 'src/dtos/system-config.dto';
|
||||||
import { LogLevel, SystemConfig } from 'src/entities/system-config.entity';
|
import { LogLevel, SystemConfig } from 'src/entities/system-config.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
import {
|
import {
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
|
|
||||||
import { TagType } from 'src/entities/tag.entity';
|
|
||||||
import { Optional } from 'src/validation';
|
|
||||||
|
|
||||||
export class CreateTagDto {
|
|
||||||
@IsString()
|
|
||||||
@IsNotEmpty()
|
|
||||||
name!: string;
|
|
||||||
|
|
||||||
@IsEnum(TagType)
|
|
||||||
@IsNotEmpty()
|
|
||||||
@ApiProperty({ enumName: 'TagTypeEnum', enum: TagType })
|
|
||||||
type!: TagType;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class UpdateTagDto {
|
|
||||||
@IsString()
|
|
||||||
@Optional()
|
|
||||||
name?: string;
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
import { when } from 'jest-when';
|
import { when } from 'jest-when';
|
||||||
import { AssetIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { TagService } from 'src/domain/tag/tag.service';
|
import { TagService } from 'src/domain/tag/tag.service';
|
||||||
|
import { AssetIdErrorReason } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { TagType } from 'src/entities/tag.entity';
|
import { TagType } from 'src/entities/tag.entity';
|
||||||
import { ITagRepository } from 'src/interfaces/tag.repository';
|
import { ITagRepository } from 'src/interfaces/tag.repository';
|
||||||
import { assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub } from 'test/fixtures/asset.stub';
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
|
import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { AssetIdsDto } from 'src/dtos/asset.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { TagResponseDto, mapTag } from 'src/domain/tag/tag-response.dto';
|
import { CreateTagDto, TagResponseDto, UpdateTagDto, mapTag } from 'src/dtos/tag.dto';
|
||||||
import { CreateTagDto, UpdateTagDto } from 'src/domain/tag/tag.dto';
|
|
||||||
import { ITagRepository } from 'src/interfaces/tag.repository';
|
import { ITagRepository } from 'src/interfaces/tag.repository';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { Inject } from '@nestjs/common';
|
import { Inject } from '@nestjs/common';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
import { AccessCore, Permission } from 'src/cores/access.core';
|
import { AccessCore, Permission } from 'src/cores/access.core';
|
||||||
import { BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
|
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
|
import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
|
||||||
|
import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.repository';
|
import { IAccessRepository } from 'src/interfaces/access.repository';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
import { IAssetRepository } from 'src/interfaces/asset.repository';
|
||||||
import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
|
import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { UploadFieldName } from 'src/domain/asset/asset.service';
|
|
||||||
|
|
||||||
export class CreateProfileImageDto {
|
|
||||||
@ApiProperty({ type: 'string', format: 'binary' })
|
|
||||||
[UploadFieldName.PROFILE_DATA]!: Express.Multer.File;
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { Transform } from 'class-transformer';
|
|
||||||
import { IsEmail, IsNotEmpty, IsNumber, IsPositive, IsString } from 'class-validator';
|
|
||||||
import { Optional, ValidateBoolean, toEmail, toSanitized } from 'src/validation';
|
|
||||||
|
|
||||||
export class CreateUserDto {
|
|
||||||
@IsEmail({ require_tld: false })
|
|
||||||
@Transform(toEmail)
|
|
||||||
email!: string;
|
|
||||||
|
|
||||||
@IsNotEmpty()
|
|
||||||
@IsString()
|
|
||||||
password!: string;
|
|
||||||
|
|
||||||
@IsNotEmpty()
|
|
||||||
@IsString()
|
|
||||||
name!: string;
|
|
||||||
|
|
||||||
@Optional({ nullable: true })
|
|
||||||
@IsString()
|
|
||||||
@Transform(toSanitized)
|
|
||||||
storageLabel?: string | null;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
memoriesEnabled?: boolean;
|
|
||||||
|
|
||||||
@Optional({ nullable: true })
|
|
||||||
@IsNumber()
|
|
||||||
@IsPositive()
|
|
||||||
@ApiProperty({ type: 'integer', format: 'int64' })
|
|
||||||
quotaSizeInBytes?: number | null;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
shouldChangePassword?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class CreateAdminDto {
|
|
||||||
@IsNotEmpty()
|
|
||||||
isAdmin!: true;
|
|
||||||
|
|
||||||
@IsEmail({ require_tld: false })
|
|
||||||
@Transform(({ value }) => value?.toLowerCase())
|
|
||||||
email!: string;
|
|
||||||
|
|
||||||
@IsNotEmpty()
|
|
||||||
password!: string;
|
|
||||||
|
|
||||||
@IsNotEmpty()
|
|
||||||
name!: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class CreateUserOAuthDto {
|
|
||||||
@IsEmail({ require_tld: false })
|
|
||||||
@Transform(({ value }) => value?.toLowerCase())
|
|
||||||
email!: string;
|
|
||||||
|
|
||||||
@IsNotEmpty()
|
|
||||||
oauthId!: string;
|
|
||||||
|
|
||||||
name?: string;
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
import { ValidateBoolean } from 'src/validation';
|
|
||||||
|
|
||||||
export class DeleteUserDto {
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
force?: boolean;
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
import { plainToInstance } from 'class-transformer';
|
|
||||||
import { validate } from 'class-validator';
|
|
||||||
import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
|
|
||||||
|
|
||||||
describe('update user DTO', () => {
|
|
||||||
it('should allow emails without a tld', async () => {
|
|
||||||
const someEmail = 'test@test';
|
|
||||||
|
|
||||||
const dto = plainToInstance(UpdateUserDto, {
|
|
||||||
email: someEmail,
|
|
||||||
id: '3fe388e4-2078-44d7-b36c-39d9dee3a657',
|
|
||||||
});
|
|
||||||
const errors = await validate(dto);
|
|
||||||
expect(errors).toHaveLength(0);
|
|
||||||
expect(dto.email).toEqual(someEmail);
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,52 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { Transform } from 'class-transformer';
|
|
||||||
import { IsEmail, IsEnum, IsNotEmpty, IsNumber, IsPositive, IsString, IsUUID } from 'class-validator';
|
|
||||||
import { UserAvatarColor } from 'src/entities/user.entity';
|
|
||||||
import { Optional, ValidateBoolean, toEmail, toSanitized } from 'src/validation';
|
|
||||||
|
|
||||||
export class UpdateUserDto {
|
|
||||||
@Optional()
|
|
||||||
@IsEmail({ require_tld: false })
|
|
||||||
@Transform(toEmail)
|
|
||||||
email?: string;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
@IsNotEmpty()
|
|
||||||
@IsString()
|
|
||||||
password?: string;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
@IsString()
|
|
||||||
@IsNotEmpty()
|
|
||||||
name?: string;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
@IsString()
|
|
||||||
@Transform(toSanitized)
|
|
||||||
storageLabel?: string;
|
|
||||||
|
|
||||||
@IsNotEmpty()
|
|
||||||
@IsUUID('4')
|
|
||||||
@ApiProperty({ format: 'uuid' })
|
|
||||||
id!: string;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
isAdmin?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
shouldChangePassword?: boolean;
|
|
||||||
|
|
||||||
@ValidateBoolean({ optional: true })
|
|
||||||
memoriesEnabled?: boolean;
|
|
||||||
|
|
||||||
@Optional()
|
|
||||||
@IsEnum(UserAvatarColor)
|
|
||||||
@ApiProperty({ enumName: 'UserAvatarColor', enum: UserAvatarColor })
|
|
||||||
avatarColor?: UserAvatarColor;
|
|
||||||
|
|
||||||
@Optional({ nullable: true })
|
|
||||||
@IsNumber()
|
|
||||||
@IsPositive()
|
|
||||||
@ApiProperty({ type: 'integer', format: 'int64' })
|
|
||||||
quotaSizeInBytes?: number | null;
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
export class CreateProfileImageResponseDto {
|
|
||||||
userId!: string;
|
|
||||||
profileImagePath!: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mapCreateProfileImageResponse(userId: string, profileImagePath: string): CreateProfileImageResponseDto {
|
|
||||||
return {
|
|
||||||
userId: userId,
|
|
||||||
profileImagePath: profileImagePath,
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
|
||||||
import { IsEnum } from 'class-validator';
|
|
||||||
import { UserAvatarColor, UserEntity, UserStatus } from 'src/entities/user.entity';
|
|
||||||
|
|
||||||
export const getRandomAvatarColor = (user: UserEntity): UserAvatarColor => {
|
|
||||||
const values = Object.values(UserAvatarColor);
|
|
||||||
const randomIndex = Math.floor(
|
|
||||||
[...user.email].map((letter) => letter.codePointAt(0) ?? 0).reduce((a, b) => a + b, 0) % values.length,
|
|
||||||
);
|
|
||||||
return values[randomIndex] as UserAvatarColor;
|
|
||||||
};
|
|
||||||
|
|
||||||
export class UserDto {
|
|
||||||
id!: string;
|
|
||||||
name!: string;
|
|
||||||
email!: string;
|
|
||||||
profileImagePath!: string;
|
|
||||||
@IsEnum(UserAvatarColor)
|
|
||||||
@ApiProperty({ enumName: 'UserAvatarColor', enum: UserAvatarColor })
|
|
||||||
avatarColor!: UserAvatarColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class UserResponseDto extends UserDto {
|
|
||||||
storageLabel!: string | null;
|
|
||||||
shouldChangePassword!: boolean;
|
|
||||||
isAdmin!: boolean;
|
|
||||||
createdAt!: Date;
|
|
||||||
deletedAt!: Date | null;
|
|
||||||
updatedAt!: Date;
|
|
||||||
oauthId!: string;
|
|
||||||
memoriesEnabled?: boolean;
|
|
||||||
@ApiProperty({ type: 'integer', format: 'int64' })
|
|
||||||
quotaSizeInBytes!: number | null;
|
|
||||||
@ApiProperty({ type: 'integer', format: 'int64' })
|
|
||||||
quotaUsageInBytes!: number | null;
|
|
||||||
@ApiProperty({ enumName: 'UserStatus', enum: UserStatus })
|
|
||||||
status!: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const mapSimpleUser = (entity: UserEntity): UserDto => {
|
|
||||||
return {
|
|
||||||
id: entity.id,
|
|
||||||
email: entity.email,
|
|
||||||
name: entity.name,
|
|
||||||
profileImagePath: entity.profileImagePath,
|
|
||||||
avatarColor: entity.avatarColor ?? getRandomAvatarColor(entity),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export function mapUser(entity: UserEntity): UserResponseDto {
|
|
||||||
return {
|
|
||||||
...mapSimpleUser(entity),
|
|
||||||
storageLabel: entity.storageLabel,
|
|
||||||
shouldChangePassword: entity.shouldChangePassword,
|
|
||||||
isAdmin: entity.isAdmin,
|
|
||||||
createdAt: entity.createdAt,
|
|
||||||
deletedAt: entity.deletedAt,
|
|
||||||
updatedAt: entity.updatedAt,
|
|
||||||
oauthId: entity.oauthId,
|
|
||||||
memoriesEnabled: entity.memoriesEnabled,
|
|
||||||
quotaSizeInBytes: entity.quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes: entity.quotaUsageInBytes,
|
|
||||||
status: entity.status,
|
|
||||||
};
|
|
||||||
}
|
|
@ -6,9 +6,8 @@ import {
|
|||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { when } from 'jest-when';
|
import { when } from 'jest-when';
|
||||||
import { JobName } from 'src/domain/job/job.constants';
|
import { JobName } from 'src/domain/job/job.constants';
|
||||||
import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
|
|
||||||
import { mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { UserService } from 'src/domain/user/user.service';
|
import { UserService } from 'src/domain/user/user.service';
|
||||||
|
import { UpdateUserDto, mapUser } from 'src/dtos/user.dto';
|
||||||
import { UserEntity, UserStatus } from 'src/entities/user.entity';
|
import { UserEntity, UserStatus } from 'src/entities/user.entity';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.repository';
|
import { IAlbumRepository } from 'src/interfaces/album.repository';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
import { ICryptoRepository } from 'src/interfaces/crypto.repository';
|
||||||
|
@ -4,17 +4,11 @@ import { randomBytes } from 'node:crypto';
|
|||||||
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
|
import { SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { UserCore } from 'src/cores/user.core';
|
import { UserCore } from 'src/cores/user.core';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
|
||||||
import { JobName } from 'src/domain/job/job.constants';
|
import { JobName } from 'src/domain/job/job.constants';
|
||||||
import { IEntityJob } from 'src/domain/job/job.interface';
|
import { IEntityJob } from 'src/domain/job/job.interface';
|
||||||
import { CreateUserDto } from 'src/domain/user/dto/create-user.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { DeleteUserDto } from 'src/domain/user/dto/delete-user.dto';
|
import { CreateProfileImageResponseDto, mapCreateProfileImageResponse } from 'src/dtos/user-profile.dto';
|
||||||
import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
|
import { CreateUserDto, DeleteUserDto, UpdateUserDto, UserResponseDto, mapUser } from 'src/dtos/user.dto';
|
||||||
import {
|
|
||||||
CreateProfileImageResponseDto,
|
|
||||||
mapCreateProfileImageResponse,
|
|
||||||
} from 'src/domain/user/response-dto/create-profile-image-response.dto';
|
|
||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { UserEntity, UserStatus } from 'src/entities/user.entity';
|
import { UserEntity, UserStatus } from 'src/entities/user.entity';
|
||||||
import { ImmichLogger } from 'src/infra/logger';
|
import { ImmichLogger } from 'src/infra/logger';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.repository';
|
import { IAlbumRepository } from 'src/interfaces/album.repository';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
import { IsEnum, IsNotEmpty, IsString, ValidateIf } from 'class-validator';
|
import { IsEnum, IsNotEmpty, IsString, ValidateIf } from 'class-validator';
|
||||||
import { UserDto, mapSimpleUser } from 'src/domain/user/response-dto/user-response.dto';
|
import { UserDto, mapSimpleUser } from 'src/dtos/user.dto';
|
||||||
import { ActivityEntity } from 'src/entities/activity.entity';
|
import { ActivityEntity } from 'src/entities/activity.entity';
|
||||||
import { Optional, ValidateUUID } from 'src/validation';
|
import { Optional, ValidateUUID } from 'src/validation';
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
import { mapAlbum } from 'src/domain/album/album-response.dto';
|
import { mapAlbum } from 'src/dtos/album.dto';
|
||||||
import { albumStub } from 'test/fixtures/album.stub';
|
import { albumStub } from 'test/fixtures/album.stub';
|
||||||
|
|
||||||
describe('mapAlbum', () => {
|
describe('mapAlbum', () => {
|
@ -1,9 +1,87 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
|
import { ArrayNotEmpty, IsEnum, IsString } from 'class-validator';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
|
import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
|
||||||
import { AlbumEntity, AssetOrder } from 'src/entities/album.entity';
|
import { AlbumEntity, AssetOrder } from 'src/entities/album.entity';
|
||||||
import { Optional } from 'src/validation';
|
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
|
||||||
|
|
||||||
|
export class AlbumInfoDto {
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
withoutAssets?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AddUsersDto {
|
||||||
|
@ValidateUUID({ each: true })
|
||||||
|
@ArrayNotEmpty()
|
||||||
|
sharedUserIds!: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CreateAlbumDto {
|
||||||
|
@IsString()
|
||||||
|
@ApiProperty()
|
||||||
|
albumName!: string;
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
@Optional()
|
||||||
|
description?: string;
|
||||||
|
|
||||||
|
@ValidateUUID({ optional: true, each: true })
|
||||||
|
sharedWithUserIds?: string[];
|
||||||
|
|
||||||
|
@ValidateUUID({ optional: true, each: true })
|
||||||
|
assetIds?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class UpdateAlbumDto {
|
||||||
|
@Optional()
|
||||||
|
@IsString()
|
||||||
|
albumName?: string;
|
||||||
|
|
||||||
|
@Optional()
|
||||||
|
@IsString()
|
||||||
|
description?: string;
|
||||||
|
|
||||||
|
@ValidateUUID({ optional: true })
|
||||||
|
albumThumbnailAssetId?: string;
|
||||||
|
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
isActivityEnabled?: boolean;
|
||||||
|
|
||||||
|
@IsEnum(AssetOrder)
|
||||||
|
@Optional()
|
||||||
|
@ApiProperty({ enum: AssetOrder, enumName: 'AssetOrder' })
|
||||||
|
order?: AssetOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GetAlbumsDto {
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
/**
|
||||||
|
* true: only shared albums
|
||||||
|
* false: only non-shared own albums
|
||||||
|
* undefined: shared and owned albums
|
||||||
|
*/
|
||||||
|
shared?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only returns albums that contain the asset
|
||||||
|
* Ignores the shared parameter
|
||||||
|
* undefined: get all albums
|
||||||
|
*/
|
||||||
|
@ValidateUUID({ optional: true })
|
||||||
|
assetId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AlbumCountResponseDto {
|
||||||
|
@ApiProperty({ type: 'integer' })
|
||||||
|
owned!: number;
|
||||||
|
|
||||||
|
@ApiProperty({ type: 'integer' })
|
||||||
|
shared!: number;
|
||||||
|
|
||||||
|
@ApiProperty({ type: 'integer' })
|
||||||
|
notShared!: number;
|
||||||
|
}
|
||||||
|
|
||||||
export class AlbumResponseDto {
|
export class AlbumResponseDto {
|
||||||
id!: string;
|
id!: string;
|
||||||
@ -73,14 +151,3 @@ export const mapAlbum = (entity: AlbumEntity, withAssets: boolean, auth?: AuthDt
|
|||||||
|
|
||||||
export const mapAlbumWithAssets = (entity: AlbumEntity) => mapAlbum(entity, true);
|
export const mapAlbumWithAssets = (entity: AlbumEntity) => mapAlbum(entity, true);
|
||||||
export const mapAlbumWithoutAssets = (entity: AlbumEntity) => mapAlbum(entity, false);
|
export const mapAlbumWithoutAssets = (entity: AlbumEntity) => mapAlbum(entity, false);
|
||||||
|
|
||||||
export class AlbumCountResponseDto {
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
owned!: number;
|
|
||||||
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
shared!: number;
|
|
||||||
|
|
||||||
@ApiProperty({ type: 'integer' })
|
|
||||||
notShared!: number;
|
|
||||||
}
|
|
@ -1,12 +1,12 @@
|
|||||||
import { ApiProperty } from '@nestjs/swagger';
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
import { ExifResponseDto, mapExif } from 'src/domain/asset/response-dto/exif-response.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { SmartInfoResponseDto, mapSmartInfo } from 'src/domain/asset/response-dto/smart-info-response.dto';
|
import { ExifResponseDto, mapExif } from 'src/dtos/exif.dto';
|
||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
|
import { PersonWithFacesResponseDto, mapFacesWithoutPerson, mapPerson } from 'src/dtos/person.dto';
|
||||||
import { PersonWithFacesResponseDto, mapFacesWithoutPerson, mapPerson } from 'src/domain/person/person.dto';
|
import { TagResponseDto, mapTag } from 'src/dtos/tag.dto';
|
||||||
import { TagResponseDto, mapTag } from 'src/domain/tag/tag-response.dto';
|
import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
|
||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
|
|
||||||
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
||||||
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
||||||
|
import { SmartInfoEntity } from 'src/entities/smart-info.entity';
|
||||||
|
|
||||||
export class SanitizedAssetResponseDto {
|
export class SanitizedAssetResponseDto {
|
||||||
id!: string;
|
id!: string;
|
||||||
@ -134,3 +134,15 @@ export class MemoryLaneResponseDto {
|
|||||||
title!: string;
|
title!: string;
|
||||||
assets!: AssetResponseDto[];
|
assets!: AssetResponseDto[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SmartInfoResponseDto {
|
||||||
|
tags?: string[] | null;
|
||||||
|
objects?: string[] | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function mapSmartInfo(entity: SmartInfoEntity): SmartInfoResponseDto {
|
||||||
|
return {
|
||||||
|
tags: entity.tags,
|
||||||
|
objects: entity.objects,
|
||||||
|
};
|
||||||
|
}
|
132
server/src/dtos/asset.dto.ts
Normal file
132
server/src/dtos/asset.dto.ts
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
import { Type } from 'class-transformer';
|
||||||
|
import {
|
||||||
|
IsDateString,
|
||||||
|
IsEnum,
|
||||||
|
IsInt,
|
||||||
|
IsLatitude,
|
||||||
|
IsLongitude,
|
||||||
|
IsNotEmpty,
|
||||||
|
IsPositive,
|
||||||
|
IsString,
|
||||||
|
ValidateIf,
|
||||||
|
} from 'class-validator';
|
||||||
|
import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
|
||||||
|
import { AssetType } from 'src/entities/asset.entity';
|
||||||
|
import { AssetStats } from 'src/interfaces/asset.repository';
|
||||||
|
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
|
||||||
|
|
||||||
|
export class DeviceIdDto {
|
||||||
|
@IsNotEmpty()
|
||||||
|
@IsString()
|
||||||
|
deviceId!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasGPS = (o: { latitude: undefined; longitude: undefined }) =>
|
||||||
|
o.latitude !== undefined || o.longitude !== undefined;
|
||||||
|
const ValidateGPS = () => ValidateIf(hasGPS);
|
||||||
|
|
||||||
|
export class UpdateAssetBase {
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
isFavorite?: boolean;
|
||||||
|
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
isArchived?: boolean;
|
||||||
|
|
||||||
|
@Optional()
|
||||||
|
@IsDateString()
|
||||||
|
dateTimeOriginal?: string;
|
||||||
|
|
||||||
|
@ValidateGPS()
|
||||||
|
@IsLatitude()
|
||||||
|
@IsNotEmpty()
|
||||||
|
latitude?: number;
|
||||||
|
|
||||||
|
@ValidateGPS()
|
||||||
|
@IsLongitude()
|
||||||
|
@IsNotEmpty()
|
||||||
|
longitude?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetBulkUpdateDto extends UpdateAssetBase {
|
||||||
|
@ValidateUUID({ each: true })
|
||||||
|
ids!: string[];
|
||||||
|
|
||||||
|
@ValidateUUID({ optional: true })
|
||||||
|
stackParentId?: string;
|
||||||
|
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
removeParent?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class UpdateAssetDto extends UpdateAssetBase {
|
||||||
|
@Optional()
|
||||||
|
@IsString()
|
||||||
|
description?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class RandomAssetsDto {
|
||||||
|
@Optional()
|
||||||
|
@IsInt()
|
||||||
|
@IsPositive()
|
||||||
|
@Type(() => Number)
|
||||||
|
count?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetBulkDeleteDto extends BulkIdsDto {
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
force?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetIdsDto {
|
||||||
|
@ValidateUUID({ each: true })
|
||||||
|
assetIds!: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum AssetJobName {
|
||||||
|
REGENERATE_THUMBNAIL = 'regenerate-thumbnail',
|
||||||
|
REFRESH_METADATA = 'refresh-metadata',
|
||||||
|
TRANSCODE_VIDEO = 'transcode-video',
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetJobsDto extends AssetIdsDto {
|
||||||
|
@ApiProperty({ enumName: 'AssetJobName', enum: AssetJobName })
|
||||||
|
@IsEnum(AssetJobName)
|
||||||
|
name!: AssetJobName;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetStatsDto {
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
isArchived?: boolean;
|
||||||
|
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
isFavorite?: boolean;
|
||||||
|
|
||||||
|
@ValidateBoolean({ optional: true })
|
||||||
|
isTrashed?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetStatsResponseDto {
|
||||||
|
@ApiProperty({ type: 'integer' })
|
||||||
|
images!: number;
|
||||||
|
|
||||||
|
@ApiProperty({ type: 'integer' })
|
||||||
|
videos!: number;
|
||||||
|
|
||||||
|
@ApiProperty({ type: 'integer' })
|
||||||
|
total!: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const mapStats = (stats: AssetStats): AssetStatsResponseDto => {
|
||||||
|
return {
|
||||||
|
images: stats[AssetType.IMAGE],
|
||||||
|
videos: stats[AssetType.VIDEO],
|
||||||
|
total: Object.values(stats).reduce((total, value) => total + value, 0),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export enum UploadFieldName {
|
||||||
|
ASSET_DATA = 'assetData',
|
||||||
|
LIVE_PHOTO_DATA = 'livePhotoData',
|
||||||
|
SIDECAR_DATA = 'sidecarData',
|
||||||
|
PROFILE_DATA = 'file',
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user