Просмотр исходного кода

Merge pull request #7616 from weseek/imprv/121200-121334-move-all-questionnaire-files-to-features

Imprv/121200 121334 move all questionnaire files to features
Ryoji Shimizu 2 лет назад
Родитель
Сommit
ff1a56b260
39 измененных файлов с 90 добавлено и 73 удалено
  1. 1 1
      apps/app/src/components/Me/OtherSettings.tsx
  2. 5 2
      apps/app/src/components/Me/PersonalSettings.jsx
  3. 1 1
      apps/app/src/components/Navbar/PersonalDropdown.jsx
  4. 0 0
      apps/app/src/features/questionnaire/client/components/ProactiveQuestionnaireModal.tsx
  5. 2 1
      apps/app/src/features/questionnaire/client/components/Question.tsx
  6. 5 4
      apps/app/src/features/questionnaire/client/components/QuestionnaireModal.tsx
  7. 0 0
      apps/app/src/features/questionnaire/client/components/QuestionnaireModalManager.module.scss
  8. 6 4
      apps/app/src/features/questionnaire/client/components/QuestionnaireModalManager.tsx
  9. 4 3
      apps/app/src/features/questionnaire/client/components/QuestionnaireToast.tsx
  10. 1 1
      apps/app/src/features/questionnaire/client/services/guest-questionnaire-answer-status.ts
  11. 2 1
      apps/app/src/features/questionnaire/client/stores/questionnaire.tsx
  12. 0 0
      apps/app/src/features/questionnaire/interfaces/answer.ts
  13. 1 0
      apps/app/src/features/questionnaire/interfaces/condition.ts
  14. 0 0
      apps/app/src/features/questionnaire/interfaces/growi-info.ts
  15. 1 0
      apps/app/src/features/questionnaire/interfaces/proactive-questionnaire-answer.ts
  16. 0 0
      apps/app/src/features/questionnaire/interfaces/question.ts
  17. 0 0
      apps/app/src/features/questionnaire/interfaces/questionnaire-answer-status.ts
  18. 0 0
      apps/app/src/features/questionnaire/interfaces/questionnaire-answer.ts
  19. 0 0
      apps/app/src/features/questionnaire/interfaces/questionnaire-order.ts
  20. 0 0
      apps/app/src/features/questionnaire/interfaces/user-info.ts
  21. 2 1
      apps/app/src/features/questionnaire/server/models/proactive-questionnaire-answer.ts
  22. 2 1
      apps/app/src/features/questionnaire/server/models/questionnaire-answer-status.ts
  23. 2 1
      apps/app/src/features/questionnaire/server/models/questionnaire-answer.ts
  24. 2 1
      apps/app/src/features/questionnaire/server/models/questionnaire-order.ts
  25. 2 1
      apps/app/src/features/questionnaire/server/models/schema/answer.ts
  26. 3 3
      apps/app/src/features/questionnaire/server/models/schema/condition.ts
  27. 1 1
      apps/app/src/features/questionnaire/server/models/schema/growi-info.ts
  28. 1 1
      apps/app/src/features/questionnaire/server/models/schema/question.ts
  29. 1 1
      apps/app/src/features/questionnaire/server/models/schema/user-info.ts
  30. 10 10
      apps/app/src/features/questionnaire/server/routes/apiv3/questionnaire.ts
  31. 6 6
      apps/app/src/features/questionnaire/server/service/questionnaire-cron.ts
  32. 9 9
      apps/app/src/features/questionnaire/server/service/questionnaire.ts
  33. 4 4
      apps/app/src/features/questionnaire/server/util/condition.ts
  34. 1 1
      apps/app/src/pages/[[...path]].page.tsx
  35. 3 2
      apps/app/src/server/crowi/index.js
  36. 1 1
      apps/app/src/server/routes/apiv3/index.js
  37. 1 1
      apps/app/src/server/service/config-loader.ts
  38. 7 7
      apps/app/test/integration/service/questionnaire-cron.test.ts
  39. 3 3
      apps/app/test/integration/service/questionnaire.test.ts

+ 1 - 1
apps/app/src/components/Me/OtherSettings.tsx

@@ -7,8 +7,8 @@ import { UncontrolledTooltip } from 'reactstrap';
 
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { toastSuccess, toastError } from '~/client/util/toastr';
+import { useSWRxIsQuestionnaireEnabled } from '~/features/questionnaire/client/stores/questionnaire';
 import { useCurrentUser } from '~/stores/context';
-import { useSWRxIsQuestionnaireEnabled } from '~/stores/questionnaire';
 
 const OtherSettings = (): JSX.Element => {
   const { t } = useTranslation();

+ 5 - 2
apps/app/src/components/Me/PersonalSettings.jsx

@@ -53,7 +53,6 @@ const PersonalSettings = () => {
         Icon: () => <i className="icon-fw icon-settings"></i>,
         Content: OtherSettings,
         i18n: t('Other Settings'),
-        index: 6,
       },
     };
   }, [t]);
@@ -61,7 +60,11 @@ const PersonalSettings = () => {
   const getDefaultTabIndex = () => {
     // e.g) '/me#password_settings' sets password settings tab as default
     const tab = window.location.hash?.substring(1);
-    return navTabMapping[tab]?.index;
+    let defaultTabIndex;
+    Object.keys(navTabMapping).forEach((key, i) => {
+      if (key === tab) { defaultTabIndex = i }
+    });
+    return defaultTabIndex;
   };
 
   return (

+ 1 - 1
apps/app/src/components/Navbar/PersonalDropdown.jsx

@@ -9,7 +9,7 @@ import { apiv3Post } from '~/client/util/apiv3-client';
 import { toastError } from '~/client/util/toastr';
 import { useCurrentUser } from '~/stores/context';
 
-import ProactiveQuestionnaireModal from '../Questionnaire/ProactiveQuestionnaireModal';
+import ProactiveQuestionnaireModal from '../../features/questionnaire/client/components/ProactiveQuestionnaireModal';
 
 const PersonalDropdown = () => {
   const { t } = useTranslation('commons');

+ 0 - 0
apps/app/src/components/Questionnaire/ProactiveQuestionnaireModal.tsx → apps/app/src/features/questionnaire/client/components/ProactiveQuestionnaireModal.tsx


+ 2 - 1
apps/app/src/components/Questionnaire/Question.tsx → apps/app/src/features/questionnaire/client/components/Question.tsx

@@ -1,6 +1,7 @@
-import { IQuestionHasId } from '~/interfaces/questionnaire/question';
 import { useCurrentUser } from '~/stores/context';
 
+import { IQuestionHasId } from '../../interfaces/question';
+
 type QuestionProps = {
   question: IQuestionHasId,
   inputNamePrefix: string,

+ 5 - 4
apps/app/src/components/Questionnaire/QuestionnaireModal.tsx → apps/app/src/features/questionnaire/client/components/QuestionnaireModal.tsx

@@ -3,16 +3,17 @@ import { useCallback } from 'react';
 import { useTranslation } from 'next-i18next';
 import { Modal, ModalBody } from 'reactstrap';
 
-import { GuestQuestionnaireAnswerStatusService } from '~/client/services/guest-questionnaire-answer-status';
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { toastSuccess, toastError } from '~/client/util/toastr';
-import { IAnswer } from '~/interfaces/questionnaire/answer';
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
-import { IQuestionnaireOrderHasId } from '~/interfaces/questionnaire/questionnaire-order';
+import { IAnswer } from '~/features/questionnaire/interfaces/answer';
+import { StatusType } from '~/features/questionnaire/interfaces/questionnaire-answer-status';
+import { IQuestionnaireOrderHasId } from '~/features/questionnaire/interfaces/questionnaire-order';
 import { useCurrentUser } from '~/stores/context';
 import { useQuestionnaireModal } from '~/stores/modal';
 import loggerFactory from '~/utils/logger';
 
+import { GuestQuestionnaireAnswerStatusService } from '../services/guest-questionnaire-answer-status';
+
 import Question from './Question';
 
 const logger = loggerFactory('growi:QuestionnaireModal');

+ 0 - 0
apps/app/src/components/Questionnaire/QuestionnaireModalManager.module.scss → apps/app/src/features/questionnaire/client/components/QuestionnaireModalManager.module.scss


+ 6 - 4
apps/app/src/components/Questionnaire/QuestionnaireModalManager.tsx → apps/app/src/features/questionnaire/client/components/QuestionnaireModalManager.tsx

@@ -1,10 +1,12 @@
 import { useCallback } from 'react';
 
-import { GuestQuestionnaireAnswerStatusService } from '~/client/services/guest-questionnaire-answer-status';
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
-import { IQuestionnaireOrderHasId } from '~/interfaces/questionnaire/questionnaire-order';
 import { useCurrentUser } from '~/stores/context';
-import { useSWRxQuestionnaireOrders } from '~/stores/questionnaire';
+
+
+import { StatusType } from '../../interfaces/questionnaire-answer-status';
+import { IQuestionnaireOrderHasId } from '../../interfaces/questionnaire-order';
+import { GuestQuestionnaireAnswerStatusService } from '../services/guest-questionnaire-answer-status';
+import { useSWRxQuestionnaireOrders } from '../stores/questionnaire';
 
 import QuestionnaireModal from './QuestionnaireModal';
 import QuestionnaireToast from './QuestionnaireToast';

+ 4 - 3
apps/app/src/components/Questionnaire/QuestionnaireToast.tsx → apps/app/src/features/questionnaire/client/components/QuestionnaireToast.tsx

@@ -2,15 +2,16 @@ import { useCallback, useState } from 'react';
 
 import { useTranslation } from 'next-i18next';
 
-import { GuestQuestionnaireAnswerStatusService } from '~/client/services/guest-questionnaire-answer-status';
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { toastSuccess } from '~/client/util/toastr';
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
-import { IQuestionnaireOrderHasId } from '~/interfaces/questionnaire/questionnaire-order';
 import { useCurrentUser } from '~/stores/context';
 import { useQuestionnaireModal } from '~/stores/modal';
 import loggerFactory from '~/utils/logger';
 
+import { StatusType } from '../../interfaces/questionnaire-answer-status';
+import { IQuestionnaireOrderHasId } from '../../interfaces/questionnaire-order';
+import { GuestQuestionnaireAnswerStatusService } from '../services/guest-questionnaire-answer-status';
+
 const logger = loggerFactory('growi:QuestionnaireToast');
 
 type QuestionnaireToastProps = {

+ 1 - 1
apps/app/src/client/services/guest-questionnaire-answer-status.ts → apps/app/src/features/questionnaire/client/services/guest-questionnaire-answer-status.ts

@@ -1,7 +1,7 @@
 // A service to manage questionnaire answer statuses for guest user.
 // Saves statuses in localStorage.
 
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
+import { StatusType } from '../../interfaces/questionnaire-answer-status';
 
 interface GuestQuestionnaireAnswerStatus {
   status: StatusType

+ 2 - 1
apps/app/src/stores/questionnaire.tsx → apps/app/src/features/questionnaire/client/stores/questionnaire.tsx

@@ -1,7 +1,8 @@
 import useSWR, { SWRResponse } from 'swr';
 
 import { apiv3Get } from '~/client/util/apiv3-client';
-import { IQuestionnaireOrderHasId } from '~/interfaces/questionnaire/questionnaire-order';
+
+import { IQuestionnaireOrderHasId } from '../../interfaces/questionnaire-order';
 
 export const useSWRxQuestionnaireOrders = (): SWRResponse<IQuestionnaireOrderHasId[], Error> => {
   return useSWR(

+ 0 - 0
apps/app/src/interfaces/questionnaire/answer.ts → apps/app/src/features/questionnaire/interfaces/answer.ts


+ 1 - 0
apps/app/src/interfaces/questionnaire/condition.ts → apps/app/src/features/questionnaire/interfaces/condition.ts

@@ -3,6 +3,7 @@ import { HasObjectId } from '@growi/core';
 import { GrowiServiceType } from './growi-info';
 import { UserType } from './user-info';
 
+
 interface UserCondition {
   types: UserType[] // user types to show questionnaire
   daysSinceCreation?: {

+ 0 - 0
apps/app/src/interfaces/questionnaire/growi-info.ts → apps/app/src/features/questionnaire/interfaces/growi-info.ts


+ 1 - 0
apps/app/src/interfaces/questionnaire/proactive-questionnaire-answer.ts → apps/app/src/features/questionnaire/interfaces/proactive-questionnaire-answer.ts

@@ -1,6 +1,7 @@
 import { IGrowiInfo } from './growi-info';
 import { IUserInfo } from './user-info';
 
+
 export interface IProactiveQuestionnaireAnswer {
   satisfaction: number,
   commentText: string,

+ 0 - 0
apps/app/src/interfaces/questionnaire/question.ts → apps/app/src/features/questionnaire/interfaces/question.ts


+ 0 - 0
apps/app/src/interfaces/questionnaire/questionnaire-answer-status.ts → apps/app/src/features/questionnaire/interfaces/questionnaire-answer-status.ts


+ 0 - 0
apps/app/src/interfaces/questionnaire/questionnaire-answer.ts → apps/app/src/features/questionnaire/interfaces/questionnaire-answer.ts


+ 0 - 0
apps/app/src/interfaces/questionnaire/questionnaire-order.ts → apps/app/src/features/questionnaire/interfaces/questionnaire-order.ts


+ 0 - 0
apps/app/src/interfaces/questionnaire/user-info.ts → apps/app/src/features/questionnaire/interfaces/user-info.ts


+ 2 - 1
apps/app/src/server/models/questionnaire/proactive-questionnaire-answer.ts → apps/app/src/features/questionnaire/server/models/proactive-questionnaire-answer.ts

@@ -1,8 +1,9 @@
 import { Model, Schema } from 'mongoose';
 
-import { IProactiveQuestionnaireAnswer } from '~/interfaces/questionnaire/proactive-questionnaire-answer';
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
 
+import { IProactiveQuestionnaireAnswer } from '../../interfaces/proactive-questionnaire-answer';
+
 import { growiInfoSchema } from './schema/growi-info';
 import { userInfoSchema } from './schema/user-info';
 

+ 2 - 1
apps/app/src/server/models/questionnaire/questionnaire-answer-status.ts → apps/app/src/features/questionnaire/server/models/questionnaire-answer-status.ts

@@ -1,8 +1,9 @@
 import { Model, Schema, Document } from 'mongoose';
 
-import { IQuestionnaireAnswerStatus, StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
 
+import { IQuestionnaireAnswerStatus, StatusType } from '../../interfaces/questionnaire-answer-status';
+
 export interface QuestionnaireAnswerStatusDocument extends IQuestionnaireAnswerStatus, Document {}
 
 export type QuestionnaireAnswerStatusModel = Model<QuestionnaireAnswerStatusDocument>

+ 2 - 1
apps/app/src/server/models/questionnaire/questionnaire-answer.ts → apps/app/src/features/questionnaire/server/models/questionnaire-answer.ts

@@ -1,9 +1,10 @@
 import { Document, Model, Schema } from 'mongoose';
 
-import { IQuestionnaireAnswer } from '~/interfaces/questionnaire/questionnaire-answer';
 import { ObjectIdLike } from '~/server/interfaces/mongoose-utils';
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
 
+import { IQuestionnaireAnswer } from '../../interfaces/questionnaire-answer';
+
 import { answerSchema } from './schema/answer';
 import { growiInfoSchema } from './schema/growi-info';
 import { userInfoSchema } from './schema/user-info';

+ 2 - 1
apps/app/src/server/models/questionnaire/questionnaire-order.ts → apps/app/src/features/questionnaire/server/models/questionnaire-order.ts

@@ -1,8 +1,9 @@
 import { Model, Schema, Document } from 'mongoose';
 
-import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
 
+import { IQuestionnaireOrder } from '../../interfaces/questionnaire-order';
+
 import conditionSchema from './schema/condition';
 import questionSchema from './schema/question';
 

+ 2 - 1
apps/app/src/server/models/questionnaire/schema/answer.ts → apps/app/src/features/questionnaire/server/models/schema/answer.ts

@@ -1,8 +1,9 @@
 import { Schema } from 'mongoose';
 
-import { IAnswer } from '~/interfaces/questionnaire/answer';
 import { ObjectIdLike } from '~/server/interfaces/mongoose-utils';
 
+import { IAnswer } from '../../../interfaces/answer';
+
 export const answerSchema = new Schema<IAnswer<ObjectIdLike>>({
   question: { type: Schema.Types.ObjectId, ref: 'Question', required: true },
   value: { type: String, required: true },

+ 3 - 3
apps/app/src/server/models/questionnaire/schema/condition.ts → apps/app/src/features/questionnaire/server/models/schema/condition.ts

@@ -1,8 +1,8 @@
 import { Schema } from 'mongoose';
 
-import { ICondition } from '~/interfaces/questionnaire/condition';
-import { GrowiServiceType } from '~/interfaces/questionnaire/growi-info';
-import { UserType } from '~/interfaces/questionnaire/user-info';
+import { ICondition } from '../../../interfaces/condition';
+import { GrowiServiceType } from '../../../interfaces/growi-info';
+import { UserType } from '../../../interfaces/user-info';
 
 const conditionSchema = new Schema<ICondition>({
   user: {

+ 1 - 1
apps/app/src/server/models/questionnaire/schema/growi-info.ts → apps/app/src/features/questionnaire/server/models/schema/growi-info.ts

@@ -2,7 +2,7 @@ import { Schema } from 'mongoose';
 
 import {
   GrowiAttachmentType, GrowiDeploymentType, GrowiExternalAuthProviderType, GrowiServiceType, GrowiWikiType, IGrowiInfo,
-} from '~/interfaces/questionnaire/growi-info';
+} from '../../../interfaces/growi-info';
 
 export const growiInfoSchema = new Schema<IGrowiInfo>({
   version: { type: String, required: true },

+ 1 - 1
apps/app/src/server/models/questionnaire/schema/question.ts → apps/app/src/features/questionnaire/server/models/schema/question.ts

@@ -1,6 +1,6 @@
 import { Schema } from 'mongoose';
 
-import { IQuestion, QuestionType } from '~/interfaces/questionnaire/question';
+import { IQuestion, QuestionType } from '../../../interfaces/question';
 
 const questionTextSchema = new Schema<IQuestion['text']>({
   ja_JP: { type: String, required: true },

+ 1 - 1
apps/app/src/server/models/questionnaire/schema/user-info.ts → apps/app/src/features/questionnaire/server/models/schema/user-info.ts

@@ -1,6 +1,6 @@
 import { Schema } from 'mongoose';
 
-import { IUserInfo, UserType } from '~/interfaces/questionnaire/user-info';
+import { IUserInfo, UserType } from '../../../interfaces/user-info';
 
 export const userInfoSchema = new Schema<IUserInfo>({
   userIdHash: { type: String },

+ 10 - 10
apps/app/src/server/routes/apiv3/questionnaire.ts → apps/app/src/features/questionnaire/server/routes/apiv3/questionnaire.ts

@@ -1,19 +1,19 @@
 import { Router, Request } from 'express';
 import { body, validationResult } from 'express-validator';
 
-import { IAnswer } from '~/interfaces/questionnaire/answer';
-import { IProactiveQuestionnaireAnswer } from '~/interfaces/questionnaire/proactive-questionnaire-answer';
-import { IQuestionnaireAnswer } from '~/interfaces/questionnaire/questionnaire-answer';
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
 import { IUserHasId } from '~/interfaces/user';
 import Crowi from '~/server/crowi';
-import ProactiveQuestionnaireAnswer from '~/server/models/questionnaire/proactive-questionnaire-answer';
-import QuestionnaireAnswer from '~/server/models/questionnaire/questionnaire-answer';
-import QuestionnaireAnswerStatus from '~/server/models/questionnaire/questionnaire-answer-status';
+import { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
 import axios from '~/utils/axios';
 import loggerFactory from '~/utils/logger';
 
-import { ApiV3Response } from './interfaces/apiv3-response';
+import { IAnswer } from '../../../interfaces/answer';
+import { IProactiveQuestionnaireAnswer } from '../../../interfaces/proactive-questionnaire-answer';
+import { IQuestionnaireAnswer } from '../../../interfaces/questionnaire-answer';
+import { StatusType } from '../../../interfaces/questionnaire-answer-status';
+import ProactiveQuestionnaireAnswer from '../../models/proactive-questionnaire-answer';
+import QuestionnaireAnswer from '../../models/questionnaire-answer';
+import QuestionnaireAnswerStatus from '../../models/questionnaire-answer-status';
 
 
 const logger = loggerFactory('growi:routes:apiv3:questionnaire');
@@ -25,8 +25,8 @@ interface AuthorizedRequest extends Request {
 }
 
 module.exports = (crowi: Crowi): Router => {
-  const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
-  const loginRequired = require('../../middlewares/login-required')(crowi, true);
+  const accessTokenParser = require('~/server/middlewares/access-token-parser')(crowi);
+  const loginRequired = require('~/server/middlewares/login-required')(crowi, true);
 
   const validators = {
     proactiveAnswer: [

+ 6 - 6
apps/app/src/server/service/questionnaire-cron.ts → apps/app/src/features/questionnaire/server/service/questionnaire-cron.ts

@@ -1,15 +1,15 @@
 import axiosRetry from 'axios-retry';
 
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
-import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
 import loggerFactory from '~/utils/logger';
 import { getRandomIntInRange } from '~/utils/rand';
 import { sleep } from '~/utils/sleep';
 
-import ProactiveQuestionnaireAnswer from '../models/questionnaire/proactive-questionnaire-answer';
-import QuestionnaireAnswer from '../models/questionnaire/questionnaire-answer';
-import QuestionnaireAnswerStatus from '../models/questionnaire/questionnaire-answer-status';
-import QuestionnaireOrder from '../models/questionnaire/questionnaire-order';
+import { StatusType } from '../../interfaces/questionnaire-answer-status';
+import { IQuestionnaireOrder } from '../../interfaces/questionnaire-order';
+import ProactiveQuestionnaireAnswer from '../models/proactive-questionnaire-answer';
+import QuestionnaireAnswer from '../models/questionnaire-answer';
+import QuestionnaireAnswerStatus from '../models/questionnaire-answer-status';
+import QuestionnaireOrder from '../models/questionnaire-order';
 
 const logger = loggerFactory('growi:service:questionnaire-cron');
 

+ 9 - 9
apps/app/src/server/service/questionnaire.ts → apps/app/src/features/questionnaire/server/service/questionnaire.ts

@@ -1,17 +1,17 @@
 import crypto from 'crypto';
 import * as os from 'node:os';
 
-import {
-  GrowiWikiType, GrowiExternalAuthProviderType, IGrowiInfo, GrowiServiceType, GrowiAttachmentType, GrowiDeploymentType,
-} from '~/interfaces/questionnaire/growi-info';
-import { StatusType } from '~/interfaces/questionnaire/questionnaire-answer-status';
-import { IUserInfo, UserType } from '~/interfaces/questionnaire/user-info';
 import { IUserHasId } from '~/interfaces/user';
-import QuestionnaireOrder, { QuestionnaireOrderDocument } from '~/server/models/questionnaire/questionnaire-order';
+import { ObjectIdLike } from '~/server/interfaces/mongoose-utils';
 
-import { ObjectIdLike } from '../interfaces/mongoose-utils';
-import QuestionnaireAnswerStatus from '../models/questionnaire/questionnaire-answer-status';
-import { isShowableCondition } from '../util/questionnaire/condition';
+import {
+  GrowiWikiType, GrowiExternalAuthProviderType, IGrowiInfo, GrowiServiceType, GrowiAttachmentType, GrowiDeploymentType,
+} from '../../interfaces/growi-info';
+import { StatusType } from '../../interfaces/questionnaire-answer-status';
+import { IUserInfo, UserType } from '../../interfaces/user-info';
+import QuestionnaireAnswerStatus from '../models/questionnaire-answer-status';
+import QuestionnaireOrder, { QuestionnaireOrderDocument } from '../models/questionnaire-order';
+import { isShowableCondition } from '../util/condition';
 
 class QuestionnaireService {
 

+ 4 - 4
apps/app/src/server/util/questionnaire/condition.ts → apps/app/src/features/questionnaire/server/util/condition.ts

@@ -1,7 +1,7 @@
-import { ICondition } from '~/interfaces/questionnaire/condition';
-import { IGrowiInfo } from '~/interfaces/questionnaire/growi-info';
-import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
-import { IUserInfo, UserType } from '~/interfaces/questionnaire/user-info';
+import { ICondition } from '../../interfaces/condition';
+import { IGrowiInfo } from '../../interfaces/growi-info';
+import { IQuestionnaireOrder } from '../../interfaces/questionnaire-order';
+import { IUserInfo, UserType } from '../../interfaces/user-info';
 
 
 const checkUserInfo = (condition: ICondition, userInfo: IUserInfo): boolean => {

+ 1 - 1
apps/app/src/pages/[[...path]].page.tsx

@@ -21,8 +21,8 @@ import superjson from 'superjson';
 
 import { useCurrentGrowiLayoutFluidClassName, useEditorModeClassName } from '~/client/services/layout';
 import { PageView } from '~/components/Page/PageView';
-import QuestionnaireModalManager from '~/components/Questionnaire/QuestionnaireModalManager';
 import { DrawioViewerScript } from '~/components/Script/DrawioViewerScript';
+import QuestionnaireModalManager from '~/features/questionnaire/client/components/QuestionnaireModalManager';
 import type { CrowiRequest } from '~/interfaces/crowi-request';
 import type { EditorConfig } from '~/interfaces/editor-settings';
 import type { IPageGrantData } from '~/interfaces/page';

+ 3 - 2
apps/app/src/server/crowi/index.js

@@ -10,11 +10,14 @@ import next from 'next';
 
 import pkg from '^/package.json';
 
+import QuestionnaireService from '~/features/questionnaire/server/service/questionnaire';
+import QuestionnaireCronService from '~/features/questionnaire/server/service/questionnaire-cron';
 import CdnResourcesService from '~/services/cdn-resources-service';
 import Xss from '~/services/xss';
 import loggerFactory from '~/utils/logger';
 import { projectRoot } from '~/utils/project-dir-utils';
 
+
 import Activity from '../models/activity';
 import GrowiPlugin from '../models/growi-plugin';
 import PageRedirect from '../models/page-redirect';
@@ -31,8 +34,6 @@ import PageGrantService from '../service/page-grant';
 import PageOperationService from '../service/page-operation';
 // eslint-disable-next-line import/no-cycle
 import { PluginService } from '../service/plugin';
-import QuestionnaireService from '../service/questionnaire';
-import QuestionnaireCronService from '../service/questionnaire-cron';
 import SearchService from '../service/search';
 import { SlackIntegrationService } from '../service/slack-integration';
 import { UserNotificationService } from '../service/user-notification';

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

@@ -112,7 +112,7 @@ module.exports = (crowi, app) => {
 
   router.use('/user-ui-settings', require('./user-ui-settings')(crowi));
 
-  router.use('/questionnaire', require('./questionnaire')(crowi));
+  router.use('/questionnaire', require('~/features/questionnaire/server/routes/apiv3/questionnaire')(crowi));
 
 
   return [router, routerForAdmin, routerForAuth];

+ 1 - 1
apps/app/src/server/service/config-loader.ts

@@ -1,7 +1,7 @@
 import { envUtils } from '@growi/core';
 import { parseISO } from 'date-fns';
 
-import { GrowiServiceType } from '~/interfaces/questionnaire/growi-info';
+import { GrowiServiceType } from '~/features/questionnaire/interfaces/growi-info';
 import loggerFactory from '~/utils/logger';
 
 import ConfigModel, {

+ 7 - 7
apps/app/test/integration/service/questionnaire-cron.test.ts

@@ -1,12 +1,12 @@
 import mongoose from 'mongoose';
 
-import { IProactiveQuestionnaireAnswer } from '../../../src/interfaces/questionnaire/proactive-questionnaire-answer';
-import { IQuestionnaireAnswer } from '../../../src/interfaces/questionnaire/questionnaire-answer';
-import { StatusType } from '../../../src/interfaces/questionnaire/questionnaire-answer-status';
-import ProactiveQuestionnaireAnswer from '../../../src/server/models/questionnaire/proactive-questionnaire-answer';
-import QuestionnaireAnswer from '../../../src/server/models/questionnaire/questionnaire-answer';
-import QuestionnaireAnswerStatus from '../../../src/server/models/questionnaire/questionnaire-answer-status';
-import QuestionnaireOrder from '../../../src/server/models/questionnaire/questionnaire-order';
+import { IProactiveQuestionnaireAnswer } from '../../../src/features/questionnaire/interfaces/proactive-questionnaire-answer';
+import { IQuestionnaireAnswer } from '../../../src/features/questionnaire/interfaces/questionnaire-answer';
+import { StatusType } from '../../../src/features/questionnaire/interfaces/questionnaire-answer-status';
+import ProactiveQuestionnaireAnswer from '../../../src/features/questionnaire/server/models/proactive-questionnaire-answer';
+import QuestionnaireAnswer from '../../../src/features/questionnaire/server/models/questionnaire-answer';
+import QuestionnaireAnswerStatus from '../../../src/features/questionnaire/server/models/questionnaire-answer-status';
+import QuestionnaireOrder from '../../../src/features/questionnaire/server/models/questionnaire-order';
 import { getInstance } from '../setup-crowi';
 
 const axios = require('axios').default;

+ 3 - 3
apps/app/test/integration/service/questionnaire.test.ts

@@ -1,6 +1,6 @@
-import { StatusType } from '../../../src/interfaces/questionnaire/questionnaire-answer-status';
-import QuestionnaireAnswerStatus from '../../../src/server/models/questionnaire/questionnaire-answer-status';
-import QuestionnaireOrder from '../../../src/server/models/questionnaire/questionnaire-order';
+import { StatusType } from '../../../src/features/questionnaire/interfaces/questionnaire-answer-status';
+import QuestionnaireAnswerStatus from '../../../src/features/questionnaire/server/models/questionnaire-answer-status';
+import QuestionnaireOrder from '../../../src/features/questionnaire/server/models/questionnaire-order';
 import { getInstance } from '../setup-crowi';
 
 describe('QuestionnaireService', () => {