condition.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import type { IGrowiInfo } from '@growi/core/dist/interfaces';
  2. import type { ICondition } from '../../interfaces/condition';
  3. import type { IGrowiAppAdditionalInfo } from '../../interfaces/growi-app-info';
  4. import type { IQuestionnaireOrder } from '../../interfaces/questionnaire-order';
  5. import type { IUserInfo } from '../../interfaces/user-info';
  6. import { UserType } from '../../interfaces/user-info';
  7. const checkUserInfo = (condition: ICondition, userInfo: IUserInfo): boolean => {
  8. const { user: { types, daysSinceCreation } } = condition;
  9. if (!types.includes(userInfo.type)) {
  10. return false;
  11. }
  12. // Check if "time passed since user creation" is between specified range
  13. if (userInfo.type !== UserType.guest) {
  14. const createdAt = userInfo.userCreatedAt;
  15. const moreThanOrEqualTo = daysSinceCreation?.moreThanOrEqualTo;
  16. const lessThanOrEqualTo = daysSinceCreation?.lessThanOrEqualTo;
  17. const currentDate = new Date();
  18. const isValidLeftThreshold = (() => {
  19. if (moreThanOrEqualTo == null) {
  20. return true;
  21. }
  22. const leftThreshold = new Date(createdAt.getTime() + 60 * 1000 * 60 * 24 * moreThanOrEqualTo);
  23. return leftThreshold <= currentDate;
  24. })();
  25. const isValidRightThreshold = (() => {
  26. if (lessThanOrEqualTo == null) {
  27. return true;
  28. }
  29. const rightThreshold = new Date(createdAt.getTime() + 60 * 1000 * 60 * 24 * lessThanOrEqualTo);
  30. return currentDate <= rightThreshold;
  31. })();
  32. return isValidLeftThreshold && isValidRightThreshold;
  33. }
  34. return true;
  35. };
  36. const checkGrowiInfo = (condition: ICondition, growiInfo: IGrowiInfo<IGrowiAppAdditionalInfo>): boolean => {
  37. const { growi: { types, versionRegExps } } = condition;
  38. if (!types.includes(growiInfo.type)) {
  39. return false;
  40. }
  41. if (!versionRegExps.some(rs => new RegExp(rs).test(growiInfo.version))) {
  42. return false;
  43. }
  44. return true;
  45. };
  46. export const isShowableCondition = (order: IQuestionnaireOrder, userInfo: IUserInfo, growiInfo: IGrowiInfo<IGrowiAppAdditionalInfo>): boolean => {
  47. const { condition } = order;
  48. if (!checkUserInfo(condition, userInfo)) {
  49. return false;
  50. }
  51. if (!checkGrowiInfo(condition, growiInfo)) {
  52. return false;
  53. }
  54. return true;
  55. };