Add additional drive capacity change support (#8867)
* Add additional drive capacity change support
* Update packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts
Co-authored-by: Johann150 <johann@qwertqwefsday.eu>
* 🎨
* show instance default capacity in placeholder
* fix
* update api/drive
* fix
* remove :
* fix lint
Co-authored-by: Johann150 <johann@qwertqwefsday.eu>
Co-authored-by: tamaina <tamaina@hotmail.co.jp>
			
			
This commit is contained in:
		
							parent
							
								
									a228d1ddaa
								
							
						
					
					
						commit
						cd07eb222e
					
				
					 9 changed files with 117 additions and 6 deletions
				
			
		|  | @ -0,0 +1,13 @@ | |||
| export class driveCapacityOverrideMb1655813815729 { | ||||
|     name = 'driveCapacityOverrideMb1655813815729' | ||||
| 
 | ||||
|     async up(queryRunner) { | ||||
|         await queryRunner.query(`ALTER TABLE "user" ADD "driveCapacityOverrideMb" integer`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "user"."driveCapacityOverrideMb" IS 'Overrides user drive capacity limit'`); | ||||
|     } | ||||
| 
 | ||||
|     async down(queryRunner) { | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "user"."driveCapacityOverrideMb" IS 'Overrides user drive capacity limit'`); | ||||
|         await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "driveCapacityOverrideMb"`); | ||||
|     } | ||||
| } | ||||
|  | @ -218,6 +218,12 @@ export class User { | |||
| 	}) | ||||
| 	public token: string | null; | ||||
| 
 | ||||
| 	@Column('integer', { | ||||
| 		nullable: true, | ||||
| 		comment: 'Overrides user drive capacity limit', | ||||
| 	}) | ||||
| 	public driveCapacityOverrideMb: number | null; | ||||
| 
 | ||||
| 	constructor(data: Partial<User>) { | ||||
| 		if (data == null) return; | ||||
| 
 | ||||
|  |  | |||
|  | @ -315,6 +315,7 @@ export const UserRepository = db.getRepository(User).extend({ | |||
| 			} : undefined) : undefined, | ||||
| 			emojis: populateEmojis(user.emojis, user.host), | ||||
| 			onlineStatus: this.getOnlineStatus(user), | ||||
| 			driveCapacityOverrideMb: user.driveCapacityOverrideMb, | ||||
| 
 | ||||
| 			...(opts.detail ? { | ||||
| 				url: profile!.url, | ||||
|  |  | |||
|  | @ -314,6 +314,7 @@ import * as ep___users_search from './endpoints/users/search.js'; | |||
| import * as ep___users_show from './endpoints/users/show.js'; | ||||
| import * as ep___users_stats from './endpoints/users/stats.js'; | ||||
| import * as ep___fetchRss from './endpoints/fetch-rss.js'; | ||||
| import * as ep___admin_driveCapOverride from './endpoints/admin/drive-capacity-override.js'; | ||||
| 
 | ||||
| const eps = [ | ||||
| 	['admin/meta', ep___admin_meta], | ||||
|  | @ -629,6 +630,7 @@ const eps = [ | |||
| 	['users/search', ep___users_search], | ||||
| 	['users/show', ep___users_show], | ||||
| 	['users/stats', ep___users_stats], | ||||
| 	['admin/drive-capacity-override', ep___admin_driveCapOverride], | ||||
| 	['fetch-rss', ep___fetchRss], | ||||
| ]; | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,47 @@ | |||
| import define from '../../define.js'; | ||||
| import { Users } from '@/models/index.js'; | ||||
| import { User } from '@/models/entities/user.js'; | ||||
| import { insertModerationLog } from '@/services/insert-moderation-log.js'; | ||||
| export const meta = { | ||||
| 	tags: ['admin'], | ||||
| 
 | ||||
| 	requireCredential: true, | ||||
| 	requireModerator: true, | ||||
| } as const; | ||||
| 
 | ||||
| export const paramDef = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		userId: { type: 'string', format: 'misskey:id' }, | ||||
| 		overrideMb: { type: 'number', nullable: true }, | ||||
| 	}, | ||||
| 	required: ['userId', 'overrideMb'], | ||||
| } as const; | ||||
| 
 | ||||
| // eslint-disable-next-line import/no-default-export
 | ||||
| export default define(meta, paramDef, async (ps, me) => { | ||||
| 	const user = await Users.findOneBy({ id: ps.userId }); | ||||
| 
 | ||||
| 	if (user == null) { | ||||
| 		throw new Error('user not found'); | ||||
| 	} | ||||
| 
 | ||||
| 	if (!Users.isLocalUser(user)) { | ||||
| 		throw new Error('user is not local user'); | ||||
| 	}  | ||||
| 
 | ||||
| 	/*if (user.isAdmin) { | ||||
| 		throw new Error('cannot suspend admin'); | ||||
| 	} | ||||
| 	if (user.isModerator) { | ||||
| 		throw new Error('cannot suspend moderator'); | ||||
| 	}*/ | ||||
| 
 | ||||
| 	await Users.update(user.id, { | ||||
| 		driveCapacityOverrideMb: ps.overrideMb, | ||||
| 	}); | ||||
| 
 | ||||
| 	insertModerationLog(me, 'change-drive-capacity-override', { | ||||
| 		targetId: user.id, | ||||
| 	}); | ||||
| }); | ||||
|  | @ -39,7 +39,7 @@ export default define(meta, paramDef, async (ps, user) => { | |||
| 	const usage = await DriveFiles.calcDriveUsageOf(user.id); | ||||
| 
 | ||||
| 	return { | ||||
| 		capacity: 1024 * 1024 * instance.localDriveCapacityMb, | ||||
| 		capacity: 1024 * 1024 * (user.driveCapacityOverrideMb || instance.localDriveCapacityMb), | ||||
| 		usage: usage, | ||||
| 	}; | ||||
| }); | ||||
|  |  | |||
|  | @ -307,7 +307,7 @@ async function deleteOldFile(user: IRemoteUser) { | |||
| 
 | ||||
| type AddFileArgs = { | ||||
| 	/** User who wish to add file */ | ||||
| 	user: { id: User['id']; host: User['host'] } | null; | ||||
| 	user: { id: User['id']; host: User['host']; driveCapacityOverrideMb: User['driveCapacityOverrideMb'] } | null; | ||||
| 	/** File path */ | ||||
| 	path: string; | ||||
| 	/** Name */ | ||||
|  | @ -371,9 +371,16 @@ export async function addFile({ | |||
| 	//#region Check drive usage
 | ||||
| 	if (user && !isLink) { | ||||
| 		const usage = await DriveFiles.calcDriveUsageOf(user); | ||||
| 		const u = await Users.findOneBy({ id: user.id }); | ||||
| 
 | ||||
| 		const instance = await fetchMeta(); | ||||
| 		const driveCapacity = 1024 * 1024 * (Users.isLocalUser(user) ? instance.localDriveCapacityMb : instance.remoteDriveCapacityMb); | ||||
| 		let driveCapacity = 1024 * 1024 * (Users.isLocalUser(user) ? instance.localDriveCapacityMb : instance.remoteDriveCapacityMb); | ||||
| 
 | ||||
| 		if (Users.isLocalUser(user) && u?.driveCapacityOverrideMb != null) { | ||||
| 			driveCapacity = 1024 * 1024 * u.driveCapacityOverrideMb; | ||||
| 			logger.debug('drive capacity override applied'); | ||||
| 			logger.debug(`overrideCap: ${driveCapacity}bytes, usage: ${usage}bytes, u+s: ${usage + info.size}bytes`); | ||||
| 		} | ||||
| 
 | ||||
| 		logger.debug(`drive usage is ${usage} (max: ${driveCapacity})`); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue