@infrab4a/connect-angular 5.5.0-alpha.3 → 5.5.0-beta.0
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.
- package/angular-connect.module.d.ts +36 -33
- package/angular-elastic-search.module.d.ts +9 -9
- package/angular-firebase-auth.module.d.ts +11 -10
- package/angular-firestore.module.d.ts +17 -16
- package/angular-hasura-graphql.module.d.ts +14 -14
- package/angular-vertex-search.module.d.ts +9 -9
- package/consts/backend-url.const.d.ts +1 -1
- package/consts/category-structure.d.ts +1 -1
- package/consts/default-shop.const.d.ts +1 -1
- package/consts/es-config.const.d.ts +1 -1
- package/consts/firebase-const.d.ts +4 -4
- package/consts/hasura-options.const.d.ts +1 -1
- package/consts/index.d.ts +8 -8
- package/consts/persistence.const.d.ts +1 -1
- package/consts/storage-base-url.const.d.ts +1 -1
- package/consts/vertex-config.const.d.ts +1 -1
- package/esm2020/angular-connect.module.mjs +291 -0
- package/esm2020/angular-elastic-search.module.mjs +34 -0
- package/esm2020/angular-firebase-auth.module.mjs +141 -0
- package/esm2020/angular-firestore.module.mjs +541 -0
- package/esm2020/angular-hasura-graphql.module.mjs +355 -0
- package/esm2020/angular-vertex-search.module.mjs +34 -0
- package/{esm2022 → esm2020}/consts/backend-url.const.mjs +2 -2
- package/{esm2022 → esm2020}/consts/category-structure.mjs +2 -2
- package/{esm2022 → esm2020}/consts/default-shop.const.mjs +2 -2
- package/{esm2022 → esm2020}/consts/es-config.const.mjs +2 -2
- package/{esm2022 → esm2020}/consts/firebase-const.mjs +5 -5
- package/{esm2022 → esm2020}/consts/hasura-options.const.mjs +2 -2
- package/{esm2022 → esm2020}/consts/index.mjs +9 -9
- package/{esm2022 → esm2020}/consts/persistence.const.mjs +2 -2
- package/{esm2022 → esm2020}/consts/storage-base-url.const.mjs +2 -2
- package/{esm2022 → esm2020}/consts/vertex-config.const.mjs +2 -2
- package/{esm2022 → esm2020}/helpers/index.mjs +2 -2
- package/{esm2022 → esm2020}/helpers/mobile-operation-system-checker.helper.mjs +7 -7
- package/{esm2022 → esm2020}/index.mjs +7 -7
- package/{esm2022 → esm2020}/infrab4a-connect-angular.mjs +4 -4
- package/esm2020/interfaces/catalog-strategies.interface.mjs +2 -0
- package/{esm2022 → esm2020}/interfaces/category-facades.interface.mjs +2 -2
- package/{esm2022 → esm2020}/interfaces/index.mjs +3 -3
- package/{esm2022 → esm2020}/persistence/cookie-data-persistence.mjs +22 -22
- package/{esm2022 → esm2020}/persistence/data-persistence.mjs +2 -2
- package/{esm2022 → esm2020}/persistence/index.mjs +3 -3
- package/{esm2022 → esm2020}/services/auth.service.mjs +37 -37
- package/{esm2022 → esm2020}/services/cart/cart-services.facade.mjs +21 -21
- package/{esm2022 → esm2020}/services/cart/index.mjs +2 -2
- package/{esm2022 → esm2020}/services/cart.service.mjs +73 -73
- package/{esm2022 → esm2020}/services/catalog/adapters/category-structure.adapter.mjs +2 -2
- package/{esm2022 → esm2020}/services/catalog/adapters/index.mjs +4 -4
- package/{esm2022 → esm2020}/services/catalog/adapters/new-category-structure.adapter.mjs +43 -43
- package/{esm2022 → esm2020}/services/catalog/adapters/old-category-structure.adapter.mjs +23 -23
- package/esm2020/services/catalog/catalog.service.mjs +111 -0
- package/{esm2022 → esm2020}/services/catalog/category.service.mjs +42 -42
- package/esm2020/services/catalog/context/catalog-search.context.mjs +40 -0
- package/{esm2022 → esm2020}/services/catalog/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/services/catalog/enums/product-sorts.enum.mjs +11 -11
- package/{esm2022 → esm2020}/services/catalog/facades/catalog-service.facade.mjs +32 -32
- package/esm2020/services/catalog/facades/catalog-strategies.facade.mjs +17 -0
- package/esm2020/services/catalog/facades/category-repository.facade.mjs +20 -0
- package/{esm2022 → esm2020}/services/catalog/facades/category-service.facade.mjs +30 -30
- package/{esm2022 → esm2020}/services/catalog/facades/index.mjs +6 -6
- package/esm2020/services/catalog/facades/product-catalog.facade.mjs +21 -0
- package/esm2020/services/catalog/helpers/brand-manager.helper.mjs +57 -0
- package/esm2020/services/catalog/helpers/catalog-filter.helper.mjs +44 -0
- package/esm2020/services/catalog/helpers/catalog-sort.helper.mjs +52 -0
- package/{esm2022 → esm2020}/services/catalog/helpers/index.mjs +5 -5
- package/{esm2022 → esm2020}/services/catalog/helpers/product-fields.helper.mjs +40 -40
- package/{esm2022 → esm2020}/services/catalog/index.mjs +8 -8
- package/{esm2022 → esm2020}/services/catalog/models/category-with-tree.model.mjs +10 -10
- package/{esm2022 → esm2020}/services/catalog/models/index.mjs +2 -2
- package/esm2020/services/catalog/services/catalog-helpers.service.mjs +33 -0
- package/{esm2022 → esm2020}/services/catalog/services/catalog-operations.facade.mjs +26 -26
- package/esm2020/services/catalog/services/catalog-repository.service.mjs +25 -0
- package/{esm2022 → esm2020}/services/catalog/services/index.mjs +5 -5
- package/esm2020/services/catalog/services/product-management.facade.mjs +25 -0
- package/esm2020/services/catalog/strategies/category-search.strategy.mjs +133 -0
- package/{esm2022 → esm2020}/services/catalog/strategies/index.mjs +4 -4
- package/esm2020/services/catalog/strategies/profile-search.strategy.mjs +42 -0
- package/esm2020/services/catalog/strategies/term-search.strategy.mjs +123 -0
- package/esm2020/services/catalog/strategies/types/strategy-params.type.mjs +2 -0
- package/{esm2022 → esm2020}/services/catalog/types/fetch-products-options.type.mjs +2 -2
- package/esm2020/services/catalog/types/fetch-products-params.type.mjs +2 -0
- package/{esm2022 → esm2020}/services/catalog/types/fetch-products-response.type.mjs +2 -2
- package/{esm2022 → esm2020}/services/catalog/types/index.mjs +6 -6
- package/esm2020/services/catalog/types/method-params.type.mjs +2 -0
- package/{esm2022 → esm2020}/services/catalog/types/product-sort.type.mjs +2 -2
- package/esm2020/services/catalog/wishlist.service.mjs +254 -0
- package/esm2020/services/checkout/checkout-dependencies.facade.mjs +20 -0
- package/esm2020/services/checkout/checkout-repositories.facade.mjs +20 -0
- package/{esm2022 → esm2020}/services/checkout/index.mjs +3 -3
- package/{esm2022 → esm2020}/services/checkout-subscription.service.mjs +55 -55
- package/{esm2022 → esm2020}/services/checkout.service.mjs +106 -106
- package/{esm2022 → esm2020}/services/coupon/coupon-repositories.facade.mjs +24 -24
- package/{esm2022 → esm2020}/services/coupon/index.mjs +2 -2
- package/esm2020/services/coupon/types/coupon-params.type.mjs +2 -0
- package/esm2020/services/coupon.service.mjs +248 -0
- package/{esm2022 → esm2020}/services/helpers/index.mjs +2 -2
- package/{esm2022 → esm2020}/services/helpers/util.helper.mjs +18 -18
- package/{esm2022 → esm2020}/services/home-shop/home-shop-repositories.facade.mjs +24 -24
- package/{esm2022 → esm2020}/services/home-shop/index.mjs +2 -2
- package/{esm2022 → esm2020}/services/home-shop.service.mjs +119 -119
- package/{esm2022 → esm2020}/services/index.mjs +11 -11
- package/esm2020/services/order-product-review.service.mjs +110 -0
- package/{esm2022 → esm2020}/services/order.service.mjs +30 -30
- package/{esm2022 → esm2020}/services/shared/configuration.facade.mjs +29 -29
- package/{esm2022 → esm2020}/services/shared/index.mjs +2 -2
- package/{esm2022 → esm2020}/services/types/index.mjs +5 -5
- package/{esm2022 → esm2020}/services/types/pending-product-review.type.mjs +2 -2
- package/{esm2022 → esm2020}/services/types/product-review-create.type.mjs +2 -2
- package/{esm2022 → esm2020}/services/types/required-checkout-data.type.mjs +2 -2
- package/{esm2022 → esm2020}/services/types/required-checkout-subscription-data.type.mjs +2 -2
- package/{esm2022 → esm2020}/types/firebase-app-config.type.mjs +2 -2
- package/{esm2022 → esm2020}/types/index.mjs +2 -2
- package/fesm2015/infrab4a-connect-angular.mjs +3513 -0
- package/fesm2015/infrab4a-connect-angular.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/infrab4a-connect-angular.mjs +3311 -3284
- package/fesm2020/infrab4a-connect-angular.mjs.map +1 -0
- package/helpers/index.d.ts +1 -1
- package/helpers/mobile-operation-system-checker.helper.d.ts +3 -3
- package/index.d.ts +6 -6
- package/interfaces/catalog-strategies.interface.d.ts +31 -31
- package/interfaces/category-facades.interface.d.ts +6 -6
- package/interfaces/index.d.ts +2 -2
- package/package.json +15 -9
- package/persistence/cookie-data-persistence.d.ts +10 -10
- package/persistence/data-persistence.d.ts +6 -6
- package/persistence/index.d.ts +2 -2
- package/services/auth.service.d.ts +18 -18
- package/services/cart/cart-services.facade.d.ts +12 -12
- package/services/cart/index.d.ts +1 -1
- package/services/cart.service.d.ts +26 -26
- package/services/catalog/adapters/category-structure.adapter.d.ts +4 -4
- package/services/catalog/adapters/index.d.ts +3 -3
- package/services/catalog/adapters/new-category-structure.adapter.d.ts +12 -12
- package/services/catalog/adapters/old-category-structure.adapter.d.ts +10 -10
- package/services/catalog/catalog.service.d.ts +24 -24
- package/services/catalog/category.service.d.ts +23 -23
- package/services/catalog/context/catalog-search.context.d.ts +14 -14
- package/services/catalog/enums/index.d.ts +1 -1
- package/services/catalog/enums/product-sorts.enum.d.ts +9 -9
- package/services/catalog/facades/catalog-service.facade.d.ts +15 -15
- package/services/catalog/facades/catalog-strategies.facade.d.ts +10 -10
- package/services/catalog/facades/category-repository.facade.d.ts +9 -9
- package/services/catalog/facades/category-service.facade.d.ts +15 -15
- package/services/catalog/facades/index.d.ts +5 -5
- package/services/catalog/facades/product-catalog.facade.d.ts +10 -10
- package/services/catalog/helpers/brand-manager.helper.d.ts +14 -14
- package/services/catalog/helpers/catalog-filter.helper.d.ts +8 -8
- package/services/catalog/helpers/catalog-sort.helper.d.ts +7 -7
- package/services/catalog/helpers/index.d.ts +4 -4
- package/services/catalog/helpers/product-fields.helper.d.ts +7 -7
- package/services/catalog/index.d.ts +7 -7
- package/services/catalog/models/category-with-tree.model.d.ts +4 -4
- package/services/catalog/models/index.d.ts +1 -1
- package/services/catalog/services/catalog-helpers.service.d.ts +17 -17
- package/services/catalog/services/catalog-operations.facade.d.ts +13 -13
- package/services/catalog/services/catalog-repository.service.d.ts +12 -12
- package/services/catalog/services/index.d.ts +4 -4
- package/services/catalog/services/product-management.facade.d.ts +12 -12
- package/services/catalog/strategies/category-search.strategy.d.ts +19 -19
- package/services/catalog/strategies/index.d.ts +3 -3
- package/services/catalog/strategies/profile-search.strategy.d.ts +14 -14
- package/services/catalog/strategies/term-search.strategy.d.ts +20 -20
- package/services/catalog/strategies/types/strategy-params.type.d.ts +58 -58
- package/services/catalog/types/fetch-products-options.type.d.ts +8 -8
- package/services/catalog/types/fetch-products-params.type.d.ts +25 -25
- package/services/catalog/types/fetch-products-response.type.d.ts +19 -19
- package/services/catalog/types/index.d.ts +5 -5
- package/services/catalog/types/method-params.type.d.ts +17 -17
- package/services/catalog/types/product-sort.type.d.ts +2 -2
- package/services/catalog/wishlist.service.d.ts +59 -59
- package/services/checkout/checkout-dependencies.facade.d.ts +10 -10
- package/services/checkout/checkout-repositories.facade.d.ts +9 -9
- package/services/checkout/index.d.ts +2 -2
- package/services/checkout-subscription.service.d.ts +19 -19
- package/services/checkout.service.d.ts +30 -30
- package/services/coupon/coupon-repositories.facade.d.ts +10 -10
- package/services/coupon/index.d.ts +1 -1
- package/services/coupon/types/coupon-params.type.d.ts +13 -13
- package/services/coupon.service.d.ts +36 -36
- package/services/helpers/index.d.ts +1 -1
- package/services/helpers/util.helper.d.ts +3 -3
- package/services/home-shop/home-shop-repositories.facade.d.ts +10 -10
- package/services/home-shop/index.d.ts +1 -1
- package/services/home-shop.service.d.ts +26 -26
- package/services/index.d.ts +10 -10
- package/services/order-product-review.service.d.ts +16 -16
- package/services/order.service.d.ts +13 -13
- package/services/shared/configuration.facade.d.ts +12 -12
- package/services/shared/index.d.ts +1 -1
- package/services/types/index.d.ts +4 -4
- package/services/types/pending-product-review.type.d.ts +12 -12
- package/services/types/product-review-create.type.d.ts +14 -14
- package/services/types/required-checkout-data.type.d.ts +2 -2
- package/services/types/required-checkout-subscription-data.type.d.ts +2 -2
- package/types/firebase-app-config.type.d.ts +1 -1
- package/types/index.d.ts +1 -1
- package/esm2022/angular-connect.module.mjs +0 -288
- package/esm2022/angular-elastic-search.module.mjs +0 -34
- package/esm2022/angular-firebase-auth.module.mjs +0 -140
- package/esm2022/angular-firestore.module.mjs +0 -538
- package/esm2022/angular-hasura-graphql.module.mjs +0 -333
- package/esm2022/angular-vertex-search.module.mjs +0 -34
- package/esm2022/interfaces/catalog-strategies.interface.mjs +0 -2
- package/esm2022/services/catalog/catalog.service.mjs +0 -111
- package/esm2022/services/catalog/context/catalog-search.context.mjs +0 -40
- package/esm2022/services/catalog/facades/catalog-strategies.facade.mjs +0 -17
- package/esm2022/services/catalog/facades/category-repository.facade.mjs +0 -20
- package/esm2022/services/catalog/facades/product-catalog.facade.mjs +0 -21
- package/esm2022/services/catalog/helpers/brand-manager.helper.mjs +0 -57
- package/esm2022/services/catalog/helpers/catalog-filter.helper.mjs +0 -44
- package/esm2022/services/catalog/helpers/catalog-sort.helper.mjs +0 -52
- package/esm2022/services/catalog/services/catalog-helpers.service.mjs +0 -33
- package/esm2022/services/catalog/services/catalog-repository.service.mjs +0 -25
- package/esm2022/services/catalog/services/product-management.facade.mjs +0 -25
- package/esm2022/services/catalog/strategies/category-search.strategy.mjs +0 -133
- package/esm2022/services/catalog/strategies/profile-search.strategy.mjs +0 -42
- package/esm2022/services/catalog/strategies/term-search.strategy.mjs +0 -123
- package/esm2022/services/catalog/strategies/types/strategy-params.type.mjs +0 -2
- package/esm2022/services/catalog/types/fetch-products-params.type.mjs +0 -2
- package/esm2022/services/catalog/types/method-params.type.mjs +0 -2
- package/esm2022/services/catalog/wishlist.service.mjs +0 -254
- package/esm2022/services/checkout/checkout-dependencies.facade.mjs +0 -20
- package/esm2022/services/checkout/checkout-repositories.facade.mjs +0 -20
- package/esm2022/services/coupon/types/coupon-params.type.mjs +0 -2
- package/esm2022/services/coupon.service.mjs +0 -248
- package/esm2022/services/order-product-review.service.mjs +0 -110
- package/fesm2022/infrab4a-connect-angular.mjs.map +0 -1
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { CheckoutTypes, CouponTypes, Exclusivities, OrderStatus, Shops, Where, } from '@infrab4a/connect';
|
|
3
|
-
import { from, of } from 'rxjs';
|
|
4
|
-
import { concatMap, map } from 'rxjs/operators';
|
|
5
|
-
import { CouponRepositoriesFacade } from './coupon';
|
|
6
|
-
import { ConfigurationFacade } from './shared';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./coupon";
|
|
9
|
-
import * as i2 from "./shared";
|
|
10
|
-
export class CouponService {
|
|
11
|
-
constructor(repositoriesFacade, configurationFacade) {
|
|
12
|
-
this.repositoriesFacade = repositoriesFacade;
|
|
13
|
-
this.configurationFacade = configurationFacade;
|
|
14
|
-
this.emailIsFromCollaborator = (userEmail) => !!userEmail?.match(/@b4a.com.br/g);
|
|
15
|
-
}
|
|
16
|
-
checkCoupon(params) {
|
|
17
|
-
const { nickname, checkoutType, checkout, plan } = params;
|
|
18
|
-
return from(this.repositoriesFacade.couponRepository
|
|
19
|
-
.find({
|
|
20
|
-
filters: {
|
|
21
|
-
nickname: { operator: Where.EQUALS, value: nickname },
|
|
22
|
-
active: { operator: Where.EQUALS, value: true },
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
.then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation({ coupon: couponValid, checkoutType, checkout, plan })), map((couponValidated) => couponValidated));
|
|
26
|
-
}
|
|
27
|
-
async couponValidation(coupon, checkoutType) {
|
|
28
|
-
if (!coupon)
|
|
29
|
-
throw 'Cupom inválido.';
|
|
30
|
-
if (coupon?.beginAt && coupon?.beginAt.getTime() > new Date().getTime())
|
|
31
|
-
throw 'Cupom inválido.';
|
|
32
|
-
if (coupon?.expiresIn && (coupon?.expiresIn).getTime() < new Date().getTime())
|
|
33
|
-
throw 'Cupom expirado.';
|
|
34
|
-
const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.configurationFacade.defaultShop;
|
|
35
|
-
if (!isInShop)
|
|
36
|
-
throw 'Cupom inválido para loja.';
|
|
37
|
-
const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
|
|
38
|
-
if (!isCheckoutType)
|
|
39
|
-
throw 'Cupom inválido. Erro de checkout.';
|
|
40
|
-
return coupon;
|
|
41
|
-
}
|
|
42
|
-
async couponRulesValidation(params) {
|
|
43
|
-
const { coupon, checkoutType, checkout, plan } = params;
|
|
44
|
-
if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
|
|
45
|
-
return this.validateSubscriptionCoupon(coupon, plan);
|
|
46
|
-
}
|
|
47
|
-
return this.validateEcommerceCoupon(coupon, checkoutType, checkout);
|
|
48
|
-
}
|
|
49
|
-
validateSubscriptionCoupon(coupon, plan) {
|
|
50
|
-
if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase()) {
|
|
51
|
-
throw 'Cupom inválido para sua assinatura.';
|
|
52
|
-
}
|
|
53
|
-
return coupon;
|
|
54
|
-
}
|
|
55
|
-
async validateEcommerceCoupon(coupon, checkoutType, checkout) {
|
|
56
|
-
this.validateUserEligibility(coupon, checkout?.user);
|
|
57
|
-
await this.validateUsageLimits(coupon, checkoutType, checkout);
|
|
58
|
-
await this.validateProductEligibility(coupon, checkout);
|
|
59
|
-
return coupon;
|
|
60
|
-
}
|
|
61
|
-
validateUserEligibility(coupon, user) {
|
|
62
|
-
const validUser = this.coupomUserValidation(coupon, user);
|
|
63
|
-
if (!validUser)
|
|
64
|
-
throw 'Usuário não elegível.';
|
|
65
|
-
}
|
|
66
|
-
async validateUsageLimits(coupon, checkoutType, checkout) {
|
|
67
|
-
const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
|
|
68
|
-
if (couponUseLimits.firstOrder) {
|
|
69
|
-
await this.validateFirstOrderLimit(checkout.user.email);
|
|
70
|
-
}
|
|
71
|
-
if (!couponUseLimits.unlimited || couponUseLimits.limitedPerUser) {
|
|
72
|
-
await this.validateCouponUsageLimits(coupon, couponUseLimits, checkout.user.email);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async validateFirstOrderLimit(userEmail) {
|
|
76
|
-
const ordersUser = await this.getOrdersFromUser(userEmail.toLocaleLowerCase());
|
|
77
|
-
if (ordersUser.length >= 1)
|
|
78
|
-
throw 'Limite de uso atingido';
|
|
79
|
-
}
|
|
80
|
-
async validateCouponUsageLimits(coupon, couponUseLimits, userEmail) {
|
|
81
|
-
const ordersCoupon = await this.getOrdersWithCoupon(coupon);
|
|
82
|
-
if (!couponUseLimits.unlimited && couponUseLimits.total && ordersCoupon.length >= couponUseLimits.total) {
|
|
83
|
-
throw 'Limite de uso atingido.';
|
|
84
|
-
}
|
|
85
|
-
if (couponUseLimits.limitedPerUser) {
|
|
86
|
-
const ordersWithUser = this.countOrdersWithUser(ordersCoupon, userEmail);
|
|
87
|
-
if (ordersWithUser > 0)
|
|
88
|
-
throw 'Limite de uso por usuário atingido.';
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
async validateProductEligibility(coupon, checkout) {
|
|
92
|
-
const hasProductCategories = await this.hasProductCategories(coupon, checkout);
|
|
93
|
-
if (!hasProductCategories)
|
|
94
|
-
throw 'Seu carrinho não possui produtos elegíveis para desconto.';
|
|
95
|
-
const hasMinSubTotal = await this.hasMinSubTotal(coupon, checkout);
|
|
96
|
-
if (!hasMinSubTotal) {
|
|
97
|
-
this.throwMinSubTotalError(coupon);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
throwMinSubTotalError(coupon) {
|
|
101
|
-
const formattedValue = Intl.NumberFormat('pt-BR', {
|
|
102
|
-
style: 'currency',
|
|
103
|
-
currency: 'BRL',
|
|
104
|
-
}).format(coupon.minSubTotalValue);
|
|
105
|
-
if (coupon.productsCategories?.length) {
|
|
106
|
-
throw `Valor mínimo de ${formattedValue} não atingido na(s) categoria(s) elegíveis para o desconto.`;
|
|
107
|
-
}
|
|
108
|
-
throw `Valor mínimo de ${formattedValue} não atingido.`;
|
|
109
|
-
}
|
|
110
|
-
calcDiscountSubscription(coupon, checkout) {
|
|
111
|
-
let discount = 0;
|
|
112
|
-
if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
|
|
113
|
-
discount = coupon.discount.subscription.value;
|
|
114
|
-
else
|
|
115
|
-
discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
|
|
116
|
-
return of(discount);
|
|
117
|
-
}
|
|
118
|
-
async hasMinSubTotal(coupon, checkout) {
|
|
119
|
-
if (!coupon.minSubTotalValue)
|
|
120
|
-
return true;
|
|
121
|
-
const lineItensDiscount = await this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
|
|
122
|
-
const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user);
|
|
123
|
-
if (coupon.minSubTotalValue <= subTotal)
|
|
124
|
-
return true;
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
async hasProductCategories(coupon, checkout) {
|
|
128
|
-
if (!coupon.productsCategories?.length) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
const couponCategories = await this.getCouponCategoriesId(coupon.productsCategories);
|
|
132
|
-
const hasCategories = checkout.lineItems?.filter((item) => {
|
|
133
|
-
if (item.isGift)
|
|
134
|
-
return false;
|
|
135
|
-
if (!item.categories?.length)
|
|
136
|
-
return true;
|
|
137
|
-
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
138
|
-
});
|
|
139
|
-
return hasCategories?.length ? true : false;
|
|
140
|
-
}
|
|
141
|
-
coupomUserValidation(coupon, user) {
|
|
142
|
-
if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
|
|
143
|
-
return true;
|
|
144
|
-
const userTypes = [];
|
|
145
|
-
if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) &&
|
|
146
|
-
this.emailIsFromCollaborator(user.email.toLocaleLowerCase()))
|
|
147
|
-
userTypes.push(Exclusivities.COLLABORATORS);
|
|
148
|
-
if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) &&
|
|
149
|
-
coupon.userExclusiveEmail.includes(user.email.toLocaleLowerCase()))
|
|
150
|
-
userTypes.push(Exclusivities.SPECIFIC_USER);
|
|
151
|
-
if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
|
|
152
|
-
user.isSubscriber &&
|
|
153
|
-
user.subscriptionPlan != '')
|
|
154
|
-
userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
|
|
155
|
-
if (user.isSubscriber &&
|
|
156
|
-
user.subscriptionPlan == '' &&
|
|
157
|
-
coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
|
|
158
|
-
userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
|
|
159
|
-
if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
|
|
160
|
-
userTypes.push(Exclusivities.NON_SUBSCRIBER);
|
|
161
|
-
return coupon.exclusivityType.some((r) => userTypes.includes(r));
|
|
162
|
-
}
|
|
163
|
-
async getCouponCategoriesId(productsCategories) {
|
|
164
|
-
const couponCategories = [];
|
|
165
|
-
for (let index = 0; index < productsCategories.length; index++) {
|
|
166
|
-
const category = await this.repositoriesFacade.categoryRepository.get({
|
|
167
|
-
id: productsCategories[index],
|
|
168
|
-
});
|
|
169
|
-
if (category) {
|
|
170
|
-
const children = await this.repositoriesFacade.categoryRepository.getChildren(parseInt(productsCategories[index]));
|
|
171
|
-
couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
return [...new Set(couponCategories)];
|
|
175
|
-
}
|
|
176
|
-
async getLineItensEligebleForDiscount(productsCategories, checkout) {
|
|
177
|
-
let lineItensDiscount = [];
|
|
178
|
-
const couponCategories = await this.getCouponCategoriesId(productsCategories);
|
|
179
|
-
if (productsCategories?.length) {
|
|
180
|
-
lineItensDiscount = checkout.lineItems?.filter((item) => {
|
|
181
|
-
if (item.isGift)
|
|
182
|
-
return false;
|
|
183
|
-
if (item.categories?.length) {
|
|
184
|
-
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
185
|
-
}
|
|
186
|
-
return true;
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
lineItensDiscount = checkout.lineItems.filter((item) => !item.isGift);
|
|
191
|
-
}
|
|
192
|
-
return lineItensDiscount;
|
|
193
|
-
}
|
|
194
|
-
calcCheckoutSubtotal(lineItens, user) {
|
|
195
|
-
return (lineItens
|
|
196
|
-
?.filter((item) => !item.isGift)
|
|
197
|
-
.reduce((acc, curr) => user?.isSubscriber && curr.price?.subscriberPrice
|
|
198
|
-
? acc + curr.price?.subscriberPrice * curr.quantity
|
|
199
|
-
: acc + curr.pricePaid * curr.quantity, 0) || 0);
|
|
200
|
-
}
|
|
201
|
-
async getOrdersWithCoupon(coupon) {
|
|
202
|
-
return await this.repositoriesFacade.orderRepository
|
|
203
|
-
.find({
|
|
204
|
-
filters: {
|
|
205
|
-
coupon: { id: coupon.id },
|
|
206
|
-
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
207
|
-
},
|
|
208
|
-
})
|
|
209
|
-
.then((result) => result.data);
|
|
210
|
-
}
|
|
211
|
-
async getOrdersFromUser(email) {
|
|
212
|
-
return await this.repositoriesFacade.orderRepository
|
|
213
|
-
.find({
|
|
214
|
-
filters: {
|
|
215
|
-
user: { email: { operator: Where.EQUALS, value: email } },
|
|
216
|
-
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
217
|
-
},
|
|
218
|
-
})
|
|
219
|
-
.then((result) => result.data);
|
|
220
|
-
}
|
|
221
|
-
countOrdersWithUser(orders, email) {
|
|
222
|
-
return orders.filter((o) => o.user.email == email).length;
|
|
223
|
-
}
|
|
224
|
-
getCouponUseLimits(coupon, checkoutType, user) {
|
|
225
|
-
let couponUseLimits;
|
|
226
|
-
if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
|
|
227
|
-
if (coupon.exclusivityType.length === 1 &&
|
|
228
|
-
(coupon.exclusivityType.at(0) === Exclusivities.SPECIFIC_USER ||
|
|
229
|
-
coupon.exclusivityType.at(0) === Exclusivities.COLLABORATORS))
|
|
230
|
-
couponUseLimits = coupon.useLimits.non_subscriber;
|
|
231
|
-
else
|
|
232
|
-
couponUseLimits = user?.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
couponUseLimits = coupon.useLimits.subscription;
|
|
236
|
-
}
|
|
237
|
-
return couponUseLimits;
|
|
238
|
-
}
|
|
239
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CouponService, deps: [{ token: i1.CouponRepositoriesFacade }, { token: i2.ConfigurationFacade }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
240
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CouponService, providedIn: 'root' }); }
|
|
241
|
-
}
|
|
242
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CouponService, decorators: [{
|
|
243
|
-
type: Injectable,
|
|
244
|
-
args: [{
|
|
245
|
-
providedIn: 'root',
|
|
246
|
-
}]
|
|
247
|
-
}], ctorParameters: () => [{ type: i1.CouponRepositoriesFacade }, { type: i2.ConfigurationFacade }] });
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxFQUlMLGFBQWEsRUFFYixXQUFXLEVBQ1gsYUFBYSxFQUdiLFdBQVcsRUFDWCxLQUFLLEVBRUwsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFBOzs7O0FBSzlDLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ21CLGtCQUE0QyxFQUM1QyxtQkFBd0M7UUFEeEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEwQjtRQUM1Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBME9uRCw0QkFBdUIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBek9qRyxDQUFDO0lBRUosV0FBVyxDQUFDLE1BQXlCO1FBQ25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFFekQsT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQjthQUNyQyxJQUFJLENBQUM7WUFDSixPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLEVBQUUs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TUFBTSxLQUFLLENBQUM7Z0JBQ25DLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLGFBQWE7b0JBQzNELE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxhQUFhLENBQUM7Z0JBRS9ELGVBQWUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQTs7Z0JBQzlDLGVBQWUsR0FBRyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUE7UUFDM0csQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUE7UUFDakQsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7K0dBL1RVLGFBQWE7bUhBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDYXRlZ29yeSxcbiAgQ2hlY2tvdXQsXG4gIENoZWNrb3V0U3Vic2NyaXB0aW9uLFxuICBDaGVja291dFR5cGVzLFxuICBDb3Vwb24sXG4gIENvdXBvblR5cGVzLFxuICBFeGNsdXNpdml0aWVzLFxuICBMaW5lSXRlbSxcbiAgT3JkZXIsXG4gIE9yZGVyU3RhdHVzLFxuICBTaG9wcyxcbiAgVXNlcixcbiAgV2hlcmUsXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgQ291cG9uUmVwb3NpdG9yaWVzRmFjYWRlIH0gZnJvbSAnLi9jb3Vwb24nXG5pbXBvcnQgeyBDaGVja0NvdXBvblBhcmFtcywgQ291cG9uUnVsZXNWYWxpZGF0aW9uUGFyYW1zIH0gZnJvbSAnLi9jb3Vwb24vdHlwZXMvY291cG9uLXBhcmFtcy50eXBlJ1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkZhY2FkZSB9IGZyb20gJy4vc2hhcmVkJ1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ291cG9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwb3NpdG9yaWVzRmFjYWRlOiBDb3Vwb25SZXBvc2l0b3JpZXNGYWNhZGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWd1cmF0aW9uRmFjYWRlOiBDb25maWd1cmF0aW9uRmFjYWRlLFxuICApIHt9XG5cbiAgY2hlY2tDb3Vwb24ocGFyYW1zOiBDaGVja0NvdXBvblBhcmFtcyk6IE9ic2VydmFibGU8Q291cG9uPiB7XG4gICAgY29uc3QgeyBuaWNrbmFtZSwgY2hlY2tvdXRUeXBlLCBjaGVja291dCwgcGxhbiB9ID0gcGFyYW1zXG5cbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMucmVwb3NpdG9yaWVzRmFjYWRlLmNvdXBvblJlcG9zaXRvcnlcbiAgICAgICAgLmZpbmQoe1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIG5pY2tuYW1lOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiBuaWNrbmFtZSB9LFxuICAgICAgICAgICAgYWN0aXZlOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiB0cnVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGFbMF0pLFxuICAgICkucGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY291cG9uKSA9PiB0aGlzLmNvdXBvblZhbGlkYXRpb24oY291cG9uLCBjaGVja291dFR5cGUpKSxcbiAgICAgIGNvbmNhdE1hcCgoY291cG9uVmFsaWQ6IENvdXBvbikgPT5cbiAgICAgICAgdGhpcy5jb3Vwb25SdWxlc1ZhbGlkYXRpb24oeyBjb3Vwb246IGNvdXBvblZhbGlkLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuIH0pLFxuICAgICAgKSxcbiAgICAgIG1hcCgoY291cG9uVmFsaWRhdGVkOiBDb3Vwb24pID0+IGNvdXBvblZhbGlkYXRlZCBhcyBDb3Vwb24pLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY291cG9uVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzKSB7XG4gICAgaWYgKCFjb3Vwb24pIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xuXG4gICAgaWYgKGNvdXBvbj8uYmVnaW5BdCAmJiBjb3Vwb24/LmJlZ2luQXQuZ2V0VGltZSgpID4gbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xuXG4gICAgaWYgKGNvdXBvbj8uZXhwaXJlc0luICYmIChjb3Vwb24/LmV4cGlyZXNJbiBhcyBEYXRlKS5nZXRUaW1lKCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgdGhyb3cgJ0N1cG9tIGV4cGlyYWRvLidcblxuICAgIGNvbnN0IGlzSW5TaG9wID1cbiAgICAgIGNvdXBvbi5zaG9wQXZhaWxhYmlsaXR5ID09PSBTaG9wcy5BTEwgfHwgY291cG9uLnNob3BBdmFpbGFiaWxpdHkgPT09IHRoaXMuY29uZmlndXJhdGlvbkZhY2FkZS5kZWZhdWx0U2hvcFxuXG4gICAgaWYgKCFpc0luU2hvcCkgdGhyb3cgJ0N1cG9tIGludsOhbGlkbyBwYXJhIGxvamEuJ1xuXG4gICAgY29uc3QgaXNDaGVja291dFR5cGUgPSBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBDaGVja291dFR5cGVzLkFMTCB8fCBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBjaGVja291dFR5cGVcblxuICAgIGlmICghaXNDaGVja291dFR5cGUpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uIEVycm8gZGUgY2hlY2tvdXQuJ1xuXG4gICAgcmV0dXJuIGNvdXBvblxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3Vwb25SdWxlc1ZhbGlkYXRpb24ocGFyYW1zOiBDb3Vwb25SdWxlc1ZhbGlkYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7IGNvdXBvbiwgY2hlY2tvdXRUeXBlLCBjaGVja291dCwgcGxhbiB9ID0gcGFyYW1zXG5cbiAgICBpZiAoY2hlY2tvdXRUeXBlID09IENoZWNrb3V0VHlwZXMuU1VCU0NSSVBUSU9OKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVN1YnNjcmlwdGlvbkNvdXBvbihjb3Vwb24sIHBsYW4pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVFY29tbWVyY2VDb3Vwb24oY291cG9uLCBjaGVja291dFR5cGUsIGNoZWNrb3V0KVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN1YnNjcmlwdGlvbkNvdXBvbihjb3Vwb246IENvdXBvbiwgcGxhbjogc3RyaW5nKTogQ291cG9uIHtcbiAgICBpZiAoY291cG9uLnBsYW4gJiYgY291cG9uLnBsYW4udG9VcHBlckNhc2UoKSAhPT0gcGxhbi50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvIHBhcmEgc3VhIGFzc2luYXR1cmEuJ1xuICAgIH1cblxuICAgIHJldHVybiBjb3Vwb25cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVFY29tbWVyY2VDb3Vwb24oXG4gICAgY291cG9uOiBDb3Vwb24sXG4gICAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgKTogUHJvbWlzZTxDb3Vwb24+IHtcbiAgICB0aGlzLnZhbGlkYXRlVXNlckVsaWdpYmlsaXR5KGNvdXBvbiwgY2hlY2tvdXQ/LnVzZXIpXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVVzYWdlTGltaXRzKGNvdXBvbiwgY2hlY2tvdXRUeXBlLCBjaGVja291dClcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlUHJvZHVjdEVsaWdpYmlsaXR5KGNvdXBvbiwgY2hlY2tvdXQpXG5cbiAgICByZXR1cm4gY291cG9uXG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVXNlckVsaWdpYmlsaXR5KGNvdXBvbjogQ291cG9uLCB1c2VyOiBVc2VyKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRVc2VyID0gdGhpcy5jb3Vwb21Vc2VyVmFsaWRhdGlvbihjb3Vwb24sIHVzZXIpXG5cbiAgICBpZiAoIXZhbGlkVXNlcikgdGhyb3cgJ1VzdcOhcmlvIG7Do28gZWxlZ8OtdmVsLidcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVVc2FnZUxpbWl0cyhcbiAgICBjb3Vwb246IENvdXBvbixcbiAgICBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb3Vwb25Vc2VMaW1pdHMgPSB0aGlzLmdldENvdXBvblVzZUxpbWl0cyhjb3Vwb24sIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQudXNlcilcblxuICAgIGlmIChjb3Vwb25Vc2VMaW1pdHMuZmlyc3RPcmRlcikge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUZpcnN0T3JkZXJMaW1pdChjaGVja291dC51c2VyLmVtYWlsKVxuICAgIH1cblxuICAgIGlmICghY291cG9uVXNlTGltaXRzLnVubGltaXRlZCB8fCBjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVDb3Vwb25Vc2FnZUxpbWl0cyhjb3Vwb24sIGNvdXBvblVzZUxpbWl0cywgY2hlY2tvdXQudXNlci5lbWFpbClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRmlyc3RPcmRlckxpbWl0KHVzZXJFbWFpbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3JkZXJzVXNlciA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzRnJvbVVzZXIodXNlckVtYWlsLnRvTG9jYWxlTG93ZXJDYXNlKCkpXG5cbiAgICBpZiAob3JkZXJzVXNlci5sZW5ndGggPj0gMSkgdGhyb3cgJ0xpbWl0ZSBkZSB1c28gYXRpbmdpZG8nXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ291cG9uVXNhZ2VMaW1pdHMoY291cG9uOiBDb3Vwb24sIGNvdXBvblVzZUxpbWl0czogYW55LCB1c2VyRW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9yZGVyc0NvdXBvbiA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb24pXG5cbiAgICBpZiAoIWNvdXBvblVzZUxpbWl0cy51bmxpbWl0ZWQgJiYgY291cG9uVXNlTGltaXRzLnRvdGFsICYmIG9yZGVyc0NvdXBvbi5sZW5ndGggPj0gY291cG9uVXNlTGltaXRzLnRvdGFsKSB7XG4gICAgICB0aHJvdyAnTGltaXRlIGRlIHVzbyBhdGluZ2lkby4nXG4gICAgfVxuXG4gICAgaWYgKGNvdXBvblVzZUxpbWl0cy5saW1pdGVkUGVyVXNlcikge1xuICAgICAgY29uc3Qgb3JkZXJzV2l0aFVzZXIgPSB0aGlzLmNvdW50T3JkZXJzV2l0aFVzZXIob3JkZXJzQ291cG9uLCB1c2VyRW1haWwpXG5cbiAgICAgIGlmIChvcmRlcnNXaXRoVXNlciA+IDApIHRocm93ICdMaW1pdGUgZGUgdXNvIHBvciB1c3XDoXJpbyBhdGluZ2lkby4nXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVByb2R1Y3RFbGlnaWJpbGl0eShjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzUHJvZHVjdENhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmhhc1Byb2R1Y3RDYXRlZ29yaWVzKGNvdXBvbiwgY2hlY2tvdXQpXG5cbiAgICBpZiAoIWhhc1Byb2R1Y3RDYXRlZ29yaWVzKSB0aHJvdyAnU2V1IGNhcnJpbmhvIG7Do28gcG9zc3VpIHByb2R1dG9zIGVsZWfDrXZlaXMgcGFyYSBkZXNjb250by4nXG5cbiAgICBjb25zdCBoYXNNaW5TdWJUb3RhbCA9IGF3YWl0IHRoaXMuaGFzTWluU3ViVG90YWwoY291cG9uLCBjaGVja291dClcblxuICAgIGlmICghaGFzTWluU3ViVG90YWwpIHtcbiAgICAgIHRoaXMudGhyb3dNaW5TdWJUb3RhbEVycm9yKGNvdXBvbilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRocm93TWluU3ViVG90YWxFcnJvcihjb3Vwb246IENvdXBvbik6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gSW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywge1xuICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICBjdXJyZW5jeTogJ0JSTCcsXG4gICAgfSkuZm9ybWF0KGNvdXBvbi5taW5TdWJUb3RhbFZhbHVlKVxuXG4gICAgaWYgKGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXM/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgYFZhbG9yIG3DrW5pbW8gZGUgJHtmb3JtYXR0ZWRWYWx1ZX0gbsOjbyBhdGluZ2lkbyBuYShzKSBjYXRlZ29yaWEocykgZWxlZ8OtdmVpcyBwYXJhIG8gZGVzY29udG8uYFxuICAgIH1cblxuICAgIHRocm93IGBWYWxvciBtw61uaW1vIGRlICR7Zm9ybWF0dGVkVmFsdWV9IG7Do28gYXRpbmdpZG8uYFxuICB9XG5cbiAgcHVibGljIGNhbGNEaXNjb3VudFN1YnNjcmlwdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXRTdWJzY3JpcHRpb24+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBsZXQgZGlzY291bnQgPSAwXG5cbiAgICBpZiAoY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi50eXBlID09IENvdXBvblR5cGVzLkFCU09MVVRFKSBkaXNjb3VudCA9IGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpcHRpb24udmFsdWVcbiAgICBlbHNlIGRpc2NvdW50ID0gY2hlY2tvdXQuc3Vic2NyaXB0aW9uUGxhbi5yZWN1cnJlbmNlUHJpY2UgKiAoY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi52YWx1ZSAvIDEwMClcblxuICAgIHJldHVybiBvZihkaXNjb3VudClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFzTWluU3ViVG90YWwoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghY291cG9uLm1pblN1YlRvdGFsVmFsdWUpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBsaW5lSXRlbnNEaXNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0TGluZUl0ZW5zRWxpZ2VibGVGb3JEaXNjb3VudChjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzLCBjaGVja291dClcbiAgICBjb25zdCBzdWJUb3RhbCA9IHRoaXMuY2FsY0NoZWNrb3V0U3VidG90YWwobGluZUl0ZW5zRGlzY291bnQsIGNoZWNrb3V0LnVzZXIpXG5cbiAgICBpZiAoY291cG9uLm1pblN1YlRvdGFsVmFsdWUgPD0gc3ViVG90YWwpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFzUHJvZHVjdENhdGVnb3JpZXMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmdldENvdXBvbkNhdGVnb3JpZXNJZChjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzKVxuICAgIGNvbnN0IGhhc0NhdGVnb3JpZXMgPSBjaGVja291dC5saW5lSXRlbXM/LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaXNHaWZ0KSByZXR1cm4gZmFsc2VcblxuICAgICAgaWYgKCFpdGVtLmNhdGVnb3JpZXM/Lmxlbmd0aCkgcmV0dXJuIHRydWVcblxuICAgICAgcmV0dXJuIGl0ZW0uY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjb3Vwb25DYXRlZ29yaWVzLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxuICAgIH0pXG5cbiAgICByZXR1cm4gaGFzQ2F0ZWdvcmllcz8ubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGNvdXBvbVVzZXJWYWxpZGF0aW9uKGNvdXBvbjogQ291cG9uLCB1c2VyOiBVc2VyKSB7XG4gICAgaWYgKCF1c2VyIHx8IGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BTExfVVNFUlMpKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgdXNlclR5cGVzOiBFeGNsdXNpdml0aWVzW10gPSBbXVxuXG4gICAgaWYgKFxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpICYmXG4gICAgICB0aGlzLmVtYWlsSXNGcm9tQ29sbGFib3JhdG9yKHVzZXIuZW1haWwudG9Mb2NhbGVMb3dlckNhc2UoKSlcbiAgICApXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpXG5cbiAgICBpZiAoXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUikgJiZcbiAgICAgIGNvdXBvbi51c2VyRXhjbHVzaXZlRW1haWwuaW5jbHVkZXModXNlci5lbWFpbC50b0xvY2FsZUxvd2VyQ2FzZSgpKVxuICAgIClcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUilcblxuICAgIGlmIChcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BQ1RJVkVfU1VCU0NSSUJFUikgJiZcbiAgICAgIHVzZXIuaXNTdWJzY3JpYmVyICYmXG4gICAgICB1c2VyLnN1YnNjcmlwdGlvblBsYW4gIT0gJydcbiAgICApXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkFDVElWRV9TVUJTQ1JJQkVSKVxuXG4gICAgaWYgKFxuICAgICAgdXNlci5pc1N1YnNjcmliZXIgJiZcbiAgICAgIHVzZXIuc3Vic2NyaXB0aW9uUGxhbiA9PSAnJyAmJlxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLklOQUNUSVZFX1NVQlNDUklCRVIpXG4gICAgKVxuICAgICAgdXNlclR5cGVzLnB1c2goRXhjbHVzaXZpdGllcy5JTkFDVElWRV9TVUJTQ1JJQkVSKVxuXG4gICAgaWYgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5OT05fU1VCU0NSSUJFUikgJiYgIXVzZXIuaXNTdWJzY3JpYmVyKVxuICAgICAgdXNlclR5cGVzLnB1c2goRXhjbHVzaXZpdGllcy5OT05fU1VCU0NSSUJFUilcblxuICAgIHJldHVybiBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLnNvbWUoKHIpID0+IHVzZXJUeXBlcy5pbmNsdWRlcyhyKSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10pOiBQcm9taXNlPEFycmF5PFN0cmluZz4+IHtcbiAgICBjb25zdCBjb3Vwb25DYXRlZ29yaWVzOiBBcnJheTxTdHJpbmc+ID0gW11cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcm9kdWN0c0NhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeTogQ2F0ZWdvcnkgJiB7IGZpcmVzdG9yZUlkPzogc3RyaW5nIH0gPSBhd2FpdCB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5jYXRlZ29yeVJlcG9zaXRvcnkuZ2V0KHtcbiAgICAgICAgaWQ6IHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5jYXRlZ29yeVJlcG9zaXRvcnkuZ2V0Q2hpbGRyZW4oXG4gICAgICAgICAgcGFyc2VJbnQocHJvZHVjdHNDYXRlZ29yaWVzW2luZGV4XSksXG4gICAgICAgIClcblxuICAgICAgICBjb3Vwb25DYXRlZ29yaWVzLnB1c2goY2F0ZWdvcnkuaWQsIC4uLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZC50b1N0cmluZygpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoY291cG9uQ2F0ZWdvcmllcyldXG4gIH1cblxuICBwcml2YXRlIGVtYWlsSXNGcm9tQ29sbGFib3JhdG9yID0gKHVzZXJFbWFpbDogc3RyaW5nKTogYm9vbGVhbiA9PiAhIXVzZXJFbWFpbD8ubWF0Y2goL0BiNGEuY29tLmJyL2cpXG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KFxuICAgIHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10sXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxuICApOiBQcm9taXNlPExpbmVJdGVtW10+IHtcbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBbXVxuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmdldENvdXBvbkNhdGVnb3JpZXNJZChwcm9kdWN0c0NhdGVnb3JpZXMpXG5cbiAgICBpZiAocHJvZHVjdHNDYXRlZ29yaWVzPy5sZW5ndGgpIHtcbiAgICAgIGxpbmVJdGVuc0Rpc2NvdW50ID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaXNHaWZ0KSByZXR1cm4gZmFsc2VcblxuICAgICAgICBpZiAoaXRlbS5jYXRlZ29yaWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5jYXRlZ29yaWVzLnNvbWUoKGMpID0+IGNvdXBvbkNhdGVnb3JpZXMuc29tZSgoY2F0KSA9PiBjYXQgPT0gYykpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZUl0ZW5zRGlzY291bnQgPSBjaGVja291dC5saW5lSXRlbXMuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc0dpZnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVJdGVuc0Rpc2NvdW50XG4gIH1cblxuICBwcml2YXRlIGNhbGNDaGVja291dFN1YnRvdGFsKGxpbmVJdGVuczogTGluZUl0ZW1bXSwgdXNlcjogVXNlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxpbmVJdGVuc1xuICAgICAgICA/LmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNHaWZ0KVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGN1cnIpID0+XG4gICAgICAgICAgICB1c2VyPy5pc1N1YnNjcmliZXIgJiYgY3Vyci5wcmljZT8uc3Vic2NyaWJlclByaWNlXG4gICAgICAgICAgICAgID8gYWNjICsgY3Vyci5wcmljZT8uc3Vic2NyaWJlclByaWNlICogY3Vyci5xdWFudGl0eVxuICAgICAgICAgICAgICA6IGFjYyArIGN1cnIucHJpY2VQYWlkICogY3Vyci5xdWFudGl0eSxcbiAgICAgICAgICAwLFxuICAgICAgICApIHx8IDBcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc1dpdGhDb3Vwb24oY291cG9uOiBDb3Vwb24pOiBQcm9taXNlPE9yZGVyW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUub3JkZXJSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICBjb3Vwb246IHsgaWQ6IGNvdXBvbi5pZCB9LFxuICAgICAgICAgIHN0YXR1czogeyBvcGVyYXRvcjogV2hlcmUuTk9URVFVQUxTLCB2YWx1ZTogT3JkZXJTdGF0dXMuQ0FOQ0VMQURPIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc0Zyb21Vc2VyKGVtYWlsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUub3JkZXJSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICB1c2VyOiB7IGVtYWlsOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiBlbWFpbCB9IH0sXG4gICAgICAgICAgc3RhdHVzOiB7IG9wZXJhdG9yOiBXaGVyZS5OT1RFUVVBTFMsIHZhbHVlOiBPcmRlclN0YXR1cy5DQU5DRUxBRE8gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiByZXN1bHQuZGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgY291bnRPcmRlcnNXaXRoVXNlcihvcmRlcnM6IE9yZGVyW10sIGVtYWlsOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBvcmRlcnMuZmlsdGVyKChvKSA9PiBvLnVzZXIuZW1haWwgPT0gZW1haWwpLmxlbmd0aFxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3Vwb25Vc2VMaW1pdHMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcywgdXNlcjogVXNlcikge1xuICAgIGxldCBjb3Vwb25Vc2VMaW1pdHM6IHsgdW5saW1pdGVkPzogYm9vbGVhbjsgdG90YWw/OiBudW1iZXI7IGxpbWl0ZWRQZXJVc2VyPzogYm9vbGVhbjsgZmlyc3RPcmRlcj86IGJvb2xlYW4gfVxuXG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkVDT01NRVJDRSB8fCBjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5BTEwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuYXQoMCkgPT09IEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUiB8fFxuICAgICAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuYXQoMCkgPT09IEV4Y2x1c2l2aXRpZXMuQ09MTEFCT1JBVE9SUylcbiAgICAgIClcbiAgICAgICAgY291cG9uVXNlTGltaXRzID0gY291cG9uLnVzZUxpbWl0cy5ub25fc3Vic2NyaWJlclxuICAgICAgZWxzZSBjb3Vwb25Vc2VMaW1pdHMgPSB1c2VyPy5pc1N1YnNjcmliZXIgPyBjb3Vwb24udXNlTGltaXRzLnN1YnNjcmliZXIgOiBjb3Vwb24udXNlTGltaXRzLm5vbl9zdWJzY3JpYmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdXBvblVzZUxpbWl0cyA9IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaXB0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdXBvblVzZUxpbWl0c1xuICB9XG59XG4iXX0=
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { OrderFirestoreRepository, OrderStatus, ProductReview, Where, } from '@infrab4a/connect';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@infrab4a/connect";
|
|
5
|
-
export class OrderProductReviewService {
|
|
6
|
-
constructor(orderRepository, productReviewRepository, variantRepository) {
|
|
7
|
-
this.orderRepository = orderRepository;
|
|
8
|
-
this.productReviewRepository = productReviewRepository;
|
|
9
|
-
this.variantRepository = variantRepository;
|
|
10
|
-
}
|
|
11
|
-
async getPendingReviewsByEmail(email) {
|
|
12
|
-
const products = [];
|
|
13
|
-
const orders = await this.getOrdersByEmail(email);
|
|
14
|
-
if (orders.length) {
|
|
15
|
-
for (const order of orders) {
|
|
16
|
-
const lineItems = order.lineItems.filter((item) => !item.isGift);
|
|
17
|
-
for (const item of lineItems) {
|
|
18
|
-
const productReview = await this.getProductReview(order, item);
|
|
19
|
-
if (productReview?.status != null)
|
|
20
|
-
continue;
|
|
21
|
-
products.push(this.buildProductReview(order, item, productReview));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return products;
|
|
26
|
-
}
|
|
27
|
-
async getOrdersByEmail(email) {
|
|
28
|
-
const { data: orders } = await this.orderRepository.find({
|
|
29
|
-
filters: {
|
|
30
|
-
user: {
|
|
31
|
-
email: email,
|
|
32
|
-
},
|
|
33
|
-
status: OrderStatus.ENTREGUE,
|
|
34
|
-
createdAt: {
|
|
35
|
-
operator: Where.GTE,
|
|
36
|
-
value: new Date(2024, 0, 0, 0, 0, 0).getTime(),
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
orderBy: {
|
|
40
|
-
createdAt: 'desc',
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
return orders;
|
|
44
|
-
}
|
|
45
|
-
async getProductReview(order, item) {
|
|
46
|
-
const products = [item.id];
|
|
47
|
-
const isVariant = await this.variantRepository
|
|
48
|
-
.find({
|
|
49
|
-
filters: {
|
|
50
|
-
id: item.id,
|
|
51
|
-
},
|
|
52
|
-
})
|
|
53
|
-
.then((res) => res.data.at(0));
|
|
54
|
-
if (isVariant)
|
|
55
|
-
products.push(isVariant.productId);
|
|
56
|
-
const productReview = await this.productReviewRepository
|
|
57
|
-
.find({
|
|
58
|
-
filters: {
|
|
59
|
-
orderId: { operator: Where.IN, value: [order.id, order.orderNumber].filter(Boolean) },
|
|
60
|
-
productId: { operator: Where.IN, value: products },
|
|
61
|
-
},
|
|
62
|
-
})
|
|
63
|
-
.then((res) => res.data.at(0));
|
|
64
|
-
return productReview;
|
|
65
|
-
}
|
|
66
|
-
buildProductReview(order, item, review) {
|
|
67
|
-
return {
|
|
68
|
-
id: item.id,
|
|
69
|
-
orderId: order.id,
|
|
70
|
-
orderNumber: order.orderNumber,
|
|
71
|
-
isEdition: false,
|
|
72
|
-
name: item.name,
|
|
73
|
-
image: item.image,
|
|
74
|
-
deliveryDate: order.deliveredAt || null,
|
|
75
|
-
evaluationInAnalysis: review ? true : false,
|
|
76
|
-
rating: review ? review.rate : null,
|
|
77
|
-
shopProductSlug: item.slug,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
async createReview(review) {
|
|
81
|
-
return this.productReviewRepository.create(ProductReview.toInstance({
|
|
82
|
-
productId: review.productId.toString(),
|
|
83
|
-
shop: review.shop,
|
|
84
|
-
rate: review.rate,
|
|
85
|
-
author: review.author,
|
|
86
|
-
email: review.email,
|
|
87
|
-
location: review.location,
|
|
88
|
-
review: review.comment,
|
|
89
|
-
title: review.title,
|
|
90
|
-
personId: review.personId,
|
|
91
|
-
points: review.points,
|
|
92
|
-
orderId: review.orderId,
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrderProductReviewService, deps: [{ token: 'OrderRepository' }, { token: 'ProductReviewRepository' }, { token: 'VariantRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
96
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrderProductReviewService }); }
|
|
97
|
-
}
|
|
98
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrderProductReviewService, decorators: [{
|
|
99
|
-
type: Injectable
|
|
100
|
-
}], ctorParameters: () => [{ type: i1.OrderFirestoreRepository, decorators: [{
|
|
101
|
-
type: Inject,
|
|
102
|
-
args: ['OrderRepository']
|
|
103
|
-
}] }, { type: undefined, decorators: [{
|
|
104
|
-
type: Inject,
|
|
105
|
-
args: ['ProductReviewRepository']
|
|
106
|
-
}] }, { type: undefined, decorators: [{
|
|
107
|
-
type: Inject,
|
|
108
|
-
args: ['VariantRepository']
|
|
109
|
-
}] }] });
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcHJvZHVjdC1yZXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvb3JkZXItcHJvZHVjdC1yZXZpZXcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBR0wsd0JBQXdCLEVBQ3hCLFdBQVcsRUFDWCxhQUFhLEVBR2IsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7OztBQUsxQixNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLFlBQzhDLGVBQXlDLEVBQ2pDLHVCQUFnRCxFQUN0RCxpQkFBb0M7UUFGdEMsb0JBQWUsR0FBZixlQUFlLENBQTBCO1FBQ2pDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDdEQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtJQUNqRixDQUFDO0lBRUosS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQWE7UUFDMUMsTUFBTSxRQUFRLEdBQTJCLEVBQUUsQ0FBQTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVqRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBRWhFLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQzdCLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJ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RSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQzNCLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUEyQjtRQUM1QyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQ3hDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDdkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1lBQ3RDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztTQUN4QixDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7K0dBdEdVLHlCQUF5QixrQkFFMUIsaUJBQWlCLGFBQ2pCLHlCQUF5QixhQUN6QixtQkFBbUI7bUhBSmxCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVTs7MEJBR04sTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQ2hDLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIExpbmVJdGVtLFxuICBPcmRlcixcbiAgT3JkZXJGaXJlc3RvcmVSZXBvc2l0b3J5LFxuICBPcmRlclN0YXR1cyxcbiAgUHJvZHVjdFJldmlldyxcbiAgUHJvZHVjdFJldmlld1JlcG9zaXRvcnksXG4gIFZhcmlhbnRSZXBvc2l0b3J5LFxuICBXaGVyZSxcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5cbmltcG9ydCB7IFBlbmRpbmdQcm9kdWN0UmV2aWV3LCBQcm9kdWN0UmV2aWV3Q3JlYXRlIH0gZnJvbSAnLi90eXBlcydcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9yZGVyUHJvZHVjdFJldmlld1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdPcmRlclJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IG9yZGVyUmVwb3NpdG9yeTogT3JkZXJGaXJlc3RvcmVSZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoJ1Byb2R1Y3RSZXZpZXdSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0UmV2aWV3UmVwb3NpdG9yeTogUHJvZHVjdFJldmlld1JlcG9zaXRvcnksXG4gICAgQEluamVjdCgnVmFyaWFudFJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IHZhcmlhbnRSZXBvc2l0b3J5OiBWYXJpYW50UmVwb3NpdG9yeSxcbiAgKSB7fVxuXG4gIGFzeW5jIGdldFBlbmRpbmdSZXZpZXdzQnlFbWFpbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxQZW5kaW5nUHJvZHVjdFJldmlld1tdPiB7XG4gICAgY29uc3QgcHJvZHVjdHM6IFBlbmRpbmdQcm9kdWN0UmV2aWV3W10gPSBbXVxuICAgIGNvbnN0IG9yZGVycyA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzQnlFbWFpbChlbWFpbClcblxuICAgIGlmIChvcmRlcnMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IG9yZGVyIG9mIG9yZGVycykge1xuICAgICAgICBjb25zdCBsaW5lSXRlbXMgPSBvcmRlci5saW5lSXRlbXMuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc0dpZnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpbmVJdGVtcykge1xuICAgICAgICAgIGNvbnN0IHByb2R1Y3RSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFByb2R1Y3RSZXZpZXcob3JkZXIsIGl0ZW0pXG5cbiAgICAgICAgICBpZiAocHJvZHVjdFJldmlldz8uc3RhdHVzICE9IG51bGwpIGNvbnRpbnVlXG5cbiAgICAgICAgICBwcm9kdWN0cy5wdXNoKHRoaXMuYnVpbGRQcm9kdWN0UmV2aWV3KG9yZGVyLCBpdGVtLCBwcm9kdWN0UmV2aWV3KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9kdWN0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPcmRlcnNCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPE9yZGVyW10+IHtcbiAgICBjb25zdCB7IGRhdGE6IG9yZGVycyB9ID0gYXdhaXQgdGhpcy5vcmRlclJlcG9zaXRvcnkuZmluZCh7XG4gICAgICBmaWx0ZXJzOiB7XG4gICAgICAgIHVzZXI6IHtcbiAgICAgICAgICBlbWFpbDogZW1haWwsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogT3JkZXJTdGF0dXMuRU5UUkVHVUUsXG4gICAgICAgIGNyZWF0ZWRBdDoge1xuICAgICAgICAgIG9wZXJhdG9yOiBXaGVyZS5HVEUsXG4gICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKDIwMjQsIDAsIDAsIDAsIDAsIDApLmdldFRpbWUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcmRlckJ5OiB7XG4gICAgICAgIGNyZWF0ZWRBdDogJ2Rlc2MnLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIG9yZGVyc1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQcm9kdWN0UmV2aWV3KG9yZGVyOiBPcmRlciwgaXRlbTogTGluZUl0ZW0pIHtcbiAgICBjb25zdCBwcm9kdWN0czogc3RyaW5nW10gPSBbaXRlbS5pZF1cbiAgICBjb25zdCBpc1ZhcmlhbnQgPSBhd2FpdCB0aGlzLnZhcmlhbnRSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YS5hdCgwKSlcblxuICAgIGlmIChpc1ZhcmlhbnQpIHByb2R1Y3RzLnB1c2goaXNWYXJpYW50LnByb2R1Y3RJZClcbiAgICBjb25zdCBwcm9kdWN0UmV2aWV3ID0gYXdhaXQgdGhpcy5wcm9kdWN0UmV2aWV3UmVwb3NpdG9yeVxuICAgICAgLmZpbmQoe1xuICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgb3JkZXJJZDogeyBvcGVyYXRvcjogV2hlcmUuSU4sIHZhbHVlOiBbb3JkZXIuaWQsIG9yZGVyLm9yZGVyTnVtYmVyXS5maWx0ZXIoQm9vbGVhbikgfSxcbiAgICAgICAgICBwcm9kdWN0SWQ6IHsgb3BlcmF0b3I6IFdoZXJlLklOLCB2YWx1ZTogcHJvZHVjdHMgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YS5hdCgwKSlcblxuICAgIHJldHVybiBwcm9kdWN0UmV2aWV3XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUHJvZHVjdFJldmlldyhvcmRlcjogT3JkZXIsIGl0ZW06IExpbmVJdGVtLCByZXZpZXc6IFByb2R1Y3RSZXZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICBvcmRlcklkOiBvcmRlci5pZCxcbiAgICAgIG9yZGVyTnVtYmVyOiBvcmRlci5vcmRlck51bWJlcixcbiAgICAgIGlzRWRpdGlvbjogZmFsc2UsXG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICBpbWFnZTogaXRlbS5pbWFnZSxcbiAgICAgIGRlbGl2ZXJ5RGF0ZTogb3JkZXIuZGVsaXZlcmVkQXQgfHwgbnVsbCxcbiAgICAgIGV2YWx1YXRpb25JbkFuYWx5c2lzOiByZXZpZXcgPyB0cnVlIDogZmFsc2UsXG4gICAgICByYXRpbmc6IHJldmlldyA/IHJldmlldy5yYXRlIDogbnVsbCxcbiAgICAgIHNob3BQcm9kdWN0U2x1ZzogaXRlbS5zbHVnLFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJldmlldyhyZXZpZXc6IFByb2R1Y3RSZXZpZXdDcmVhdGUpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0UmV2aWV3UmVwb3NpdG9yeS5jcmVhdGUoXG4gICAgICBQcm9kdWN0UmV2aWV3LnRvSW5zdGFuY2Uoe1xuICAgICAgICBwcm9kdWN0SWQ6IHJldmlldy5wcm9kdWN0SWQudG9TdHJpbmcoKSxcbiAgICAgICAgc2hvcDogcmV2aWV3LnNob3AsXG4gICAgICAgIHJhdGU6IHJldmlldy5yYXRlLFxuICAgICAgICBhdXRob3I6IHJldmlldy5hdXRob3IsXG4gICAgICAgIGVtYWlsOiByZXZpZXcuZW1haWwsXG4gICAgICAgIGxvY2F0aW9uOiByZXZpZXcubG9jYXRpb24sXG4gICAgICAgIHJldmlldzogcmV2aWV3LmNvbW1lbnQsXG4gICAgICAgIHRpdGxlOiByZXZpZXcudGl0bGUsXG4gICAgICAgIHBlcnNvbklkOiByZXZpZXcucGVyc29uSWQsXG4gICAgICAgIHBvaW50czogcmV2aWV3LnBvaW50cyxcbiAgICAgICAgb3JkZXJJZDogcmV2aWV3Lm9yZGVySWQsXG4gICAgICB9KSxcbiAgICApXG4gIH1cbn1cbiJdfQ==
|