Compare commits

...

1 commit
main ... 2770

Author SHA1 Message Date
Thomas Way
0a59b6a4fb
chore(server): use esm
The server/ and web/ projects use CommonJS and ES modules respectively. Ideally
they should both use the same standard. ES modules is the more modern of the two
and typically recommended. ESM should make development easier and more
consistent.

Fixes: #2770
2023-07-01 04:47:27 +01:00
250 changed files with 2277 additions and 2979 deletions

3255
server/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -16,7 +16,7 @@
"start": "npm run start:dev",
"nest": "nest",
"start:dev": "nest start --watch --",
"start:debug": "nest start --debug 0.0.0.0:9230 --watch --",
"start:debug": "nest start --exec 'node -r tsconfig-paths/register -r ts-node/register ./dist/main.js' --debug 0.0.0.0:9230 --watch --",
"lint": "eslint \"src/**/*.ts\" --max-warnings 0",
"lint:fix": "npm run lint -- --fix",
"check": "tsc --noEmit",
@ -53,7 +53,7 @@
"@socket.io/redis-adapter": "^8.0.1",
"@types/mime-types": "^2.1.1",
"archiver": "^5.3.1",
"axios": "^0.26.0",
"axios": "^1.4.0",
"bcrypt": "^5.0.1",
"bullmq": "^3.14.1",
"class-transformer": "^0.5.1",
@ -64,12 +64,13 @@
"fluent-ffmpeg": "^2.1.2",
"handlebars": "^4.7.7",
"i18n-iso-countries": "^7.5.0",
"ioredis": "^5.3.1",
"ioredis": "^5.3.2",
"joi": "^17.5.0",
"local-reverse-geocoder": "0.12.5",
"local-reverse-geocoder": "^0.16.4",
"lodash": "^4.17.21",
"luxon": "^3.0.3",
"mime-types": "^2.1.35",
"module-alias": "^2.2.3",
"mv": "^2.1.1",
"nest-commander": "^3.3.0",
"openid-client": "^5.2.1",
@ -81,8 +82,7 @@
"thumbhash": "^0.1.1",
"typeorm": "^0.3.11",
"typesense": "^1.5.3",
"ua-parser-js": "^1.0.35",
"immich": "^0.39.0"
"ua-parser-js": "^1.0.35"
},
"devDependencies": {
"@nestjs/cli": "^9.1.8",
@ -121,7 +121,7 @@
"ts-jest": "^27.0.3",
"ts-loader": "^9.2.3",
"ts-node": "^10.0.0",
"tsconfig-paths": "^3.10.1",
"tsconfig-paths": "^3.14.2",
"typescript": "^4.9.4"
},
"jest": {
@ -160,5 +160,32 @@
"^@app/domain(|/.*)$": "<rootDir>/src/domain/$1"
},
"globalSetup": "<rootDir>/test/global-setup.js"
},
"type": "module",
"_moduleAliases": {
"@test": [
"test"
],
"@test/*": [
"test/*"
],
"@app/immich": [
"src/immich/index.js"
],
"@app/immich/*": [
"src/immich/*"
],
"@app/infra": [
"src/infra/index.js"
],
"@app/infra/*": [
"src/infra/*"
],
"@app/domain": [
"src/domain/index.js"
],
"@app/domain/*": [
"src/domain/*"
]
}
}

View file

@ -1,9 +1,9 @@
import { DomainModule } from '@app/domain';
import { InfraModule } from '@app/infra';
import { Module } from '@nestjs/common';
import { ListUsersCommand } from './commands/list-users.command';
import { DisablePasswordLoginCommand, EnablePasswordLoginCommand } from './commands/password-login';
import { PromptPasswordQuestions, ResetAdminPasswordCommand } from './commands/reset-admin-password.command';
import { ListUsersCommand } from './commands/list-users.command.js';
import { DisablePasswordLoginCommand, EnablePasswordLoginCommand } from './commands/password-login.js';
import { PromptPasswordQuestions, ResetAdminPasswordCommand } from './commands/reset-admin-password.command.js';
@Module({
imports: [DomainModule.register({ imports: [InfraModule] })],

View file

@ -1,6 +1,6 @@
import { UserService } from '@app/domain';
import { Command, CommandRunner } from 'nest-commander';
import { CLI_USER } from '../constants';
import { CLI_USER } from '../constants.js';
@Command({
name: 'list-users',

View file

@ -1,5 +1,5 @@
import { CommandFactory } from 'nest-commander';
import { AppModule } from './app.module';
import { AppModule } from './app.module.js';
export async function bootstrap() {
await CommandFactory.run(AppModule, ['warn', 'error']);

View file

@ -1,6 +1,6 @@
import { BadRequestException } from '@nestjs/common';
import { AuthUserDto } from '../auth';
import { IAccessRepository } from './access.repository';
import { AuthUserDto } from '../auth/index.js';
import { IAccessRepository } from './access.repository.js';
export enum Permission {
// ASSET_CREATE = 'asset.create',

View file

@ -1,2 +1,2 @@
export * from './access.core';
export * from './access.repository';
export * from './access.core.js';
export * from './access.repository.js';

View file

@ -1,7 +1,7 @@
import { AlbumEntity } from '@app/infra/entities';
import { AlbumEntity } from '@app/infra/entities/index.js';
import { ApiProperty } from '@nestjs/swagger';
import { AssetResponseDto, mapAsset } from '../asset';
import { mapUser, UserResponseDto } from '../user';
import { AssetResponseDto, mapAsset } from '../asset/index.js';
import { mapUser, UserResponseDto } from '../user/index.js';
export class AlbumResponseDto {
id!: string;

View file

@ -1,4 +1,4 @@
import { AlbumEntity } from '@app/infra/entities';
import { AlbumEntity } from '@app/infra/entities/index.js';
export const IAlbumRepository = 'IAlbumRepository';

View file

@ -9,13 +9,13 @@ import {
newJobRepositoryMock,
newUserRepositoryMock,
userEntityStub,
} from '@test';
} from '@test/index.js';
import _ from 'lodash';
import { IAssetRepository } from '../asset';
import { IJobRepository, JobName } from '../job';
import { IUserRepository } from '../user';
import { IAlbumRepository } from './album.repository';
import { AlbumService } from './album.service';
import { IAssetRepository } from '../asset/index.js';
import { IJobRepository, JobName } from '../job/index.js';
import { IUserRepository } from '../user/index.js';
import { IAlbumRepository } from './album.repository.js';
import { AlbumService } from './album.service.js';
describe(AlbumService.name, () => {
let sut: AlbumService;

View file

@ -1,13 +1,13 @@
import { AlbumEntity, AssetEntity, UserEntity } from '@app/infra/entities';
import { AlbumEntity, AssetEntity, UserEntity } from '@app/infra/entities/index.js';
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import { IAssetRepository, mapAsset } from '../asset';
import { AuthUserDto } from '../auth';
import { AccessCore, IAccessRepository, Permission } from '../index';
import { IJobRepository, JobName } from '../job';
import { IUserRepository } from '../user';
import { AlbumCountResponseDto, AlbumResponseDto, mapAlbum } from './album-response.dto';
import { IAlbumRepository } from './album.repository';
import { AddUsersDto, CreateAlbumDto, GetAlbumsDto, UpdateAlbumDto } from './dto';
import { IAssetRepository, mapAsset } from '../asset/index.js';
import { AuthUserDto } from '../auth/index.js';
import { AccessCore, IAccessRepository, Permission } from '../index.js';
import { IJobRepository, JobName } from '../job/index.js';
import { IUserRepository } from '../user/index.js';
import { AlbumCountResponseDto, AlbumResponseDto, mapAlbum } from './album-response.dto.js';
import { IAlbumRepository } from './album.repository.js';
import { AddUsersDto, CreateAlbumDto, GetAlbumsDto, UpdateAlbumDto } from './dto/index.js';
@Injectable()
export class AlbumService {

View file

@ -1,4 +1,4 @@
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator';
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator.js';
import { ArrayNotEmpty } from 'class-validator';
export class AddUsersDto {

View file

@ -1,4 +1,4 @@
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator';
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator.js';
import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsString } from 'class-validator';

View file

@ -1,4 +1,4 @@
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator';
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator.js';
import { ApiProperty } from '@nestjs/swagger';
import { IsOptional } from 'class-validator';

View file

@ -1,5 +1,5 @@
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator';
import { toBoolean } from '@app/immich/utils/transform.util';
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator.js';
import { toBoolean } from '@app/immich/utils/transform.util.js';
import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { IsBoolean, IsOptional } from 'class-validator';

View file

@ -1,4 +1,4 @@
export * from './album-add-users.dto';
export * from './album-create.dto';
export * from './album-update.dto';
export * from './get-albums.dto';
export * from './album-add-users.dto.js';
export * from './album-create.dto.js';
export * from './album-update.dto.js';
export * from './get-albums.dto.js';

View file

@ -1,4 +1,4 @@
export * from './album-response.dto';
export * from './album.repository';
export * from './album.service';
export * from './dto';
export * from './album-response.dto.js';
export * from './album.repository.js';
export * from './album.service.js';
export * from './dto/index.js';

View file

@ -1,4 +1,4 @@
import { APIKeyEntity } from '@app/infra/entities';
import { APIKeyEntity } from '@app/infra/entities/index.js';
export const IKeyRepository = 'IKeyRepository';

View file

@ -1,8 +1,8 @@
import { BadRequestException } from '@nestjs/common';
import { authStub, keyStub, newCryptoRepositoryMock, newKeyRepositoryMock } from '@test';
import { ICryptoRepository } from '../crypto';
import { IKeyRepository } from './api-key.repository';
import { APIKeyService } from './api-key.service';
import { authStub, keyStub, newCryptoRepositoryMock, newKeyRepositoryMock } from '@test/index.js';
import { ICryptoRepository } from '../crypto/index.js';
import { IKeyRepository } from './api-key.repository.js';
import { APIKeyService } from './api-key.service.js';
describe(APIKeyService.name, () => {
let sut: APIKeyService;

View file

@ -1,9 +1,9 @@
import { APIKeyEntity } from '@app/infra/entities';
import { APIKeyEntity } from '@app/infra/entities/index.js';
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import { AuthUserDto } from '../auth';
import { ICryptoRepository } from '../crypto';
import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto } from './api-key.dto';
import { IKeyRepository } from './api-key.repository';
import { AuthUserDto } from '../auth/index.js';
import { ICryptoRepository } from '../crypto/index.js';
import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto } from './api-key.dto.js';
import { IKeyRepository } from './api-key.repository.js';
@Injectable()
export class APIKeyService {

View file

@ -1,3 +1,3 @@
export * from './api-key.dto';
export * from './api-key.repository';
export * from './api-key.service';
export * from './api-key.dto.js';
export * from './api-key.repository.js';
export * from './api-key.service.js';

View file

@ -1,5 +1,5 @@
import { AssetEntity, AssetType } from '@app/infra/entities';
import { Paginated, PaginationOptions } from '../domain.util';
import { AssetEntity, AssetType } from '@app/infra/entities/index.js';
import { Paginated, PaginationOptions } from '../domain.util.js';
export interface AssetSearchOptions {
isVisible?: boolean;

View file

@ -6,14 +6,14 @@ import {
newAccessRepositoryMock,
newAssetRepositoryMock,
newStorageRepositoryMock,
} from '@test';
} from '@test/index.js';
import { when } from 'jest-when';
import { Readable } from 'stream';
import { IStorageRepository } from '../storage';
import { IAssetRepository } from './asset.repository';
import { AssetService } from './asset.service';
import { DownloadResponseDto } from './index';
import { mapAsset } from './response-dto';
import { IStorageRepository } from '../storage/index.js';
import { IAssetRepository } from './asset.repository.js';
import { AssetService } from './asset.service.js';
import { DownloadResponseDto } from './index.js';
import { mapAsset } from './response-dto/index.js';
const downloadResponse: DownloadResponseDto = {
totalSize: 105_000,

View file

@ -1,16 +1,16 @@
import { BadRequestException, Inject } from '@nestjs/common';
import { DateTime } from 'luxon';
import { extname } from 'path';
import { AssetEntity } from '../../infra/entities/asset.entity';
import { AuthUserDto } from '../auth';
import { HumanReadableSize, usePagination } from '../domain.util';
import { AccessCore, IAccessRepository, Permission } from '../index';
import { ImmichReadStream, IStorageRepository } from '../storage';
import { IAssetRepository } from './asset.repository';
import { AssetIdsDto, DownloadArchiveInfo, DownloadDto, DownloadResponseDto, MemoryLaneDto } from './dto';
import { MapMarkerDto } from './dto/map-marker.dto';
import { mapAsset, MapMarkerResponseDto } from './response-dto';
import { MemoryLaneResponseDto } from './response-dto/memory-lane-response.dto';
import { AssetEntity } from '../../infra/entities/asset.entity.js';
import { AuthUserDto } from '../auth/index.js';
import { HumanReadableSize, usePagination } from '../domain.util.js';
import { AccessCore, IAccessRepository, Permission } from '../index.js';
import { ImmichReadStream, IStorageRepository } from '../storage/index.js';
import { IAssetRepository } from './asset.repository.js';
import { AssetIdsDto, DownloadArchiveInfo, DownloadDto, DownloadResponseDto, MemoryLaneDto } from './dto/index.js';
import { MapMarkerDto } from './dto/map-marker.dto.js';
import { mapAsset, MapMarkerResponseDto } from './response-dto/index.js';
import { MemoryLaneResponseDto } from './response-dto/memory-lane-response.dto.js';
export class AssetService {
private access: AccessCore;

View file

@ -1,4 +1,4 @@
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator';
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator.js';
export class AssetIdsDto {
@ValidateUUID({ each: true })

View file

@ -1,4 +1,4 @@
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator';
import { ValidateUUID } from '@app/immich/decorators/validate-uuid.decorator.js';
import { ApiProperty } from '@nestjs/swagger';
import { IsInt, IsOptional, IsPositive } from 'class-validator';

View file

@ -1,4 +1,4 @@
export * from './asset-ids.dto';
export * from './download.dto';
export * from './map-marker.dto';
export * from './memory-lane.dto';
export * from './asset-ids.dto.js';
export * from './download.dto.js';
export * from './map-marker.dto.js';
export * from './memory-lane.dto.js';

View file

@ -1,4 +1,4 @@
import { toBoolean } from '@app/immich/utils/transform.util';
import { toBoolean } from '@app/immich/utils/transform.util.js';
import { ApiProperty } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import { IsBoolean, IsDate, IsOptional } from 'class-validator';

View file

@ -1,4 +1,4 @@
export * from './asset.repository';
export * from './asset.service';
export * from './dto';
export * from './response-dto';
export * from './asset.repository.js';
export * from './asset.service.js';
export * from './dto/index.js';
export * from './response-dto/index.js';

View file

@ -1,9 +1,9 @@
import { AssetEntity, AssetType } from '@app/infra/entities';
import { AssetEntity, AssetType } from '@app/infra/entities/index.js';
import { ApiProperty } from '@nestjs/swagger';
import { mapFace, PersonResponseDto } from '../../person/person.dto';
import { mapTag, TagResponseDto } from '../../tag';
import { ExifResponseDto, mapExif } from './exif-response.dto';
import { mapSmartInfo, SmartInfoResponseDto } from './smart-info-response.dto';
import { mapFace, PersonResponseDto } from '../../person/person.dto.js';
import { mapTag, TagResponseDto } from '../../tag/index.js';
import { ExifResponseDto, mapExif } from './exif-response.dto.js';
import { mapSmartInfo, SmartInfoResponseDto } from './smart-info-response.dto.js';
export class AssetResponseDto {
id!: string;

View file

@ -1,4 +1,4 @@
import { ExifEntity } from '@app/infra/entities';
import { ExifEntity } from '@app/infra/entities/index.js';
import { ApiProperty } from '@nestjs/swagger';
export class ExifResponseDto {

View file

@ -1,5 +1,5 @@
export * from './asset-ids-response.dto';
export * from './asset-response.dto';
export * from './exif-response.dto';
export * from './map-marker-response.dto';
export * from './smart-info-response.dto';
export * from './asset-ids-response.dto.js';
export * from './asset-response.dto.js';
export * from './exif-response.dto.js';
export * from './map-marker-response.dto.js';
export * from './smart-info-response.dto.js';

View file

@ -1,4 +1,4 @@
import { AssetResponseDto } from './asset-response.dto';
import { AssetResponseDto } from './asset-response.dto.js';
export class MemoryLaneResponseDto {
title!: string;

View file

@ -1,4 +1,4 @@
import { SmartInfoEntity } from '@app/infra/entities';
import { SmartInfoEntity } from '@app/infra/entities/index.js';
export class SmartInfoResponseDto {
tags?: string[] | null;

View file

@ -1,10 +1,10 @@
import { SystemConfig, UserEntity } from '@app/infra/entities';
import { ICryptoRepository } from '../crypto/crypto.repository';
import { ISystemConfigRepository } from '../system-config';
import { SystemConfigCore } from '../system-config/system-config.core';
import { IUserTokenRepository, UserTokenCore } from '../user-token';
import { AuthType, IMMICH_ACCESS_COOKIE, IMMICH_AUTH_TYPE_COOKIE } from './auth.constant';
import { LoginResponseDto, mapLoginResponse } from './response-dto';
import { SystemConfig, UserEntity } from '@app/infra/entities/index.js';
import { ICryptoRepository } from '../crypto/crypto.repository.js';
import { ISystemConfigRepository } from '../system-config/index.js';
import { SystemConfigCore } from '../system-config/system-config.core.js';
import { IUserTokenRepository, UserTokenCore } from '../user-token/index.js';
import { AuthType, IMMICH_ACCESS_COOKIE, IMMICH_AUTH_TYPE_COOKIE } from './auth.constant.js';
import { LoginResponseDto, mapLoginResponse } from './response-dto/index.js';
export interface LoginDetails {
isSecure: boolean;

View file

@ -1,4 +1,4 @@
import { SystemConfig, UserEntity } from '@app/infra/entities';
import { SystemConfig, UserEntity } from '@app/infra/entities/index.js';
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
import {
authStub,
@ -14,19 +14,19 @@ import {
systemConfigStub,
userEntityStub,
userTokenEntityStub,
} from '@test';
} from '@test/index.js';
import { IncomingHttpHeaders } from 'http';
import { generators, Issuer } from 'openid-client';
import { Socket } from 'socket.io';
import { IKeyRepository } from '../api-key';
import { ICryptoRepository } from '../crypto/crypto.repository';
import { ISharedLinkRepository } from '../shared-link';
import { ISystemConfigRepository } from '../system-config';
import { IUserRepository } from '../user';
import { IUserTokenRepository } from '../user-token';
import { AuthType } from './auth.constant';
import { AuthService } from './auth.service';
import { AuthUserDto, SignUpDto } from './dto';
import { IKeyRepository } from '../api-key/index.js';
import { ICryptoRepository } from '../crypto/crypto.repository.js';
import { ISharedLinkRepository } from '../shared-link/index.js';
import { ISystemConfigRepository } from '../system-config/index.js';
import { IUserTokenRepository } from '../user-token/index.js';
import { IUserRepository } from '../user/index.js';
import { AuthType } from './auth.constant.js';
import { AuthService } from './auth.service.js';
import { AuthUserDto, SignUpDto } from './dto/index.js';
// const token = Buffer.from('my-api-key', 'utf8').toString('base64');

View file

@ -1,4 +1,4 @@
import { SystemConfig } from '@app/infra/entities';
import { SystemConfig } from '@app/infra/entities/index.js';
import {
BadRequestException,
Inject,
@ -9,16 +9,16 @@ import {
} from '@nestjs/common';
import cookieParser from 'cookie';
import { IncomingHttpHeaders } from 'http';
import { IKeyRepository } from '../api-key';
import { ICryptoRepository } from '../crypto/crypto.repository';
import { OAuthCore } from '../oauth/oauth.core';
import { ISharedLinkRepository } from '../shared-link';
import { INITIAL_SYSTEM_CONFIG, ISystemConfigRepository } from '../system-config';
import { IUserRepository, UserCore } from '../user';
import { IUserTokenRepository, UserTokenCore } from '../user-token';
import { AuthType, IMMICH_ACCESS_COOKIE, IMMICH_API_KEY_HEADER } from './auth.constant';
import { AuthCore, LoginDetails } from './auth.core';
import { AuthUserDto, ChangePasswordDto, LoginCredentialDto, SignUpDto } from './dto';
import { IKeyRepository } from '../api-key/index.js';
import { ICryptoRepository } from '../crypto/crypto.repository.js';
import { OAuthCore } from '../oauth/oauth.core.js';
import { ISharedLinkRepository } from '../shared-link/index.js';
import { INITIAL_SYSTEM_CONFIG, ISystemConfigRepository } from '../system-config/index.js';
import { IUserRepository, UserCore } from '../user/index.js';
import { IUserTokenRepository, UserTokenCore } from '../user-token/index.js';
import { AuthType, IMMICH_ACCESS_COOKIE, IMMICH_API_KEY_HEADER } from './auth.constant.js';
import { AuthCore, LoginDetails } from './auth.core.js';
import { AuthUserDto, ChangePasswordDto, LoginCredentialDto, SignUpDto } from './dto/index.js';
import {
AdminSignupResponseDto,
AuthDeviceResponseDto,
@ -26,7 +26,7 @@ import {
LogoutResponseDto,
mapAdminSignupResponse,
mapUserToken,
} from './response-dto';
} from './response-dto/index.js';
@Injectable()
export class AuthService {
@ -189,7 +189,7 @@ export class AuthService {
return cookies[IMMICH_ACCESS_COOKIE] || null;
}
private async validateSharedLink(key: string | string[]): Promise<AuthUserDto> {
private async validateSharedLink(key: string | string[]): Promise<AuthUserDto | null> {
key = Array.isArray(key) ? key[0] : key;
const bytes = Buffer.from(key, key.length === 100 ? 'hex' : 'base64url');

View file

@ -1,4 +1,4 @@
export * from './auth-user.dto';
export * from './change-password.dto';
export * from './login-credential.dto';
export * from './sign-up.dto';
export * from './auth-user.dto.js';
export * from './change-password.dto.js';
export * from './login-credential.dto.js';
export * from './sign-up.dto.js';

View file

@ -1,6 +1,6 @@
import { plainToInstance } from 'class-transformer';
import { validateSync } from 'class-validator';
import { LoginCredentialDto } from './login-credential.dto';
import { LoginCredentialDto } from './login-credential.dto.js';
describe('LoginCredentialDto', () => {
it('should allow emails without a tld', () => {

View file

@ -1,6 +1,6 @@
import { plainToInstance } from 'class-transformer';
import { validateSync } from 'class-validator';
import { SignUpDto } from './sign-up.dto';
import { SignUpDto } from './sign-up.dto.js';
describe('SignUpDto', () => {
it('should require all fields', () => {

View file

@ -1,5 +1,5 @@
export * from './auth.constant';
export * from './auth.core';
export * from './auth.service';
export * from './dto';
export * from './response-dto';
export * from './auth.constant.js';
export * from './auth.core.js';
export * from './auth.service.js';
export * from './dto/index.js';
export * from './response-dto/index.js';

View file

@ -1,4 +1,4 @@
import { UserEntity } from '@app/infra/entities';
import { UserEntity } from '@app/infra/entities/index.js';
export class AdminSignupResponseDto {
id!: string;

View file

@ -1,4 +1,4 @@
import { UserTokenEntity } from '@app/infra/entities';
import { UserTokenEntity } from '@app/infra/entities/index.js';
export class AuthDeviceResponseDto {
id!: string;

View file

@ -1,5 +1,5 @@
export * from './admin-signup-response.dto';
export * from './auth-device-response.dto';
export * from './login-response.dto';
export * from './logout-response.dto';
export * from './validate-asset-token-response.dto';
export * from './admin-signup-response.dto.js';
export * from './auth-device-response.dto.js';
export * from './login-response.dto.js';
export * from './logout-response.dto.js';
export * from './validate-asset-token-response.dto.js';

View file

@ -1,4 +1,4 @@
import { UserEntity } from '@app/infra/entities';
import { UserEntity } from '@app/infra/entities/index.js';
import { ApiResponseProperty } from '@nestjs/swagger';
export class LoginResponseDto {

View file

@ -1 +1 @@
export * from './communication.repository';
export * from './communication.repository.js';

View file

@ -1 +1 @@
export * from './crypto.repository';
export * from './crypto.repository.js';

View file

@ -1,4 +1,4 @@
import { validMimeTypes } from './domain.constant';
import { validMimeTypes } from './domain.constant.js';
describe('valid mime types', () => {
it('should be a sorted list', () => {

View file

@ -1,24 +1,24 @@
import { DynamicModule, Global, Module, ModuleMetadata, OnApplicationShutdown, Provider } from '@nestjs/common';
import { AlbumService } from './album';
import { APIKeyService } from './api-key';
import { AssetService } from './asset';
import { AuthService } from './auth';
import { FacialRecognitionService } from './facial-recognition';
import { JobService } from './job';
import { MediaService } from './media';
import { MetadataService } from './metadata';
import { OAuthService } from './oauth';
import { PartnerService } from './partner';
import { PersonService } from './person';
import { SearchService } from './search';
import { ServerInfoService } from './server-info';
import { SharedLinkService } from './shared-link';
import { SmartInfoService } from './smart-info';
import { StorageService } from './storage';
import { StorageTemplateService } from './storage-template';
import { INITIAL_SYSTEM_CONFIG, SystemConfigService } from './system-config';
import { TagService } from './tag';
import { UserService } from './user';
import { AlbumService } from './album/index.js';
import { APIKeyService } from './api-key/index.js';
import { AssetService } from './asset/index.js';
import { AuthService } from './auth/index.js';
import { FacialRecognitionService } from './facial-recognition/index.js';
import { JobService } from './job/index.js';
import { MediaService } from './media/index.js';
import { MetadataService } from './metadata/index.js';
import { OAuthService } from './oauth/index.js';
import { PartnerService } from './partner/index.js';
import { PersonService } from './person/index.js';
import { SearchService } from './search/index.js';
import { ServerInfoService } from './server-info/index.js';
import { SharedLinkService } from './shared-link/index.js';
import { SmartInfoService } from './smart-info/index.js';
import { StorageTemplateService } from './storage-template/index.js';
import { StorageService } from './storage/index.js';
import { INITIAL_SYSTEM_CONFIG, SystemConfigService } from './system-config/index.js';
import { TagService } from './tag/index.js';
import { UserService } from './user/index.js';
const providers: Provider[] = [
AlbumService,

View file

@ -1,4 +1,4 @@
import { AssetFaceEntity } from '@app/infra/entities';
import { AssetFaceEntity } from '@app/infra/entities/index.js';
export const IFaceRepository = 'IFaceRepository';

View file

@ -10,16 +10,16 @@ import {
newSearchRepositoryMock,
newStorageRepositoryMock,
personStub,
} from '@test';
import { IAssetRepository, WithoutProperty } from '../asset';
import { IJobRepository, JobName } from '../job';
import { IMediaRepository } from '../media';
import { IPersonRepository } from '../person';
import { ISearchRepository } from '../search';
import { IMachineLearningRepository } from '../smart-info';
import { IStorageRepository } from '../storage';
import { IFaceRepository } from './face.repository';
import { FacialRecognitionService } from './facial-recognition.services';
} from '@test/index.js';
import { IAssetRepository, WithoutProperty } from '../asset/index.js';
import { IJobRepository, JobName } from '../job/index.js';
import { IMediaRepository } from '../media/index.js';
import { IPersonRepository } from '../person/index.js';
import { ISearchRepository } from '../search/index.js';
import { IMachineLearningRepository } from '../smart-info/index.js';
import { IStorageRepository } from '../storage/index.js';
import { IFaceRepository } from './face.repository.js';
import { FacialRecognitionService } from './facial-recognition.services.js';
const croppedFace = Buffer.from('Cropped Face');

View file

@ -1,15 +1,22 @@
import { Inject, Logger } from '@nestjs/common';
import { join } from 'path';
import { IAssetRepository, WithoutProperty } from '../asset';
import { MACHINE_LEARNING_ENABLED } from '../domain.constant';
import { usePagination } from '../domain.util';
import { IBaseJob, IEntityJob, IFaceThumbnailJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job';
import { CropOptions, FACE_THUMBNAIL_SIZE, IMediaRepository } from '../media';
import { IPersonRepository } from '../person/person.repository';
import { ISearchRepository } from '../search/search.repository';
import { IMachineLearningRepository } from '../smart-info';
import { IStorageRepository, StorageCore, StorageFolder } from '../storage';
import { AssetFaceId, IFaceRepository } from './face.repository';
import { IAssetRepository, WithoutProperty } from '../asset/index.js';
import { MACHINE_LEARNING_ENABLED } from '../domain.constant.js';
import { usePagination } from '../domain.util.js';
import {
IBaseJob,
IEntityJob,
IFaceThumbnailJob,
IJobRepository,
JobName,
JOBS_ASSET_PAGINATION_SIZE,
} from '../job/index.js';
import { CropOptions, FACE_THUMBNAIL_SIZE, IMediaRepository } from '../media/index.js';
import { IPersonRepository } from '../person/person.repository.js';
import { ISearchRepository } from '../search/search.repository.js';
import { IMachineLearningRepository } from '../smart-info/index.js';
import { IStorageRepository, StorageCore, StorageFolder } from '../storage/index.js';
import { AssetFaceId, IFaceRepository } from './face.repository.js';
export class FacialRecognitionService {
private logger = new Logger(FacialRecognitionService.name);

View file

@ -1,2 +1,2 @@
export * from './face.repository';
export * from './facial-recognition.services';
export * from './face.repository.js';
export * from './facial-recognition.services.js';

View file

@ -1,28 +1,28 @@
export * from './access';
export * from './album';
export * from './api-key';
export * from './asset';
export * from './auth';
export * from './communication';
export * from './crypto';
export * from './domain.config';
export * from './domain.constant';
export * from './domain.module';
export * from './domain.util';
export * from './facial-recognition';
export * from './job';
export * from './media';
export * from './metadata';
export * from './oauth';
export * from './partner';
export * from './person';
export * from './search';
export * from './server-info';
export * from './shared-link';
export * from './smart-info';
export * from './storage';
export * from './storage-template';
export * from './system-config';
export * from './tag';
export * from './user';
export * from './user-token';
export * from './access/index.js';
export * from './album/index.js';
export * from './api-key/index.js';
export * from './asset/index.js';
export * from './auth/index.js';
export * from './communication/index.js';
export * from './crypto/index.js';
export * from './domain.config.js';
export * from './domain.constant.js';
export * from './domain.module.js';
export * from './domain.util.js';
export * from './facial-recognition/index.js';
export * from './job/index.js';
export * from './media/index.js';
export * from './metadata/index.js';
export * from './oauth/index.js';
export * from './partner/index.js';
export * from './person/index.js';
export * from './search/index.js';
export * from './server-info/index.js';
export * from './shared-link/index.js';
export * from './smart-info/index.js';
export * from './storage-template/index.js';
export * from './storage/index.js';
export * from './system-config/index.js';
export * from './tag/index.js';
export * from './user-token/index.js';
export * from './user/index.js';

View file

@ -1,2 +1,2 @@
export * from './job-command.dto';
export * from './job-id.dto';
export * from './job-command.dto.js';
export * from './job-id.dto.js';

View file

@ -1,6 +1,6 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsBoolean, IsEnum, IsNotEmpty, IsOptional } from 'class-validator';
import { JobCommand } from '../job.constants';
import { JobCommand } from '../job.constants.js';
export class JobCommandDto {
@IsNotEmpty()

View file

@ -1,6 +1,6 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsEnum, IsNotEmpty } from 'class-validator';
import { QueueName } from '../job.constants';
import { QueueName } from '../job.constants.js';
export class JobIdDto {
@IsNotEmpty()

View file

@ -1,6 +1,6 @@
export * from './dto';
export * from './job.constants';
export * from './job.interface';
export * from './job.repository';
export * from './job.service';
export * from './response-dto';
export * from './dto/index.js';
export * from './job.constants.js';
export * from './job.interface.js';
export * from './job.repository.js';
export * from './job.service.js';
export * from './response-dto/index.js';

View file

@ -1,4 +1,4 @@
import { BoundingBox } from '../smart-info';
import { BoundingBox } from '../smart-info/index.js';
export interface IBaseJob {
force?: boolean;

View file

@ -1,4 +1,4 @@
import { JobName, QueueName } from './job.constants';
import { JobName, QueueName } from './job.constants.js';
import {
IAssetFaceJob,
IBaseJob,
@ -6,7 +6,7 @@ import {
IDeleteFilesJob,
IEntityJob,
IFaceThumbnailJob,
} from './job.interface';
} from './job.interface.js';
export interface JobCounts {
active: number;

View file

@ -1,4 +1,4 @@
import { SystemConfig } from '@app/infra/entities';
import { SystemConfig } from '@app/infra/entities/index.js';
import { BadRequestException } from '@nestjs/common';
import {
asyncTick,
@ -6,12 +6,12 @@ import {
newCommunicationRepositoryMock,
newJobRepositoryMock,
newSystemConfigRepositoryMock,
} from '@test';
import { IJobRepository, JobCommand, JobHandler, JobItem, JobName, JobService, QueueName } from '.';
import { IAssetRepository } from '../asset';
import { ICommunicationRepository } from '../communication';
import { ISystemConfigRepository } from '../system-config';
import { SystemConfigCore } from '../system-config/system-config.core';
} from '@test/index.js';
import { IAssetRepository } from '../asset/index.js';
import { ICommunicationRepository } from '../communication/index.js';
import { IJobRepository, JobCommand, JobHandler, JobItem, JobName, JobService, QueueName } from '../index.js';
import { ISystemConfigRepository } from '../system-config/index.js';
import { SystemConfigCore } from '../system-config/system-config.core.js';
const makeMockHandlers = (success: boolean) => {
const mock = jest.fn().mockResolvedValue(success);

View file

@ -1,13 +1,13 @@
import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
import { IAssetRepository, mapAsset } from '../asset';
import { CommunicationEvent, ICommunicationRepository } from '../communication';
import { assertMachineLearningEnabled } from '../domain.constant';
import { ISystemConfigRepository } from '../system-config';
import { SystemConfigCore } from '../system-config/system-config.core';
import { JobCommandDto } from './dto';
import { JobCommand, JobName, QueueName } from './job.constants';
import { IJobRepository, JobHandler, JobItem } from './job.repository';
import { AllJobStatusResponseDto, JobStatusDto } from './response-dto';
import { IAssetRepository, mapAsset } from '../asset/index.js';
import { CommunicationEvent, ICommunicationRepository } from '../communication/index.js';
import { assertMachineLearningEnabled } from '../domain.constant.js';
import { ISystemConfigRepository } from '../system-config/index.js';
import { SystemConfigCore } from '../system-config/system-config.core.js';
import { JobCommandDto } from './dto/index.js';
import { JobCommand, JobName, QueueName } from './job.constants.js';
import { IJobRepository, JobHandler, JobItem } from './job.repository.js';
import { AllJobStatusResponseDto, JobStatusDto } from './response-dto/index.js';
@Injectable()
export class JobService {

View file

@ -1,5 +1,5 @@
import { ApiProperty } from '@nestjs/swagger';
import { QueueName } from '../job.constants';
import { QueueName } from '../job.constants.js';
export class JobCountsDto {
@ApiProperty({ type: 'integer' })

View file

@ -1 +1 @@
export * from './all-job-status-response.dto';
export * from './all-job-status-response.dto.js';

View file

@ -1,3 +1,3 @@
export * from './media.constant';
export * from './media.repository';
export * from './media.service';
export * from './media.constant.js';
export * from './media.repository.js';
export * from './media.service.js';

View file

@ -1,4 +1,4 @@
import { AssetType, SystemConfigKey } from '@app/infra/entities';
import { AssetType, SystemConfigKey } from '@app/infra/entities/index.js';
import {
assetEntityStub,
newAssetRepositoryMock,
@ -7,13 +7,13 @@ import {
newStorageRepositoryMock,
newSystemConfigRepositoryMock,
probeStub,
} from '@test';
import { IAssetRepository, WithoutProperty } from '../asset';
import { IJobRepository, JobName } from '../job';
import { IStorageRepository } from '../storage';
import { ISystemConfigRepository } from '../system-config';
import { IMediaRepository } from './media.repository';
import { MediaService } from './media.service';
} from '@test/index.js';
import { IAssetRepository, WithoutProperty } from '../asset/index.js';
import { IJobRepository, JobName } from '../job/index.js';
import { IStorageRepository } from '../storage/index.js';
import { ISystemConfigRepository } from '../system-config/index.js';
import { IMediaRepository } from './media.repository.js';
import { MediaService } from './media.service.js';
describe(MediaService.name, () => {
let sut: MediaService;

View file

@ -1,14 +1,14 @@
import { AssetEntity, AssetType, TranscodePreset } from '@app/infra/entities';
import { AssetEntity, AssetType, TranscodePreset } from '@app/infra/entities/index.js';
import { Inject, Injectable, Logger } from '@nestjs/common';
import { join } from 'path';
import { IAssetRepository, WithoutProperty } from '../asset';
import { usePagination } from '../domain.util';
import { IBaseJob, IEntityJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job';
import { IStorageRepository, StorageCore, StorageFolder } from '../storage';
import { ISystemConfigRepository, SystemConfigFFmpegDto } from '../system-config';
import { SystemConfigCore } from '../system-config/system-config.core';
import { JPEG_THUMBNAIL_SIZE, WEBP_THUMBNAIL_SIZE } from './media.constant';
import { AudioStreamInfo, IMediaRepository, VideoStreamInfo } from './media.repository';
import { IAssetRepository, WithoutProperty } from '../asset/index.js';
import { usePagination } from '../domain.util.js';
import { IBaseJob, IEntityJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job/index.js';
import { IStorageRepository, StorageCore, StorageFolder } from '../storage/index.js';
import { ISystemConfigRepository, SystemConfigFFmpegDto } from '../system-config/index.js';
import { SystemConfigCore } from '../system-config/system-config.core.js';
import { JPEG_THUMBNAIL_SIZE, WEBP_THUMBNAIL_SIZE } from './media.constant.js';
import { AudioStreamInfo, IMediaRepository, VideoStreamInfo } from './media.repository.js';
@Injectable()
export class MediaService {

View file

@ -1,2 +1,2 @@
export * from './geocoding.repository';
export * from './metadata.service';
export * from './geocoding.repository.js';
export * from './metadata.service.js';

View file

@ -1,9 +1,14 @@
import { assetEntityStub, newAssetRepositoryMock, newJobRepositoryMock, newStorageRepositoryMock } from '@test';
import {
assetEntityStub,
newAssetRepositoryMock,
newJobRepositoryMock,
newStorageRepositoryMock,
} from '@test/index.js';
import { constants } from 'fs/promises';
import { IAssetRepository, WithoutProperty, WithProperty } from '../asset';
import { IJobRepository, JobName } from '../job';
import { IStorageRepository } from '../storage';
import { MetadataService } from './metadata.service';
import { IAssetRepository, WithoutProperty, WithProperty } from '../asset/index.js';
import { IJobRepository, JobName } from '../job/index.js';
import { IStorageRepository } from '../storage/index.js';
import { MetadataService } from './metadata.service.js';
describe(MetadataService.name, () => {
let sut: MetadataService;

View file

@ -1,9 +1,9 @@
import { Inject } from '@nestjs/common';
import { constants } from 'fs/promises';
import { IAssetRepository, WithoutProperty, WithProperty } from '../asset';
import { usePagination } from '../domain.util';
import { IBaseJob, IEntityJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job';
import { IStorageRepository } from '../storage';
import { IAssetRepository, WithoutProperty, WithProperty } from '../asset/index.js';
import { usePagination } from '../domain.util.js';
import { IBaseJob, IEntityJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job/index.js';
import { IStorageRepository } from '../storage/index.js';
export class MetadataService {
constructor(

View file

@ -1,2 +1,2 @@
export * from './oauth-auth-code.dto';
export * from './oauth-config.dto';
export * from './oauth-auth-code.dto.js';
export * from './oauth-config.dto.js';

View file

@ -1,4 +1,4 @@
export * from './dto';
export * from './oauth.constants';
export * from './oauth.service';
export * from './response-dto';
export * from './dto/index.js';
export * from './oauth.constants.js';
export * from './oauth.service.js';
export * from './response-dto/index.js';

View file

@ -1,11 +1,11 @@
import { SystemConfig } from '@app/infra/entities';
import { SystemConfig } from '@app/infra/entities/index.js';
import { BadRequestException, Injectable, Logger } from '@nestjs/common';
import { ClientMetadata, custom, generators, Issuer, UserinfoResponse } from 'openid-client';
import { ISystemConfigRepository } from '../system-config';
import { SystemConfigCore } from '../system-config/system-config.core';
import { OAuthConfigDto } from './dto';
import { MOBILE_REDIRECT } from './oauth.constants';
import { OAuthConfigResponseDto } from './response-dto';
import { ISystemConfigRepository } from '../system-config/index.js';
import { SystemConfigCore } from '../system-config/system-config.core.js';
import { OAuthConfigDto } from './dto/index.js';
import { MOBILE_REDIRECT } from './oauth.constants.js';
import { OAuthConfigResponseDto } from './response-dto/index.js';
type OAuthProfile = UserinfoResponse & {
email: string;

View file

@ -1,4 +1,4 @@
import { SystemConfig, UserEntity } from '@app/infra/entities';
import { SystemConfig, UserEntity } from '@app/infra/entities/index.js';
import { BadRequestException } from '@nestjs/common';
import {
authStub,
@ -10,14 +10,14 @@ import {
systemConfigStub,
userEntityStub,
userTokenEntityStub,
} from '@test';
} from '@test/index.js';
import { generators, Issuer } from 'openid-client';
import { OAuthService } from '.';
import { LoginDetails } from '../auth';
import { ICryptoRepository } from '../crypto';
import { ISystemConfigRepository } from '../system-config';
import { IUserRepository } from '../user';
import { IUserTokenRepository } from '../user-token';
import { LoginDetails } from '../auth/index.js';
import { ICryptoRepository } from '../crypto/index.js';
import { ISystemConfigRepository } from '../system-config/index.js';
import { IUserTokenRepository } from '../user-token/index.js';
import { IUserRepository } from '../user/index.js';
import { OAuthService } from './index.js';
const email = 'user@immich.com';
const sub = 'my-auth-user-sub';

View file

@ -1,15 +1,15 @@
import { SystemConfig } from '@app/infra/entities';
import { SystemConfig } from '@app/infra/entities/index.js';
import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
import { AuthType, AuthUserDto, LoginResponseDto } from '../auth';
import { AuthCore, LoginDetails } from '../auth/auth.core';
import { ICryptoRepository } from '../crypto';
import { INITIAL_SYSTEM_CONFIG, ISystemConfigRepository } from '../system-config';
import { IUserRepository, UserCore, UserResponseDto } from '../user';
import { IUserTokenRepository } from '../user-token';
import { OAuthCallbackDto, OAuthConfigDto } from './dto';
import { MOBILE_REDIRECT } from './oauth.constants';
import { OAuthCore } from './oauth.core';
import { OAuthConfigResponseDto } from './response-dto';
import { AuthCore, LoginDetails } from '../auth/auth.core.js';
import { AuthType, AuthUserDto, LoginResponseDto } from '../auth/index.js';
import { ICryptoRepository } from '../crypto/index.js';
import { INITIAL_SYSTEM_CONFIG, ISystemConfigRepository } from '../system-config/index.js';
import { IUserTokenRepository } from '../user-token/index.js';
import { IUserRepository, UserCore, UserResponseDto } from '../user/index.js';
import { OAuthCallbackDto, OAuthConfigDto } from './dto/index.js';
import { MOBILE_REDIRECT } from './oauth.constants.js';
import { OAuthCore } from './oauth.core.js';
import { OAuthConfigResponseDto } from './response-dto/index.js';
@Injectable()
export class OAuthService {

View file

@ -1 +1 @@
export * from './oauth-config-response.dto';
export * from './oauth-config-response.dto.js';

View file

@ -1,2 +1,2 @@
export * from './partner.repository';
export * from './partner.service';
export * from './partner.repository.js';
export * from './partner.service.js';

View file

@ -1,4 +1,4 @@
import { PartnerEntity } from '@app/infra/entities';
import { PartnerEntity } from '@app/infra/entities/index.js';
export interface PartnerIds {
sharedById: string;

View file

@ -1,7 +1,7 @@
import { BadRequestException } from '@nestjs/common';
import { authStub, newPartnerRepositoryMock, partnerStub } from '@test';
import { IPartnerRepository, PartnerDirection } from './partner.repository';
import { PartnerService } from './partner.service';
import { authStub, newPartnerRepositoryMock, partnerStub } from '@test/index.js';
import { IPartnerRepository, PartnerDirection } from './partner.repository.js';
import { PartnerService } from './partner.service.js';
const responseDto = {
admin: {

View file

@ -1,8 +1,8 @@
import { PartnerEntity } from '@app/infra/entities';
import { PartnerEntity } from '@app/infra/entities/index.js';
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import { IPartnerRepository, PartnerDirection, PartnerIds } from '.';
import { AuthUserDto } from '../auth';
import { mapUser, UserResponseDto } from '../user';
import { AuthUserDto } from '../auth/index.js';
import { mapUser, UserResponseDto } from '../user/index.js';
import { IPartnerRepository, PartnerDirection, PartnerIds } from './index.js';
@Injectable()
export class PartnerService {

View file

@ -1,3 +1,3 @@
export * from './person.dto';
export * from './person.repository';
export * from './person.service';
export * from './person.dto.js';
export * from './person.repository.js';
export * from './person.service.js';

View file

@ -1,4 +1,4 @@
import { AssetFaceEntity, PersonEntity } from '@app/infra/entities';
import { AssetFaceEntity, PersonEntity } from '@app/infra/entities/index.js';
import { IsNotEmpty, IsString } from 'class-validator';
export class PersonUpdateDto {

View file

@ -1,4 +1,4 @@
import { AssetEntity, PersonEntity } from '@app/infra/entities';
import { AssetEntity, PersonEntity } from '@app/infra/entities/index.js';
export const IPersonRepository = 'IPersonRepository';

View file

@ -6,12 +6,12 @@ import {
newPersonRepositoryMock,
newStorageRepositoryMock,
personStub,
} from '@test';
import { IJobRepository, JobName } from '..';
import { IStorageRepository } from '../storage';
import { PersonResponseDto } from './person.dto';
import { IPersonRepository } from './person.repository';
import { PersonService } from './person.service';
} from '@test/index.js';
import { IStorageRepository } from '../index.js';
import { PersonResponseDto } from './person.dto.js';
import { IPersonRepository } from './person.repository.js';
import { PersonService } from './person.service.js';
import { PersonResponseDto } from './response-dto/index.js';
const responseDto: PersonResponseDto = {
id: 'person-1',

View file

@ -1,10 +1,10 @@
import { BadRequestException, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
import { AssetResponseDto, mapAsset } from '../asset';
import { AuthUserDto } from '../auth';
import { IJobRepository, JobName } from '../job';
import { ImmichReadStream, IStorageRepository } from '../storage';
import { mapPerson, PersonResponseDto, PersonUpdateDto } from './person.dto';
import { IPersonRepository } from './person.repository';
import { AssetResponseDto, mapAsset } from '../asset/index.js';
import { AuthUserDto } from '../auth/index.js';
import { IJobRepository, JobName } from '../job/index.js';
import { ImmichReadStream, IStorageRepository } from '../storage/index.js';
import { mapPerson, PersonResponseDto, PersonUpdateDto } from './person.dto.js';
import { IPersonRepository } from './person.repository.js';
@Injectable()
export class PersonService {

View file

@ -1 +1 @@
export * from './search.dto';
export * from './search.dto.js';

View file

@ -1,5 +1,5 @@
import { toBoolean } from '@app/immich/utils/transform.util';
import { AssetType } from '@app/infra/entities';
import { toBoolean } from '@app/immich/utils/transform.util.js';
import { AssetType } from '@app/infra/entities/index.js';
import { Transform } from 'class-transformer';
import { IsArray, IsBoolean, IsEnum, IsNotEmpty, IsOptional, IsString } from 'class-validator';

View file

@ -1,4 +1,4 @@
export * from './dto';
export * from './response-dto';
export * from './search.repository';
export * from './search.service';
export * from './dto/index.js';
export * from './response-dto/index.js';
export * from './search.repository.js';
export * from './search.service.js';

View file

@ -1,3 +1,3 @@
export * from './search-config-response.dto';
export * from './search-explore.response.dto';
export * from './search-response.dto';
export * from './search-config-response.dto.js';
export * from './search-explore.response.dto.js';
export * from './search-response.dto.js';

View file

@ -1,4 +1,4 @@
import { AssetResponseDto } from '../../asset';
import { AssetResponseDto } from '../../asset/index.js';
class SearchExploreItem {
value!: string;

View file

@ -1,6 +1,6 @@
import { ApiProperty } from '@nestjs/swagger';
import { AlbumResponseDto } from '../../album';
import { AssetResponseDto } from '../../asset';
import { AlbumResponseDto } from '../../album/index.js';
import { AssetResponseDto } from '../../asset/index.js';
class SearchFacetCountResponseDto {
@ApiProperty({ type: 'integer' })

View file

@ -1,4 +1,4 @@
import { AlbumEntity, AssetEntity, AssetFaceEntity, AssetType } from '@app/infra/entities';
import { AlbumEntity, AssetEntity, AssetFaceEntity, AssetType } from '@app/infra/entities/index.js';
export enum SearchCollection {
ASSETS = 'assets',

View file

@ -13,17 +13,17 @@ import {
newMachineLearningRepositoryMock,
newSearchRepositoryMock,
searchStub,
} from '@test';
} from '@test/index.js';
import { plainToInstance } from 'class-transformer';
import { IAlbumRepository } from '../album/album.repository';
import { IAssetRepository } from '../asset/asset.repository';
import { IFaceRepository } from '../facial-recognition';
import { JobName } from '../job';
import { IJobRepository } from '../job/job.repository';
import { IMachineLearningRepository } from '../smart-info';
import { SearchDto } from './dto';
import { ISearchRepository } from './search.repository';
import { SearchService } from './search.service';
import { IAlbumRepository } from '../album/album.repository.js';
import { IAssetRepository } from '../asset/asset.repository.js';
import { IFaceRepository } from '../facial-recognition/index.js';
import { JobName } from '../job/index.js';
import { IJobRepository } from '../job/job.repository.js';
import { IMachineLearningRepository } from '../smart-info/index.js';
import { SearchDto } from './dto/index.js';
import { ISearchRepository } from './search.repository.js';
import { SearchService } from './search.service.js';
jest.useFakeTimers();

View file

@ -1,18 +1,18 @@
import { AlbumEntity, AssetEntity, AssetFaceEntity } from '@app/infra/entities';
import { AlbumEntity, AssetEntity, AssetFaceEntity } from '@app/infra/entities/index.js';
import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { mapAlbum } from '../album';
import { IAlbumRepository } from '../album/album.repository';
import { AssetResponseDto, mapAsset } from '../asset';
import { IAssetRepository } from '../asset/asset.repository';
import { AuthUserDto } from '../auth';
import { MACHINE_LEARNING_ENABLED } from '../domain.constant';
import { usePagination } from '../domain.util';
import { AssetFaceId, IFaceRepository } from '../facial-recognition';
import { IAssetFaceJob, IBulkEntityJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job';
import { IMachineLearningRepository } from '../smart-info';
import { SearchDto } from './dto';
import { SearchConfigResponseDto, SearchResponseDto } from './response-dto';
import { IAlbumRepository } from '../album/album.repository.js';
import { mapAlbum } from '../album/index.js';
import { IAssetRepository } from '../asset/asset.repository.js';
import { AssetResponseDto, mapAsset } from '../asset/index.js';
import { AuthUserDto } from '../auth/index.js';
import { MACHINE_LEARNING_ENABLED } from '../domain.constant.js';
import { usePagination } from '../domain.util.js';
import { AssetFaceId, IFaceRepository } from '../facial-recognition/index.js';
import { IAssetFaceJob, IBulkEntityJob, IJobRepository, JobName, JOBS_ASSET_PAGINATION_SIZE } from '../job/index.js';
import { IMachineLearningRepository } from '../smart-info/index.js';
import { SearchDto } from './dto/index.js';
import { SearchConfigResponseDto, SearchResponseDto } from './response-dto/index.js';
import {
ISearchRepository,
OwnedFaceEntity,
@ -20,7 +20,7 @@ import {
SearchExploreItem,
SearchResult,
SearchStrategy,
} from './search.repository';
} from './search.repository.js';
interface SyncQueue {
upsert: Set<string>;

View file

@ -1,2 +1,2 @@
export * from './response-dto';
export * from './server-info.service';
export * from './response-dto/index.js';
export * from './server-info.service.js';

View file

@ -1,5 +1,5 @@
export * from './server-info-response.dto';
export * from './server-ping-response.dto';
export * from './server-stats-response.dto';
export * from './server-version-response.dto';
export * from './usage-by-user-response.dto';
export * from './server-info-response.dto.js';
export * from './server-ping-response.dto.js';
export * from './server-stats-response.dto.js';
export * from './server-version-response.dto.js';
export * from './usage-by-user-response.dto.js';

View file

@ -1,5 +1,5 @@
import { ApiProperty } from '@nestjs/swagger';
import { UsageByUserDto } from './usage-by-user-response.dto';
import { UsageByUserDto } from './usage-by-user-response.dto.js';
export class ServerStatsResponseDto {
@ApiProperty({ type: 'integer' })

View file

@ -1,8 +1,8 @@
import { newStorageRepositoryMock, newUserRepositoryMock } from '@test';
import { serverVersion } from '../domain.constant';
import { IStorageRepository } from '../storage';
import { IUserRepository } from '../user';
import { ServerInfoService } from './server-info.service';
import { newStorageRepositoryMock, newUserRepositoryMock } from '@test/index.js';
import { serverVersion } from '../domain.constant.js';
import { IStorageRepository } from '../storage/index.js';
import { IUserRepository } from '../user/index.js';
import { ServerInfoService } from './server-info.service.js';
describe(ServerInfoService.name, () => {
let sut: ServerInfoService;

View file

@ -1,9 +1,14 @@
import { Inject, Injectable } from '@nestjs/common';
import { serverVersion } from '../domain.constant';
import { asHumanReadable } from '../domain.util';
import { IStorageRepository, StorageCore, StorageFolder } from '../storage';
import { IUserRepository, UserStatsQueryResponse } from '../user';
import { ServerInfoResponseDto, ServerPingResponse, ServerStatsResponseDto, UsageByUserDto } from './response-dto';
import { serverVersion } from '../domain.constant.js';
import { asHumanReadable } from '../domain.util.js';
import { IStorageRepository, StorageCore, StorageFolder } from '../storage/index.js';
import { IUserRepository, UserStatsQueryResponse } from '../user/index.js';
import {
ServerInfoResponseDto,
ServerPingResponse,
ServerStatsResponseDto,
UsageByUserDto,
} from './response-dto/index.js';
@Injectable()
export class ServerInfoService {

View file

@ -1,4 +1,4 @@
export * from './shared-link-response.dto';
export * from './shared-link.dto';
export * from './shared-link.repository';
export * from './shared-link.service';
export * from './shared-link-response.dto.js';
export * from './shared-link.dto.js';
export * from './shared-link.repository.js';
export * from './shared-link.service.js';

Some files were not shown because too many files have changed in this diff Show more