2024-11-05 08:07:51 -05:00
|
|
|
import { BadRequestException, Inject } from '@nestjs/common';
|
2025-01-13 19:30:34 -06:00
|
|
|
import { Insertable } from 'kysely';
|
2024-10-24 17:24:37 -04:00
|
|
|
import sanitize from 'sanitize-filename';
|
2024-09-30 17:31:21 -04:00
|
|
|
import { SystemConfig } from 'src/config';
|
2024-11-05 08:07:51 -05:00
|
|
|
import { SALT_ROUNDS } from 'src/constants';
|
2024-10-02 10:54:35 -04:00
|
|
|
import { StorageCore } from 'src/cores/storage.core';
|
2025-01-13 19:30:34 -06:00
|
|
|
import { Users } from 'src/db';
|
2024-10-24 17:24:37 -04:00
|
|
|
import { UserEntity } from 'src/entities/user.entity';
|
2024-10-02 10:54:35 -04:00
|
|
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
|
|
|
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
|
|
|
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
|
|
|
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
|
|
|
|
import { IEventRepository } from 'src/interfaces/event.interface';
|
|
|
|
|
import { IJobRepository } from 'src/interfaces/job.interface';
|
|
|
|
|
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
|
|
|
|
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
|
|
|
|
|
import { IMoveRepository } from 'src/interfaces/move.interface';
|
|
|
|
|
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
|
|
|
|
import { IPersonRepository } from 'src/interfaces/person.interface';
|
|
|
|
|
import { ISearchRepository } from 'src/interfaces/search.interface';
|
|
|
|
|
import { ISessionRepository } from 'src/interfaces/session.interface';
|
|
|
|
|
import { ISharedLinkRepository } from 'src/interfaces/shared-link.interface';
|
|
|
|
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
|
|
|
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
|
|
|
|
import { ITagRepository } from 'src/interfaces/tag.interface';
|
|
|
|
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
2025-01-21 11:09:24 -05:00
|
|
|
import { AccessRepository } from 'src/repositories/access.repository';
|
2025-01-15 23:31:26 -05:00
|
|
|
import { ActivityRepository } from 'src/repositories/activity.repository';
|
2025-01-23 18:10:17 -05:00
|
|
|
import { AlbumUserRepository } from 'src/repositories/album-user.repository';
|
2025-01-21 11:45:59 -05:00
|
|
|
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
2025-01-21 13:13:09 -05:00
|
|
|
import { AuditRepository } from 'src/repositories/audit.repository';
|
|
|
|
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
2025-01-23 18:10:17 -05:00
|
|
|
import { CronRepository } from 'src/repositories/cron.repository';
|
2025-01-23 08:31:30 -05:00
|
|
|
import { LoggingRepository } from 'src/repositories/logging.repository';
|
2025-01-23 18:10:17 -05:00
|
|
|
import { MapRepository } from 'src/repositories/map.repository';
|
2025-01-22 17:11:07 -05:00
|
|
|
import { MediaRepository } from 'src/repositories/media.repository';
|
2025-01-22 16:39:13 -05:00
|
|
|
import { MemoryRepository } from 'src/repositories/memory.repository';
|
2025-01-23 18:10:17 -05:00
|
|
|
import { MetadataRepository } from 'src/repositories/metadata.repository';
|
|
|
|
|
import { NotificationRepository } from 'src/repositories/notification.repository';
|
|
|
|
|
import { OAuthRepository } from 'src/repositories/oauth.repository';
|
2025-02-07 18:04:04 -05:00
|
|
|
import { ProcessRepository } from 'src/repositories/process.repository';
|
2025-01-23 18:10:17 -05:00
|
|
|
import { ServerInfoRepository } from 'src/repositories/server-info.repository';
|
2025-02-07 17:26:49 -05:00
|
|
|
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
2025-01-23 18:10:17 -05:00
|
|
|
import { TelemetryRepository } from 'src/repositories/telemetry.repository';
|
|
|
|
|
import { TrashRepository } from 'src/repositories/trash.repository';
|
|
|
|
|
import { VersionHistoryRepository } from 'src/repositories/version-history.repository';
|
2025-01-21 13:26:13 -05:00
|
|
|
import { ViewRepository } from 'src/repositories/view-repository';
|
2024-10-10 11:53:53 -04:00
|
|
|
import { AccessRequest, checkAccess, requireAccess } from 'src/utils/access';
|
2024-09-30 17:31:21 -04:00
|
|
|
import { getConfig, updateConfig } from 'src/utils/config';
|
|
|
|
|
|
|
|
|
|
export class BaseService {
|
2024-10-02 10:54:35 -04:00
|
|
|
protected storageCore: StorageCore;
|
|
|
|
|
|
2024-09-30 17:31:21 -04:00
|
|
|
constructor(
|
2025-01-23 08:31:30 -05:00
|
|
|
protected logger: LoggingRepository,
|
2025-01-21 11:09:24 -05:00
|
|
|
protected accessRepository: AccessRepository,
|
2025-01-15 23:31:26 -05:00
|
|
|
protected activityRepository: ActivityRepository,
|
2025-01-21 13:13:09 -05:00
|
|
|
protected auditRepository: AuditRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(IAlbumRepository) protected albumRepository: IAlbumRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected albumUserRepository: AlbumUserRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(IAssetRepository) protected assetRepository: IAssetRepository,
|
2025-01-21 13:13:09 -05:00
|
|
|
protected configRepository: ConfigRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected cronRepository: CronRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(ICryptoRepository) protected cryptoRepository: ICryptoRepository,
|
|
|
|
|
@Inject(IDatabaseRepository) protected databaseRepository: IDatabaseRepository,
|
|
|
|
|
@Inject(IEventRepository) protected eventRepository: IEventRepository,
|
|
|
|
|
@Inject(IJobRepository) protected jobRepository: IJobRepository,
|
2025-01-21 11:45:59 -05:00
|
|
|
protected keyRepository: ApiKeyRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(ILibraryRepository) protected libraryRepository: ILibraryRepository,
|
|
|
|
|
@Inject(IMachineLearningRepository) protected machineLearningRepository: IMachineLearningRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected mapRepository: MapRepository,
|
2025-01-22 17:11:07 -05:00
|
|
|
protected mediaRepository: MediaRepository,
|
2025-01-22 16:39:13 -05:00
|
|
|
protected memoryRepository: MemoryRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected metadataRepository: MetadataRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(IMoveRepository) protected moveRepository: IMoveRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected notificationRepository: NotificationRepository,
|
|
|
|
|
protected oauthRepository: OAuthRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(IPartnerRepository) protected partnerRepository: IPartnerRepository,
|
|
|
|
|
@Inject(IPersonRepository) protected personRepository: IPersonRepository,
|
2025-02-07 18:04:04 -05:00
|
|
|
protected processRepository: ProcessRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(ISearchRepository) protected searchRepository: ISearchRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected serverInfoRepository: ServerInfoRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(ISessionRepository) protected sessionRepository: ISessionRepository,
|
|
|
|
|
@Inject(ISharedLinkRepository) protected sharedLinkRepository: ISharedLinkRepository,
|
|
|
|
|
@Inject(IStackRepository) protected stackRepository: IStackRepository,
|
|
|
|
|
@Inject(IStorageRepository) protected storageRepository: IStorageRepository,
|
2025-02-07 17:26:49 -05:00
|
|
|
protected systemMetadataRepository: SystemMetadataRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(ITagRepository) protected tagRepository: ITagRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected telemetryRepository: TelemetryRepository,
|
|
|
|
|
protected trashRepository: TrashRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
@Inject(IUserRepository) protected userRepository: IUserRepository,
|
2025-01-23 18:10:17 -05:00
|
|
|
protected versionRepository: VersionHistoryRepository,
|
2025-01-21 13:26:13 -05:00
|
|
|
protected viewRepository: ViewRepository,
|
2024-10-02 10:54:35 -04:00
|
|
|
) {
|
|
|
|
|
this.logger.setContext(this.constructor.name);
|
|
|
|
|
this.storageCore = StorageCore.create(
|
|
|
|
|
assetRepository,
|
|
|
|
|
configRepository,
|
|
|
|
|
cryptoRepository,
|
|
|
|
|
moveRepository,
|
|
|
|
|
personRepository,
|
|
|
|
|
storageRepository,
|
|
|
|
|
systemMetadataRepository,
|
|
|
|
|
this.logger,
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-09-30 17:31:21 -04:00
|
|
|
|
2024-11-05 08:07:51 -05:00
|
|
|
get worker() {
|
|
|
|
|
return this.configRepository.getWorker();
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-10 11:53:53 -04:00
|
|
|
private get configRepos() {
|
2024-10-01 16:03:55 -04:00
|
|
|
return {
|
|
|
|
|
configRepo: this.configRepository,
|
|
|
|
|
metadataRepo: this.systemMetadataRepository,
|
|
|
|
|
logger: this.logger,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-30 17:31:21 -04:00
|
|
|
getConfig(options: { withCache: boolean }) {
|
2024-10-10 11:53:53 -04:00
|
|
|
return getConfig(this.configRepos, options);
|
2024-09-30 17:31:21 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateConfig(newConfig: SystemConfig) {
|
2024-10-10 11:53:53 -04:00
|
|
|
return updateConfig(this.configRepos, newConfig);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
requireAccess(request: AccessRequest) {
|
|
|
|
|
return requireAccess(this.accessRepository, request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
checkAccess(request: AccessRequest) {
|
|
|
|
|
return checkAccess(this.accessRepository, request);
|
2024-09-30 17:31:21 -04:00
|
|
|
}
|
2024-10-24 17:24:37 -04:00
|
|
|
|
2025-01-13 19:30:34 -06:00
|
|
|
async createUser(dto: Insertable<Users> & { email: string }): Promise<UserEntity> {
|
2024-10-24 17:24:37 -04:00
|
|
|
const user = await this.userRepository.getByEmail(dto.email);
|
|
|
|
|
if (user) {
|
|
|
|
|
throw new BadRequestException('User exists');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!dto.isAdmin) {
|
|
|
|
|
const localAdmin = await this.userRepository.getAdmin();
|
|
|
|
|
if (!localAdmin) {
|
|
|
|
|
throw new BadRequestException('The first registered account must the administrator.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-13 19:30:34 -06:00
|
|
|
const payload: Insertable<Users> = { ...dto };
|
2024-10-24 17:24:37 -04:00
|
|
|
if (payload.password) {
|
|
|
|
|
payload.password = await this.cryptoRepository.hashBcrypt(payload.password, SALT_ROUNDS);
|
|
|
|
|
}
|
|
|
|
|
if (payload.storageLabel) {
|
|
|
|
|
payload.storageLabel = sanitize(payload.storageLabel.replaceAll('.', ''));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.userRepository.create(payload);
|
|
|
|
|
}
|
2024-09-30 17:31:21 -04:00
|
|
|
}
|