wip
This commit is contained in:
		
							parent
							
								
									a3cf63823f
								
							
						
					
					
						commit
						9021bb5694
					
				
					 7 changed files with 176 additions and 2 deletions
				
			
		
							
								
								
									
										27
									
								
								src/client/app/desktop/views/pages/admin/admin.dashboard.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/client/app/desktop/views/pages/admin/admin.dashboard.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<header>%i18n:@dashboard%</header>
 | 
			
		||||
 | 
			
		||||
	<p><b>%i18n:@all-users%</b><span>{ stats.usersCount | number }</span></p>
 | 
			
		||||
	<p><b>%i18n:@original-users%</b><span>{ stats.originalUsersCount | number }</span></p>
 | 
			
		||||
	<p><b>%i18n:@all-notes%</b><span>{ stats.notesCount | number }</span></p>
 | 
			
		||||
	<p><b>%i18n:@original-notes%</b><span>{ stats.originalNotesCount | number }</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from "vue";
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			stats: null
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	created() {
 | 
			
		||||
		(this as any).api('stats').then(stats => {
 | 
			
		||||
			this.stats = stats;
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<header>%i18n:@suspend-user%</header>
 | 
			
		||||
	<input v-model="username"/>
 | 
			
		||||
	<button @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from "vue";
 | 
			
		||||
import parseAcct from "../../../../../../misc/acct/parse";
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      username: null,
 | 
			
		||||
      suspending: false
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    async suspendUser() {
 | 
			
		||||
      this.suspending = true;
 | 
			
		||||
 | 
			
		||||
      const user = await (this as any).os.api(
 | 
			
		||||
        "users/show",
 | 
			
		||||
        parseAcct(this.username)
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      await (this as any).os.api("admin/suspend-user", {
 | 
			
		||||
        userId: user.id
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      this.suspending = false;
 | 
			
		||||
 | 
			
		||||
      (this as any).os.apis.dialog("%i18n:@suspended%");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										35
									
								
								src/client/app/desktop/views/pages/admin/admin.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/client/app/desktop/views/pages/admin/admin.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
	<nav>
 | 
			
		||||
		<ul>
 | 
			
		||||
			<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%i18n:@dashborad%</li>
 | 
			
		||||
			<li @click="nav('drive')" :class="{ active: page == 'drive' }">%i18n:@drive%</li>
 | 
			
		||||
			<li @click="nav('users')" :class="{ active: page == 'users' }">%i18n:@users%</li>
 | 
			
		||||
			<li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li>
 | 
			
		||||
		</ul>
 | 
			
		||||
	</nav>
 | 
			
		||||
	<main>
 | 
			
		||||
		<div v-if="page == 'dashboard'">
 | 
			
		||||
			<x-dashboard/>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div v-if="page == 'drive'"></div>
 | 
			
		||||
		<div v-if="page == 'users'">
 | 
			
		||||
			<x-suspend-user/>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div v-if="page == 'update'"></div>
 | 
			
		||||
	</main>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from "vue";
 | 
			
		||||
import XDashboard from "./admin.dashboard.vue";
 | 
			
		||||
import XSuspendUser from "./admin.suspend-user.vue";
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
  components: {
 | 
			
		||||
		XDashboard,
 | 
			
		||||
    XSuspendUser
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
import { performance } from 'perf_hooks';
 | 
			
		||||
import limitter from './limitter';
 | 
			
		||||
import { IUser } from '../../models/user';
 | 
			
		||||
import { IUser, isLocalUser } from '../../models/user';
 | 
			
		||||
import { IApp } from '../../models/app';
 | 
			
		||||
import endpoints from './endpoints';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +21,10 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any)
 | 
			
		|||
		return rej('YOUR_ACCOUNT_HAS_BEEN_SUSPENDED');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ep.meta.requireAdmin && !(isLocalUser(user) && user.isAdmin)) {
 | 
			
		||||
		return rej('YOU_ARE_NOT_ADMIN');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (app && ep.meta.kind) {
 | 
			
		||||
		if (!app.permission.some(p => p === ep.meta.kind)) {
 | 
			
		||||
			return rej('PERMISSION_DENIED');
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +57,7 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any)
 | 
			
		|||
		const time = after - before;
 | 
			
		||||
 | 
			
		||||
		if (time > 1000) {
 | 
			
		||||
			console.warn(`SLOW API CALL DETECTED: ${ep.name} (${ time }ms)`);
 | 
			
		||||
			console.warn(`SLOW API CALL DETECTED: ${ep.name} (${time}ms)`);
 | 
			
		||||
		}
 | 
			
		||||
	} catch (e) {
 | 
			
		||||
		rej(e);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,11 @@ export interface IEndpointMeta {
 | 
			
		|||
	 */
 | 
			
		||||
	requireCredential?: boolean;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 管理者のみ使えるエンドポイントか否か
 | 
			
		||||
	 */
 | 
			
		||||
	requireAdmin?: boolean;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * エンドポイントのリミテーションに関するやつ
 | 
			
		||||
	 * 省略した場合はリミテーションは無いものとして解釈されます。
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										46
									
								
								src/server/api/endpoints/admin/suspend-user.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/server/api/endpoints/admin/suspend-user.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
import $ from 'cafy';
 | 
			
		||||
import ID from '../../../../misc/cafy-id';
 | 
			
		||||
import getParams from '../../get-params';
 | 
			
		||||
import User from '../../../../models/user';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
  desc: {
 | 
			
		||||
    ja: '指定したユーザーを凍結します。',
 | 
			
		||||
    en: 'Suspend a user.'
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  requireCredential: true,
 | 
			
		||||
  requireAdmin: true,
 | 
			
		||||
 | 
			
		||||
  params: {
 | 
			
		||||
    userId: $.type(ID).note({
 | 
			
		||||
      desc: {
 | 
			
		||||
        ja: '対象のユーザーID',
 | 
			
		||||
        en: 'The user ID which you want to suspend'
 | 
			
		||||
      }
 | 
			
		||||
    }),
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default (params: any) => new Promise(async (res, rej) => {
 | 
			
		||||
  const [ps, psErr] = getParams(meta, params);
 | 
			
		||||
  if (psErr) return rej(psErr);
 | 
			
		||||
 | 
			
		||||
  const user = await User.findOne({
 | 
			
		||||
    _id: ps.userId
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (user == null) {
 | 
			
		||||
    return rej('user not found');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  await User.findOneAndUpdate({
 | 
			
		||||
    _id: user._id
 | 
			
		||||
  }, {
 | 
			
		||||
      $set: {
 | 
			
		||||
        isSuspended: true
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
  res();
 | 
			
		||||
});
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue