Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
|
0a59b6a4fb |
250 changed files with 2277 additions and 2979 deletions
3255
server/package-lock.json
generated
3255
server/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -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/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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] })],
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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']);
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export * from './access.core';
|
||||
export * from './access.repository';
|
||||
export * from './access.core.js';
|
||||
export * from './access.repository.js';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { AlbumEntity } from '@app/infra/entities';
|
||||
import { AlbumEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export const IAlbumRepository = 'IAlbumRepository';
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { APIKeyEntity } from '@app/infra/entities';
|
||||
import { APIKeyEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export const IKeyRepository = 'IKeyRepository';
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 })
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { AssetResponseDto } from './asset-response.dto';
|
||||
import { AssetResponseDto } from './asset-response.dto.js';
|
||||
|
||||
export class MemoryLaneResponseDto {
|
||||
title!: string;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { SmartInfoEntity } from '@app/infra/entities';
|
||||
import { SmartInfoEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export class SmartInfoResponseDto {
|
||||
tags?: string[] | null;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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', () => {
|
||||
|
|
|
@ -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', () => {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { UserEntity } from '@app/infra/entities';
|
||||
import { UserEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export class AdminSignupResponseDto {
|
||||
id!: string;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { UserTokenEntity } from '@app/infra/entities';
|
||||
import { UserTokenEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export class AuthDeviceResponseDto {
|
||||
id!: string;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1 +1 @@
|
|||
export * from './communication.repository';
|
||||
export * from './communication.repository.js';
|
||||
|
|
|
@ -1 +1 @@
|
|||
export * from './crypto.repository';
|
||||
export * from './crypto.repository.js';
|
||||
|
|
|
@ -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', () => {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { AssetFaceEntity } from '@app/infra/entities';
|
||||
import { AssetFaceEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export const IFaceRepository = 'IFaceRepository';
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export * from './face.repository';
|
||||
export * from './facial-recognition.services';
|
||||
export * from './face.repository.js';
|
||||
export * from './facial-recognition.services.js';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { BoundingBox } from '../smart-info';
|
||||
import { BoundingBox } from '../smart-info/index.js';
|
||||
|
||||
export interface IBaseJob {
|
||||
force?: boolean;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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' })
|
||||
|
|
|
@ -1 +1 @@
|
|||
export * from './all-job-status-response.dto';
|
||||
export * from './all-job-status-response.dto.js';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export * from './geocoding.repository';
|
||||
export * from './metadata.service';
|
||||
export * from './geocoding.repository.js';
|
||||
export * from './metadata.service.js';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1 +1 @@
|
|||
export * from './oauth-config-response.dto';
|
||||
export * from './oauth-config-response.dto.js';
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export * from './partner.repository';
|
||||
export * from './partner.service';
|
||||
export * from './partner.repository.js';
|
||||
export * from './partner.service.js';
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { PartnerEntity } from '@app/infra/entities';
|
||||
import { PartnerEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export interface PartnerIds {
|
||||
sharedById: string;
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { AssetEntity, PersonEntity } from '@app/infra/entities';
|
||||
import { AssetEntity, PersonEntity } from '@app/infra/entities/index.js';
|
||||
|
||||
export const IPersonRepository = 'IPersonRepository';
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1 +1 @@
|
|||
export * from './search.dto';
|
||||
export * from './search.dto.js';
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { AssetResponseDto } from '../../asset';
|
||||
import { AssetResponseDto } from '../../asset/index.js';
|
||||
|
||||
class SearchExploreItem {
|
||||
value!: string;
|
||||
|
|
|
@ -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' })
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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>;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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' })
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
Loading…
Reference in a new issue