소스 검색

refactor(server): flatten infra folders (#2120)

* refactor: flatten infra folders

* fix: database migrations

* fix: test related import

* fix: github actions workflow

* chore: rename schemas to typesense-schemas
Jason Rasmussen 2 년 전
부모
커밋
34d300d1da
100개의 변경된 파일163개의 추가작업 그리고 148개의 파일을 삭제
  1. 2 2
      .github/workflows/test.yml
  2. 2 2
      server/apps/immich/src/api-v1/album/album-repository.ts
  3. 1 1
      server/apps/immich/src/api-v1/album/album.module.ts
  4. 1 1
      server/apps/immich/src/api-v1/album/album.service.spec.ts
  5. 1 1
      server/apps/immich/src/api-v1/album/album.service.ts
  6. 1 1
      server/apps/immich/src/api-v1/asset/asset-repository.ts
  7. 1 1
      server/apps/immich/src/api-v1/asset/asset.core.ts
  8. 1 1
      server/apps/immich/src/api-v1/asset/asset.module.ts
  9. 1 1
      server/apps/immich/src/api-v1/asset/asset.service.spec.ts
  10. 1 1
      server/apps/immich/src/api-v1/asset/asset.service.ts
  11. 1 1
      server/apps/immich/src/api-v1/asset/dto/create-asset.dto.ts
  12. 1 1
      server/apps/immich/src/api-v1/tag/dto/create-tag.dto.ts
  13. 1 1
      server/apps/immich/src/api-v1/tag/tag.module.ts
  14. 1 1
      server/apps/immich/src/api-v1/tag/tag.repository.ts
  15. 1 1
      server/apps/immich/src/api-v1/tag/tag.service.spec.ts
  16. 1 1
      server/apps/immich/src/api-v1/tag/tag.service.ts
  17. 1 1
      server/apps/immich/src/modules/download/download.service.ts
  18. 1 1
      server/apps/microservices/src/microservices.module.ts
  19. 1 1
      server/apps/microservices/src/processors/metadata-extraction.processor.ts
  20. 1 1
      server/apps/microservices/src/processors/video-transcode.processor.ts
  21. 1 1
      server/libs/domain/src/album/album.repository.ts
  22. 1 1
      server/libs/domain/src/album/album.service.ts
  23. 1 1
      server/libs/domain/src/album/response-dto/album-response.dto.ts
  24. 1 1
      server/libs/domain/src/api-key/api-key.repository.ts
  25. 1 1
      server/libs/domain/src/api-key/response-dto/api-key-response.dto.ts
  26. 1 1
      server/libs/domain/src/asset/asset.core.ts
  27. 1 1
      server/libs/domain/src/asset/asset.repository.ts
  28. 1 1
      server/libs/domain/src/asset/asset.service.spec.ts
  29. 1 1
      server/libs/domain/src/asset/asset.service.ts
  30. 1 1
      server/libs/domain/src/asset/response-dto/asset-response.dto.ts
  31. 1 1
      server/libs/domain/src/asset/response-dto/exif-response.dto.ts
  32. 1 1
      server/libs/domain/src/asset/response-dto/smart-info-response.dto.ts
  33. 1 1
      server/libs/domain/src/auth/auth.core.ts
  34. 1 1
      server/libs/domain/src/auth/auth.service.spec.ts
  35. 1 1
      server/libs/domain/src/auth/auth.service.ts
  36. 1 1
      server/libs/domain/src/auth/response-dto/admin-signup-response.dto.ts
  37. 1 1
      server/libs/domain/src/auth/response-dto/login-response.dto.ts
  38. 1 1
      server/libs/domain/src/device-info/device-info.core.ts
  39. 1 1
      server/libs/domain/src/device-info/device-info.repository.ts
  40. 1 1
      server/libs/domain/src/device-info/device-info.service.spec.ts
  41. 1 1
      server/libs/domain/src/device-info/dto/upsert-device-info.dto.ts
  42. 1 1
      server/libs/domain/src/device-info/response-dto/device-info-response.dto.ts
  43. 1 1
      server/libs/domain/src/job/job.interface.ts
  44. 1 1
      server/libs/domain/src/media/media.service.ts
  45. 1 1
      server/libs/domain/src/oauth/oauth.core.ts
  46. 1 1
      server/libs/domain/src/oauth/oauth.service.spec.ts
  47. 1 1
      server/libs/domain/src/oauth/oauth.service.ts
  48. 1 1
      server/libs/domain/src/search/dto/search.dto.ts
  49. 1 1
      server/libs/domain/src/search/search.repository.ts
  50. 1 1
      server/libs/domain/src/search/search.service.ts
  51. 1 1
      server/libs/domain/src/share/dto/create-shared-link.dto.ts
  52. 1 1
      server/libs/domain/src/share/response-dto/shared-link-response.dto.ts
  53. 1 1
      server/libs/domain/src/share/share.core.ts
  54. 1 1
      server/libs/domain/src/share/shared-link.repository.ts
  55. 1 1
      server/libs/domain/src/smart-info/smart-info.repository.ts
  56. 1 1
      server/libs/domain/src/smart-info/smart-info.service.spec.ts
  57. 1 1
      server/libs/domain/src/storage-template/storage-template.core.ts
  58. 1 1
      server/libs/domain/src/storage-template/storage-template.service.ts
  59. 1 1
      server/libs/domain/src/system-config/dto/system-config-ffmpeg.dto.ts
  60. 1 1
      server/libs/domain/src/system-config/dto/system-config.dto.ts
  61. 1 1
      server/libs/domain/src/system-config/system-config.core.ts
  62. 1 1
      server/libs/domain/src/system-config/system-config.repository.ts
  63. 1 1
      server/libs/domain/src/system-config/system-config.service.spec.ts
  64. 1 1
      server/libs/domain/src/tag/response-dto/tag-response.dto.ts
  65. 1 1
      server/libs/domain/src/user-token/user-token.core.ts
  66. 1 1
      server/libs/domain/src/user-token/user-token.repository.ts
  67. 1 1
      server/libs/domain/src/user/response-dto/user-response.dto.ts
  68. 1 1
      server/libs/domain/src/user/user.core.ts
  69. 1 1
      server/libs/domain/src/user/user.repository.ts
  70. 1 1
      server/libs/domain/src/user/user.service.spec.ts
  71. 1 1
      server/libs/domain/src/user/user.service.ts
  72. 1 1
      server/libs/domain/test/fixtures.ts
  73. 0 0
      server/libs/infra/src/communication.gateway.ts
  74. 0 2
      server/libs/infra/src/communication/index.ts
  75. 4 3
      server/libs/infra/src/database.config.ts
  76. 0 1
      server/libs/infra/src/db/config/index.ts
  77. 0 11
      server/libs/infra/src/db/entities/index.ts
  78. 0 3
      server/libs/infra/src/db/index.ts
  79. 0 0
      server/libs/infra/src/entities/album.entity.ts
  80. 0 0
      server/libs/infra/src/entities/api-key.entity.ts
  81. 0 0
      server/libs/infra/src/entities/asset.entity.ts
  82. 0 0
      server/libs/infra/src/entities/device-info.entity.ts
  83. 0 0
      server/libs/infra/src/entities/exif.entity.ts
  84. 33 0
      server/libs/infra/src/entities/index.ts
  85. 0 0
      server/libs/infra/src/entities/shared-link.entity.ts
  86. 0 0
      server/libs/infra/src/entities/smart-info.entity.ts
  87. 0 0
      server/libs/infra/src/entities/system-config.entity.ts
  88. 0 0
      server/libs/infra/src/entities/tag.entity.ts
  89. 0 0
      server/libs/infra/src/entities/user-token.entity.ts
  90. 0 0
      server/libs/infra/src/entities/user.entity.ts
  91. 2 1
      server/libs/infra/src/index.ts
  92. 35 0
      server/libs/infra/src/infra.config.ts
  93. 15 50
      server/libs/infra/src/infra.module.ts
  94. 0 1
      server/libs/infra/src/job/index.ts
  95. 0 1
      server/libs/infra/src/machine-learning/index.ts
  96. 0 1
      server/libs/infra/src/media/index.ts
  97. 0 0
      server/libs/infra/src/migrations/1645130759468-CreateUserTable.ts
  98. 0 0
      server/libs/infra/src/migrations/1645130777674-CreateDeviceInfoTable.ts
  99. 0 0
      server/libs/infra/src/migrations/1645130805273-CreateAssetsTable.ts
  100. 0 0
      server/libs/infra/src/migrations/1645130817965-CreateExifTable.ts

+ 2 - 2
.github/workflows/test.yml

@@ -110,13 +110,13 @@ jobs:
         continue-on-error: true
         run: |
           cd server
-          npm run typeorm:migrations:generate ./libs/infra/src/db/migrations/TestMigration
+          npm run typeorm:migrations:generate ./libs/infra/src/migrations/TestMigration
       - name: Find file changes
         uses: tj-actions/verify-changed-files@v13.1
         id: verify-changed-files
         with:
           files: |
-            server/libs/infra/src/db/migrations/
+            server/libs/infra/src/migrations/
       - name: Verify files have not changed
         if: steps.verify-changed-files.outputs.files_changed == 'true'
         run: |

+ 2 - 2
server/apps/immich/src/api-v1/album/album-repository.ts

@@ -1,5 +1,5 @@
-import { AlbumEntity, AssetEntity, UserEntity } from '@app/infra/db/entities';
-import { dataSource } from '@app/infra/db/config';
+import { AlbumEntity, AssetEntity, UserEntity } from '@app/infra/entities';
+import { dataSource } from '@app/infra/database.config';
 import { Injectable } from '@nestjs/common';
 import { InjectRepository } from '@nestjs/typeorm';
 import { Repository } from 'typeorm';

+ 1 - 1
server/apps/immich/src/api-v1/album/album.module.ts

@@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
 import { AlbumService } from './album.service';
 import { AlbumController } from './album.controller';
 import { TypeOrmModule } from '@nestjs/typeorm';
-import { AlbumEntity, AssetEntity } from '@app/infra/db/entities';
+import { AlbumEntity, AssetEntity } from '@app/infra/entities';
 import { AlbumRepository, IAlbumRepository } from './album-repository';
 import { DownloadModule } from '../../modules/download/download.module';
 

+ 1 - 1
server/apps/immich/src/api-v1/album/album.service.spec.ts

@@ -1,7 +1,7 @@
 import { AlbumService } from './album.service';
 import { AuthUserDto } from '../../decorators/auth-user.decorator';
 import { BadRequestException, NotFoundException, ForbiddenException } from '@nestjs/common';
-import { AlbumEntity, UserEntity } from '@app/infra/db/entities';
+import { AlbumEntity, UserEntity } from '@app/infra/entities';
 import { AlbumResponseDto, ICryptoRepository, IJobRepository, JobName, mapUser } from '@app/domain';
 import { AddAssetsResponseDto } from './response-dto/add-assets-response.dto';
 import { IAlbumRepository } from './album-repository';

+ 1 - 1
server/apps/immich/src/api-v1/album/album.service.ts

@@ -1,7 +1,7 @@
 import { BadRequestException, Inject, Injectable, NotFoundException, ForbiddenException, Logger } from '@nestjs/common';
 import { AuthUserDto } from '../../decorators/auth-user.decorator';
 import { CreateAlbumDto } from './dto/create-album.dto';
-import { AlbumEntity, SharedLinkType } from '@app/infra/db/entities';
+import { AlbumEntity, SharedLinkType } from '@app/infra/entities';
 import { AddUsersDto } from './dto/add-users.dto';
 import { RemoveAssetsDto } from './dto/remove-assets.dto';
 import { UpdateAlbumDto } from './dto/update-album.dto';

+ 1 - 1
server/apps/immich/src/api-v1/asset/asset-repository.ts

@@ -1,6 +1,6 @@
 import { SearchPropertiesDto } from './dto/search-properties.dto';
 import { CuratedLocationsResponseDto } from './response-dto/curated-locations-response.dto';
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 import { Inject, Injectable } from '@nestjs/common';
 import { InjectRepository } from '@nestjs/typeorm';
 import { Repository } from 'typeorm/repository/Repository';

+ 1 - 1
server/apps/immich/src/api-v1/asset/asset.core.ts

@@ -1,5 +1,5 @@
 import { AuthUserDto, IJobRepository, JobName } from '@app/domain';
-import { AssetEntity, UserEntity } from '@app/infra/db/entities';
+import { AssetEntity, UserEntity } from '@app/infra/entities';
 import { IAssetRepository } from './asset-repository';
 import { CreateAssetDto, UploadFile } from './dto/create-asset.dto';
 

+ 1 - 1
server/apps/immich/src/api-v1/asset/asset.module.ts

@@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
 import { AssetService } from './asset.service';
 import { AssetController } from './asset.controller';
 import { TypeOrmModule } from '@nestjs/typeorm';
-import { AssetEntity } from '@app/infra/db/entities';
+import { AssetEntity } from '@app/infra/entities';
 import { AssetRepository, IAssetRepository } from './asset-repository';
 import { DownloadModule } from '../../modules/download/download.module';
 import { TagModule } from '../tag/tag.module';

+ 1 - 1
server/apps/immich/src/api-v1/asset/asset.service.spec.ts

@@ -1,7 +1,7 @@
 import { IAssetRepository } from './asset-repository';
 import { AssetService } from './asset.service';
 import { QueryFailedError, Repository } from 'typeorm';
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 import { CreateAssetDto } from './dto/create-asset.dto';
 import { AssetCountByTimeBucket } from './response-dto/asset-count-by-time-group-response.dto';
 import { TimeGroupEnum } from './dto/get-asset-count-by-time-bucket.dto';

+ 1 - 1
server/apps/immich/src/api-v1/asset/asset.service.ts

@@ -12,7 +12,7 @@ import {
 import { InjectRepository } from '@nestjs/typeorm';
 import { QueryFailedError, Repository } from 'typeorm';
 import { AuthUserDto } from '../../decorators/auth-user.decorator';
-import { AssetEntity, AssetType, SharedLinkType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType, SharedLinkType } from '@app/infra/entities';
 import { constants, createReadStream, stat } from 'fs';
 import { ServeFileDto } from './dto/serve-file.dto';
 import { Response as Res } from 'express';

+ 1 - 1
server/apps/immich/src/api-v1/asset/dto/create-asset.dto.ts

@@ -1,4 +1,4 @@
-import { AssetType } from '@app/infra/db/entities';
+import { AssetType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 import { IsBoolean, IsEnum, IsNotEmpty, IsOptional } from 'class-validator';
 import { ImmichFile } from '../../../config/asset-upload.config';

+ 1 - 1
server/apps/immich/src/api-v1/tag/dto/create-tag.dto.ts

@@ -1,4 +1,4 @@
-import { TagType } from '@app/infra/db/entities';
+import { TagType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
 

+ 1 - 1
server/apps/immich/src/api-v1/tag/tag.module.ts

@@ -1,7 +1,7 @@
 import { Module } from '@nestjs/common';
 import { TagService } from './tag.service';
 import { TagController } from './tag.controller';
-import { TagEntity } from '@app/infra/db/entities';
+import { TagEntity } from '@app/infra/entities';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { TagRepository, ITagRepository } from './tag.repository';
 

+ 1 - 1
server/apps/immich/src/api-v1/tag/tag.repository.ts

@@ -1,4 +1,4 @@
-import { TagEntity, TagType } from '@app/infra/db/entities';
+import { TagEntity, TagType } from '@app/infra/entities';
 import { Injectable } from '@nestjs/common';
 import { InjectRepository } from '@nestjs/typeorm';
 import { In, Repository } from 'typeorm';

+ 1 - 1
server/apps/immich/src/api-v1/tag/tag.service.spec.ts

@@ -1,4 +1,4 @@
-import { TagEntity, TagType, UserEntity } from '@app/infra/db/entities';
+import { TagEntity, TagType, UserEntity } from '@app/infra/entities';
 import { AuthUserDto } from '../../decorators/auth-user.decorator';
 import { ITagRepository } from './tag.repository';
 import { TagService } from './tag.service';

+ 1 - 1
server/apps/immich/src/api-v1/tag/tag.service.ts

@@ -1,4 +1,4 @@
-import { TagEntity } from '@app/infra/db/entities';
+import { TagEntity } from '@app/infra/entities';
 import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
 import { AuthUserDto } from '../../decorators/auth-user.decorator';
 import { CreateTagDto } from './dto/create-tag.dto';

+ 1 - 1
server/apps/immich/src/modules/download/download.service.ts

@@ -1,4 +1,4 @@
-import { AssetEntity } from '@app/infra/db/entities';
+import { AssetEntity } from '@app/infra/entities';
 import { BadRequestException, Injectable, InternalServerErrorException, Logger, StreamableFile } from '@nestjs/common';
 import archiver from 'archiver';
 import { extname } from 'path';

+ 1 - 1
server/apps/microservices/src/microservices.module.ts

@@ -1,6 +1,6 @@
 import { DomainModule } from '@app/domain';
 import { InfraModule } from '@app/infra';
-import { ExifEntity } from '@app/infra/db/entities';
+import { ExifEntity } from '@app/infra/entities';
 import { Module } from '@nestjs/common';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import {

+ 1 - 1
server/apps/microservices/src/processors/metadata-extraction.processor.ts

@@ -10,7 +10,7 @@ import {
   QueueName,
   WithoutProperty,
 } from '@app/domain';
-import { AssetType, ExifEntity } from '@app/infra/db/entities';
+import { AssetType, ExifEntity } from '@app/infra/entities';
 import { Process, Processor } from '@nestjs/bull';
 import { Inject, Logger } from '@nestjs/common';
 import { ConfigService } from '@nestjs/config';

+ 1 - 1
server/apps/microservices/src/processors/video-transcode.processor.ts

@@ -12,7 +12,7 @@ import {
   SystemConfigService,
   WithoutProperty,
 } from '@app/domain';
-import { AssetEntity, AssetType, TranscodePreset } from '@app/infra/db/entities';
+import { AssetEntity, AssetType, TranscodePreset } from '@app/infra/entities';
 import { Process, Processor } from '@nestjs/bull';
 import { Inject, Logger } from '@nestjs/common';
 import { Job } from 'bull';

+ 1 - 1
server/libs/domain/src/album/album.repository.ts

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

+ 1 - 1
server/libs/domain/src/album/album.service.ts

@@ -1,4 +1,4 @@
-import { AlbumEntity } from '@app/infra/db/entities';
+import { AlbumEntity } from '@app/infra/entities';
 import { Inject, Injectable } from '@nestjs/common';
 import { IAssetRepository } from '../asset';
 import { AuthUserDto } from '../auth';

+ 1 - 1
server/libs/domain/src/album/response-dto/album-response.dto.ts

@@ -1,4 +1,4 @@
-import { AlbumEntity } from '@app/infra/db/entities';
+import { AlbumEntity } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 import { AssetResponseDto, mapAsset } from '../../asset';
 import { mapUser, UserResponseDto } from '../../user';

+ 1 - 1
server/libs/domain/src/api-key/api-key.repository.ts

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

+ 1 - 1
server/libs/domain/src/api-key/response-dto/api-key-response.dto.ts

@@ -1,4 +1,4 @@
-import { APIKeyEntity } from '@app/infra/db/entities';
+import { APIKeyEntity } from '@app/infra/entities';
 
 export class APIKeyResponseDto {
   id!: string;

+ 1 - 1
server/libs/domain/src/asset/asset.core.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 import { IJobRepository, JobName } from '../job';
 import { AssetSearchOptions, IAssetRepository } from './asset.repository';
 

+ 1 - 1
server/libs/domain/src/asset/asset.repository.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 
 export interface AssetSearchOptions {
   isVisible?: boolean;

+ 1 - 1
server/libs/domain/src/asset/asset.service.spec.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 import { assetEntityStub, newAssetRepositoryMock, newJobRepositoryMock } from '../../test';
 import { AssetService, IAssetRepository } from '../asset';
 import { IJobRepository, JobName } from '../job';

+ 1 - 1
server/libs/domain/src/asset/asset.service.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 import { Inject } from '@nestjs/common';
 import { IAssetUploadedJob, IJobRepository, JobName } from '../job';
 import { AssetCore } from './asset.core';

+ 1 - 1
server/libs/domain/src/asset/response-dto/asset-response.dto.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, AssetType } from '@app/infra/db/entities';
+import { AssetEntity, AssetType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 import { mapTag, TagResponseDto } from '../../tag';
 import { ExifResponseDto, mapExif } from './exif-response.dto';

+ 1 - 1
server/libs/domain/src/asset/response-dto/exif-response.dto.ts

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

+ 1 - 1
server/libs/domain/src/asset/response-dto/smart-info-response.dto.ts

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

+ 1 - 1
server/libs/domain/src/auth/auth.core.ts

@@ -1,4 +1,4 @@
-import { SystemConfig, UserEntity } from '@app/infra/db/entities';
+import { SystemConfig, UserEntity } from '@app/infra/entities';
 import { ISystemConfigRepository } from '../system-config';
 import { SystemConfigCore } from '../system-config/system-config.core';
 import { AuthType, IMMICH_ACCESS_COOKIE, IMMICH_AUTH_TYPE_COOKIE } from './auth.constant';

+ 1 - 1
server/libs/domain/src/auth/auth.service.spec.ts

@@ -1,4 +1,4 @@
-import { SystemConfig, UserEntity } from '@app/infra/db/entities';
+import { SystemConfig, UserEntity } from '@app/infra/entities';
 import { BadRequestException, UnauthorizedException } from '@nestjs/common';
 import { IncomingHttpHeaders } from 'http';
 import { generators, Issuer } from 'openid-client';

+ 1 - 1
server/libs/domain/src/auth/auth.service.ts

@@ -1,4 +1,4 @@
-import { SystemConfig } from '@app/infra/db/entities';
+import { SystemConfig } from '@app/infra/entities';
 import {
   BadRequestException,
   Inject,

+ 1 - 1
server/libs/domain/src/auth/response-dto/admin-signup-response.dto.ts

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

+ 1 - 1
server/libs/domain/src/auth/response-dto/login-response.dto.ts

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

+ 1 - 1
server/libs/domain/src/device-info/device-info.core.ts

@@ -1,4 +1,4 @@
-import { DeviceInfoEntity } from '@app/infra/db/entities';
+import { DeviceInfoEntity } from '@app/infra/entities';
 import { IDeviceInfoRepository } from './device-info.repository';
 
 type UpsertKeys = Pick<DeviceInfoEntity, 'deviceId' | 'userId'>;

+ 1 - 1
server/libs/domain/src/device-info/device-info.repository.ts

@@ -1,4 +1,4 @@
-import { DeviceInfoEntity } from '@app/infra/db/entities';
+import { DeviceInfoEntity } from '@app/infra/entities';
 
 export const IDeviceInfoRepository = 'IDeviceInfoRepository';
 

+ 1 - 1
server/libs/domain/src/device-info/device-info.service.spec.ts

@@ -1,4 +1,4 @@
-import { DeviceInfoEntity, DeviceType } from '@app/infra/db/entities';
+import { DeviceInfoEntity, DeviceType } from '@app/infra/entities';
 import { authStub, newDeviceInfoRepositoryMock } from '../../test';
 import { IDeviceInfoRepository } from './device-info.repository';
 import { DeviceInfoService } from './device-info.service';

+ 1 - 1
server/libs/domain/src/device-info/dto/upsert-device-info.dto.ts

@@ -1,5 +1,5 @@
 import { IsNotEmpty, IsOptional } from 'class-validator';
-import { DeviceType } from '@app/infra/db/entities';
+import { DeviceType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 
 export class UpsertDeviceInfoDto {

+ 1 - 1
server/libs/domain/src/device-info/response-dto/device-info-response.dto.ts

@@ -1,4 +1,4 @@
-import { DeviceInfoEntity, DeviceType } from '@app/infra/db/entities';
+import { DeviceInfoEntity, DeviceType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 
 export class DeviceInfoResponseDto {

+ 1 - 1
server/libs/domain/src/job/job.interface.ts

@@ -1,4 +1,4 @@
-import { AlbumEntity, AssetEntity, UserEntity } from '@app/infra/db/entities';
+import { AlbumEntity, AssetEntity, UserEntity } from '@app/infra/entities';
 
 export interface IBaseJob {
   force?: boolean;

+ 1 - 1
server/libs/domain/src/media/media.service.ts

@@ -1,4 +1,4 @@
-import { AssetType } from '@app/infra/db/entities';
+import { AssetType } from '@app/infra/entities';
 import { Inject, Injectable, Logger } from '@nestjs/common';
 import { join } from 'path';
 import { IAssetRepository, mapAsset, WithoutProperty } from '../asset';

+ 1 - 1
server/libs/domain/src/oauth/oauth.core.ts

@@ -1,4 +1,4 @@
-import { SystemConfig } from '@app/infra/db/entities';
+import { SystemConfig } from '@app/infra/entities';
 import { BadRequestException, Injectable, Logger } from '@nestjs/common';
 import { ClientMetadata, custom, generators, Issuer, UserinfoResponse } from 'openid-client';
 import { ISystemConfigRepository } from '../system-config';

+ 1 - 1
server/libs/domain/src/oauth/oauth.service.spec.ts

@@ -1,4 +1,4 @@
-import { SystemConfig, UserEntity } from '@app/infra/db/entities';
+import { SystemConfig, UserEntity } from '@app/infra/entities';
 import { BadRequestException } from '@nestjs/common';
 import { generators, Issuer } from 'openid-client';
 import {

+ 1 - 1
server/libs/domain/src/oauth/oauth.service.ts

@@ -1,4 +1,4 @@
-import { SystemConfig } from '@app/infra/db/entities';
+import { SystemConfig } from '@app/infra/entities';
 import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
 import { AuthType, AuthUserDto, LoginResponseDto } from '../auth';
 import { AuthCore } from '../auth/auth.core';

+ 1 - 1
server/libs/domain/src/search/dto/search.dto.ts

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

+ 1 - 1
server/libs/domain/src/search/search.repository.ts

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

+ 1 - 1
server/libs/domain/src/search/search.service.ts

@@ -1,4 +1,4 @@
-import { AlbumEntity, AssetEntity } from '@app/infra/db/entities';
+import { AlbumEntity, AssetEntity } from '@app/infra/entities';
 import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
 import { ConfigService } from '@nestjs/config';
 import { mapAlbum } from '../album';

+ 1 - 1
server/libs/domain/src/share/dto/create-shared-link.dto.ts

@@ -1,4 +1,4 @@
-import { AlbumEntity, AssetEntity, SharedLinkType } from '@app/infra/db/entities';
+import { AlbumEntity, AssetEntity, SharedLinkType } from '@app/infra/entities';
 
 export class CreateSharedLinkDto {
   description?: string;

+ 1 - 1
server/libs/domain/src/share/response-dto/shared-link-response.dto.ts

@@ -1,4 +1,4 @@
-import { SharedLinkEntity, SharedLinkType } from '@app/infra/db/entities';
+import { SharedLinkEntity, SharedLinkType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 import _ from 'lodash';
 import { AlbumResponseDto, mapAlbumExcludeAssetInfo } from '../../album';

+ 1 - 1
server/libs/domain/src/share/share.core.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, SharedLinkEntity } from '@app/infra/db/entities';
+import { AssetEntity, SharedLinkEntity } from '@app/infra/entities';
 import {
   BadRequestException,
   ForbiddenException,

+ 1 - 1
server/libs/domain/src/share/shared-link.repository.ts

@@ -1,4 +1,4 @@
-import { SharedLinkEntity } from '@app/infra/db/entities';
+import { SharedLinkEntity } from '@app/infra/entities';
 
 export const ISharedLinkRepository = 'ISharedLinkRepository';
 

+ 1 - 1
server/libs/domain/src/smart-info/smart-info.repository.ts

@@ -1,4 +1,4 @@
-import { SmartInfoEntity } from '@app/infra/db/entities';
+import { SmartInfoEntity } from '@app/infra/entities';
 
 export const ISmartInfoRepository = 'ISmartInfoRepository';
 

+ 1 - 1
server/libs/domain/src/smart-info/smart-info.service.spec.ts

@@ -1,4 +1,4 @@
-import { AssetEntity } from '@app/infra/db/entities';
+import { AssetEntity } from '@app/infra/entities';
 import {
   assetEntityStub,
   newAssetRepositoryMock,

+ 1 - 1
server/libs/domain/src/storage-template/storage-template.core.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, AssetType, SystemConfig } from '@app/infra/db/entities';
+import { AssetEntity, AssetType, SystemConfig } from '@app/infra/entities';
 import { Logger } from '@nestjs/common';
 import handlebar from 'handlebars';
 import * as luxon from 'luxon';

+ 1 - 1
server/libs/domain/src/storage-template/storage-template.service.ts

@@ -1,4 +1,4 @@
-import { AssetEntity, SystemConfig } from '@app/infra/db/entities';
+import { AssetEntity, SystemConfig } from '@app/infra/entities';
 import { Inject, Injectable, Logger } from '@nestjs/common';
 import { IAssetRepository } from '../asset/asset.repository';
 import { APP_MEDIA_LOCATION } from '../domain.constant';

+ 1 - 1
server/libs/domain/src/system-config/dto/system-config-ffmpeg.dto.ts

@@ -1,5 +1,5 @@
 import { IsEnum, IsString } from 'class-validator';
-import { TranscodePreset } from '@app/infra/db/entities';
+import { TranscodePreset } from '@app/infra/entities';
 
 export class SystemConfigFFmpegDto {
   @IsString()

+ 1 - 1
server/libs/domain/src/system-config/dto/system-config.dto.ts

@@ -1,4 +1,4 @@
-import { SystemConfig } from '@app/infra/db/entities';
+import { SystemConfig } from '@app/infra/entities';
 import { ValidateNested } from 'class-validator';
 import { SystemConfigFFmpegDto } from './system-config-ffmpeg.dto';
 import { SystemConfigOAuthDto } from './system-config-oauth.dto';

+ 1 - 1
server/libs/domain/src/system-config/system-config.core.ts

@@ -1,4 +1,4 @@
-import { SystemConfig, SystemConfigEntity, SystemConfigKey, TranscodePreset } from '@app/infra/db/entities';
+import { SystemConfig, SystemConfigEntity, SystemConfigKey, TranscodePreset } from '@app/infra/entities';
 import { BadRequestException, Injectable, Logger } from '@nestjs/common';
 import * as _ from 'lodash';
 import { Subject } from 'rxjs';

+ 1 - 1
server/libs/domain/src/system-config/system-config.repository.ts

@@ -1,4 +1,4 @@
-import { SystemConfigEntity } from '@app/infra/db/entities';
+import { SystemConfigEntity } from '@app/infra/entities';
 
 export const ISystemConfigRepository = 'ISystemConfigRepository';
 

+ 1 - 1
server/libs/domain/src/system-config/system-config.service.spec.ts

@@ -1,4 +1,4 @@
-import { SystemConfigEntity, SystemConfigKey, TranscodePreset } from '@app/infra/db/entities';
+import { SystemConfigEntity, SystemConfigKey, TranscodePreset } from '@app/infra/entities';
 import { BadRequestException } from '@nestjs/common';
 import { newJobRepositoryMock, newSystemConfigRepositoryMock, systemConfigStub } from '../../test';
 import { IJobRepository, JobName } from '../job';

+ 1 - 1
server/libs/domain/src/tag/response-dto/tag-response.dto.ts

@@ -1,4 +1,4 @@
-import { TagEntity, TagType } from '@app/infra/db/entities';
+import { TagEntity, TagType } from '@app/infra/entities';
 import { ApiProperty } from '@nestjs/swagger';
 
 export class TagResponseDto {

+ 1 - 1
server/libs/domain/src/user-token/user-token.core.ts

@@ -1,4 +1,4 @@
-import { UserEntity } from '@app/infra/db/entities';
+import { UserEntity } from '@app/infra/entities';
 import { Injectable, UnauthorizedException } from '@nestjs/common';
 import { ICryptoRepository } from '../crypto';
 import { IUserTokenRepository } from './user-token.repository';

+ 1 - 1
server/libs/domain/src/user-token/user-token.repository.ts

@@ -1,4 +1,4 @@
-import { UserTokenEntity } from '@app/infra/db/entities';
+import { UserTokenEntity } from '@app/infra/entities';
 
 export const IUserTokenRepository = 'IUserTokenRepository';
 

+ 1 - 1
server/libs/domain/src/user/response-dto/user-response.dto.ts

@@ -1,4 +1,4 @@
-import { UserEntity } from '@app/infra/db/entities';
+import { UserEntity } from '@app/infra/entities';
 
 export class UserResponseDto {
   id!: string;

+ 1 - 1
server/libs/domain/src/user/user.core.ts

@@ -1,4 +1,4 @@
-import { UserEntity } from '@app/infra/db/entities';
+import { UserEntity } from '@app/infra/entities';
 import {
   BadRequestException,
   ForbiddenException,

+ 1 - 1
server/libs/domain/src/user/user.repository.ts

@@ -1,4 +1,4 @@
-import { UserEntity } from '@app/infra/db/entities';
+import { UserEntity } from '@app/infra/entities';
 
 export interface UserListFilter {
   excludeId?: string;

+ 1 - 1
server/libs/domain/src/user/user.service.spec.ts

@@ -1,4 +1,4 @@
-import { UserEntity } from '@app/infra/db/entities';
+import { UserEntity } from '@app/infra/entities';
 import { BadRequestException, ForbiddenException, NotFoundException } from '@nestjs/common';
 import { when } from 'jest-when';
 import {

+ 1 - 1
server/libs/domain/src/user/user.service.ts

@@ -1,4 +1,4 @@
-import { UserEntity } from '@app/infra/db/entities';
+import { UserEntity } from '@app/infra/entities';
 import { BadRequestException, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
 import { randomBytes } from 'crypto';
 import { ReadStream } from 'fs';

+ 1 - 1
server/libs/domain/test/fixtures.ts

@@ -9,7 +9,7 @@ import {
   TranscodePreset,
   UserEntity,
   UserTokenEntity,
-} from '@app/infra/db/entities';
+} from '@app/infra/entities';
 import {
   AlbumResponseDto,
   AssetResponseDto,

+ 0 - 0
server/libs/infra/src/communication/communication.gateway.ts → server/libs/infra/src/communication.gateway.ts


+ 0 - 2
server/libs/infra/src/communication/index.ts

@@ -1,2 +0,0 @@
-export * from './communication.gateway';
-export * from './communication.repository';

+ 4 - 3
server/libs/infra/src/db/config/database.config.ts → server/libs/infra/src/database.config.ts

@@ -1,5 +1,5 @@
-import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions';
 import { DataSource } from 'typeorm';
+import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions';
 
 const url = process.env.DB_URL;
 const urlOrParts = url
@@ -14,12 +14,13 @@ const urlOrParts = url
 
 export const databaseConfig: PostgresConnectionOptions = {
   type: 'postgres',
-  entities: [__dirname + '/../**/*.entity.{js,ts}'],
+  entities: [__dirname + '/entities/*.entity.{js,ts}'],
   synchronize: false,
-  migrations: [__dirname + '/../migrations/*.{js,ts}'],
+  migrations: [__dirname + '/migrations/*.{js,ts}'],
   migrationsRun: true,
   connectTimeoutMS: 10000, // 10 seconds
   ...urlOrParts,
 };
 
+// this export is used by TypeORM commands in package.json#scripts
 export const dataSource = new DataSource(databaseConfig);

+ 0 - 1
server/libs/infra/src/db/config/index.ts

@@ -1 +0,0 @@
-export * from './database.config';

+ 0 - 11
server/libs/infra/src/db/entities/index.ts

@@ -1,11 +0,0 @@
-export * from './album.entity';
-export * from './api-key.entity';
-export * from './asset.entity';
-export * from './device-info.entity';
-export * from './exif.entity';
-export * from './smart-info.entity';
-export * from './system-config.entity';
-export * from './tag.entity';
-export * from './user.entity';
-export * from './user-token.entity';
-export * from './shared-link.entity';

+ 0 - 3
server/libs/infra/src/db/index.ts

@@ -1,3 +0,0 @@
-export * from './config';
-export * from './entities';
-export * from './repository';

+ 0 - 0
server/libs/infra/src/db/entities/album.entity.ts → server/libs/infra/src/entities/album.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/api-key.entity.ts → server/libs/infra/src/entities/api-key.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/asset.entity.ts → server/libs/infra/src/entities/asset.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/device-info.entity.ts → server/libs/infra/src/entities/device-info.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/exif.entity.ts → server/libs/infra/src/entities/exif.entity.ts


+ 33 - 0
server/libs/infra/src/entities/index.ts

@@ -0,0 +1,33 @@
+import { AlbumEntity } from './album.entity';
+import { APIKeyEntity } from './api-key.entity';
+import { AssetEntity } from './asset.entity';
+import { DeviceInfoEntity } from './device-info.entity';
+import { SharedLinkEntity } from './shared-link.entity';
+import { SmartInfoEntity } from './smart-info.entity';
+import { SystemConfigEntity } from './system-config.entity';
+import { UserTokenEntity } from './user-token.entity';
+import { UserEntity } from './user.entity';
+
+export * from './album.entity';
+export * from './api-key.entity';
+export * from './asset.entity';
+export * from './device-info.entity';
+export * from './exif.entity';
+export * from './shared-link.entity';
+export * from './smart-info.entity';
+export * from './system-config.entity';
+export * from './tag.entity';
+export * from './user-token.entity';
+export * from './user.entity';
+
+export const databaseEntities = [
+  AssetEntity,
+  AlbumEntity,
+  APIKeyEntity,
+  DeviceInfoEntity,
+  UserEntity,
+  SharedLinkEntity,
+  SmartInfoEntity,
+  SystemConfigEntity,
+  UserTokenEntity,
+];

+ 0 - 0
server/libs/infra/src/db/entities/shared-link.entity.ts → server/libs/infra/src/entities/shared-link.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/smart-info.entity.ts → server/libs/infra/src/entities/smart-info.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/system-config.entity.ts → server/libs/infra/src/entities/system-config.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/tag.entity.ts → server/libs/infra/src/entities/tag.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/user-token.entity.ts → server/libs/infra/src/entities/user-token.entity.ts


+ 0 - 0
server/libs/infra/src/db/entities/user.entity.ts → server/libs/infra/src/entities/user.entity.ts


+ 2 - 1
server/libs/infra/src/index.ts

@@ -1,2 +1,3 @@
-export * from './db';
+export * from './database.config';
+export * from './infra.config';
 export * from './infra.module';

+ 35 - 0
server/libs/infra/src/infra.config.ts

@@ -0,0 +1,35 @@
+import { BullModuleOptions } from '@nestjs/bull';
+import { ConfigurationOptions } from 'typesense/lib/Typesense/Configuration';
+import { QueueName } from '../../domain/src';
+
+export const bullConfig: BullModuleOptions = {
+  prefix: 'immich_bull',
+  redis: {
+    host: process.env.REDIS_HOSTNAME || 'immich_redis',
+    port: parseInt(process.env.REDIS_PORT || '6379'),
+    db: parseInt(process.env.REDIS_DBINDEX || '0'),
+    password: process.env.REDIS_PASSWORD || undefined,
+    path: process.env.REDIS_SOCKET || undefined,
+  },
+  defaultJobOptions: {
+    attempts: 3,
+    removeOnComplete: true,
+    removeOnFail: false,
+  },
+};
+
+export const bullQueues: BullModuleOptions[] = Object.values(QueueName).map((name) => ({ name }));
+
+export const typesenseConfig: ConfigurationOptions = {
+  nodes: [
+    {
+      host: process.env.TYPESENSE_HOST || 'typesense',
+      port: Number(process.env.TYPESENSE_PORT) || 8108,
+      protocol: process.env.TYPESENSE_PROTOCOL || 'http',
+    },
+  ],
+  apiKey: process.env.TYPESENSE_API_KEY as string,
+  numRetries: 15,
+  retryIntervalSeconds: 4,
+  connectionTimeoutSeconds: 10,
+};

+ 15 - 50
server/libs/infra/src/infra.module.ts

@@ -16,40 +16,33 @@ import {
   ISystemConfigRepository,
   IUserRepository,
   IUserTokenRepository,
-  QueueName,
 } from '@app/domain';
 import { BullModule } from '@nestjs/bull';
 import { Global, Module, Provider } from '@nestjs/common';
 import { ConfigModule } from '@nestjs/config';
 import { TypeOrmModule } from '@nestjs/typeorm';
-import { CryptoRepository } from './auth/crypto.repository';
-import { CommunicationGateway, CommunicationRepository } from './communication';
+import { CommunicationGateway } from './communication.gateway';
+import { databaseConfig } from './database.config';
+import { databaseEntities } from './entities';
+import { bullConfig, bullQueues } from './infra.config';
 import {
-  AlbumEntity,
   AlbumRepository,
-  APIKeyEntity,
   APIKeyRepository,
-  AssetEntity,
   AssetRepository,
-  databaseConfig,
-  DeviceInfoEntity,
+  CommunicationRepository,
+  CryptoRepository,
   DeviceInfoRepository,
-  SharedLinkEntity,
+  FilesystemProvider,
+  JobRepository,
+  MachineLearningRepository,
+  MediaRepository,
   SharedLinkRepository,
-  SmartInfoEntity,
   SmartInfoRepository,
-  SystemConfigEntity,
   SystemConfigRepository,
-  UserEntity,
+  TypesenseRepository,
   UserRepository,
-  UserTokenEntity,
   UserTokenRepository,
-} from './db';
-import { JobRepository } from './job';
-import { MachineLearningRepository } from './machine-learning';
-import { MediaRepository } from './media';
-import { TypesenseRepository } from './search';
-import { FilesystemProvider } from './storage';
+} from './repositories';
 
 const providers: Provider[] = [
   { provide: IAlbumRepository, useClass: AlbumRepository },
@@ -74,38 +67,10 @@ const providers: Provider[] = [
 @Module({
   imports: [
     ConfigModule.forRoot(immichAppConfig),
-
     TypeOrmModule.forRoot(databaseConfig),
-    TypeOrmModule.forFeature([
-      AssetEntity,
-      AlbumEntity,
-      APIKeyEntity,
-      DeviceInfoEntity,
-      UserEntity,
-      SharedLinkEntity,
-      SmartInfoEntity,
-      SystemConfigEntity,
-      UserTokenEntity,
-    ]),
-
-    BullModule.forRootAsync({
-      useFactory: async () => ({
-        prefix: 'immich_bull',
-        redis: {
-          host: process.env.REDIS_HOSTNAME || 'immich_redis',
-          port: parseInt(process.env.REDIS_PORT || '6379'),
-          db: parseInt(process.env.REDIS_DBINDEX || '0'),
-          password: process.env.REDIS_PASSWORD || undefined,
-          path: process.env.REDIS_SOCKET || undefined,
-        },
-        defaultJobOptions: {
-          attempts: 3,
-          removeOnComplete: true,
-          removeOnFail: false,
-        },
-      }),
-    }),
-    BullModule.registerQueue(...Object.values(QueueName).map((name) => ({ name }))),
+    TypeOrmModule.forFeature(databaseEntities),
+    BullModule.forRoot(bullConfig),
+    BullModule.registerQueue(...bullQueues),
   ],
   providers: [...providers, CommunicationGateway],
   exports: [...providers, BullModule],

+ 0 - 1
server/libs/infra/src/job/index.ts

@@ -1 +0,0 @@
-export * from './job.repository';

+ 0 - 1
server/libs/infra/src/machine-learning/index.ts

@@ -1 +0,0 @@
-export * from './machine-learning.repository';

+ 0 - 1
server/libs/infra/src/media/index.ts

@@ -1 +0,0 @@
-export * from './media.repository';

+ 0 - 0
server/libs/infra/src/db/migrations/1645130759468-CreateUserTable.ts → server/libs/infra/src/migrations/1645130759468-CreateUserTable.ts


+ 0 - 0
server/libs/infra/src/db/migrations/1645130777674-CreateDeviceInfoTable.ts → server/libs/infra/src/migrations/1645130777674-CreateDeviceInfoTable.ts


+ 0 - 0
server/libs/infra/src/db/migrations/1645130805273-CreateAssetsTable.ts → server/libs/infra/src/migrations/1645130805273-CreateAssetsTable.ts


+ 0 - 0
server/libs/infra/src/db/migrations/1645130817965-CreateExifTable.ts → server/libs/infra/src/migrations/1645130817965-CreateExifTable.ts


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.