Browse Source

Merge pull request #9563 from weseek/feat/160452-enable-selecting-member-user-groups

feat(ai): Implement API to return member UserGroups
Shun Miyazawa 1 year ago
parent
commit
adfb40b9be

+ 3 - 0
apps/app/src/server/routes/apiv3/index.js

@@ -11,6 +11,7 @@ import g2gTransfer from './g2g-transfer';
 import importRoute from './import';
 import pageListing from './page-listing';
 import securitySettings from './security-settings';
+import { factory as userRouteFactory } from './user';
 import * as userActivation from './user-activation';
 
 const logger = loggerFactory('growi:routes:apiv3'); // eslint-disable-line no-unused-vars
@@ -122,5 +123,7 @@ module.exports = (crowi, app) => {
 
   router.use('/openai', openaiRouteFactory(crowi));
 
+  router.use('/user', userRouteFactory(crowi));
+
   return [router, routerForAdmin, routerForAuth];
 };

+ 35 - 0
apps/app/src/server/routes/apiv3/user/get-related-groups.ts

@@ -0,0 +1,35 @@
+import type { IUserHasId } from '@growi/core';
+import { ErrorV3 } from '@growi/core/dist/models';
+import type { Request, RequestHandler } from 'express';
+
+import type Crowi from '~/server/crowi';
+import { accessTokenParser } from '~/server/middlewares/access-token-parser';
+import loggerFactory from '~/utils/logger';
+
+import type { ApiV3Response } from '../interfaces/apiv3-response';
+
+const logger = loggerFactory('growi:routes:apiv3:user:get-related-groups');
+
+type GetRelatedGroupsHandlerFactory = (crowi: Crowi) => RequestHandler[];
+
+interface Req extends Request {
+  user: IUserHasId,
+}
+
+export const getRelatedGroupsHandlerFactory: GetRelatedGroupsHandlerFactory = (crowi) => {
+  const loginRequiredStrictly = require('~/server/middlewares/login-required')(crowi);
+
+  return [
+    accessTokenParser, loginRequiredStrictly,
+    async(req: Req, res: ApiV3Response) => {
+      try {
+        const relatedGroups = await crowi.pageGrantService?.getUserRelatedGroups(req.user);
+        return res.apiv3({ relatedGroups });
+      }
+      catch (err) {
+        logger.error(err);
+        return res.apiv3Err(new ErrorV3('Error occurred while getting user related groups'));
+      }
+    },
+  ];
+};

+ 13 - 0
apps/app/src/server/routes/apiv3/user/index.ts

@@ -0,0 +1,13 @@
+import express from 'express';
+
+import type Crowi from '~/server/crowi';
+
+import { getRelatedGroupsHandlerFactory } from './get-related-groups';
+
+const router = express.Router();
+
+export const factory = (crowi: Crowi): express.Router => {
+  router.get('/related-groups', getRelatedGroupsHandlerFactory(crowi));
+
+  return router;
+};

+ 12 - 0
apps/app/src/stores/user.tsx

@@ -4,6 +4,7 @@ import useSWR from 'swr';
 import useSWRImmutable from 'swr/immutable';
 
 import { apiv3Get } from '~/client/util/apiv3-client';
+import type { PopulatedGrantedGroup } from '~/interfaces/page-grant';
 import { checkAndUpdateImageUrlCached } from '~/stores/middlewares/user';
 
 export const useSWRxUsersList = (userIds: string[]): SWRResponse<IUserHasId[], Error> => {
@@ -49,3 +50,14 @@ export const useSWRxUsernames = (q: string, offset?: number, limit?: number, opt
     }).then(result => result.data),
   );
 };
+
+type RelatedGroupsResponse = {
+  relatedGroups: PopulatedGrantedGroup[]
+}
+
+export const useSWRxUserRelatedGroups = (): SWRResponse<RelatedGroupsResponse, Error> => {
+  return useSWRImmutable<RelatedGroupsResponse>(
+    ['/user/related-groups'],
+    ([endpoint]) => apiv3Get(endpoint).then(response => response.data),
+  );
+};