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

refs 116948: add daysSinceCreation to UserCondition

Futa Arai 3 лет назад
Родитель
Сommit
755cc79c58

+ 4 - 0
packages/app/src/interfaces/questionnaire/condition.ts

@@ -5,6 +5,10 @@ import { UserType } from './user-info';
 
 
 interface UserCondition {
 interface UserCondition {
   types: UserType[] // user types to show questionnaire
   types: UserType[] // user types to show questionnaire
+  daysSinceCreation?: {
+    moreThanOrEqualTo?: number
+    lessThanOrEqualTo?: number
+  }
 }
 }
 
 
 interface GrowiCondition {
 interface GrowiCondition {

+ 12 - 0
packages/app/src/server/models/questionnaire/schema/condition.ts

@@ -7,6 +7,18 @@ import { UserType } from '~/interfaces/questionnaire/user-info';
 const conditionSchema = new Schema<ICondition>({
 const conditionSchema = new Schema<ICondition>({
   user: {
   user: {
     types: [{ type: String, enum: Object.values(UserType) }],
     types: [{ type: String, enum: Object.values(UserType) }],
+    daysSinceCreation: {
+      moreThanOrEqualTo: { type: Number, min: 0 },
+      lessThanOrEqualTo: {
+        type: Number,
+        min: 0,
+        validate: [
+          function(value) {
+            return !this.user.daysSinceCreation.moreThanOrEqualTo || this.user.daysSinceCreation.moreThanOrEqualTo <= value;
+          }, 'daysSinceCreation.lessThanOrEqualTo must be greater than moreThanOrEqualTo',
+        ],
+      },
+    },
   },
   },
   growi: {
   growi: {
     types: [{ type: String, enum: Object.values(GrowiServiceType) }],
     types: [{ type: String, enum: Object.values(GrowiServiceType) }],

+ 24 - 3
packages/app/src/server/util/questionnaire/condition.ts

@@ -1,13 +1,34 @@
 import { ICondition } from '~/interfaces/questionnaire/condition';
 import { ICondition } from '~/interfaces/questionnaire/condition';
 import { IGrowiInfo } from '~/interfaces/questionnaire/growi-info';
 import { IGrowiInfo } from '~/interfaces/questionnaire/growi-info';
 import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
 import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
-import { IUserInfo } from '~/interfaces/questionnaire/user-info';
+import { IUserInfo, UserType } from '~/interfaces/questionnaire/user-info';
 
 
 
 
 const checkUserInfo = (condition: ICondition, userInfo: IUserInfo): boolean => {
 const checkUserInfo = (condition: ICondition, userInfo: IUserInfo): boolean => {
-  const { user: { types } } = condition;
+  const { user: { types, daysSinceCreation } } = condition;
 
 
-  return types.includes(userInfo.type);
+  if (!types.includes(userInfo.type)) {
+    return false;
+  }
+
+  if (userInfo.type !== UserType.guest) {
+    const createdAt = userInfo.userCreatedAt;
+    const moreThanOrEqualTo = daysSinceCreation?.moreThanOrEqualTo;
+    const lessThanOrEqualTo = daysSinceCreation?.lessThanOrEqualTo;
+
+    const leftThresholdBool = !moreThanOrEqualTo || (() => {
+      const leftThreshold = new Date(Date.now() - 60 * 1000 * 60 * 24 * moreThanOrEqualTo);
+      return leftThreshold <= createdAt;
+    })();
+    const rightThresholdBool = !lessThanOrEqualTo || (() => {
+      const rightThreshold = new Date(Date.now() + 60 * 1000 * 60 * 24 * lessThanOrEqualTo);
+      return rightThreshold >= createdAt;
+    })();
+
+    return leftThresholdBool && rightThresholdBool;
+  }
+
+  return true;
 };
 };
 
 
 const checkGrowiInfo = (condition: ICondition, growiInfo: IGrowiInfo): boolean => {
 const checkGrowiInfo = (condition: ICondition, growiInfo: IGrowiInfo): boolean => {