Browse Source

refactor user api (#409)

Signed-off-by: ryjiang <jiangruiyi@gmail.com>
ryjiang 1 year ago
parent
commit
9dac4619f0

+ 4 - 4
client/src/context/System.tsx

@@ -1,5 +1,5 @@
 import { createContext, useEffect, useState, useContext } from 'react';
-import { User, MilvusService } from '@/http';
+import { UserService, MilvusService } from '@/http';
 import { parseJson, getNode, getSystemConfigs } from '@/utils';
 import { MILVUS_NODE_TYPE } from '@/consts';
 import { authContext } from '@/context';
@@ -20,8 +20,8 @@ export const SystemProvider = (props: { children: React.ReactNode }) => {
       // fetch all data
       const [metrics, users, roles] = await Promise.all([
         MilvusService.getMetrics(),
-        User.getUsers(),
-        User.getRoles(),
+        UserService.getUsers(),
+        UserService.getRoles(),
       ]);
 
       // parse data
@@ -91,4 +91,4 @@ export const SystemProvider = (props: { children: React.ReactNode }) => {
       {props.children}
     </Provider>
   );
-};
+};

+ 17 - 25
client/src/http/User.ts → client/src/http/User.service.ts

@@ -8,44 +8,43 @@ import {
   UnassignRoleParams,
 } from '../pages/user/Types';
 import BaseModel from './BaseModel';
+import { Users, UsersWithRoles } from '@server/types';
 
-export class User extends BaseModel {
-  public names!: string[];
-
+export class UserService extends BaseModel {
   constructor(props: {}) {
     super(props);
     Object.assign(this, props);
   }
 
-  static USERS_URL = `/users`;
-  static ROLES_URL = `/users/roles`;
-
   // get user data
   static getUsers() {
-    return super.search({ path: this.USERS_URL, params: {} }) as Promise<{
-      usernames: string[];
-    }>;
+    return super.search<Users>({ path: '/users', params: {} });
+  }
+
+  // get all roles
+  static getRoles() {
+    return super.search<UsersWithRoles>({ path: `/users/roles`, params: {} });
   }
 
   // create user
   static createUser(data: CreateUserParams) {
-    return super.create({ path: this.USERS_URL, data });
+    return super.create({ path: '/users', data });
   }
 
   // update user (pass)
   static updateUser(data: UpdateUserParams) {
-    return super.update({ path: this.USERS_URL, data });
+    return super.update({ path: '/users', data });
   }
 
   // delete user
   static deleteUser(data: DeleteUserParams) {
-    return super.delete({ path: `${this.USERS_URL}/${data.username}` });
+    return super.delete({ path: `/users/${data.username}` });
   }
 
   // update user role
   static updateUserRole(data: AssignRoleParams) {
     return super.update({
-      path: `${this.USERS_URL}/${data.username}/role/update`,
+      path: `/users/${data.username}/role/update`,
       data,
     });
   }
@@ -53,32 +52,25 @@ export class User extends BaseModel {
   // unassign user role
   static unassignUserRole(data: UnassignRoleParams) {
     return super.update({
-      path: `${this.USERS_URL}/${data.username}/role/unassign`,
+      path: `/users/${data.username}/role/unassign`,
       data,
     });
   }
 
   // create a role
   static createRole(data: CreateRoleParams) {
-    return super.create({ path: `${this.ROLES_URL}`, data });
+    return super.create({ path: `/users/roles`, data });
   }
 
   // delete a role
   static deleteRole(data: DeleteRoleParams) {
-    return super.delete({ path: `${this.ROLES_URL}/${data.roleName}`, data });
-  }
-
-  // get all roles
-  static getRoles() {
-    return super.search({ path: `${this.ROLES_URL}`, params: {} }) as Promise<{
-      results: string[];
-    }>;
+    return super.delete({ path: `/users/roles/${data.roleName}`, data });
   }
 
   // update role privileges
   static updateRolePrivileges(data: CreateRoleParams) {
     return super.update({
-      path: `${this.ROLES_URL}/${data.roleName}/updatePrivileges`,
+      path: `/users/roles/${data.roleName}/updatePrivileges`,
       data,
     });
   }
@@ -86,7 +78,7 @@ export class User extends BaseModel {
   // get RBAC info
   static getRBAC() {
     return super.search({
-      path: `${this.USERS_URL}/rbac`,
+      path: `/users/rbac`,
       params: {},
     }) as Promise<{
       GlobalPrivileges: Record<string, unknown>;

+ 1 - 1
client/src/http/index.ts

@@ -4,7 +4,6 @@ export * from './BaseModel';
 export * from './Collection';
 export * from './MilvusIndex';
 export * from './Field';
-export * from './User';
 
 // service
 export * from './Partition.service';
@@ -13,3 +12,4 @@ export * from './Milvus.service';
 export * from './Database.service';
 export * from './Prometheus.service';
 export * from './Segment.service';
+export * from './User.service';

+ 5 - 5
client/src/pages/user/Roles.tsx

@@ -1,7 +1,7 @@
 import { useContext, useEffect, useState } from 'react';
 import { makeStyles, Theme, Chip } from '@material-ui/core';
 import { useTranslation } from 'react-i18next';
-import { User } from '@/http';
+import { UserService } from '@/http';
 import { rootContext, dataContext } from '@/context';
 import { useNavigationHook } from '@/hooks';
 import AttuGrid from '@/components/grid/Grid';
@@ -35,14 +35,14 @@ const Roles = () => {
   const { t: dialogTrans } = useTranslation('dialog');
 
   const fetchRoles = async () => {
-    const roles = await User.getRoles();
+    const roles = await UserService.getRoles();
     setSelectedRole([]);
 
     setRoles(
-      roles.results.map((v: any) => ({
+      roles.results.map(v => ({
         name: v.role.name,
         privilegeContent: v,
-        privileges: v.entities.map((e: any) => ({
+        privileges: v.entities.map(e => ({
           roleName: v.role.name,
           object: e.object.name,
           objectName: e.object_name,
@@ -68,7 +68,7 @@ const Roles = () => {
         roleName: role.name,
         force,
       };
-      await User.deleteRole(param);
+      await UserService.deleteRole(param);
     }
 
     openSnackBar(successTrans('delete', { name: userTrans('role') }));

+ 4 - 4
client/src/pages/user/UpdateRoleDialog.tsx

@@ -6,7 +6,7 @@ import CustomInput from '@/components/customInput/CustomInput';
 import { ITextfieldConfig } from '@/components/customInput/Types';
 import { useFormValidation } from '@/hooks';
 import { formatForm } from '@/utils';
-import { User } from '@/http';
+import { UserService } from '@/http';
 import {
   CreateRoleProps,
   CreateRoleParams,
@@ -50,7 +50,7 @@ const UpdateRoleDialog: FC<CreateRoleProps> = ({
   });
 
   const fetchRBAC = async () => {
-    const rbacOptions = await User.getRBAC();
+    const rbacOptions = await UserService.getRBAC();
 
     setRbacOptions(rbacOptions);
   };
@@ -108,10 +108,10 @@ const UpdateRoleDialog: FC<CreateRoleProps> = ({
 
   const handleCreateRole = async () => {
     if (!isEditing) {
-      await User.createRole(form);
+      await UserService.createRole(form);
     }
 
-    await User.updateRolePrivileges(form);
+    await UserService.updateRolePrivileges(form);
 
     onUpdate({ data: form, isEditing: isEditing });
   };

+ 4 - 4
client/src/pages/user/UpdateUserRole.tsx

@@ -9,7 +9,7 @@ import { FC, useState, useEffect } from 'react';
 import { useTranslation } from 'react-i18next';
 import DialogTemplate from '@/components/customDialog/DialogTemplate';
 import { UpdateUserRoleProps, UpdateUserRoleParams } from './Types';
-import { User } from '@/http';
+import { UserService } from '@/http';
 
 const useStyles = makeStyles((theme: Theme) => ({
   input: {
@@ -41,14 +41,14 @@ const UpdateUserRole: FC<UpdateUserRoleProps> = ({
   const classes = useStyles();
 
   const handleUpdate = async () => {
-    await User.updateUserRole(form);
+    await UserService.updateUserRole(form);
     onUpdate(form);
   };
 
   const fetchAllRoles = async () => {
-    const roles = await User.getRoles();
+    const roles = await UserService.getRoles();
 
-    setRoleOptions(roles.results.map((r: any) => r.role.name));
+    setRoleOptions(roles.results.map(r => r.role.name));
   };
 
   useEffect(() => {

+ 10 - 10
client/src/pages/user/User.tsx

@@ -1,7 +1,7 @@
 import React, { useContext, useEffect, useState } from 'react';
 import { makeStyles, Theme } from '@material-ui/core';
 import { useTranslation } from 'react-i18next';
-import { User } from '@/http';
+import { UserService } from '@/http';
 import AttuGrid from '@/components/grid/Grid';
 import { ColDefinitionsType, ToolBarConfig } from '@/components/grid/Types';
 import {
@@ -39,17 +39,17 @@ const Users = () => {
   const { t: dialogTrans } = useTranslation('dialog');
 
   const fetchUsers = async () => {
-    const res = await User.getUsers();
-    const roles = await User.getRoles();
+    const res = await UserService.getUsers();
+    const roles = await UserService.getRoles();
 
     setUsers(
       res.usernames.map((v: string) => {
         const name = v;
-        const rolesByName = roles.results.filter((r: any) =>
+        const rolesByName = roles.results.filter(r =>
           r.users.map((u: any) => u.name).includes(name)
         );
         const originRoles =
-          v === 'root' ? ['admin'] : rolesByName.map((r: any) => r.role.name);
+          v === 'root' ? ['admin'] : rolesByName.map(r => r.role.name);
         return {
           name: v,
           role: originRoles.join(' , '),
@@ -60,9 +60,9 @@ const Users = () => {
   };
 
   const handleCreate = async (data: CreateUserParams) => {
-    await User.createUser(data);
+    await UserService.createUser(data);
     // assign user role if
-    await User.updateUserRole({
+    await UserService.updateUserRole({
       username: data.username,
       roles: data.roles,
     });
@@ -81,7 +81,7 @@ const Users = () => {
   };
 
   const handleUpdate = async (data: UpdateUserParams) => {
-    await User.updateUser(data);
+    await UserService.updateUser(data);
     fetchUsers();
     openSnackBar(successTrans('update', { name: userTrans('user') }));
     handleCloseDialog();
@@ -92,7 +92,7 @@ const Users = () => {
       const param: DeleteUserParams = {
         username: user.name,
       };
-      await User.deleteUser(param);
+      await UserService.deleteUser(param);
     }
 
     openSnackBar(successTrans('delete', { name: userTrans('user') }));
@@ -104,7 +104,7 @@ const Users = () => {
     {
       label: userTrans('user'),
       onClick: async () => {
-        const roles = await User.getRoles();
+        const roles = await UserService.getRoles();
         setDialog({
           open: true,
           type: 'custom',

+ 3 - 2
server/src/types/index.ts

@@ -10,8 +10,9 @@ export {
   GePersistentSegmentInfoResponse,
   PersistentSegmentInfo,
   DescribeIndexResponse,
-  MilvusClient
+  MilvusClient,
 } from '@zilliz/milvus2-sdk-node';
 
 export * from './collections.type';
-export * from './partitions.type'
+export * from './partitions.type';
+export * from './users.type';

+ 7 - 0
server/src/types/users.type.ts

@@ -0,0 +1,7 @@
+import {
+  SelectRoleResponse,
+  ListCredUsersResponse,
+} from '@zilliz/milvus2-sdk-node';
+
+export type Users = ListCredUsersResponse;
+export type UsersWithRoles = SelectRoleResponse;

+ 1 - 1
server/src/users/users.controller.ts

@@ -112,7 +112,7 @@ export class UserController {
 
   async getRoles(req: Request, res: Response, next: NextFunction) {
     try {
-      const result = (await this.userService.getRoles(req.clientId)) as any;
+      const result = await this.userService.getRoles(req.clientId);
 
       for (let i = 0; i < result.results.length; i++) {
         const { entities } = await this.userService.listGrants(req.clientId, {