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", |         "bull": "^4.4.0", | ||||||
|         "class-transformer": "^0.5.1", |         "class-transformer": "^0.5.1", | ||||||
|         "class-validator": "^0.13.2", |         "class-validator": "^0.13.2", | ||||||
|  |         "diskusage": "^1.1.3", | ||||||
|         "dotenv": "^14.2.0", |         "dotenv": "^14.2.0", | ||||||
|         "exifr": "^7.1.3", |         "exifr": "^7.1.3", | ||||||
|         "joi": "^17.5.0", |         "joi": "^17.5.0", | ||||||
| @@ -4258,6 +4259,16 @@ | |||||||
|         "node": ">=8" |         "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": { |     "node_modules/doctrine": { | ||||||
|       "version": "3.0.0", |       "version": "3.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", |       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", | ||||||
| @@ -4444,6 +4455,11 @@ | |||||||
|       "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", |       "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", | ||||||
|       "dev": true |       "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": { |     "node_modules/escalade": { | ||||||
|       "version": "3.1.1", |       "version": "3.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", |       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", | ||||||
| @@ -7712,8 +7728,7 @@ | |||||||
|     "node_modules/nan": { |     "node_modules/nan": { | ||||||
|       "version": "2.15.0", |       "version": "2.15.0", | ||||||
|       "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", |       "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", | ||||||
|       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", |       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" | ||||||
|       "optional": true |  | ||||||
|     }, |     }, | ||||||
|     "node_modules/natural-compare": { |     "node_modules/natural-compare": { | ||||||
|       "version": "1.4.0", |       "version": "1.4.0", | ||||||
| @@ -14098,6 +14113,15 @@ | |||||||
|         "path-type": "^4.0.0" |         "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": { |     "doctrine": { | ||||||
|       "version": "3.0.0", |       "version": "3.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", |       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", | ||||||
| @@ -14246,6 +14270,11 @@ | |||||||
|       "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", |       "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", | ||||||
|       "dev": true |       "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": { |     "escalade": { | ||||||
|       "version": "3.1.1", |       "version": "3.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", |       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", | ||||||
| @@ -16753,8 +16782,7 @@ | |||||||
|     "nan": { |     "nan": { | ||||||
|       "version": "2.15.0", |       "version": "2.15.0", | ||||||
|       "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", |       "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", | ||||||
|       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", |       "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" | ||||||
|       "optional": true |  | ||||||
|     }, |     }, | ||||||
|     "natural-compare": { |     "natural-compare": { | ||||||
|       "version": "1.4.0", |       "version": "1.4.0", | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ | |||||||
|     "bull": "^4.4.0", |     "bull": "^4.4.0", | ||||||
|     "class-transformer": "^0.5.1", |     "class-transformer": "^0.5.1", | ||||||
|     "class-validator": "^0.13.2", |     "class-validator": "^0.13.2", | ||||||
|  |     "diskusage": "^1.1.3", | ||||||
|     "dotenv": "^14.2.0", |     "dotenv": "^14.2.0", | ||||||
|     "exifr": "^7.1.3", |     "exifr": "^7.1.3", | ||||||
|     "joi": "^17.5.0", |     "joi": "^17.5.0", | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ export class AssetController { | |||||||
|     @UploadedFiles() uploadFiles: { assetData: Express.Multer.File[]; thumbnailData?: Express.Multer.File[] }, |     @UploadedFiles() uploadFiles: { assetData: Express.Multer.File[]; thumbnailData?: Express.Multer.File[] }, | ||||||
|     @Body(ValidationPipe) assetInfo: CreateAssetDto, |     @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); |       const savedAsset = await this.assetService.createUserAsset(authUser, assetInfo, file.path, file.mimetype); | ||||||
|  |  | ||||||
|       if (uploadFiles.thumbnailData != null) { |       if (uploadFiles.thumbnailData != null) { | ||||||
| @@ -66,7 +66,7 @@ export class AssetController { | |||||||
|       await this.backgroundTaskService.extractExif(savedAsset, file.originalname, file.size); |       await this.backgroundTaskService.extractExif(savedAsset, file.originalname, file.size); | ||||||
|  |  | ||||||
|       this.wsCommunicateionGateway.server.to(savedAsset.userId).emit('on_upload_success', JSON.stringify(savedAsset)); |       this.wsCommunicateionGateway.server.to(savedAsset.userId).emit('on_upload_success', JSON.stringify(savedAsset)); | ||||||
|     }); |     } | ||||||
|  |  | ||||||
|     return 'ok'; |     return 'ok'; | ||||||
|   } |   } | ||||||
| @@ -125,10 +125,10 @@ export class AssetController { | |||||||
|   async deleteAssetById(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) assetIds: DeleteAssetDto) { |   async deleteAssetById(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) assetIds: DeleteAssetDto) { | ||||||
|     const deleteAssetList: AssetEntity[] = []; |     const deleteAssetList: AssetEntity[] = []; | ||||||
|  |  | ||||||
|     assetIds.ids.forEach(async (id) => { |     for (const id of assetIds.ids) { | ||||||
|       const assets = await this.assetService.getAssetById(authUser, id); |       const assets = await this.assetService.getAssetById(authUser, id); | ||||||
|       deleteAssetList.push(assets); |       deleteAssetList.push(assets); | ||||||
|     }); |     } | ||||||
|  |  | ||||||
|     const result = await this.assetService.deleteAssetById(authUser, assetIds); |     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 { ConfigService } from '@nestjs/config'; | ||||||
| import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; |  | ||||||
| import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; | import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; | ||||||
| import { ServerInfoService } from './server-info.service'; | 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'; | import { serverVersion } from '../../constants/server_version.constant'; | ||||||
|  |  | ||||||
| @Controller('server-info') | @Controller('server-info') | ||||||
|   | |||||||
| @@ -1,31 +1,27 @@ | |||||||
| import { Injectable } from '@nestjs/common'; | import { Injectable } from '@nestjs/common'; | ||||||
| import systemInformation from 'systeminformation'; |  | ||||||
| import { ServerInfoDto } from './dto/server-info.dto'; | import { ServerInfoDto } from './dto/server-info.dto'; | ||||||
|  | import diskusage from 'diskusage'; | ||||||
|  |  | ||||||
| @Injectable() | @Injectable() | ||||||
| export class ServerInfoService { | export class ServerInfoService { | ||||||
|   constructor() {} |  | ||||||
|   async getServerInfo() { |   async getServerInfo() { | ||||||
|     const res = await systemInformation.fsSize(); |     const diskInfo = await diskusage.check('./upload'); | ||||||
|  |  | ||||||
|     const size = res[0].size; |     const usagePercentage = (((diskInfo.total - diskInfo.free) / diskInfo.total) * 100).toFixed(2); | ||||||
|     const used = res[0].used; |  | ||||||
|     const available = res[0].available; |  | ||||||
|     const percentageUsage = res[0].use; |  | ||||||
|  |  | ||||||
|     const serverInfo = new ServerInfoDto(); |     const serverInfo = new ServerInfoDto(); | ||||||
|     serverInfo.diskAvailable = this.getHumanReadableString(available); |     serverInfo.diskAvailable = ServerInfoService.getHumanReadableString(diskInfo.available); | ||||||
|     serverInfo.diskSize = this.getHumanReadableString(size); |     serverInfo.diskSize = ServerInfoService.getHumanReadableString(diskInfo.total); | ||||||
|     serverInfo.diskUse = this.getHumanReadableString(used); |     serverInfo.diskUse = ServerInfoService.getHumanReadableString(diskInfo.total - diskInfo.free); | ||||||
|     serverInfo.diskAvailableRaw = available; |     serverInfo.diskAvailableRaw = diskInfo.available; | ||||||
|     serverInfo.diskSizeRaw = size; |     serverInfo.diskSizeRaw = diskInfo.total; | ||||||
|     serverInfo.diskUseRaw = used; |     serverInfo.diskUseRaw = diskInfo.total - diskInfo.free; | ||||||
|     serverInfo.diskUsagePercentage = percentageUsage; |     serverInfo.diskUsagePercentage = parseFloat(usagePercentage); | ||||||
|  |  | ||||||
|     return serverInfo; |     return serverInfo; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private getHumanReadableString(sizeInByte: number) { |   private static getHumanReadableString(sizeInByte: number) { | ||||||
|     const pepibyte = 1.126 * Math.pow(10, 15); |     const pepibyte = 1.126 * Math.pow(10, 15); | ||||||
|     const tebibyte = 1.1 * Math.pow(10, 12); |     const tebibyte = 1.1 * Math.pow(10, 12); | ||||||
|     const gibibyte = 1.074 * Math.pow(10, 9); |     const gibibyte = 1.074 * Math.pow(10, 9); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user