mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	refactor(server): move constant into common package (#522)
* refactor(server): move constant into common package * refactor(server): re-arrange import statement in microservice module * refactor(server): move app.config into common package * fix(server): e2e testing
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '@app/common/constants';
 | 
			
		||||
import { Injectable } from '@nestjs/common';
 | 
			
		||||
import { ServerInfoResponseDto } from './response-dto/server-info-response.dto';
 | 
			
		||||
import diskusage from 'diskusage';
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '../../constants/upload_location.constant';
 | 
			
		||||
 | 
			
		||||
@Injectable()
 | 
			
		||||
export class ServerInfoService {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { immichAppConfig } from '@app/common/config';
 | 
			
		||||
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
 | 
			
		||||
import { UserModule } from './api-v1/user/user.module';
 | 
			
		||||
import { AssetModule } from './api-v1/asset/asset.module';
 | 
			
		||||
@@ -5,7 +6,6 @@ import { AuthModule } from './api-v1/auth/auth.module';
 | 
			
		||||
import { ImmichJwtModule } from './modules/immich-jwt/immich-jwt.module';
 | 
			
		||||
import { DeviceInfoModule } from './api-v1/device-info/device-info.module';
 | 
			
		||||
import { ConfigModule } from '@nestjs/config';
 | 
			
		||||
import { immichAppConfig } from './config/app.config';
 | 
			
		||||
import { BullModule } from '@nestjs/bull';
 | 
			
		||||
import { ServerInfoModule } from './api-v1/server-info/server-info.module';
 | 
			
		||||
import { BackgroundTaskModule } from './modules/background-task/background-task.module';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
import { ConfigModuleOptions } from '@nestjs/config';
 | 
			
		||||
import Joi from 'joi';
 | 
			
		||||
 | 
			
		||||
export const immichAppConfig: ConfigModuleOptions = {
 | 
			
		||||
  envFilePath: '.env',
 | 
			
		||||
  isGlobal: true,
 | 
			
		||||
  validationSchema: Joi.object({
 | 
			
		||||
    NODE_ENV: Joi.string().required().valid('development', 'production', 'staging').default('development'),
 | 
			
		||||
    DB_USERNAME: Joi.string().required(),
 | 
			
		||||
    DB_PASSWORD: Joi.string().required(),
 | 
			
		||||
    DB_DATABASE_NAME: Joi.string().required(),
 | 
			
		||||
    JWT_SECRET: Joi.string().required(),
 | 
			
		||||
    ENABLE_MAPBOX: Joi.boolean().required().valid(true, false),
 | 
			
		||||
    MAPBOX_KEY: Joi.any().when('ENABLE_MAPBOX', {
 | 
			
		||||
      is: false,
 | 
			
		||||
      then: Joi.string().optional().allow(null, ''),
 | 
			
		||||
      otherwise: Joi.string().required(),
 | 
			
		||||
    }),
 | 
			
		||||
  }),
 | 
			
		||||
};
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '@app/common/constants';
 | 
			
		||||
import { HttpException, HttpStatus } from '@nestjs/common';
 | 
			
		||||
import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface';
 | 
			
		||||
import { existsSync, mkdirSync } from 'fs';
 | 
			
		||||
import { diskStorage } from 'multer';
 | 
			
		||||
import { extname } from 'path';
 | 
			
		||||
import { Request } from 'express';
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '../constants/upload_location.constant';
 | 
			
		||||
import { randomUUID } from 'crypto';
 | 
			
		||||
 | 
			
		||||
export const assetUploadOption: MulterOptions = {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '@app/common/constants';
 | 
			
		||||
import { HttpException, HttpStatus } from '@nestjs/common';
 | 
			
		||||
import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface';
 | 
			
		||||
import { existsSync, mkdirSync } from 'fs';
 | 
			
		||||
import { diskStorage } from 'multer';
 | 
			
		||||
import { extname } from 'path';
 | 
			
		||||
import { Request } from 'express';
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '../constants/upload_location.constant';
 | 
			
		||||
 | 
			
		||||
export const profileImageUploadOption: MulterOptions = {
 | 
			
		||||
  fileFilter: (req: Request, file: any, cb: any) => {
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
export const APP_UPLOAD_LOCATION = './upload';
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
    "^.+\\.(t|j)s$": "ts-jest"
 | 
			
		||||
  },
 | 
			
		||||
  "moduleNameMapper": {
 | 
			
		||||
    "@app/common/(.*)": "<rootDir>../../../libs/common/src/$1",
 | 
			
		||||
    "@app/database/config/(.*)": "<rootDir>../../../libs/database/src/config/$1",
 | 
			
		||||
    "@app/database/entities/(.*)": "<rootDir>../../../libs/database/src/entities/$1"
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,26 +1,29 @@
 | 
			
		||||
import { BullModule } from '@nestjs/bull';
 | 
			
		||||
import { Module } from '@nestjs/common';
 | 
			
		||||
import { TypeOrmModule } from '@nestjs/typeorm';
 | 
			
		||||
import { immichAppConfig } from '@app/common/config';
 | 
			
		||||
import { DatabaseModule } from '@app/database';
 | 
			
		||||
import { AssetEntity } from '@app/database/entities/asset.entity';
 | 
			
		||||
import { ExifEntity } from '@app/database/entities/exif.entity';
 | 
			
		||||
import { SmartInfoEntity } from '@app/database/entities/smart-info.entity';
 | 
			
		||||
import { UserEntity } from '@app/database/entities/user.entity';
 | 
			
		||||
import { MicroservicesService } from './microservices.service';
 | 
			
		||||
import { AssetUploadedProcessor } from './processors/asset-uploaded.processor';
 | 
			
		||||
import { ThumbnailGeneratorProcessor } from './processors/thumbnail.processor';
 | 
			
		||||
import { MetadataExtractionProcessor } from './processors/metadata-extraction.processor';
 | 
			
		||||
import { VideoTranscodeProcessor } from './processors/video-transcode.processor';
 | 
			
		||||
import { CommunicationModule } from '../../immich/src/api-v1/communication/communication.module';
 | 
			
		||||
import {
 | 
			
		||||
  assetUploadedQueueName,
 | 
			
		||||
  metadataExtractionQueueName,
 | 
			
		||||
  thumbnailGeneratorQueueName,
 | 
			
		||||
  videoConversionQueueName,
 | 
			
		||||
} from '@app/job/constants/queue-name.constant';
 | 
			
		||||
import { BullModule } from '@nestjs/bull';
 | 
			
		||||
import { Module } from '@nestjs/common';
 | 
			
		||||
import { ConfigModule } from '@nestjs/config';
 | 
			
		||||
import { TypeOrmModule } from '@nestjs/typeorm';
 | 
			
		||||
import { CommunicationModule } from '../../immich/src/api-v1/communication/communication.module';
 | 
			
		||||
import { MicroservicesService } from './microservices.service';
 | 
			
		||||
import { AssetUploadedProcessor } from './processors/asset-uploaded.processor';
 | 
			
		||||
import { MetadataExtractionProcessor } from './processors/metadata-extraction.processor';
 | 
			
		||||
import { ThumbnailGeneratorProcessor } from './processors/thumbnail.processor';
 | 
			
		||||
import { VideoTranscodeProcessor } from './processors/video-transcode.processor';
 | 
			
		||||
 | 
			
		||||
@Module({
 | 
			
		||||
  imports: [
 | 
			
		||||
    ConfigModule.forRoot(immichAppConfig),
 | 
			
		||||
    DatabaseModule,
 | 
			
		||||
    TypeOrmModule.forFeature([UserEntity, ExifEntity, AssetEntity, SmartInfoEntity]),
 | 
			
		||||
    BullModule.forRootAsync({
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,4 @@
 | 
			
		||||
import { InjectQueue, Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Job, Queue } from 'bull';
 | 
			
		||||
import { AssetType } from '@app/database/entities/asset.entity';
 | 
			
		||||
import { randomUUID } from 'crypto';
 | 
			
		||||
import {
 | 
			
		||||
  IAssetUploadedJob,
 | 
			
		||||
  IMetadataExtractionJob,
 | 
			
		||||
@@ -17,6 +14,9 @@ import {
 | 
			
		||||
  mp4ConversionProcessorName,
 | 
			
		||||
  videoMetadataExtractionProcessorName,
 | 
			
		||||
} from '@app/job';
 | 
			
		||||
import { InjectQueue, Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Job, Queue } from 'bull';
 | 
			
		||||
import { randomUUID } from 'crypto';
 | 
			
		||||
 | 
			
		||||
@Processor(assetUploadedQueueName)
 | 
			
		||||
export class AssetUploadedProcessor {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,6 @@
 | 
			
		||||
import { Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Job } from 'bull';
 | 
			
		||||
import { AssetEntity } from '@app/database/entities/asset.entity';
 | 
			
		||||
import { Repository } from 'typeorm/repository/Repository';
 | 
			
		||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
			
		||||
import { ExifEntity } from '@app/database/entities/exif.entity';
 | 
			
		||||
import exifr from 'exifr';
 | 
			
		||||
import mapboxGeocoding, { GeocodeService } from '@mapbox/mapbox-sdk/services/geocoding';
 | 
			
		||||
import { MapiResponse } from '@mapbox/mapbox-sdk/lib/classes/mapi-response';
 | 
			
		||||
import { readFile } from 'fs/promises';
 | 
			
		||||
import { Logger } from '@nestjs/common';
 | 
			
		||||
import axios from 'axios';
 | 
			
		||||
import { SmartInfoEntity } from '@app/database/entities/smart-info.entity';
 | 
			
		||||
import ffmpeg from 'fluent-ffmpeg';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import {
 | 
			
		||||
  IExifExtractionProcessor,
 | 
			
		||||
  IVideoLengthExtractionProcessor,
 | 
			
		||||
@@ -24,6 +12,18 @@ import {
 | 
			
		||||
  reverseGeocodingProcessorName,
 | 
			
		||||
  IReverseGeocodingProcessor,
 | 
			
		||||
} from '@app/job';
 | 
			
		||||
import { MapiResponse } from '@mapbox/mapbox-sdk/lib/classes/mapi-response';
 | 
			
		||||
import mapboxGeocoding, { GeocodeService } from '@mapbox/mapbox-sdk/services/geocoding';
 | 
			
		||||
import { Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Logger } from '@nestjs/common';
 | 
			
		||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
			
		||||
import axios from 'axios';
 | 
			
		||||
import { Job } from 'bull';
 | 
			
		||||
import exifr from 'exifr';
 | 
			
		||||
import ffmpeg from 'fluent-ffmpeg';
 | 
			
		||||
import { readFile } from 'fs/promises';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import { Repository } from 'typeorm/repository/Repository';
 | 
			
		||||
 | 
			
		||||
@Processor(metadataExtractionQueueName)
 | 
			
		||||
export class MetadataExtractionProcessor {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,4 @@
 | 
			
		||||
import { InjectQueue, Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Job, Queue } from 'bull';
 | 
			
		||||
import { AssetEntity, AssetType } from '@app/database/entities/asset.entity';
 | 
			
		||||
import { Repository } from 'typeorm/repository/Repository';
 | 
			
		||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
			
		||||
import sharp from 'sharp';
 | 
			
		||||
import { existsSync, mkdirSync } from 'node:fs';
 | 
			
		||||
import { randomUUID } from 'node:crypto';
 | 
			
		||||
import { CommunicationGateway } from '../../../immich/src/api-v1/communication/communication.gateway';
 | 
			
		||||
import ffmpeg from 'fluent-ffmpeg';
 | 
			
		||||
import { Logger } from '@nestjs/common';
 | 
			
		||||
import {
 | 
			
		||||
  WebpGeneratorProcessor,
 | 
			
		||||
  generateJPEGThumbnailProcessorName,
 | 
			
		||||
@@ -19,7 +9,17 @@ import {
 | 
			
		||||
  thumbnailGeneratorQueueName,
 | 
			
		||||
  JpegGeneratorProcessor,
 | 
			
		||||
} from '@app/job';
 | 
			
		||||
import { InjectQueue, Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Logger } from '@nestjs/common';
 | 
			
		||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
			
		||||
import { mapAsset } from 'apps/immich/src/api-v1/asset/response-dto/asset-response.dto';
 | 
			
		||||
import { Job, Queue } from 'bull';
 | 
			
		||||
import ffmpeg from 'fluent-ffmpeg';
 | 
			
		||||
import { randomUUID } from 'node:crypto';
 | 
			
		||||
import { existsSync, mkdirSync } from 'node:fs';
 | 
			
		||||
import sharp from 'sharp';
 | 
			
		||||
import { Repository } from 'typeorm/repository/Repository';
 | 
			
		||||
import { CommunicationGateway } from '../../../immich/src/api-v1/communication/communication.gateway';
 | 
			
		||||
 | 
			
		||||
@Processor(thumbnailGeneratorQueueName)
 | 
			
		||||
export class ThumbnailGeneratorProcessor {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '@app/common/constants';
 | 
			
		||||
import { AssetEntity } from '@app/database/entities/asset.entity';
 | 
			
		||||
import { mp4ConversionProcessorName } from '@app/job/constants/job-name.constant';
 | 
			
		||||
import { videoConversionQueueName } from '@app/job/constants/queue-name.constant';
 | 
			
		||||
import { IMp4ConversionProcessor } from '@app/job/interfaces/video-transcode.interface';
 | 
			
		||||
@@ -8,8 +10,6 @@ import { Job } from 'bull';
 | 
			
		||||
import ffmpeg from 'fluent-ffmpeg';
 | 
			
		||||
import { existsSync, mkdirSync } from 'fs';
 | 
			
		||||
import { Repository } from 'typeorm';
 | 
			
		||||
import { AssetEntity } from '../../../../libs/database/src/entities/asset.entity';
 | 
			
		||||
import { APP_UPLOAD_LOCATION } from '../../../immich/src/constants/upload_location.constant';
 | 
			
		||||
 | 
			
		||||
@Processor(videoConversionQueueName)
 | 
			
		||||
export class VideoTranscodeProcessor {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user