2023-03-21 22:49:19 -04:00
|
|
|
import { Inject, Injectable } from '@nestjs/common';
|
2023-08-25 00:15:03 -04:00
|
|
|
import { mimeTypes, serverVersion } from '../domain.constant';
|
2023-03-21 22:49:19 -04:00
|
|
|
import { asHumanReadable } from '../domain.util';
|
2023-05-24 22:05:31 -04:00
|
|
|
import { IStorageRepository, StorageCore, StorageFolder } from '../storage';
|
2023-08-25 00:15:03 -04:00
|
|
|
import { ISystemConfigRepository, SystemConfigCore } from '../system-config';
|
2023-03-21 22:49:19 -04:00
|
|
|
import { IUserRepository, UserStatsQueryResponse } from '../user';
|
2023-07-15 20:24:46 -05:00
|
|
|
import {
|
2023-08-18 00:55:26 -04:00
|
|
|
ServerFeaturesDto,
|
2023-07-15 20:24:46 -05:00
|
|
|
ServerInfoResponseDto,
|
|
|
|
|
ServerMediaTypesResponseDto,
|
|
|
|
|
ServerPingResponse,
|
|
|
|
|
ServerStatsResponseDto,
|
|
|
|
|
UsageByUserDto,
|
2023-08-18 00:55:26 -04:00
|
|
|
} from './server-info.dto';
|
2023-03-21 22:49:19 -04:00
|
|
|
|
|
|
|
|
@Injectable()
|
|
|
|
|
export class ServerInfoService {
|
2023-05-24 22:05:31 -04:00
|
|
|
private storageCore = new StorageCore();
|
2023-08-18 00:55:26 -04:00
|
|
|
private configCore: SystemConfigCore;
|
2023-05-24 22:05:31 -04:00
|
|
|
|
2023-03-21 22:49:19 -04:00
|
|
|
constructor(
|
2023-08-18 00:55:26 -04:00
|
|
|
@Inject(ISystemConfigRepository) configRepository: ISystemConfigRepository,
|
2023-03-21 22:49:19 -04:00
|
|
|
@Inject(IUserRepository) private userRepository: IUserRepository,
|
|
|
|
|
@Inject(IStorageRepository) private storageRepository: IStorageRepository,
|
2023-08-18 00:55:26 -04:00
|
|
|
) {
|
|
|
|
|
this.configCore = new SystemConfigCore(configRepository);
|
|
|
|
|
}
|
2023-03-21 22:49:19 -04:00
|
|
|
|
|
|
|
|
async getInfo(): Promise<ServerInfoResponseDto> {
|
2023-05-24 22:05:31 -04:00
|
|
|
const libraryBase = this.storageCore.getBaseFolder(StorageFolder.LIBRARY);
|
|
|
|
|
const diskInfo = await this.storageRepository.checkDiskUsage(libraryBase);
|
2023-03-21 22:49:19 -04:00
|
|
|
|
|
|
|
|
const usagePercentage = (((diskInfo.total - diskInfo.free) / diskInfo.total) * 100).toFixed(2);
|
|
|
|
|
|
|
|
|
|
const serverInfo = new ServerInfoResponseDto();
|
|
|
|
|
serverInfo.diskAvailable = asHumanReadable(diskInfo.available);
|
|
|
|
|
serverInfo.diskSize = asHumanReadable(diskInfo.total);
|
|
|
|
|
serverInfo.diskUse = asHumanReadable(diskInfo.total - diskInfo.free);
|
|
|
|
|
serverInfo.diskAvailableRaw = diskInfo.available;
|
|
|
|
|
serverInfo.diskSizeRaw = diskInfo.total;
|
|
|
|
|
serverInfo.diskUseRaw = diskInfo.total - diskInfo.free;
|
|
|
|
|
serverInfo.diskUsagePercentage = parseFloat(usagePercentage);
|
|
|
|
|
return serverInfo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ping(): ServerPingResponse {
|
2023-08-18 00:55:26 -04:00
|
|
|
return { res: 'pong' };
|
2023-03-21 22:49:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getVersion() {
|
|
|
|
|
return serverVersion;
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-25 00:15:03 -04:00
|
|
|
getFeatures(): Promise<ServerFeaturesDto> {
|
|
|
|
|
return this.configCore.getFeatures();
|
2023-08-18 00:55:26 -04:00
|
|
|
}
|
|
|
|
|
|
2023-03-21 22:49:19 -04:00
|
|
|
async getStats(): Promise<ServerStatsResponseDto> {
|
|
|
|
|
const userStats: UserStatsQueryResponse[] = await this.userRepository.getUserStats();
|
|
|
|
|
const serverStats = new ServerStatsResponseDto();
|
|
|
|
|
|
|
|
|
|
for (const user of userStats) {
|
|
|
|
|
const usage = new UsageByUserDto();
|
|
|
|
|
usage.userId = user.userId;
|
|
|
|
|
usage.userFirstName = user.userFirstName;
|
|
|
|
|
usage.userLastName = user.userLastName;
|
|
|
|
|
usage.photos = user.photos;
|
|
|
|
|
usage.videos = user.videos;
|
|
|
|
|
usage.usage = user.usage;
|
|
|
|
|
|
|
|
|
|
serverStats.photos += usage.photos;
|
|
|
|
|
serverStats.videos += usage.videos;
|
|
|
|
|
serverStats.usage += usage.usage;
|
|
|
|
|
serverStats.usageByUser.push(usage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return serverStats;
|
|
|
|
|
}
|
2023-07-15 20:24:46 -05:00
|
|
|
|
|
|
|
|
getSupportedMediaTypes(): ServerMediaTypesResponseDto {
|
|
|
|
|
return {
|
2023-08-15 12:05:32 -04:00
|
|
|
video: Object.keys(mimeTypes.video),
|
|
|
|
|
image: Object.keys(mimeTypes.image),
|
|
|
|
|
sidecar: Object.keys(mimeTypes.sidecar),
|
2023-07-15 20:24:46 -05:00
|
|
|
};
|
|
|
|
|
}
|
2023-03-21 22:49:19 -04:00
|
|
|
}
|