Files
docmost/apps/server/src/integrations/storage/providers/storage.provider.ts

85 lines
2.5 KiB
TypeScript

import {
STORAGE_CONFIG_TOKEN,
STORAGE_DRIVER_TOKEN,
} from '../constants/storage.constants';
import { EnvironmentService } from '../../environment/environment.service';
import {
LocalStorageConfig,
S3StorageConfig,
StorageConfig,
StorageDriver,
StorageOption,
} from '../interfaces';
import { LocalDriver, S3Driver } from '../drivers';
import * as process from 'node:process';
import { LOCAL_STORAGE_PATH } from '../../../common/helpers';
import path from 'path';
function createStorageDriver(disk: StorageConfig): StorageDriver {
switch (disk.driver) {
case StorageOption.LOCAL:
return new LocalDriver(disk.config as LocalStorageConfig);
case StorageOption.S3:
return new S3Driver(disk.config as S3StorageConfig);
default:
throw new Error(`Unknown storage driver`);
}
}
export const storageDriverConfigProvider = {
provide: STORAGE_CONFIG_TOKEN,
useFactory: async (environmentService: EnvironmentService) => {
const driver = environmentService.getStorageDriver().toLowerCase();
switch (driver) {
case StorageOption.LOCAL:
return {
driver,
config: {
storagePath: LOCAL_STORAGE_PATH,
},
};
case StorageOption.S3:
const s3Config = {
driver,
config: {
region: environmentService.getAwsS3Region(),
endpoint: environmentService.getAwsS3Endpoint(),
bucket: environmentService.getAwsS3Bucket(),
baseUrl: environmentService.getAwsS3Url(),
credentials: undefined,
},
};
/**
* This makes use of AWS_S3_ACCESS_KEY_ID and AWS_S3_SECRET_ACCESS_KEY if present,
* If not present, it makes it lenient for the AWS SDK to use
* AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY if they are present in the environment
*/
if (
environmentService.getAwsS3AccessKeyId() &&
environmentService.getAwsS3SecretAccessKey()
) {
s3Config.config.credentials = {
accessKeyId: environmentService.getAwsS3AccessKeyId(),
secretAccessKey: environmentService.getAwsS3SecretAccessKey(),
};
}
return s3Config;
default:
throw new Error(`Unknown storage driver: ${driver}`);
}
},
inject: [EnvironmentService],
};
export const storageDriverProvider = {
provide: STORAGE_DRIVER_TOKEN,
useFactory: (config: StorageConfig) => createStorageDriver(config),
inject: [STORAGE_CONFIG_TOKEN],
};