363c558db7
* add job to check for offline files * fix lint * only check for offline when using checkForOffline * improve tests * remove old test * wip * remove trie * refactor batches * also check offline status * fix spelling * don't do offline scan * rename scan to check * fix job statuses * fix lint * cleanup * add test * open-api * fix test * fix spinner * reset text * don't double batch * fix comments from mert * remove tries * fix tests * fix e2e * fix test * fix test * add tests * fix lint * fix e2e * interweave scans * fix errors * fix messages * fix test * add mock * fix sql * fix e2e * use library batch size * save -> update * add file extensions * update specs * test for import paths * check import paths when testing offline * fix lint * normalize import path * remove console logs * decrease batch size to 1000 * add test for import path * add test for already-online assets * fix merge * fix lint * add library job back * add offline job to correct queue * library spec compiles now * move one test to new e2e * fix comments * fix comments * fix lint * refactor path validation * fix loop bug * remove logging * expect responses * fix asset mock * take the straightforward approach * use generator correctly * fix vitest on file edit * bump vitest to 1.6.0 * test for offline check * add e2e tests for offlining assets depending on import path * cleanup e2e test after finish * cleanup library service * paginate the walk generator * fix tests * fix typo * refactoring handleOfflineCheck * better testing of handleOfflineCheck * fix lint * handle large library deletions * dont check if library is deleted * fix mock * add a 100k page size to library * fix loading animation * better log messages * Better logging for offline asset removal * fix sql and tests * fix number format * Remove submodule * fix format * chore: cleanup * chore: fix tests --------- Co-authored-by: Alex <alex.tran1502@gmail.com> Co-authored-by: Jason Rasmussen <jason@rasm.me>
148 lines
3.0 KiB
TypeScript
148 lines
3.0 KiB
TypeScript
import { ApiProperty } from '@nestjs/swagger';
|
|
import { ArrayMaxSize, ArrayUnique, IsNotEmpty, IsString } from 'class-validator';
|
|
import { LibraryEntity } from 'src/entities/library.entity';
|
|
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
|
|
|
|
export class CreateLibraryDto {
|
|
@ValidateUUID()
|
|
ownerId!: string;
|
|
|
|
@IsString()
|
|
@Optional()
|
|
@IsNotEmpty()
|
|
name?: string;
|
|
|
|
@Optional()
|
|
@IsString({ each: true })
|
|
@IsNotEmpty({ each: true })
|
|
@ArrayUnique()
|
|
@ArrayMaxSize(128)
|
|
importPaths?: string[];
|
|
|
|
@Optional()
|
|
@IsString({ each: true })
|
|
@IsNotEmpty({ each: true })
|
|
@ArrayUnique()
|
|
@ArrayMaxSize(128)
|
|
exclusionPatterns?: string[];
|
|
}
|
|
|
|
export class UpdateLibraryDto {
|
|
@Optional()
|
|
@IsString()
|
|
@IsNotEmpty()
|
|
name?: string;
|
|
|
|
@Optional()
|
|
@IsString({ each: true })
|
|
@IsNotEmpty({ each: true })
|
|
@ArrayUnique()
|
|
@ArrayMaxSize(128)
|
|
importPaths?: string[];
|
|
|
|
@Optional()
|
|
@IsNotEmpty({ each: true })
|
|
@IsString({ each: true })
|
|
@ArrayUnique()
|
|
@ArrayMaxSize(128)
|
|
exclusionPatterns?: string[];
|
|
}
|
|
|
|
export interface CrawlOptionsDto {
|
|
pathsToCrawl: string[];
|
|
includeHidden?: boolean;
|
|
exclusionPatterns?: string[];
|
|
}
|
|
|
|
export interface WalkOptionsDto extends CrawlOptionsDto {
|
|
take: number;
|
|
}
|
|
|
|
export class ValidateLibraryDto {
|
|
@Optional()
|
|
@IsString({ each: true })
|
|
@IsNotEmpty({ each: true })
|
|
@ArrayUnique()
|
|
@ArrayMaxSize(128)
|
|
importPaths?: string[];
|
|
|
|
@Optional()
|
|
@IsNotEmpty({ each: true })
|
|
@IsString({ each: true })
|
|
@ArrayUnique()
|
|
@ArrayMaxSize(128)
|
|
exclusionPatterns?: string[];
|
|
}
|
|
|
|
export class ValidateLibraryResponseDto {
|
|
importPaths?: ValidateLibraryImportPathResponseDto[];
|
|
}
|
|
|
|
export class ValidateLibraryImportPathResponseDto {
|
|
importPath!: string;
|
|
isValid: boolean = false;
|
|
message?: string;
|
|
}
|
|
|
|
export class LibrarySearchDto {
|
|
@ValidateUUID({ optional: true })
|
|
userId?: string;
|
|
}
|
|
|
|
export class ScanLibraryDto {
|
|
@ValidateBoolean({ optional: true })
|
|
refreshModifiedFiles?: boolean;
|
|
|
|
@ValidateBoolean({ optional: true })
|
|
refreshAllFiles?: boolean;
|
|
}
|
|
|
|
export class LibraryResponseDto {
|
|
id!: string;
|
|
ownerId!: string;
|
|
name!: string;
|
|
|
|
@ApiProperty({ type: 'integer' })
|
|
assetCount!: number;
|
|
|
|
importPaths!: string[];
|
|
|
|
exclusionPatterns!: string[];
|
|
|
|
createdAt!: Date;
|
|
updatedAt!: Date;
|
|
refreshedAt!: Date | null;
|
|
}
|
|
|
|
export class LibraryStatsResponseDto {
|
|
@ApiProperty({ type: 'integer' })
|
|
photos = 0;
|
|
|
|
@ApiProperty({ type: 'integer' })
|
|
videos = 0;
|
|
|
|
@ApiProperty({ type: 'integer' })
|
|
total = 0;
|
|
|
|
@ApiProperty({ type: 'integer', format: 'int64' })
|
|
usage = 0;
|
|
}
|
|
|
|
export function mapLibrary(entity: LibraryEntity): LibraryResponseDto {
|
|
let assetCount = 0;
|
|
if (entity.assets) {
|
|
assetCount = entity.assets.length;
|
|
}
|
|
return {
|
|
id: entity.id,
|
|
ownerId: entity.ownerId,
|
|
name: entity.name,
|
|
createdAt: entity.createdAt,
|
|
updatedAt: entity.updatedAt,
|
|
refreshedAt: entity.refreshedAt,
|
|
assetCount,
|
|
importPaths: entity.importPaths,
|
|
exclusionPatterns: entity.exclusionPatterns,
|
|
};
|
|
}
|