@chevre/domain 24.0.0-alpha.16 → 24.0.0-alpha.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,45 +30,19 @@ exports.ActionRepo = void 0;
30
30
  const moment_1 = __importDefault(require("moment"));
31
31
  const factory = __importStar(require("../factory"));
32
32
  const settings_1 = require("../settings");
33
- const action_1 = require("./mongoose/schemas/action");
34
- const actionRecipe_1 = require("./mongoose/schemas/actionRecipe");
35
- const AVAILABLE_PROJECT_FIELDS = [
36
- 'project',
37
- 'actionStatus',
38
- 'typeOf',
39
- 'description',
40
- 'agent',
41
- 'recipient',
42
- 'result',
43
- 'error',
44
- 'object',
45
- 'startDate',
46
- 'endDate',
47
- 'purpose',
48
- 'potentialActions',
49
- 'amount',
50
- 'fromLocation',
51
- 'toLocation',
52
- 'instrument',
53
- 'location',
54
- 'replacer',
55
- 'targetCollection',
56
- 'sameAs',
57
- 'cancelAction',
58
- 'about',
59
- 'target',
60
- 'identifier'
61
- ];
33
+ // import { createSchema, IModel as IActionModel, modelName } from './mongoose/schemas/action';
34
+ // import { createSchema as createRecipeSchema, IModel as IActionRecipeModel, modelName as recipeModelName } from './mongoose/schemas/actionRecipe';
35
+ const actionProcess_1 = require("./action/actionProcess");
62
36
  /**
63
37
  * アクションリポジトリ
64
38
  */
65
- class ActionRepo {
66
- actionModel;
67
- actionRecipeModel;
68
- constructor(connection) {
69
- this.actionModel = connection.model(action_1.modelName, (0, action_1.createSchema)());
70
- this.actionRecipeModel = connection.model(actionRecipe_1.modelName, (0, actionRecipe_1.createSchema)());
71
- }
39
+ class ActionRepo extends actionProcess_1.ActionProcessRepo {
40
+ // private readonly actionModel: IActionModel;
41
+ // private readonly actionRecipeModel: IActionRecipeModel;
42
+ // constructor(connection: Connection) {
43
+ // this.actionModel = connection.model(modelName, createSchema());
44
+ // this.actionRecipeModel = connection.model(recipeModelName, createRecipeSchema());
45
+ // }
72
46
  static CREATE_MONGO_CONDITIONS(params) {
73
47
  const andConditions = [];
74
48
  const idIn = params.id?.$in;
@@ -480,9 +454,9 @@ class ActionRepo {
480
454
  */
481
455
  async search(params, inclusion) {
482
456
  const conditions = ActionRepo.CREATE_MONGO_CONDITIONS(params);
483
- let positiveProjectionFields = AVAILABLE_PROJECT_FIELDS;
457
+ let positiveProjectionFields = actionProcess_1.AVAILABLE_PROJECT_FIELDS;
484
458
  if (Array.isArray(inclusion) && inclusion.length > 0) {
485
- positiveProjectionFields = inclusion.filter((key) => AVAILABLE_PROJECT_FIELDS.includes(key));
459
+ positiveProjectionFields = inclusion.filter((key) => actionProcess_1.AVAILABLE_PROJECT_FIELDS.includes(key));
486
460
  }
487
461
  const projection = {
488
462
  _id: 0,
@@ -505,180 +479,239 @@ class ActionRepo {
505
479
  .lean() // 2024-08-26~
506
480
  .exec();
507
481
  }
508
- /**
509
- * アクション開始
510
- */
511
- async start(attributes, options) {
512
- const startDate = new Date();
513
- const creatingAction = {
514
- ...attributes,
515
- actionStatus: factory.actionStatusType.ActiveActionStatus,
516
- startDate
517
- };
518
- // reimplemnt with insertMany(2024-08-29~)
519
- const result = await this.actionModel.insertMany(creatingAction, { rawResult: true });
520
- const id = result.insertedIds?.[0]?.toHexString();
521
- if (typeof id !== 'string') {
522
- throw new factory.errors.Internal('action not saved');
523
- }
524
- // add recipe(2024-06-09~)
525
- const savingRecipe = options?.recipe;
526
- if (savingRecipe?.typeOf === 'Recipe') {
527
- await this.upsertRecipe({ ...savingRecipe, recipeFor: { id, typeOf: creatingAction.typeOf } });
528
- }
529
- return { id, startDate, typeOf: creatingAction.typeOf };
530
- }
531
- async completeWithVoid(params) {
532
- if (params.recipe?.typeOf === 'Recipe') {
533
- await this.upsertRecipe({ ...params.recipe, recipeFor: { id: params.id, typeOf: params.typeOf } });
534
- }
535
- const doc = await this.actionModel.findOneAndUpdate({
536
- _id: { $eq: params.id },
537
- typeOf: { $eq: params.typeOf }
538
- }, {
539
- $set: {
540
- actionStatus: factory.actionStatusType.CompletedActionStatus,
541
- result: params.result,
542
- endDate: new Date()
543
- }
544
- }, { new: false, projection: { _id: 1 } })
545
- .lean()
546
- .exec();
547
- if (doc === null) {
548
- throw new factory.errors.NotFound(this.actionModel.modelName);
549
- }
550
- }
551
- /**
552
- * アクション取消
553
- */
554
- async cancelWithVoid(params) {
555
- const cancelDate = new Date();
556
- const cancelAction = (params.cancelAction !== undefined)
557
- ? {
558
- ...params.cancelAction,
559
- endTime: cancelDate,
560
- typeOf: factory.actionType.CancelAction
561
- }
562
- : undefined;
563
- const doc = await this.actionModel.findOneAndUpdate({
564
- _id: { $eq: params.id },
565
- typeOf: { $eq: params.typeOf },
566
- actionStatus: { $ne: factory.actionStatusType.CanceledActionStatus } // 冪等性確保(2024-05-26~)
567
- }, {
568
- $set: {
569
- actionStatus: factory.actionStatusType.CanceledActionStatus,
570
- ...(cancelAction !== undefined) ? { cancelAction } : undefined // cancelAction連携(2024-05-26~)
571
- }
572
- }, { new: false, projection: { _id: 1 } })
573
- .lean()
574
- .exec();
575
- if (doc === null) {
576
- // 既にCanceledActionStatusであればok
577
- const existingAction = await this.findById({ id: params.id, typeOf: params.typeOf }, ['actionStatus'], []);
578
- if (existingAction.actionStatus !== factory.actionStatusType.CanceledActionStatus) {
579
- throw new factory.errors.NotFound(this.actionModel.modelName);
580
- }
581
- }
582
- // endDateが存在しなければセット(2024-04-22~)
583
- await this.actionModel.updateOne({
584
- _id: { $eq: params.id },
585
- endDate: { $exists: false }
586
- }, { $set: { endDate: cancelDate } })
587
- .exec();
588
- }
589
- /**
590
- * アクション失敗
591
- */
592
- async giveUp(params) {
593
- const actionError = (Array.isArray(params.error))
594
- ? params.error.map((e) => ({ ...e, message: e.message, name: e.name }))
595
- : { ...params.error, message: params.error.message, name: params.error.name };
596
- if (params.recipe?.typeOf === 'Recipe') {
597
- await this.upsertRecipe({ ...params.recipe, recipeFor: { id: params.id, typeOf: params.typeOf } });
598
- }
599
- const doc = await this.actionModel.findOneAndUpdate({
600
- typeOf: { $eq: params.typeOf },
601
- _id: { $eq: params.id }
602
- }, {
603
- $set: {
604
- actionStatus: factory.actionStatusType.FailedActionStatus,
605
- error: actionError,
606
- endDate: new Date()
607
- }
608
- }, { new: true, projection: { _id: 1 } })
609
- .lean()
610
- .exec();
611
- if (doc === null) {
612
- throw new factory.errors.NotFound(this.actionModel.modelName);
613
- }
614
- }
615
- /**
616
- * アクション再開
617
- */
618
- async reStart(params) {
619
- const doc = await this.actionModel.findOneAndUpdate({
620
- _id: { $eq: params.id },
621
- typeOf: { $eq: params.typeOf },
622
- actionStatus: { $eq: factory.actionStatusType.CompletedActionStatus }
623
- }, {
624
- $set: {
625
- actionStatus: factory.actionStatusType.ActiveActionStatus,
626
- startDate: new Date()
627
- },
628
- $unset: { endDate: 1 }
629
- }, { new: false, projection: { _id: 1 } })
630
- .lean()
631
- .exec();
632
- if (doc === null) {
633
- throw new factory.errors.NotFound(this.actionModel.modelName);
634
- }
635
- // add recipe(2024-06-09~)
636
- if (params.recipe?.typeOf === 'Recipe') {
637
- await this.upsertRecipe({ ...params.recipe, recipeFor: { id: params.id, typeOf: params.typeOf } });
638
- }
639
- }
640
- /**
641
- * 一定期間ActiveActionStatusのアクションをFailedActionStatusにする
642
- */
643
- async giveUpStartDatePassedCertainPeriod(params) {
644
- return this.actionModel.updateMany({
645
- actionStatus: { $eq: factory.actionStatusType.ActiveActionStatus },
646
- // 一定期間過ぎたもの
647
- startDate: { $lt: params.startDate.$lt },
648
- ...(typeof params.id?.$eq === 'string') ? { _id: { $eq: params.id.$eq } } : undefined
649
- }, {
650
- actionStatus: factory.actionStatusType.FailedActionStatus,
651
- error: params.error,
652
- endDate: new Date()
653
- })
654
- .exec();
655
- }
656
- async findById(params, inclusion, exclusion) {
657
- let positiveProjectionFields = AVAILABLE_PROJECT_FIELDS;
658
- if (Array.isArray(inclusion) && inclusion.length > 0) {
659
- positiveProjectionFields = inclusion.filter((key) => AVAILABLE_PROJECT_FIELDS.includes(key));
660
- }
661
- else {
662
- if (Array.isArray(exclusion) && exclusion.length > 0) {
663
- positiveProjectionFields = positiveProjectionFields.filter((key) => !exclusion.includes(key));
664
- }
665
- }
666
- const projection = {
667
- _id: 0,
668
- id: { $toString: '$_id' },
669
- ...Object.fromEntries(positiveProjectionFields.map((key) => ([key, 1])))
670
- };
671
- const doc = await this.actionModel.findOne({
672
- typeOf: { $eq: params.typeOf },
673
- _id: { $eq: params.id }
674
- }, projection)
675
- .lean() // 2024-08-26~
676
- .exec();
677
- if (doc === null) {
678
- throw new factory.errors.NotFound(this.actionModel.modelName);
679
- }
680
- return doc;
681
- }
482
+ // /**
483
+ // * アクション開始
484
+ // */
485
+ // public async start<T extends factory.actionType>(
486
+ // attributes: factory.action.IAttributes<T, any, any>,
487
+ // options?: {
488
+ // recipe?: IRecipeAsActionAttributes;
489
+ // }
490
+ // ): Promise<Pick<IAction<T>, 'id' | 'typeOf' | 'startDate'>> {
491
+ // const startDate = new Date();
492
+ // const creatingAction: Omit<factory.action.IAction<factory.action.IAttributes<T, any, any>>, 'id'> = {
493
+ // ...attributes,
494
+ // actionStatus: factory.actionStatusType.ActiveActionStatus,
495
+ // startDate
496
+ // };s
497
+ // // reimplemnt with insertMany(2024-08-29~)
498
+ // const result = await this.actionModel.insertMany(creatingAction, { rawResult: true });
499
+ // const id = result.insertedIds?.[0]?.toHexString();
500
+ // if (typeof id !== 'string') {
501
+ // throw new factory.errors.Internal('action not saved');
502
+ // }
503
+ // // add recipe(2024-06-09~)
504
+ // const savingRecipe = options?.recipe;
505
+ // if (savingRecipe?.typeOf === 'Recipe') {
506
+ // await this.upsertRecipe({ ...savingRecipe, recipeFor: { id, typeOf: creatingAction.typeOf } });
507
+ // }
508
+ // return { id, startDate, typeOf: creatingAction.typeOf };
509
+ // }
510
+ // public async completeWithVoid(params: {
511
+ // typeOf: factory.actionType;
512
+ // id: string;
513
+ // result: any;
514
+ // recipe?: IRecipeAsActionAttributes;
515
+ // }): Promise<void> {
516
+ // if (params.recipe?.typeOf === 'Recipe') {
517
+ // await this.upsertRecipe({ ...params.recipe, recipeFor: { id: params.id, typeOf: params.typeOf } });
518
+ // }
519
+ // const doc = await this.actionModel.findOneAndUpdate(
520
+ // {
521
+ // _id: { $eq: params.id },
522
+ // typeOf: { $eq: params.typeOf }
523
+ // },
524
+ // {
525
+ // $set: {
526
+ // actionStatus: factory.actionStatusType.CompletedActionStatus,
527
+ // result: params.result,
528
+ // endDate: new Date()
529
+ // }
530
+ // },
531
+ // { new: false, projection: { _id: 1 } }
532
+ // )
533
+ // .lean<{ _id: ObjectId }>()
534
+ // .exec();
535
+ // if (doc === null) {
536
+ // throw new factory.errors.NotFound(this.actionModel.modelName);
537
+ // }
538
+ // }
539
+ // /**
540
+ // * アクション取消
541
+ // */
542
+ // public async cancelWithVoid(params: {
543
+ // typeOf: factory.actionType.AcceptAction | factory.actionType.AuthorizeAction; // 現時点でAcceptAction,AuthorizeActionのみ対応
544
+ // id: string;
545
+ // cancelAction?: Pick<ICancelActionAction, 'agent' | 'sameAs' | 'startTime'>;
546
+ // }): Promise<void> {
547
+ // const cancelDate = new Date();
548
+ // const cancelAction: ICancelActionAction | undefined = (params.cancelAction !== undefined)
549
+ // ? {
550
+ // ...params.cancelAction,
551
+ // endTime: cancelDate,
552
+ // typeOf: factory.actionType.CancelAction
553
+ // }
554
+ // : undefined;
555
+ // const doc = await this.actionModel.findOneAndUpdate(
556
+ // {
557
+ // _id: { $eq: params.id },
558
+ // typeOf: { $eq: params.typeOf },
559
+ // actionStatus: { $ne: factory.actionStatusType.CanceledActionStatus } // 冪等性確保(2024-05-26~)
560
+ // },
561
+ // {
562
+ // $set: {
563
+ // actionStatus: factory.actionStatusType.CanceledActionStatus,
564
+ // ...(cancelAction !== undefined) ? { cancelAction } : undefined // cancelAction連携(2024-05-26~)
565
+ // }
566
+ // },
567
+ // { new: false, projection: { _id: 1 } }
568
+ // )
569
+ // .lean<{ _id: ObjectId }>()
570
+ // .exec();
571
+ // if (doc === null) {
572
+ // // 既にCanceledActionStatusであればok
573
+ // const existingAction = <Pick<IAction<typeof params.typeOf>, 'actionStatus'>>
574
+ // await this.findById({ id: params.id, typeOf: params.typeOf }, ['actionStatus'], []);
575
+ // if (existingAction.actionStatus !== factory.actionStatusType.CanceledActionStatus) {
576
+ // throw new factory.errors.NotFound(this.actionModel.modelName);
577
+ // }
578
+ // }
579
+ // // endDateが存在しなければセット(2024-04-22~)
580
+ // await this.actionModel.updateOne(
581
+ // {
582
+ // _id: { $eq: params.id },
583
+ // endDate: { $exists: false }
584
+ // },
585
+ // { $set: { endDate: cancelDate } }
586
+ // )
587
+ // .exec();
588
+ // }
589
+ // /**
590
+ // * アクション失敗
591
+ // */
592
+ // public async giveUp(params: {
593
+ // typeOf: factory.actionType;
594
+ // id: string;
595
+ // error: Error | Error[];
596
+ // recipe?: IRecipeAsActionAttributes;
597
+ // }): Promise<void> {
598
+ // const actionError: IActionError | IActionError[] = (Array.isArray(params.error))
599
+ // ? params.error.map((e) => ({ ...e, message: e.message, name: e.name }))
600
+ // : { ...params.error, message: params.error.message, name: params.error.name };
601
+ // if (params.recipe?.typeOf === 'Recipe') {
602
+ // await this.upsertRecipe({ ...params.recipe, recipeFor: { id: params.id, typeOf: params.typeOf } });
603
+ // }
604
+ // const doc = await this.actionModel.findOneAndUpdate(
605
+ // {
606
+ // typeOf: { $eq: params.typeOf },
607
+ // _id: { $eq: params.id }
608
+ // },
609
+ // {
610
+ // $set: {
611
+ // actionStatus: factory.actionStatusType.FailedActionStatus,
612
+ // error: actionError,
613
+ // endDate: new Date()
614
+ // }
615
+ // },
616
+ // { new: true, projection: { _id: 1 } }
617
+ // )
618
+ // .lean<{ _id: ObjectId }>()
619
+ // .exec();
620
+ // if (doc === null) {
621
+ // throw new factory.errors.NotFound(this.actionModel.modelName);
622
+ // }
623
+ // }
624
+ // /**
625
+ // * アクション再開
626
+ // */
627
+ // public async reStart(params: {
628
+ // typeOf: factory.actionType;
629
+ // id: string;
630
+ // recipe?: IRecipeAsActionAttributes;
631
+ // }): Promise<void> {
632
+ // const doc = await this.actionModel.findOneAndUpdate(
633
+ // {
634
+ // _id: { $eq: params.id },
635
+ // typeOf: { $eq: params.typeOf },
636
+ // actionStatus: { $eq: factory.actionStatusType.CompletedActionStatus }
637
+ // },
638
+ // {
639
+ // $set: {
640
+ // actionStatus: factory.actionStatusType.ActiveActionStatus,
641
+ // startDate: new Date()
642
+ // },
643
+ // $unset: { endDate: 1 }
644
+ // },
645
+ // { new: false, projection: { _id: 1 } }
646
+ // )
647
+ // .lean<{ _id: ObjectId }>()
648
+ // .exec();
649
+ // if (doc === null) {
650
+ // throw new factory.errors.NotFound(this.actionModel.modelName);
651
+ // }
652
+ // // add recipe(2024-06-09~)
653
+ // if (params.recipe?.typeOf === 'Recipe') {
654
+ // await this.upsertRecipe({ ...params.recipe, recipeFor: { id: params.id, typeOf: params.typeOf } });
655
+ // }
656
+ // }
657
+ // /**
658
+ // * 一定期間ActiveActionStatusのアクションをFailedActionStatusにする
659
+ // */
660
+ // public async giveUpStartDatePassedCertainPeriod(params: {
661
+ // id?: { $eq?: string };
662
+ // error: any;
663
+ // startDate: { $lt: Date };
664
+ // }): Promise<any> {
665
+ // return this.actionModel.updateMany(
666
+ // {
667
+ // actionStatus: { $eq: factory.actionStatusType.ActiveActionStatus },
668
+ // // 一定期間過ぎたもの
669
+ // startDate: { $lt: params.startDate.$lt },
670
+ // ...(typeof params.id?.$eq === 'string') ? { _id: { $eq: params.id.$eq } } : undefined
671
+ // },
672
+ // {
673
+ // actionStatus: factory.actionStatusType.FailedActionStatus,
674
+ // error: params.error,
675
+ // endDate: new Date()
676
+ // }
677
+ // )
678
+ // .exec();
679
+ // }
680
+ // public async findById<T extends factory.actionType>(
681
+ // params: {
682
+ // typeOf: T;
683
+ // id: string;
684
+ // },
685
+ // inclusion?: IKeyOfProjection[],
686
+ // exclusion?: IKeyOfProjection[]
687
+ // ): Promise<IAction<T>> {
688
+ // let positiveProjectionFields: IKeyOfProjection[] = AVAILABLE_PROJECT_FIELDS;
689
+ // if (Array.isArray(inclusion) && inclusion.length > 0) {
690
+ // positiveProjectionFields = inclusion.filter((key) => AVAILABLE_PROJECT_FIELDS.includes(key));
691
+ // } else {
692
+ // if (Array.isArray(exclusion) && exclusion.length > 0) {
693
+ // positiveProjectionFields = positiveProjectionFields.filter((key) => !exclusion.includes(key));
694
+ // }
695
+ // }
696
+ // const projection: ProjectionType<IAction<T>> = {
697
+ // _id: 0,
698
+ // id: { $toString: '$_id' },
699
+ // ...Object.fromEntries<1>(positiveProjectionFields.map((key) => ([key, 1])))
700
+ // };
701
+ // const doc = await this.actionModel.findOne(
702
+ // {
703
+ // typeOf: { $eq: params.typeOf },
704
+ // _id: { $eq: params.id }
705
+ // },
706
+ // projection
707
+ // )
708
+ // .lean<IAction<T>>() // 2024-08-26~
709
+ // .exec();
710
+ // if (doc === null) {
711
+ // throw new factory.errors.NotFound(this.actionModel.modelName);
712
+ // }
713
+ // return doc;
714
+ // }
682
715
  async findPayAction(params) {
683
716
  const payActions = await this.search({
684
717
  limit: 1,
@@ -791,7 +824,7 @@ class ActionRepo {
791
824
  const projection = {
792
825
  _id: 0,
793
826
  id: { $toString: '$_id' },
794
- ...Object.fromEntries(AVAILABLE_PROJECT_FIELDS.map((key) => ([key, 1])))
827
+ ...Object.fromEntries(actionProcess_1.AVAILABLE_PROJECT_FIELDS.map((key) => ([key, 1])))
795
828
  };
796
829
  const query = this.actionModel.find(filter, projection);
797
830
  // .select({ __v: 0, createdAt: 0, updatedAt: 0 });
@@ -830,29 +863,37 @@ class ActionRepo {
830
863
  })
831
864
  .exec();
832
865
  }
833
- async reCompleteAuthorizeEventOfferAction(params) {
834
- return this.actionModel.findOneAndUpdate({
835
- // typeOf: factory.actionType.AuthorizeAction,
836
- _id: { $eq: params.id },
837
- // ActiveActionStatus->CompletedActionStatusで再実装(2024-01-15~)
838
- // actionStatus: factory.actionStatusType.CompletedActionStatus
839
- actionStatus: { $eq: factory.actionStatusType.ActiveActionStatus }
840
- }, {
841
- $set: {
842
- actionStatus: factory.actionStatusType.CompletedActionStatus,
843
- object: params.object,
844
- result: params.result,
845
- endDate: new Date()
846
- }
847
- }, { new: true, projection: { _id: 1 } })
848
- .lean()
849
- .exec()
850
- .then((doc) => {
851
- if (doc === null) {
852
- throw new factory.errors.NotFound(this.actionModel.modelName);
853
- }
854
- });
855
- }
866
+ // public async reCompleteAuthorizeEventOfferAction(params: {
867
+ // id: string;
868
+ // object: factory.action.authorize.offer.eventService.IObject;
869
+ // result: factory.action.authorize.offer.eventService.IResult;
870
+ // }): Promise<void> {
871
+ // return this.actionModel.findOneAndUpdate(
872
+ // {
873
+ // // typeOf: factory.actionType.AuthorizeAction,
874
+ // _id: { $eq: params.id },
875
+ // // ActiveActionStatus->CompletedActionStatusで再実装(2024-01-15~)
876
+ // // actionStatus: factory.actionStatusType.CompletedActionStatus
877
+ // actionStatus: { $eq: factory.actionStatusType.ActiveActionStatus }
878
+ // },
879
+ // {
880
+ // $set: {
881
+ // actionStatus: factory.actionStatusType.CompletedActionStatus,
882
+ // object: params.object,
883
+ // result: params.result,
884
+ // endDate: new Date()
885
+ // }
886
+ // },
887
+ // { new: true, projection: { _id: 1 } }
888
+ // )
889
+ // .lean<{ _id: ObjectId }>()
890
+ // .exec()
891
+ // .then((doc) => {
892
+ // if (doc === null) {
893
+ // throw new factory.errors.NotFound(this.actionModel.modelName);
894
+ // }
895
+ // });
896
+ // }
856
897
  async updateById(params) {
857
898
  await this.actionModel.updateOne({ _id: { $eq: params.id } }, params.update)
858
899
  .exec();
@@ -1071,20 +1112,23 @@ class ActionRepo {
1071
1112
  };
1072
1113
  });
1073
1114
  }
1074
- // public async saveRecipeWithDateCreated(savingRecipe: IRecipeAsDocument & {
1075
- // dateModified: Date;
1076
- // }) {
1077
- // const { typeOf, project, recipeCategory, recipeFor, step, dateCreated, dateModified } = savingRecipe;
1115
+ // public async saveActionWithEndDate(savingAction: Omit<factory.action.authorize.invoice.IAction, 'id'>) {
1116
+ // const { sameAs, typeOf, project, agent, object, ...updateFields } = savingAction;
1078
1117
  // const filter: FilterQuery<factory.recipe.IRecipe> = {
1079
- // 'recipeFor.id': { $eq: recipeFor.id }
1118
+ // 'project.id': { $eq: project.id },
1119
+ // // 'agent.id': { $exists: true, $eq: agent.id },
1120
+ // // 'object.typeOf': { $exists: true, $eq: object.typeOf },
1121
+ // 'object.paymentMethodId': { $exists: true, $eq: object.paymentMethodId },
1122
+ // typeOf: { $eq: typeOf },
1123
+ // 'sameAs.id': { $exists: true, $eq: sameAs.id }
1080
1124
  // };
1081
- // const setOnInsert: AnyKeys<IRecipeAsDocument> = { project, typeOf, recipeCategory, recipeFor, dateCreated };
1082
- // const setKeys: AnyKeys<IRecipeAsDocument> = { step, dateModified };
1083
- // const update: UpdateQuery<IRecipeAsDocument> = {
1125
+ // const setOnInsert: AnyKeys<IAction<factory.actionType>> = { typeOf, project, agent, object, sameAs };
1126
+ // const setKeys: AnyKeys<IAction<factory.actionType>> = updateFields;
1127
+ // const update: UpdateQuery<IAction<factory.actionType>> = {
1084
1128
  // $setOnInsert: setOnInsert,
1085
1129
  // $set: setKeys
1086
1130
  // };
1087
- // return this.actionRecipeModel.updateOne<HydratedDocument<IRecipeAsDocument>>(
1131
+ // return this.actionModel.updateOne<HydratedDocument<IRecipeAsDocument>>(
1088
1132
  // filter,
1089
1133
  // update,
1090
1134
  // {
@@ -1094,42 +1138,25 @@ class ActionRepo {
1094
1138
  // )
1095
1139
  // .exec();
1096
1140
  // }
1097
- async saveActionWithEndDate(savingAction) {
1098
- const { sameAs, typeOf, project, agent, object, ...updateFields } = savingAction;
1099
- const filter = {
1100
- 'project.id': { $eq: project.id },
1101
- // 'agent.id': { $exists: true, $eq: agent.id },
1102
- // 'object.typeOf': { $exists: true, $eq: object.typeOf },
1103
- 'object.paymentMethodId': { $exists: true, $eq: object.paymentMethodId },
1104
- typeOf: { $eq: typeOf },
1105
- 'sameAs.id': { $exists: true, $eq: sameAs.id }
1106
- };
1107
- const setOnInsert = { typeOf, project, agent, object, sameAs };
1108
- const setKeys = updateFields;
1109
- const update = {
1110
- $setOnInsert: setOnInsert,
1111
- $set: setKeys
1112
- };
1113
- return this.actionModel.updateOne(filter, update, {
1114
- upsert: true,
1115
- includeResultMetadata: true
1116
- })
1117
- .exec();
1118
- }
1119
- async findRecipeByAction(params) {
1120
- return this.actionRecipeModel.findOne({
1121
- 'project.id': { $eq: params.project.id },
1122
- 'recipeFor.id': { $eq: params.recipeFor.id }
1123
- }, { step: 1, recipeCategory: 1 }
1124
- // { lean: true }
1125
- )
1126
- .lean()
1127
- .exec();
1128
- // if (result === null) {
1129
- // throw new factory.errors.NotFound(this.actionRecipeModel.modelName);
1130
- // }
1131
- // return result;
1132
- }
1141
+ // public async findRecipeByAction<T extends factory.recipe.RecipeCategory>(params: {
1142
+ // project: { id: string };
1143
+ // recipeFor: { id: string };
1144
+ // }): Promise<Pick<IActionRecipe<T>, 'step' | 'recipeCategory'> | null> {
1145
+ // return this.actionRecipeModel.findOne(
1146
+ // {
1147
+ // 'project.id': { $eq: params.project.id },
1148
+ // 'recipeFor.id': { $eq: params.recipeFor.id }
1149
+ // },
1150
+ // { step: 1, recipeCategory: 1 }
1151
+ // // { lean: true }
1152
+ // )
1153
+ // .lean<Pick<IActionRecipe<T>, 'step' | 'recipeCategory'>>()
1154
+ // .exec();
1155
+ // // if (result === null) {
1156
+ // // throw new factory.errors.NotFound(this.actionRecipeModel.modelName);
1157
+ // // }
1158
+ // // return result;
1159
+ // }
1133
1160
  async findIMinimizedPurchaseNumberAuthResultByCheckMovieTicketRecipe(params) {
1134
1161
  const recipe = await this.actionRecipeModel.findOne({
1135
1162
  'project.id': { $eq: params.project.id },
@@ -1147,184 +1174,6 @@ class ActionRepo {
1147
1174
  .exec();
1148
1175
  return recipe?.step[0]?.itemListElement[0]?.itemListElement[0]?.afterMedia;
1149
1176
  }
1150
- async aggregateAuthorizeEventServiceOfferAction(params) {
1151
- const statuses = await Promise.all([
1152
- factory.actionStatusType.CompletedActionStatus,
1153
- factory.actionStatusType.CanceledActionStatus,
1154
- factory.actionStatusType.FailedActionStatus
1155
- ].map(async (actionStatus) => {
1156
- const matchConditions = {
1157
- startDate: {
1158
- $gte: params.startFrom,
1159
- $lte: params.startThrough
1160
- },
1161
- typeOf: { $eq: params.typeOf },
1162
- actionStatus: { $eq: actionStatus },
1163
- 'object.typeOf': {
1164
- $exists: true,
1165
- $eq: factory.action.authorize.offer.eventService.ObjectType.SeatReservation
1166
- },
1167
- ...(typeof params.project?.id?.$ne === 'string')
1168
- ? { 'project.id': { $ne: params.project.id.$ne } }
1169
- : undefined
1170
- };
1171
- return this.agggregateByStatus({ matchConditions, actionStatus });
1172
- }));
1173
- return { statuses };
1174
- }
1175
- async aggregateAuthorizePaymentAction(params) {
1176
- const statuses = await Promise.all([
1177
- factory.actionStatusType.CompletedActionStatus,
1178
- factory.actionStatusType.CanceledActionStatus,
1179
- factory.actionStatusType.FailedActionStatus
1180
- ].map(async (actionStatus) => {
1181
- const matchConditions = {
1182
- startDate: {
1183
- $gte: params.startFrom,
1184
- $lte: params.startThrough
1185
- },
1186
- typeOf: { $eq: params.typeOf },
1187
- actionStatus: { $eq: actionStatus },
1188
- 'object.typeOf': {
1189
- $exists: true,
1190
- $eq: factory.action.authorize.paymentMethod.any.ResultType.Payment
1191
- },
1192
- ...(typeof params.project?.id?.$ne === 'string')
1193
- ? { 'project.id': { $ne: params.project.id.$ne } }
1194
- : undefined
1195
- };
1196
- return this.agggregateByStatus({ matchConditions, actionStatus });
1197
- }));
1198
- return { statuses };
1199
- }
1200
- async aggregateAuthorizeOrderAction(params) {
1201
- const statuses = await Promise.all([
1202
- factory.actionStatusType.CompletedActionStatus,
1203
- factory.actionStatusType.CanceledActionStatus,
1204
- factory.actionStatusType.FailedActionStatus
1205
- ].map(async (actionStatus) => {
1206
- const matchConditions = {
1207
- startDate: {
1208
- $gte: params.startFrom,
1209
- $lte: params.startThrough
1210
- },
1211
- typeOf: { $eq: params.typeOf },
1212
- actionStatus: { $eq: actionStatus },
1213
- 'object.typeOf': {
1214
- $exists: true,
1215
- $eq: factory.order.OrderType.Order
1216
- },
1217
- ...(typeof params.project?.id?.$ne === 'string')
1218
- ? { 'project.id': { $ne: params.project.id.$ne } }
1219
- : undefined
1220
- };
1221
- return this.agggregateByStatus({ matchConditions, actionStatus });
1222
- }));
1223
- return { statuses };
1224
- }
1225
- async aggregateCancelReservationAction(params) {
1226
- const statuses = await Promise.all([
1227
- factory.actionStatusType.CompletedActionStatus,
1228
- factory.actionStatusType.CanceledActionStatus,
1229
- factory.actionStatusType.FailedActionStatus
1230
- ].map(async (actionStatus) => {
1231
- const matchConditions = {
1232
- startDate: {
1233
- $gte: params.startFrom,
1234
- $lte: params.startThrough
1235
- },
1236
- typeOf: { $eq: factory.actionType.CancelAction },
1237
- actionStatus: { $eq: actionStatus },
1238
- 'object.typeOf': {
1239
- $exists: true,
1240
- $in: [
1241
- factory.reservationType.BusReservation,
1242
- factory.reservationType.EventReservation,
1243
- factory.reservationType.ReservationPackage
1244
- ]
1245
- },
1246
- ...(typeof params.project?.id?.$ne === 'string')
1247
- ? { 'project.id': { $ne: params.project.id.$ne } }
1248
- : undefined
1249
- };
1250
- return this.agggregateByStatus({ matchConditions, actionStatus });
1251
- }));
1252
- return { statuses };
1253
- }
1254
- /**
1255
- * アクションタイプによる汎用的な集計
1256
- */
1257
- async aggregateByTypeOf(params) {
1258
- const statuses = await Promise.all([
1259
- factory.actionStatusType.CompletedActionStatus,
1260
- factory.actionStatusType.CanceledActionStatus,
1261
- factory.actionStatusType.FailedActionStatus
1262
- ].map(async (actionStatus) => {
1263
- const matchConditions = {
1264
- startDate: {
1265
- $gte: params.startFrom,
1266
- $lte: params.startThrough
1267
- },
1268
- typeOf: { $eq: params.typeOf },
1269
- actionStatus: { $eq: actionStatus },
1270
- ...(typeof params.project?.id?.$ne === 'string')
1271
- ? { 'project.id': { $ne: params.project.id.$ne } }
1272
- : undefined
1273
- };
1274
- return this.agggregateByStatus({ matchConditions, actionStatus });
1275
- }));
1276
- return { statuses };
1277
- }
1278
- async aggregateCheckMovieTicketAction(params) {
1279
- const statuses = await Promise.all([
1280
- factory.actionStatusType.CompletedActionStatus,
1281
- factory.actionStatusType.CanceledActionStatus,
1282
- factory.actionStatusType.FailedActionStatus
1283
- ].map(async (actionStatus) => {
1284
- const matchConditions = {
1285
- startDate: {
1286
- $gte: params.startFrom,
1287
- $lte: params.startThrough
1288
- },
1289
- typeOf: { $eq: factory.actionType.CheckAction },
1290
- 'object.typeOf': {
1291
- $exists: true,
1292
- $eq: factory.service.paymentService.PaymentServiceType.MovieTicket
1293
- },
1294
- actionStatus: { $eq: actionStatus },
1295
- ...(typeof params.project?.id?.$ne === 'string')
1296
- ? { 'project.id': { $ne: params.project.id.$ne } }
1297
- : undefined
1298
- };
1299
- return this.agggregateByStatus({ matchConditions, actionStatus });
1300
- }));
1301
- return { statuses };
1302
- }
1303
- async aggregatePayMovieTicketAction(params) {
1304
- const statuses = await Promise.all([
1305
- factory.actionStatusType.CompletedActionStatus,
1306
- factory.actionStatusType.CanceledActionStatus,
1307
- factory.actionStatusType.FailedActionStatus
1308
- ].map(async (actionStatus) => {
1309
- const matchConditions = {
1310
- startDate: {
1311
- $gte: params.startFrom,
1312
- $lte: params.startThrough
1313
- },
1314
- typeOf: { $eq: factory.actionType.PayAction },
1315
- 'object.typeOf': {
1316
- $exists: true,
1317
- $eq: factory.service.paymentService.PaymentServiceType.MovieTicket
1318
- },
1319
- actionStatus: { $eq: actionStatus },
1320
- ...(typeof params.project?.id?.$ne === 'string')
1321
- ? { 'project.id': { $ne: params.project.id.$ne } }
1322
- : undefined
1323
- };
1324
- return this.agggregateByStatus({ matchConditions, actionStatus });
1325
- }));
1326
- return { statuses };
1327
- }
1328
1177
  getCursor(conditions, projection) {
1329
1178
  return this.actionModel.find(conditions, projection)
1330
1179
  .sort({ startDate: factory.sortType.Descending })
@@ -1334,126 +1183,5 @@ class ActionRepo {
1334
1183
  return this.actionModel.updateMany(params.filter, { $unset: params.$unset }, { timestamps: false })
1335
1184
  .exec();
1336
1185
  }
1337
- async agggregateByStatus(params) {
1338
- const aggregations = await this.actionModel.aggregate([
1339
- { $match: params.matchConditions },
1340
- {
1341
- $project: {
1342
- duration: { $subtract: ['$endDate', '$startDate'] },
1343
- actionStatus: '$actionStatus',
1344
- startDate: '$startDate',
1345
- endDate: '$endDate',
1346
- typeOf: '$typeOf'
1347
- }
1348
- },
1349
- {
1350
- $group: {
1351
- _id: '$typeOf',
1352
- actionCount: { $sum: 1 },
1353
- maxDuration: { $max: '$duration' },
1354
- minDuration: { $min: '$duration' },
1355
- avgDuration: { $avg: '$duration' }
1356
- }
1357
- },
1358
- {
1359
- $project: {
1360
- _id: 0,
1361
- actionCount: '$actionCount',
1362
- avgDuration: '$avgDuration',
1363
- maxDuration: '$maxDuration',
1364
- minDuration: '$minDuration'
1365
- }
1366
- }
1367
- ])
1368
- .exec();
1369
- const percents = [50, 95, 99];
1370
- if (aggregations.length === 0) {
1371
- return {
1372
- status: params.actionStatus,
1373
- aggregation: {
1374
- actionCount: 0,
1375
- avgDuration: 0,
1376
- maxDuration: 0,
1377
- minDuration: 0,
1378
- percentilesDuration: percents.map((percent) => {
1379
- return {
1380
- name: String(percent),
1381
- value: 0
1382
- };
1383
- })
1384
- }
1385
- };
1386
- }
1387
- const ranks4percentile = percents.map((percentile) => {
1388
- return {
1389
- percentile,
1390
- rank: Math.floor(aggregations[0].actionCount * percentile / 100)
1391
- };
1392
- });
1393
- const aggregations2 = await this.actionModel.aggregate([
1394
- {
1395
- $match: params.matchConditions
1396
- },
1397
- {
1398
- $project: {
1399
- duration: { $subtract: ['$endDate', '$startDate'] },
1400
- actionStatus: '$actionStatus',
1401
- startDate: '$startDate',
1402
- endDate: '$endDate',
1403
- typeOf: '$typeOf'
1404
- }
1405
- },
1406
- { $sort: { duration: 1 } },
1407
- {
1408
- $group: {
1409
- _id: '$typeOf',
1410
- durations: { $push: '$duration' }
1411
- }
1412
- },
1413
- {
1414
- $project: {
1415
- _id: 0,
1416
- avgSmallDuration: '$avgSmallDuration',
1417
- avgMediumDuration: '$avgMediumDuration',
1418
- avgLargeDuration: '$avgLargeDuration',
1419
- percentilesDuration: ranks4percentile.map((rank) => {
1420
- return {
1421
- name: String(rank.percentile),
1422
- value: { $arrayElemAt: ['$durations', rank.rank] }
1423
- };
1424
- })
1425
- }
1426
- }
1427
- ])
1428
- .exec();
1429
- return {
1430
- status: params.actionStatus,
1431
- aggregation: {
1432
- ...aggregations[0],
1433
- ...aggregations2[0]
1434
- }
1435
- };
1436
- }
1437
- async upsertRecipe(savingRecipe) {
1438
- const dateModified = new Date();
1439
- const { typeOf, project, recipeCategory, recipeFor, step } = savingRecipe;
1440
- const filter = {
1441
- 'recipeFor.id': { $eq: recipeFor.id }
1442
- };
1443
- const setOnInsert = {
1444
- project, typeOf, recipeCategory, recipeFor,
1445
- dateCreated: dateModified
1446
- };
1447
- const setKeys = { step, dateModified };
1448
- const update = {
1449
- $setOnInsert: setOnInsert,
1450
- $set: setKeys
1451
- };
1452
- return this.actionRecipeModel.updateOne(filter, update, {
1453
- upsert: true,
1454
- includeResultMetadata: true
1455
- })
1456
- .exec();
1457
- }
1458
1186
  }
1459
1187
  exports.ActionRepo = ActionRepo;