管理画面でユーザーを状態でフィルタできるように (#3873)
This commit is contained in:
		
							
								
								
									
										123
									
								
								src/server/api/endpoints/admin/show-users.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								src/server/api/endpoints/admin/show-users.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| import $ from 'cafy'; | ||||
| import User, { pack } from '../../../../models/user'; | ||||
| import define from '../../define'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true, | ||||
| 	requireModerator: true, | ||||
|  | ||||
| 	params: { | ||||
| 		limit: { | ||||
| 			validator: $.num.optional.range(1, 100), | ||||
| 			default: 10 | ||||
| 		}, | ||||
|  | ||||
| 		offset: { | ||||
| 			validator: $.num.optional.min(0), | ||||
| 			default: 0 | ||||
| 		}, | ||||
|  | ||||
| 		sort: { | ||||
| 			validator: $.str.optional.or([ | ||||
| 				'+follower', | ||||
| 				'-follower', | ||||
| 				'+createdAt', | ||||
| 				'-createdAt', | ||||
| 				'+updatedAt', | ||||
| 				'-updatedAt', | ||||
| 			]), | ||||
| 		}, | ||||
|  | ||||
| 		state: { | ||||
| 			validator: $.str.optional.or([ | ||||
| 				'all', | ||||
| 				'admin', | ||||
| 				'moderator', | ||||
| 				'adminOrModerator', | ||||
| 				'verified', | ||||
| 				'suspended', | ||||
| 			]), | ||||
| 			default: 'all' | ||||
| 		}, | ||||
|  | ||||
| 		origin: { | ||||
| 			validator: $.str.optional.or([ | ||||
| 				'combined', | ||||
| 				'local', | ||||
| 				'remote', | ||||
| 			]), | ||||
| 			default: 'local' | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default define(meta, (ps, me) => new Promise(async (res, rej) => { | ||||
| 	let _sort; | ||||
| 	if (ps.sort) { | ||||
| 		if (ps.sort == '+follower') { | ||||
| 			_sort = { | ||||
| 				followersCount: -1 | ||||
| 			}; | ||||
| 		} else if (ps.sort == '-follower') { | ||||
| 			_sort = { | ||||
| 				followersCount: 1 | ||||
| 			}; | ||||
| 		} else if (ps.sort == '+createdAt') { | ||||
| 			_sort = { | ||||
| 				createdAt: -1 | ||||
| 			}; | ||||
| 		} else if (ps.sort == '+updatedAt') { | ||||
| 			_sort = { | ||||
| 				updatedAt: -1 | ||||
| 			}; | ||||
| 		} else if (ps.sort == '-createdAt') { | ||||
| 			_sort = { | ||||
| 				createdAt: 1 | ||||
| 			}; | ||||
| 		} else if (ps.sort == '-updatedAt') { | ||||
| 			_sort = { | ||||
| 				updatedAt: 1 | ||||
| 			}; | ||||
| 		} | ||||
| 	} else { | ||||
| 		_sort = { | ||||
| 			_id: -1 | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	const q = { | ||||
| 		$and: [] | ||||
| 	} as any; | ||||
|  | ||||
| 	// state | ||||
| 	q.$and.push( | ||||
| 		ps.state == 'admin' ? { isAdmin: true } : | ||||
| 		ps.state == 'moderator' ? { isModerator: true } : | ||||
| 		ps.state == 'adminOrModerator' ? { | ||||
| 			$or: [{ | ||||
| 				isAdmin: true | ||||
| 			}, { | ||||
| 				isModerator: true | ||||
| 			}] | ||||
| 		} : | ||||
| 		ps.state == 'verified' ? { isVerified: true } : | ||||
| 		ps.state == 'suspended' ? { isSuspended: true } : | ||||
| 		{} | ||||
| 	); | ||||
|  | ||||
| 	// origin | ||||
| 	q.$and.push( | ||||
| 		ps.origin == 'local' ? { host: null } : | ||||
| 		ps.origin == 'remote' ? { host: { $ne: null } } : | ||||
| 		{} | ||||
| 	); | ||||
|  | ||||
| 	const users = await User | ||||
| 		.find(q, { | ||||
| 			limit: ps.limit, | ||||
| 			sort: _sort, | ||||
| 			skip: ps.offset | ||||
| 		}); | ||||
|  | ||||
| 	res(await Promise.all(users.map(user => pack(user, me, { detail: true })))); | ||||
| })); | ||||
		Reference in New Issue
	
	Block a user
	 MeiMei
					MeiMei