mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	Implemented getting correct disk info for the mounted directory (#72)
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,3 @@ | ||||
| .DS_Store | ||||
| .DS_Store | ||||
| .vscode | ||||
| .idea | ||||
							
								
								
									
										36
									
								
								server/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										36
									
								
								server/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -28,6 +28,7 @@ | ||||
|         "bull": "^4.4.0", | ||||
|         "class-transformer": "^0.5.1", | ||||
|         "class-validator": "^0.13.2", | ||||
|         "diskusage": "^1.1.3", | ||||
|         "dotenv": "^14.2.0", | ||||
|         "exifr": "^7.1.3", | ||||
|         "joi": "^17.5.0", | ||||
| @@ -4258,6 +4259,16 @@ | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/diskusage": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.1.3.tgz", | ||||
|       "integrity": "sha512-EAyaxl8hy4Ph07kzlzGTfpbZMNAAAHXSZtNEMwdlnSd1noHzvA6HsgKt4fEMSvaEXQYLSphe5rPMxN4WOj0hcQ==", | ||||
|       "hasInstallScript": true, | ||||
|       "dependencies": { | ||||
|         "es6-promise": "^4.2.5", | ||||
|         "nan": "^2.14.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/doctrine": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", | ||||
| @@ -4444,6 +4455,11 @@ | ||||
|       "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/es6-promise": { | ||||
|       "version": "4.2.8", | ||||
|       "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", | ||||
|       "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" | ||||
|     }, | ||||
|     "node_modules/escalade": { | ||||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", | ||||
| @@ -7712,8 +7728,7 @@ | ||||
|     "node_modules/nan": { | ||||
|       "version": "2.15.0", | ||||
|       "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", | ||||
|       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", | ||||
|       "optional": true | ||||
|       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" | ||||
|     }, | ||||
|     "node_modules/natural-compare": { | ||||
|       "version": "1.4.0", | ||||
| @@ -14098,6 +14113,15 @@ | ||||
|         "path-type": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "diskusage": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.1.3.tgz", | ||||
|       "integrity": "sha512-EAyaxl8hy4Ph07kzlzGTfpbZMNAAAHXSZtNEMwdlnSd1noHzvA6HsgKt4fEMSvaEXQYLSphe5rPMxN4WOj0hcQ==", | ||||
|       "requires": { | ||||
|         "es6-promise": "^4.2.5", | ||||
|         "nan": "^2.14.0" | ||||
|       } | ||||
|     }, | ||||
|     "doctrine": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", | ||||
| @@ -14246,6 +14270,11 @@ | ||||
|       "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "es6-promise": { | ||||
|       "version": "4.2.8", | ||||
|       "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", | ||||
|       "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" | ||||
|     }, | ||||
|     "escalade": { | ||||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", | ||||
| @@ -16753,8 +16782,7 @@ | ||||
|     "nan": { | ||||
|       "version": "2.15.0", | ||||
|       "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", | ||||
|       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", | ||||
|       "optional": true | ||||
|       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" | ||||
|     }, | ||||
|     "natural-compare": { | ||||
|       "version": "1.4.0", | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
|     "bull": "^4.4.0", | ||||
|     "class-transformer": "^0.5.1", | ||||
|     "class-validator": "^0.13.2", | ||||
|     "diskusage": "^1.1.3", | ||||
|     "dotenv": "^14.2.0", | ||||
|     "exifr": "^7.1.3", | ||||
|     "joi": "^17.5.0", | ||||
|   | ||||
| @@ -55,7 +55,7 @@ export class AssetController { | ||||
|     @UploadedFiles() uploadFiles: { assetData: Express.Multer.File[]; thumbnailData?: Express.Multer.File[] }, | ||||
|     @Body(ValidationPipe) assetInfo: CreateAssetDto, | ||||
|   ) { | ||||
|     uploadFiles.assetData.forEach(async (file) => { | ||||
|     for (const file of uploadFiles.assetData) { | ||||
|       const savedAsset = await this.assetService.createUserAsset(authUser, assetInfo, file.path, file.mimetype); | ||||
|  | ||||
|       if (uploadFiles.thumbnailData != null) { | ||||
| @@ -66,7 +66,7 @@ export class AssetController { | ||||
|       await this.backgroundTaskService.extractExif(savedAsset, file.originalname, file.size); | ||||
|  | ||||
|       this.wsCommunicateionGateway.server.to(savedAsset.userId).emit('on_upload_success', JSON.stringify(savedAsset)); | ||||
|     }); | ||||
|     } | ||||
|  | ||||
|     return 'ok'; | ||||
|   } | ||||
| @@ -125,10 +125,10 @@ export class AssetController { | ||||
|   async deleteAssetById(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) assetIds: DeleteAssetDto) { | ||||
|     const deleteAssetList: AssetEntity[] = []; | ||||
|  | ||||
|     assetIds.ids.forEach(async (id) => { | ||||
|     for (const id of assetIds.ids) { | ||||
|       const assets = await this.assetService.getAssetById(authUser, id); | ||||
|       deleteAssetList.push(assets); | ||||
|     }); | ||||
|     } | ||||
|  | ||||
|     const result = await this.assetService.deleteAssetById(authUser, assetIds); | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,7 @@ | ||||
| import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards } from '@nestjs/common'; | ||||
| import { Controller, Get, UseGuards } from '@nestjs/common'; | ||||
| import { ConfigService } from '@nestjs/config'; | ||||
| import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; | ||||
| import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; | ||||
| import { ServerInfoService } from './server-info.service'; | ||||
| import mapboxGeocoding, { GeocodeService } from '@mapbox/mapbox-sdk/services/geocoding'; | ||||
| import { MapiResponse } from '@mapbox/mapbox-sdk/lib/classes/mapi-response'; | ||||
| import { serverVersion } from '../../constants/server_version.constant'; | ||||
|  | ||||
| @Controller('server-info') | ||||
|   | ||||
| @@ -1,31 +1,27 @@ | ||||
| import { Injectable } from '@nestjs/common'; | ||||
| import systemInformation from 'systeminformation'; | ||||
| import { ServerInfoDto } from './dto/server-info.dto'; | ||||
| import diskusage from 'diskusage'; | ||||
|  | ||||
| @Injectable() | ||||
| export class ServerInfoService { | ||||
|   constructor() {} | ||||
|   async getServerInfo() { | ||||
|     const res = await systemInformation.fsSize(); | ||||
|     const diskInfo = await diskusage.check('./upload'); | ||||
|  | ||||
|     const size = res[0].size; | ||||
|     const used = res[0].used; | ||||
|     const available = res[0].available; | ||||
|     const percentageUsage = res[0].use; | ||||
|     const usagePercentage = (((diskInfo.total - diskInfo.free) / diskInfo.total) * 100).toFixed(2); | ||||
|  | ||||
|     const serverInfo = new ServerInfoDto(); | ||||
|     serverInfo.diskAvailable = this.getHumanReadableString(available); | ||||
|     serverInfo.diskSize = this.getHumanReadableString(size); | ||||
|     serverInfo.diskUse = this.getHumanReadableString(used); | ||||
|     serverInfo.diskAvailableRaw = available; | ||||
|     serverInfo.diskSizeRaw = size; | ||||
|     serverInfo.diskUseRaw = used; | ||||
|     serverInfo.diskUsagePercentage = percentageUsage; | ||||
|     serverInfo.diskAvailable = ServerInfoService.getHumanReadableString(diskInfo.available); | ||||
|     serverInfo.diskSize = ServerInfoService.getHumanReadableString(diskInfo.total); | ||||
|     serverInfo.diskUse = ServerInfoService.getHumanReadableString(diskInfo.total - diskInfo.free); | ||||
|     serverInfo.diskAvailableRaw = diskInfo.available; | ||||
|     serverInfo.diskSizeRaw = diskInfo.total; | ||||
|     serverInfo.diskUseRaw = diskInfo.total - diskInfo.free; | ||||
|     serverInfo.diskUsagePercentage = parseFloat(usagePercentage); | ||||
|  | ||||
|     return serverInfo; | ||||
|   } | ||||
|  | ||||
|   private getHumanReadableString(sizeInByte: number) { | ||||
|   private static getHumanReadableString(sizeInByte: number) { | ||||
|     const pepibyte = 1.126 * Math.pow(10, 15); | ||||
|     const tebibyte = 1.1 * Math.pow(10, 12); | ||||
|     const gibibyte = 1.074 * Math.pow(10, 9); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user