@infrab4a/connect-angular 5.4.0-beta.1 → 5.5.0-alpha.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 -36
- package/angular-elastic-search.module.d.ts +9 -9
- package/angular-firebase-auth.module.d.ts +11 -11
- package/angular-firestore.module.d.ts +17 -17
- 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 -291
- package/esm2020/angular-elastic-search.module.mjs +34 -34
- package/esm2020/angular-firebase-auth.module.mjs +141 -141
- package/esm2020/angular-firestore.module.mjs +541 -541
- package/esm2020/angular-hasura-graphql.module.mjs +333 -333
- package/esm2020/angular-vertex-search.module.mjs +34 -34
- package/esm2020/consts/backend-url.const.mjs +2 -2
- package/esm2020/consts/category-structure.mjs +2 -2
- package/esm2020/consts/default-shop.const.mjs +2 -2
- package/esm2020/consts/es-config.const.mjs +2 -2
- package/esm2020/consts/firebase-const.mjs +5 -5
- package/esm2020/consts/hasura-options.const.mjs +2 -2
- package/esm2020/consts/index.mjs +9 -9
- package/esm2020/consts/persistence.const.mjs +2 -2
- package/esm2020/consts/storage-base-url.const.mjs +2 -2
- package/esm2020/consts/vertex-config.const.mjs +2 -2
- package/esm2020/helpers/index.mjs +2 -2
- package/esm2020/helpers/mobile-operation-system-checker.helper.mjs +7 -7
- package/esm2020/index.mjs +7 -7
- package/esm2020/infrab4a-connect-angular.mjs +4 -4
- package/esm2020/interfaces/catalog-strategies.interface.mjs +2 -2
- package/esm2020/interfaces/category-facades.interface.mjs +2 -2
- package/esm2020/interfaces/index.mjs +3 -3
- package/esm2020/persistence/cookie-data-persistence.mjs +22 -22
- package/esm2020/persistence/data-persistence.mjs +2 -2
- package/esm2020/persistence/index.mjs +3 -3
- package/esm2020/services/auth.service.mjs +37 -37
- package/esm2020/services/cart/cart-services.facade.mjs +21 -21
- package/esm2020/services/cart/index.mjs +2 -2
- package/esm2020/services/cart.service.mjs +73 -73
- package/esm2020/services/catalog/adapters/category-structure.adapter.mjs +2 -2
- package/esm2020/services/catalog/adapters/index.mjs +4 -4
- package/esm2020/services/catalog/adapters/new-category-structure.adapter.mjs +43 -43
- package/esm2020/services/catalog/adapters/old-category-structure.adapter.mjs +23 -23
- package/esm2020/services/catalog/catalog.service.mjs +111 -111
- package/esm2020/services/catalog/category.service.mjs +39 -39
- package/esm2020/services/catalog/context/catalog-search.context.mjs +40 -40
- package/esm2020/services/catalog/enums/index.mjs +2 -2
- package/esm2020/services/catalog/enums/product-sorts.enum.mjs +11 -11
- package/esm2020/services/catalog/facades/catalog-service.facade.mjs +32 -32
- package/esm2020/services/catalog/facades/catalog-strategies.facade.mjs +17 -17
- package/esm2020/services/catalog/facades/category-repository.facade.mjs +20 -20
- package/esm2020/services/catalog/facades/category-service.facade.mjs +30 -30
- package/esm2020/services/catalog/facades/index.mjs +6 -6
- package/esm2020/services/catalog/facades/product-catalog.facade.mjs +21 -21
- package/esm2020/services/catalog/helpers/brand-manager.helper.mjs +57 -57
- package/esm2020/services/catalog/helpers/catalog-filter.helper.mjs +44 -44
- package/esm2020/services/catalog/helpers/catalog-sort.helper.mjs +52 -52
- package/esm2020/services/catalog/helpers/index.mjs +5 -5
- package/esm2020/services/catalog/helpers/product-fields.helper.mjs +40 -39
- package/esm2020/services/catalog/index.mjs +8 -8
- package/esm2020/services/catalog/models/category-with-tree.model.mjs +10 -10
- package/esm2020/services/catalog/models/index.mjs +2 -2
- package/esm2020/services/catalog/services/catalog-helpers.service.mjs +33 -33
- package/esm2020/services/catalog/services/catalog-operations.facade.mjs +26 -26
- package/esm2020/services/catalog/services/catalog-repository.service.mjs +25 -25
- package/esm2020/services/catalog/services/index.mjs +5 -5
- package/esm2020/services/catalog/services/product-management.facade.mjs +25 -25
- package/esm2020/services/catalog/strategies/category-search.strategy.mjs +133 -133
- package/esm2020/services/catalog/strategies/index.mjs +4 -4
- package/esm2020/services/catalog/strategies/profile-search.strategy.mjs +42 -42
- package/esm2020/services/catalog/strategies/term-search.strategy.mjs +123 -123
- package/esm2020/services/catalog/strategies/types/strategy-params.type.mjs +2 -2
- package/esm2020/services/catalog/types/fetch-products-options.type.mjs +2 -2
- package/esm2020/services/catalog/types/fetch-products-params.type.mjs +2 -2
- package/esm2020/services/catalog/types/fetch-products-response.type.mjs +2 -2
- package/esm2020/services/catalog/types/index.mjs +6 -6
- package/esm2020/services/catalog/types/method-params.type.mjs +2 -2
- package/esm2020/services/catalog/types/product-sort.type.mjs +2 -2
- package/esm2020/services/catalog/wishlist.service.mjs +254 -254
- package/esm2020/services/checkout/checkout-dependencies.facade.mjs +20 -20
- package/esm2020/services/checkout/checkout-repositories.facade.mjs +20 -20
- package/esm2020/services/checkout/index.mjs +3 -3
- package/esm2020/services/checkout-subscription.service.mjs +55 -55
- package/esm2020/services/checkout.service.mjs +106 -106
- package/esm2020/services/coupon/coupon-repositories.facade.mjs +24 -24
- package/esm2020/services/coupon/index.mjs +2 -2
- package/esm2020/services/coupon/types/coupon-params.type.mjs +2 -2
- package/esm2020/services/coupon.service.mjs +248 -248
- package/esm2020/services/helpers/index.mjs +2 -2
- package/esm2020/services/helpers/util.helper.mjs +18 -18
- package/esm2020/services/home-shop/home-shop-repositories.facade.mjs +24 -24
- package/esm2020/services/home-shop/index.mjs +2 -2
- package/esm2020/services/home-shop.service.mjs +119 -119
- package/esm2020/services/index.mjs +11 -11
- package/esm2020/services/order-product-review.service.mjs +110 -65
- package/esm2020/services/order.service.mjs +30 -30
- package/esm2020/services/shared/configuration.facade.mjs +29 -29
- package/esm2020/services/shared/index.mjs +2 -2
- package/esm2020/services/types/index.mjs +5 -4
- package/esm2020/services/types/pending-product-review.type.mjs +2 -2
- package/esm2020/services/types/product-review-create.type.mjs +2 -0
- package/esm2020/services/types/required-checkout-data.type.mjs +2 -2
- package/esm2020/services/types/required-checkout-subscription-data.type.mjs +2 -2
- package/esm2020/types/firebase-app-config.type.mjs +2 -2
- package/esm2020/types/index.mjs +2 -2
- package/fesm2015/infrab4a-connect-angular.mjs +3349 -3297
- package/fesm2015/infrab4a-connect-angular.mjs.map +1 -1
- package/fesm2020/infrab4a-connect-angular.mjs +3245 -3199
- package/fesm2020/infrab4a-connect-angular.mjs.map +1 -1
- 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 +2 -2
- 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 +22 -22
- 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 -12
- 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 -3
- package/services/types/pending-product-review.type.d.ts +12 -9
- package/services/types/product-review-create.type.d.ts +14 -0
- 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
|
@@ -1,254 +1,254 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { PersonTypes, Shops, Wishlist, WishlistLogType, } from '@infrab4a/connect';
|
|
3
|
-
import { DEFAULT_SHOP } from '../../consts';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@infrab4a/connect";
|
|
6
|
-
export class WishlistService {
|
|
7
|
-
constructor(wishlistRepository, productRepository, logRepository, shop) {
|
|
8
|
-
this.wishlistRepository = wishlistRepository;
|
|
9
|
-
this.productRepository = productRepository;
|
|
10
|
-
this.logRepository = logRepository;
|
|
11
|
-
this.shop = shop;
|
|
12
|
-
}
|
|
13
|
-
initializeServices(catalogServiceFacade, categoryServiceFacade) {
|
|
14
|
-
this.catalogService = catalogServiceFacade.getCatalogService();
|
|
15
|
-
this.categoryService = categoryServiceFacade.getCategoryService();
|
|
16
|
-
}
|
|
17
|
-
getCatalogService() {
|
|
18
|
-
return this.catalogService;
|
|
19
|
-
}
|
|
20
|
-
getCategoryService() {
|
|
21
|
-
return this.categoryService;
|
|
22
|
-
}
|
|
23
|
-
async create({ personId, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
|
|
24
|
-
const wishlistData = this.buildWishlistData({
|
|
25
|
-
title,
|
|
26
|
-
description,
|
|
27
|
-
published,
|
|
28
|
-
userFullName,
|
|
29
|
-
userPhoto,
|
|
30
|
-
theme,
|
|
31
|
-
bannerUrl,
|
|
32
|
-
personType,
|
|
33
|
-
personIsSubscriber,
|
|
34
|
-
personId,
|
|
35
|
-
});
|
|
36
|
-
const existingWishlist = await this.findExistingWishlistByPersonId(personId);
|
|
37
|
-
await this.createWishlistLog(WishlistLogType.CREATE, wishlistData);
|
|
38
|
-
if (existingWishlist)
|
|
39
|
-
return existingWishlist;
|
|
40
|
-
return this.createNewWishlist(wishlistData);
|
|
41
|
-
}
|
|
42
|
-
buildWishlistData({ title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, personId, }) {
|
|
43
|
-
return {
|
|
44
|
-
slug: '',
|
|
45
|
-
name: title,
|
|
46
|
-
description,
|
|
47
|
-
metadatas: [
|
|
48
|
-
{
|
|
49
|
-
shop: this.shop,
|
|
50
|
-
title: `${userFullName} - ${title}`,
|
|
51
|
-
description: `${userFullName} - ${description}`,
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
shop: this.shop,
|
|
55
|
-
shops: [this.shop],
|
|
56
|
-
personId,
|
|
57
|
-
personName: userFullName,
|
|
58
|
-
personPhoto: userPhoto,
|
|
59
|
-
brandCategory: false,
|
|
60
|
-
published,
|
|
61
|
-
theme,
|
|
62
|
-
bannerUrl,
|
|
63
|
-
personType: personType ?? PersonTypes.NONE,
|
|
64
|
-
personIsSubscriber: personIsSubscriber ?? false,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
async findExistingWishlistByPersonId(personId) {
|
|
68
|
-
const hasWishlist = await this.wishlistRepository
|
|
69
|
-
.find({
|
|
70
|
-
filters: {
|
|
71
|
-
personId,
|
|
72
|
-
},
|
|
73
|
-
options: {
|
|
74
|
-
enableCount: false,
|
|
75
|
-
},
|
|
76
|
-
orderBy: {
|
|
77
|
-
id: 'asc',
|
|
78
|
-
},
|
|
79
|
-
})
|
|
80
|
-
.then((res) => res.data);
|
|
81
|
-
return hasWishlist.length ? hasWishlist.at(0) : null;
|
|
82
|
-
}
|
|
83
|
-
async createNewWishlist(data) {
|
|
84
|
-
const newWishlist = await this.wishlistRepository.create(data);
|
|
85
|
-
await this.wishlistRepository.update({ id: newWishlist.id, slug: newWishlist.id });
|
|
86
|
-
return Wishlist.toInstance({ ...newWishlist.toPlain(), slug: newWishlist.id });
|
|
87
|
-
}
|
|
88
|
-
async update({ id, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
|
|
89
|
-
const data = {
|
|
90
|
-
id,
|
|
91
|
-
name: title,
|
|
92
|
-
description,
|
|
93
|
-
published,
|
|
94
|
-
metadatas: [
|
|
95
|
-
{
|
|
96
|
-
shop: this.shop,
|
|
97
|
-
title: `${userFullName} - ${title}`,
|
|
98
|
-
description: `${userFullName} - ${description}`,
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
personName: userFullName,
|
|
102
|
-
personPhoto: userPhoto,
|
|
103
|
-
theme,
|
|
104
|
-
bannerUrl,
|
|
105
|
-
personType: personType ?? PersonTypes.NONE,
|
|
106
|
-
personIsSubscriber: personIsSubscriber ?? false,
|
|
107
|
-
};
|
|
108
|
-
await this.createWishlistLog(WishlistLogType.UPDATE, data);
|
|
109
|
-
return this.wishlistRepository.update(data);
|
|
110
|
-
}
|
|
111
|
-
async delete(wishlistId) {
|
|
112
|
-
const wishlist = await this.findById(wishlistId);
|
|
113
|
-
await this.createWishlistLog(WishlistLogType.DELETE, wishlist);
|
|
114
|
-
return this.wishlistRepository.delete({ id: wishlistId });
|
|
115
|
-
}
|
|
116
|
-
getWishlistBySlug(slug) {
|
|
117
|
-
const [id] = slug.split('-');
|
|
118
|
-
if (+id)
|
|
119
|
-
return this.wishlistRepository.get({ id });
|
|
120
|
-
return this.wishlistRepository.getWishlistBySlug(slug);
|
|
121
|
-
}
|
|
122
|
-
getWishlistsByPerson(personId) {
|
|
123
|
-
return this.wishlistRepository.getWishlistByPerson(personId);
|
|
124
|
-
}
|
|
125
|
-
async addProduct(wishlistId, productId) {
|
|
126
|
-
const wishlist = await this.wishlistRepository.get({ id: wishlistId });
|
|
127
|
-
const hasProduct = wishlist.products.some((p) => p == productId);
|
|
128
|
-
const wishlistData = await this.findById(wishlistId);
|
|
129
|
-
const productData = await this.findProductById(productId);
|
|
130
|
-
await this.createWishlistLog(WishlistLogType.ADD_PRODUCT, wishlistData, productData);
|
|
131
|
-
if (!hasProduct) {
|
|
132
|
-
wishlist.products = [...wishlist.products, productId];
|
|
133
|
-
await this.wishlistRepository.addProduct(wishlistId, productId);
|
|
134
|
-
}
|
|
135
|
-
return wishlist;
|
|
136
|
-
}
|
|
137
|
-
async removeProduct(wishlistId, productId) {
|
|
138
|
-
const wishlist = await this.wishlistRepository.get({ id: wishlistId });
|
|
139
|
-
const productIndex = wishlist.products.findIndex((p) => p == productId);
|
|
140
|
-
if (productIndex != -1) {
|
|
141
|
-
wishlist.products.splice(productIndex, 1);
|
|
142
|
-
const wishlistData = await this.findById(wishlistId);
|
|
143
|
-
const productData = await this.findProductById(productId);
|
|
144
|
-
await this.createWishlistLog(WishlistLogType.REMOVE_PRODUCT, wishlistData, productData);
|
|
145
|
-
await this.wishlistRepository.removeProduct(wishlistId, productId);
|
|
146
|
-
}
|
|
147
|
-
return wishlist;
|
|
148
|
-
}
|
|
149
|
-
async findById(id) {
|
|
150
|
-
return this.wishlistRepository
|
|
151
|
-
.find({
|
|
152
|
-
fields: ['id', 'name', 'description', 'personId', 'personIsSubscriber', 'personType', 'personName'],
|
|
153
|
-
filters: {
|
|
154
|
-
id,
|
|
155
|
-
},
|
|
156
|
-
})
|
|
157
|
-
.then((res) => res.data.at(0));
|
|
158
|
-
}
|
|
159
|
-
async findProductById(id) {
|
|
160
|
-
return this.productRepository
|
|
161
|
-
.find({
|
|
162
|
-
fields: ['id', 'sku', 'EAN', 'name', 'brand'],
|
|
163
|
-
filters: {
|
|
164
|
-
id,
|
|
165
|
-
},
|
|
166
|
-
})
|
|
167
|
-
.then((res) => res.data.at(0));
|
|
168
|
-
}
|
|
169
|
-
async createWishlistLog(type, wishlist, product) {
|
|
170
|
-
switch (type) {
|
|
171
|
-
case WishlistLogType.CREATE:
|
|
172
|
-
case WishlistLogType.UPDATE:
|
|
173
|
-
case WishlistLogType.DELETE:
|
|
174
|
-
await this.createWishlistOperationLog(type, wishlist);
|
|
175
|
-
break;
|
|
176
|
-
case WishlistLogType.ADD_PRODUCT:
|
|
177
|
-
case WishlistLogType.REMOVE_PRODUCT:
|
|
178
|
-
await this.createWishlistProductLog(type, wishlist, product);
|
|
179
|
-
break;
|
|
180
|
-
default:
|
|
181
|
-
break;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
async createWishlistOperationLog(type, wishlist) {
|
|
185
|
-
const operation = this.getOperationTypeFromWishlistLogType(type);
|
|
186
|
-
await this.logRepository.create({
|
|
187
|
-
collection: 'wishlist',
|
|
188
|
-
date: new Date(),
|
|
189
|
-
operation,
|
|
190
|
-
documentId: wishlist.id,
|
|
191
|
-
document: this.buildWishlistLogDocument(wishlist, type),
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
async createWishlistProductLog(type, wishlist, product) {
|
|
195
|
-
await this.logRepository.create({
|
|
196
|
-
collection: 'wishlist',
|
|
197
|
-
date: new Date(),
|
|
198
|
-
operation: 'UPDATE',
|
|
199
|
-
documentId: wishlist.id,
|
|
200
|
-
document: {
|
|
201
|
-
...this.buildWishlistLogDocument(wishlist, type),
|
|
202
|
-
...this.buildProductLogData(product),
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
getOperationTypeFromWishlistLogType(type) {
|
|
207
|
-
if (type === WishlistLogType.CREATE)
|
|
208
|
-
return 'CREATE';
|
|
209
|
-
if (type === WishlistLogType.UPDATE)
|
|
210
|
-
return 'UPDATE';
|
|
211
|
-
return 'DELETE';
|
|
212
|
-
}
|
|
213
|
-
buildWishlistLogDocument(wishlist, type) {
|
|
214
|
-
return {
|
|
215
|
-
id: wishlist.id,
|
|
216
|
-
shop: this.shop,
|
|
217
|
-
name: wishlist.name,
|
|
218
|
-
description: wishlist.description,
|
|
219
|
-
published: wishlist.published,
|
|
220
|
-
type: type,
|
|
221
|
-
personType: wishlist.personType,
|
|
222
|
-
personId: wishlist.personId,
|
|
223
|
-
personName: wishlist.personName,
|
|
224
|
-
personIsSubscriber: wishlist.personIsSubscriber,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
buildProductLogData(product) {
|
|
228
|
-
return {
|
|
229
|
-
productId: product.id,
|
|
230
|
-
productEAN: product.EAN,
|
|
231
|
-
productSKU: product.sku,
|
|
232
|
-
productName: product.name,
|
|
233
|
-
productBrand: product.brand,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
WishlistService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService, deps: [{ token: 'WishlistRepository' }, { token: 'ProductRepository' }, { token: 'LogRepository' }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
238
|
-
WishlistService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService });
|
|
239
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService, decorators: [{
|
|
240
|
-
type: Injectable
|
|
241
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
242
|
-
type: Inject,
|
|
243
|
-
args: ['WishlistRepository']
|
|
244
|
-
}] }, { type: undefined, decorators: [{
|
|
245
|
-
type: Inject,
|
|
246
|
-
args: ['ProductRepository']
|
|
247
|
-
}] }, { type: undefined, decorators: [{
|
|
248
|
-
type: Inject,
|
|
249
|
-
args: ['LogRepository']
|
|
250
|
-
}] }, { type: i1.Shops, decorators: [{
|
|
251
|
-
type: Inject,
|
|
252
|
-
args: [DEFAULT_SHOP]
|
|
253
|
-
}] }]; } });
|
|
254
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lzaGxpc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvY2F0YWxvZy93aXNobGlzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFHTCxXQUFXLEVBR1gsS0FBSyxFQUNMLFFBQVEsRUFDUixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUE7QUFFMUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTs7O0FBTzNDLE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ2lELGtCQUFzQyxFQUN2QyxpQkFBb0MsRUFDeEMsYUFBNEIsRUFDL0IsSUFBVztRQUhILHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMvQixTQUFJLEdBQUosSUFBSSxDQUFPO0lBQ2pELENBQUM7SUFFSixrQkFBa0IsQ0FBQyxvQkFBMEMsRUFBRSxxQkFBNEM7UUFDekcsSUFBSSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzlELElBQUksQ0FBQyxlQUFlLEdBQUcscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFBO0lBQzVCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFBO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1Qs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QUFJLEVBQUUsSUFBSTtZQUNWLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtZQUMvQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7U0FDaEQsQ0FBQTtJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFnQjtRQUMxQyxPQUFPO1lBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3JCLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRztZQUN2QixVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDdkIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3pCLFlBQVksRUFBRSxPQUFPLENBQUMsS0FBSztTQUM1QixDQUFBO0lBQ0gsQ0FBQzs7NEdBcFZVLGVBQWUsa0JBS2hCLG9CQUFvQixhQUNwQixtQkFBbUIsYUFDbkIsZUFBZSxhQUNmLFlBQVk7Z0hBUlgsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVOzswQkFNTixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQzNCLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsTUFBTTsyQkFBQyxlQUFlOzswQkFDdEIsTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBMb2dSZXBvc2l0b3J5LFxyXG4gIFBlcnNvblR5cGUsXHJcbiAgUGVyc29uVHlwZXMsXHJcbiAgUHJvZHVjdCxcclxuICBQcm9kdWN0UmVwb3NpdG9yeSxcclxuICBTaG9wcyxcclxuICBXaXNobGlzdCxcclxuICBXaXNobGlzdExvZ1R5cGUsXHJcbiAgV2lzaGxpc3RSZXBvc2l0b3J5LFxyXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xyXG5cclxuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vLi4vY29uc3RzJ1xyXG5cclxuaW1wb3J0IHsgQ2F0YWxvZ1NlcnZpY2UgfSBmcm9tICcuL2NhdGFsb2cuc2VydmljZSdcclxuaW1wb3J0IHsgQ2F0ZWdvcnlTZXJ2aWNlIH0gZnJvbSAnLi9jYXRlZ29yeS5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBDYXRhbG9nU2VydmljZUZhY2FkZSwgQ2F0ZWdvcnlTZXJ2aWNlRmFjYWRlIH0gZnJvbSAnLi9mYWNhZGVzJ1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgV2lzaGxpc3RTZXJ2aWNlIHtcclxuICBwcml2YXRlIGNhdGFsb2dTZXJ2aWNlOiBDYXRhbG9nU2VydmljZVxyXG4gIHByaXZhdGUgY2F0ZWdvcnlTZXJ2aWNlOiBDYXRlZ29yeVNlcnZpY2VcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdXaXNobGlzdFJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IHdpc2hsaXN0UmVwb3NpdG9yeTogV2lzaGxpc3RSZXBvc2l0b3J5LFxyXG4gICAgQEluamVjdCgnUHJvZHVjdFJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RSZXBvc2l0b3J5OiBQcm9kdWN0UmVwb3NpdG9yeSxcclxuICAgIEBJbmplY3QoJ0xvZ1JlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGxvZ1JlcG9zaXRvcnk6IExvZ1JlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KERFRkFVTFRfU0hPUCkgcHJpdmF0ZSByZWFkb25seSBzaG9wOiBTaG9wcyxcclxuICApIHt9XHJcblxyXG4gIGluaXRpYWxpemVTZXJ2aWNlcyhjYXRhbG9nU2VydmljZUZhY2FkZTogQ2F0YWxvZ1NlcnZpY2VGYWNhZGUsIGNhdGVnb3J5U2VydmljZUZhY2FkZTogQ2F0ZWdvcnlTZXJ2aWNlRmFjYWRlKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhdGFsb2dTZXJ2aWNlID0gY2F0YWxvZ1NlcnZpY2VGYWNhZGUuZ2V0Q2F0YWxvZ1NlcnZpY2UoKVxyXG4gICAgdGhpcy5jYXRlZ29yeVNlcnZpY2UgPSBjYXRlZ29yeVNlcnZpY2VGYWNhZGUuZ2V0Q2F0ZWdvcnlTZXJ2aWNlKClcclxuICB9XHJcblxyXG4gIGdldENhdGFsb2dTZXJ2aWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2VcclxuICB9XHJcblxyXG4gIGdldENhdGVnb3J5U2VydmljZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNhdGVnb3J5U2VydmljZVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlKHtcclxuICAgIHBlcnNvbklkLFxyXG4gICAgdGl0bGUsXHJcbiAgICBkZXNjcmlwdGlvbixcclxuICAgIHB1Ymxpc2hlZCxcclxuICAgIHVzZXJGdWxsTmFtZSxcclxuICAgIHVzZXJQaG90byxcclxuICAgIHRoZW1lLFxyXG4gICAgYmFubmVyVXJsLFxyXG4gICAgcGVyc29uVHlwZSxcclxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcclxuICB9OiB7XHJcbiAgICBwZXJzb25JZDogc3RyaW5nXHJcbiAgICB0aXRsZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXHJcbiAgICBwdWJsaXNoZWQ6IGJvb2xlYW5cclxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXHJcbiAgICB1c2VyUGhvdG8/OiBzdHJpbmdcclxuICAgIHRoZW1lPzogc3RyaW5nXHJcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcclxuICAgIHBlcnNvblR5cGU/OiBQZXJzb25UeXBlXHJcbiAgICBwZXJzb25Jc1N1YnNjcmliZXI/OiBib29sZWFuXHJcbiAgfSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcclxuICAgIGNvbnN0IHdpc2hsaXN0RGF0YSA9IHRoaXMuYnVpbGRXaXNobGlzdERhdGEoe1xyXG4gICAgICB0aXRsZSxcclxuICAgICAgZGVzY3JpcHRpb24sXHJcbiAgICAgIHB1Ymxpc2hlZCxcclxuICAgICAgdXNlckZ1bGxOYW1lLFxyXG4gICAgICB1c2VyUGhvdG8sXHJcbiAgICAgIHRoZW1lLFxyXG4gICAgICBiYW5uZXJVcmwsXHJcbiAgICAgIHBlcnNvblR5cGUsXHJcbiAgICAgIHBlcnNvbklzU3Vic2NyaWJlcixcclxuICAgICAgcGVyc29uSWQsXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGV4aXN0aW5nV2lzaGxpc3QgPSBhd2FpdCB0aGlzLmZpbmRFeGlzdGluZ1dpc2hsaXN0QnlQZXJzb25JZChwZXJzb25JZClcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5DUkVBVEUsIHdpc2hsaXN0RGF0YSBhcyBXaXNobGlzdClcclxuXHJcbiAgICBpZiAoZXhpc3RpbmdXaXNobGlzdCkgcmV0dXJuIGV4aXN0aW5nV2lzaGxpc3RcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdXaXNobGlzdCh3aXNobGlzdERhdGEpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkV2lzaGxpc3REYXRhKHtcclxuICAgIHRpdGxlLFxyXG4gICAgZGVzY3JpcHRpb24sXHJcbiAgICBwdWJsaXNoZWQsXHJcbiAgICB1c2VyRnVsbE5hbWUsXHJcbiAgICB1c2VyUGhvdG8sXHJcbiAgICB0aGVtZSxcclxuICAgIGJhbm5lclVybCxcclxuICAgIHBlcnNvblR5cGUsXHJcbiAgICBwZXJzb25Jc1N1YnNjcmliZXIsXHJcbiAgICBwZXJzb25JZCxcclxuICB9OiB7XHJcbiAgICB0aXRsZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXHJcbiAgICBwdWJsaXNoZWQ6IGJvb2xlYW5cclxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXHJcbiAgICB1c2VyUGhvdG8/OiBzdHJpbmdcclxuICAgIHRoZW1lPzogc3RyaW5nXHJcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcclxuICAgIHBlcnNvblR5cGU/OiBQZXJzb25UeXBlXHJcbiAgICBwZXJzb25Jc1N1YnNjcmliZXI/OiBib29sZWFuXHJcbiAgICBwZXJzb25JZDogc3RyaW5nXHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2x1ZzogJycsXHJcbiAgICAgIG5hbWU6IHRpdGxlLFxyXG4gICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgbWV0YWRhdGFzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2hvcDogdGhpcy5zaG9wLFxyXG4gICAgICAgICAgdGl0bGU6IGAke3VzZXJGdWxsTmFtZX0gLSAke3RpdGxlfWAsXHJcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7dXNlckZ1bGxOYW1lfSAtICR7ZGVzY3JpcHRpb259YCxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBzaG9wOiB0aGlzLnNob3AsXHJcbiAgICAgIHNob3BzOiBbdGhpcy5zaG9wXSxcclxuICAgICAgcGVyc29uSWQsXHJcbiAgICAgIHBlcnNvbk5hbWU6IHVzZXJGdWxsTmFtZSxcclxuICAgICAgcGVyc29uUGhvdG86IHVzZXJQaG90byxcclxuICAgICAgYnJhbmRDYXRlZ29yeTogZmFsc2UsXHJcbiAgICAgIHB1Ymxpc2hlZCxcclxuICAgICAgdGhlbWUsXHJcbiAgICAgIGJhbm5lclVybCxcclxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxyXG4gICAgICBwZXJzb25Jc1N1YnNjcmliZXI6IHBlcnNvbklzU3Vic2NyaWJlciA/PyBmYWxzZSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmluZEV4aXN0aW5nV2lzaGxpc3RCeVBlcnNvbklkKHBlcnNvbklkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0IHwgbnVsbD4ge1xyXG4gICAgY29uc3QgaGFzV2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeVxyXG4gICAgICAuZmluZCh7XHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgcGVyc29uSWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBlbmFibGVDb3VudDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcmRlckJ5OiB7XHJcbiAgICAgICAgICBpZDogJ2FzYycsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpXHJcblxyXG4gICAgcmV0dXJuIGhhc1dpc2hsaXN0Lmxlbmd0aCA/IGhhc1dpc2hsaXN0LmF0KDApIDogbnVsbFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdXaXNobGlzdChkYXRhOiBhbnkpOiBQcm9taXNlPFdpc2hsaXN0PiB7XHJcbiAgICBjb25zdCBuZXdXaXNobGlzdCA9IGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmNyZWF0ZShkYXRhKVxyXG5cclxuICAgIGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZSh7IGlkOiBuZXdXaXNobGlzdC5pZCwgc2x1ZzogbmV3V2lzaGxpc3QuaWQgfSlcclxuXHJcbiAgICByZXR1cm4gV2lzaGxpc3QudG9JbnN0YW5jZSh7IC4uLm5ld1dpc2hsaXN0LnRvUGxhaW4oKSwgc2x1ZzogbmV3V2lzaGxpc3QuaWQgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZSh7XHJcbiAgICBpZCxcclxuICAgIHRpdGxlLFxyXG4gICAgZGVzY3JpcHRpb24sXHJcbiAgICBwdWJsaXNoZWQsXHJcbiAgICB1c2VyRnVsbE5hbWUsXHJcbiAgICB1c2VyUGhvdG8sXHJcbiAgICB0aGVtZSxcclxuICAgIGJhbm5lclVybCxcclxuICAgIHBlcnNvblR5cGUsXHJcbiAgICBwZXJzb25Jc1N1YnNjcmliZXIsXHJcbiAgfToge1xyXG4gICAgaWQ6IHN0cmluZ1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xyXG4gICAgcHVibGlzaGVkOiBib29sZWFuXHJcbiAgICB1c2VyRnVsbE5hbWU6IHN0cmluZ1xyXG4gICAgdXNlclBob3RvPzogc3RyaW5nXHJcbiAgICB0aGVtZT86IHN0cmluZ1xyXG4gICAgYmFubmVyVXJsPzogc3RyaW5nXHJcbiAgICBwZXJzb25UeXBlPzogUGVyc29uVHlwZVxyXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyPzogYm9vbGVhblxyXG4gIH0pOiBQcm9taXNlPFdpc2hsaXN0PiB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBpZCxcclxuICAgICAgbmFtZTogdGl0bGUsXHJcbiAgICAgIGRlc2NyaXB0aW9uLFxyXG4gICAgICBwdWJsaXNoZWQsXHJcbiAgICAgIG1ldGFkYXRhczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcclxuICAgICAgICAgIHRpdGxlOiBgJHt1c2VyRnVsbE5hbWV9IC0gJHt0aXRsZX1gLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3VzZXJGdWxsTmFtZX0gLSAke2Rlc2NyaXB0aW9ufWAsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgcGVyc29uTmFtZTogdXNlckZ1bGxOYW1lLFxyXG4gICAgICBwZXJzb25QaG90bzogdXNlclBob3RvLFxyXG4gICAgICB0aGVtZSxcclxuICAgICAgYmFubmVyVXJsLFxyXG4gICAgICBwZXJzb25UeXBlOiBwZXJzb25UeXBlID8/IFBlcnNvblR5cGVzLk5PTkUsXHJcbiAgICAgIHBlcnNvbklzU3Vic2NyaWJlcjogcGVyc29uSXNTdWJzY3JpYmVyID8/IGZhbHNlLFxyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RMb2coV2lzaGxpc3RMb2dUeXBlLlVQREFURSwgZGF0YSBhcyBXaXNobGlzdClcclxuXHJcbiAgICByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkudXBkYXRlKGRhdGEpXHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGUod2lzaGxpc3RJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aXNobGlzdCA9IGF3YWl0IHRoaXMuZmluZEJ5SWQod2lzaGxpc3RJZClcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5ERUxFVEUsIHdpc2hsaXN0KVxyXG5cclxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5kZWxldGUoeyBpZDogd2lzaGxpc3RJZCB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0V2lzaGxpc3RCeVNsdWcoc2x1Zzogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xyXG4gICAgY29uc3QgW2lkXSA9IHNsdWcuc3BsaXQoJy0nKVxyXG5cclxuICAgIGlmICgraWQpIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXQoeyBpZCB9KVxyXG5cclxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXRXaXNobGlzdEJ5U2x1ZyhzbHVnKVxyXG4gIH1cclxuXHJcbiAgZ2V0V2lzaGxpc3RzQnlQZXJzb24ocGVyc29uSWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3RbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldFdpc2hsaXN0QnlQZXJzb24ocGVyc29uSWQpXHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRQcm9kdWN0KHdpc2hsaXN0SWQ6IHN0cmluZywgcHJvZHVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XHJcbiAgICBjb25zdCB3aXNobGlzdCA9IGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldCh7IGlkOiB3aXNobGlzdElkIH0pXHJcbiAgICBjb25zdCBoYXNQcm9kdWN0ID0gd2lzaGxpc3QucHJvZHVjdHMuc29tZSgocCkgPT4gcCA9PSBwcm9kdWN0SWQpXHJcblxyXG4gICAgY29uc3Qgd2lzaGxpc3REYXRhID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxyXG4gICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXHJcblxyXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuQUREX1BST0RVQ1QsIHdpc2hsaXN0RGF0YSwgcHJvZHVjdERhdGEpXHJcblxyXG4gICAgaWYgKCFoYXNQcm9kdWN0KSB7XHJcbiAgICAgIHdpc2hsaXN0LnByb2R1Y3RzID0gWy4uLndpc2hsaXN0LnByb2R1Y3RzLCBwcm9kdWN0SWRdXHJcbiAgICAgIGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmFkZFByb2R1Y3Qod2lzaGxpc3RJZCwgcHJvZHVjdElkKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB3aXNobGlzdFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlUHJvZHVjdCh3aXNobGlzdElkOiBzdHJpbmcsIHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xyXG4gICAgY29uc3Qgd2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXQoeyBpZDogd2lzaGxpc3RJZCB9KVxyXG4gICAgY29uc3QgcHJvZHVjdEluZGV4ID0gd2lzaGxpc3QucHJvZHVjdHMuZmluZEluZGV4KChwKSA9PiBwID09IHByb2R1Y3RJZClcclxuXHJcbiAgICBpZiAocHJvZHVjdEluZGV4ICE9IC0xKSB7XHJcbiAgICAgIHdpc2hsaXN0LnByb2R1Y3RzLnNwbGljZShwcm9kdWN0SW5kZXgsIDEpXHJcbiAgICAgIGNvbnN0IHdpc2hsaXN0RGF0YSA9IGF3YWl0IHRoaXMuZmluZEJ5SWQod2lzaGxpc3RJZClcclxuICAgICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5SRU1PVkVfUFJPRFVDVCwgd2lzaGxpc3REYXRhLCBwcm9kdWN0RGF0YSlcclxuICAgICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkucmVtb3ZlUHJvZHVjdCh3aXNobGlzdElkLCBwcm9kdWN0SWQpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHdpc2hsaXN0XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XHJcbiAgICByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnlcclxuICAgICAgLmZpbmQoe1xyXG4gICAgICAgIGZpZWxkczogWydpZCcsICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ3BlcnNvbklkJywgJ3BlcnNvbklzU3Vic2NyaWJlcicsICdwZXJzb25UeXBlJywgJ3BlcnNvbk5hbWUnXSxcclxuICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YS5hdCgwKSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmluZFByb2R1Y3RCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFByb2R1Y3Q+IHtcclxuICAgIHJldHVybiB0aGlzLnByb2R1Y3RSZXBvc2l0b3J5XHJcbiAgICAgIC5maW5kKHtcclxuICAgICAgICBmaWVsZHM6IFsnaWQnLCAnc2t1JywgJ0VBTicsICduYW1lJywgJ2JyYW5kJ10sXHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgaWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEuYXQoMCkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVdpc2hsaXN0TG9nKHR5cGU6IFdpc2hsaXN0TG9nVHlwZSwgd2lzaGxpc3Q6IFdpc2hsaXN0LCBwcm9kdWN0PzogUHJvZHVjdCkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkNSRUFURTpcclxuICAgICAgY2FzZSBXaXNobGlzdExvZ1R5cGUuVVBEQVRFOlxyXG4gICAgICBjYXNlIFdpc2hsaXN0TG9nVHlwZS5ERUxFVEU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdE9wZXJhdGlvbkxvZyh0eXBlLCB3aXNobGlzdClcclxuICAgICAgICBicmVha1xyXG5cclxuICAgICAgY2FzZSBXaXNobGlzdExvZ1R5cGUuQUREX1BST0RVQ1Q6XHJcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLlJFTU9WRV9QUk9EVUNUOlxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RQcm9kdWN0TG9nKHR5cGUsIHdpc2hsaXN0LCBwcm9kdWN0KVxyXG4gICAgICAgIGJyZWFrXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVdpc2hsaXN0T3BlcmF0aW9uTG9nKHR5cGU6IFdpc2hsaXN0TG9nVHlwZSwgd2lzaGxpc3Q6IFdpc2hsaXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvblR5cGVGcm9tV2lzaGxpc3RMb2dUeXBlKHR5cGUpXHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2dSZXBvc2l0b3J5LmNyZWF0ZSh7XHJcbiAgICAgIGNvbGxlY3Rpb246ICd3aXNobGlzdCcsXHJcbiAgICAgIGRhdGU6IG5ldyBEYXRlKCksXHJcbiAgICAgIG9wZXJhdGlvbixcclxuICAgICAgZG9jdW1lbnRJZDogd2lzaGxpc3QuaWQsXHJcbiAgICAgIGRvY3VtZW50OiB0aGlzLmJ1aWxkV2lzaGxpc3RMb2dEb2N1bWVudCh3aXNobGlzdCwgdHlwZSksXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVXaXNobGlzdFByb2R1Y3RMb2codHlwZTogV2lzaGxpc3RMb2dUeXBlLCB3aXNobGlzdDogV2lzaGxpc3QsIHByb2R1Y3Q6IFByb2R1Y3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubG9nUmVwb3NpdG9yeS5jcmVhdGUoe1xyXG4gICAgICBjb2xsZWN0aW9uOiAnd2lzaGxpc3QnLFxyXG4gICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxyXG4gICAgICBvcGVyYXRpb246ICdVUERBVEUnLFxyXG4gICAgICBkb2N1bWVudElkOiB3aXNobGlzdC5pZCxcclxuICAgICAgZG9jdW1lbnQ6IHtcclxuICAgICAgICAuLi50aGlzLmJ1aWxkV2lzaGxpc3RMb2dEb2N1bWVudCh3aXNobGlzdCwgdHlwZSksXHJcbiAgICAgICAgLi4udGhpcy5idWlsZFByb2R1Y3RMb2dEYXRhKHByb2R1Y3QpLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3BlcmF0aW9uVHlwZUZyb21XaXNobGlzdExvZ1R5cGUodHlwZTogV2lzaGxpc3RMb2dUeXBlKTogJ0NSRUFURScgfCAnVVBEQVRFJyB8ICdERUxFVEUnIHtcclxuICAgIGlmICh0eXBlID09PSBXaXNobGlzdExvZ1R5cGUuQ1JFQVRFKSByZXR1cm4gJ0NSRUFURSdcclxuXHJcbiAgICBpZiAodHlwZSA9PT0gV2lzaGxpc3RMb2dUeXBlLlVQREFURSkgcmV0dXJuICdVUERBVEUnXHJcblxyXG4gICAgcmV0dXJuICdERUxFVEUnXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkV2lzaGxpc3RMb2dEb2N1bWVudCh3aXNobGlzdDogV2lzaGxpc3QsIHR5cGU6IFdpc2hsaXN0TG9nVHlwZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHdpc2hsaXN0LmlkLFxyXG4gICAgICBzaG9wOiB0aGlzLnNob3AsXHJcbiAgICAgIG5hbWU6IHdpc2hsaXN0Lm5hbWUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB3aXNobGlzdC5kZXNjcmlwdGlvbixcclxuICAgICAgcHVibGlzaGVkOiB3aXNobGlzdC5wdWJsaXNoZWQsXHJcbiAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgIHBlcnNvblR5cGU6IHdpc2hsaXN0LnBlcnNvblR5cGUsXHJcbiAgICAgIHBlcnNvbklkOiB3aXNobGlzdC5wZXJzb25JZCxcclxuICAgICAgcGVyc29uTmFtZTogd2lzaGxpc3QucGVyc29uTmFtZSxcclxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiB3aXNobGlzdC5wZXJzb25Jc1N1YnNjcmliZXIsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkUHJvZHVjdExvZ0RhdGEocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LmlkLFxyXG4gICAgICBwcm9kdWN0RUFOOiBwcm9kdWN0LkVBTixcclxuICAgICAgcHJvZHVjdFNLVTogcHJvZHVjdC5za3UsXHJcbiAgICAgIHByb2R1Y3ROYW1lOiBwcm9kdWN0Lm5hbWUsXHJcbiAgICAgIHByb2R1Y3RCcmFuZDogcHJvZHVjdC5icmFuZCxcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { PersonTypes, Shops, Wishlist, WishlistLogType, } from '@infrab4a/connect';
|
|
3
|
+
import { DEFAULT_SHOP } from '../../consts';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@infrab4a/connect";
|
|
6
|
+
export class WishlistService {
|
|
7
|
+
constructor(wishlistRepository, productRepository, logRepository, shop) {
|
|
8
|
+
this.wishlistRepository = wishlistRepository;
|
|
9
|
+
this.productRepository = productRepository;
|
|
10
|
+
this.logRepository = logRepository;
|
|
11
|
+
this.shop = shop;
|
|
12
|
+
}
|
|
13
|
+
initializeServices(catalogServiceFacade, categoryServiceFacade) {
|
|
14
|
+
this.catalogService = catalogServiceFacade.getCatalogService();
|
|
15
|
+
this.categoryService = categoryServiceFacade.getCategoryService();
|
|
16
|
+
}
|
|
17
|
+
getCatalogService() {
|
|
18
|
+
return this.catalogService;
|
|
19
|
+
}
|
|
20
|
+
getCategoryService() {
|
|
21
|
+
return this.categoryService;
|
|
22
|
+
}
|
|
23
|
+
async create({ personId, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
|
|
24
|
+
const wishlistData = this.buildWishlistData({
|
|
25
|
+
title,
|
|
26
|
+
description,
|
|
27
|
+
published,
|
|
28
|
+
userFullName,
|
|
29
|
+
userPhoto,
|
|
30
|
+
theme,
|
|
31
|
+
bannerUrl,
|
|
32
|
+
personType,
|
|
33
|
+
personIsSubscriber,
|
|
34
|
+
personId,
|
|
35
|
+
});
|
|
36
|
+
const existingWishlist = await this.findExistingWishlistByPersonId(personId);
|
|
37
|
+
await this.createWishlistLog(WishlistLogType.CREATE, wishlistData);
|
|
38
|
+
if (existingWishlist)
|
|
39
|
+
return existingWishlist;
|
|
40
|
+
return this.createNewWishlist(wishlistData);
|
|
41
|
+
}
|
|
42
|
+
buildWishlistData({ title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, personId, }) {
|
|
43
|
+
return {
|
|
44
|
+
slug: '',
|
|
45
|
+
name: title,
|
|
46
|
+
description,
|
|
47
|
+
metadatas: [
|
|
48
|
+
{
|
|
49
|
+
shop: this.shop,
|
|
50
|
+
title: `${userFullName} - ${title}`,
|
|
51
|
+
description: `${userFullName} - ${description}`,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
shop: this.shop,
|
|
55
|
+
shops: [this.shop],
|
|
56
|
+
personId,
|
|
57
|
+
personName: userFullName,
|
|
58
|
+
personPhoto: userPhoto,
|
|
59
|
+
brandCategory: false,
|
|
60
|
+
published,
|
|
61
|
+
theme,
|
|
62
|
+
bannerUrl,
|
|
63
|
+
personType: personType ?? PersonTypes.NONE,
|
|
64
|
+
personIsSubscriber: personIsSubscriber ?? false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async findExistingWishlistByPersonId(personId) {
|
|
68
|
+
const hasWishlist = await this.wishlistRepository
|
|
69
|
+
.find({
|
|
70
|
+
filters: {
|
|
71
|
+
personId,
|
|
72
|
+
},
|
|
73
|
+
options: {
|
|
74
|
+
enableCount: false,
|
|
75
|
+
},
|
|
76
|
+
orderBy: {
|
|
77
|
+
id: 'asc',
|
|
78
|
+
},
|
|
79
|
+
})
|
|
80
|
+
.then((res) => res.data);
|
|
81
|
+
return hasWishlist.length ? hasWishlist.at(0) : null;
|
|
82
|
+
}
|
|
83
|
+
async createNewWishlist(data) {
|
|
84
|
+
const newWishlist = await this.wishlistRepository.create(data);
|
|
85
|
+
await this.wishlistRepository.update({ id: newWishlist.id, slug: newWishlist.id });
|
|
86
|
+
return Wishlist.toInstance({ ...newWishlist.toPlain(), slug: newWishlist.id });
|
|
87
|
+
}
|
|
88
|
+
async update({ id, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
|
|
89
|
+
const data = {
|
|
90
|
+
id,
|
|
91
|
+
name: title,
|
|
92
|
+
description,
|
|
93
|
+
published,
|
|
94
|
+
metadatas: [
|
|
95
|
+
{
|
|
96
|
+
shop: this.shop,
|
|
97
|
+
title: `${userFullName} - ${title}`,
|
|
98
|
+
description: `${userFullName} - ${description}`,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
personName: userFullName,
|
|
102
|
+
personPhoto: userPhoto,
|
|
103
|
+
theme,
|
|
104
|
+
bannerUrl,
|
|
105
|
+
personType: personType ?? PersonTypes.NONE,
|
|
106
|
+
personIsSubscriber: personIsSubscriber ?? false,
|
|
107
|
+
};
|
|
108
|
+
await this.createWishlistLog(WishlistLogType.UPDATE, data);
|
|
109
|
+
return this.wishlistRepository.update(data);
|
|
110
|
+
}
|
|
111
|
+
async delete(wishlistId) {
|
|
112
|
+
const wishlist = await this.findById(wishlistId);
|
|
113
|
+
await this.createWishlistLog(WishlistLogType.DELETE, wishlist);
|
|
114
|
+
return this.wishlistRepository.delete({ id: wishlistId });
|
|
115
|
+
}
|
|
116
|
+
getWishlistBySlug(slug) {
|
|
117
|
+
const [id] = slug.split('-');
|
|
118
|
+
if (+id)
|
|
119
|
+
return this.wishlistRepository.get({ id });
|
|
120
|
+
return this.wishlistRepository.getWishlistBySlug(slug);
|
|
121
|
+
}
|
|
122
|
+
getWishlistsByPerson(personId) {
|
|
123
|
+
return this.wishlistRepository.getWishlistByPerson(personId);
|
|
124
|
+
}
|
|
125
|
+
async addProduct(wishlistId, productId) {
|
|
126
|
+
const wishlist = await this.wishlistRepository.get({ id: wishlistId });
|
|
127
|
+
const hasProduct = wishlist.products.some((p) => p == productId);
|
|
128
|
+
const wishlistData = await this.findById(wishlistId);
|
|
129
|
+
const productData = await this.findProductById(productId);
|
|
130
|
+
await this.createWishlistLog(WishlistLogType.ADD_PRODUCT, wishlistData, productData);
|
|
131
|
+
if (!hasProduct) {
|
|
132
|
+
wishlist.products = [...wishlist.products, productId];
|
|
133
|
+
await this.wishlistRepository.addProduct(wishlistId, productId);
|
|
134
|
+
}
|
|
135
|
+
return wishlist;
|
|
136
|
+
}
|
|
137
|
+
async removeProduct(wishlistId, productId) {
|
|
138
|
+
const wishlist = await this.wishlistRepository.get({ id: wishlistId });
|
|
139
|
+
const productIndex = wishlist.products.findIndex((p) => p == productId);
|
|
140
|
+
if (productIndex != -1) {
|
|
141
|
+
wishlist.products.splice(productIndex, 1);
|
|
142
|
+
const wishlistData = await this.findById(wishlistId);
|
|
143
|
+
const productData = await this.findProductById(productId);
|
|
144
|
+
await this.createWishlistLog(WishlistLogType.REMOVE_PRODUCT, wishlistData, productData);
|
|
145
|
+
await this.wishlistRepository.removeProduct(wishlistId, productId);
|
|
146
|
+
}
|
|
147
|
+
return wishlist;
|
|
148
|
+
}
|
|
149
|
+
async findById(id) {
|
|
150
|
+
return this.wishlistRepository
|
|
151
|
+
.find({
|
|
152
|
+
fields: ['id', 'name', 'description', 'personId', 'personIsSubscriber', 'personType', 'personName'],
|
|
153
|
+
filters: {
|
|
154
|
+
id,
|
|
155
|
+
},
|
|
156
|
+
})
|
|
157
|
+
.then((res) => res.data.at(0));
|
|
158
|
+
}
|
|
159
|
+
async findProductById(id) {
|
|
160
|
+
return this.productRepository
|
|
161
|
+
.find({
|
|
162
|
+
fields: ['id', 'sku', 'EAN', 'name', 'brand'],
|
|
163
|
+
filters: {
|
|
164
|
+
id,
|
|
165
|
+
},
|
|
166
|
+
})
|
|
167
|
+
.then((res) => res.data.at(0));
|
|
168
|
+
}
|
|
169
|
+
async createWishlistLog(type, wishlist, product) {
|
|
170
|
+
switch (type) {
|
|
171
|
+
case WishlistLogType.CREATE:
|
|
172
|
+
case WishlistLogType.UPDATE:
|
|
173
|
+
case WishlistLogType.DELETE:
|
|
174
|
+
await this.createWishlistOperationLog(type, wishlist);
|
|
175
|
+
break;
|
|
176
|
+
case WishlistLogType.ADD_PRODUCT:
|
|
177
|
+
case WishlistLogType.REMOVE_PRODUCT:
|
|
178
|
+
await this.createWishlistProductLog(type, wishlist, product);
|
|
179
|
+
break;
|
|
180
|
+
default:
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async createWishlistOperationLog(type, wishlist) {
|
|
185
|
+
const operation = this.getOperationTypeFromWishlistLogType(type);
|
|
186
|
+
await this.logRepository.create({
|
|
187
|
+
collection: 'wishlist',
|
|
188
|
+
date: new Date(),
|
|
189
|
+
operation,
|
|
190
|
+
documentId: wishlist.id,
|
|
191
|
+
document: this.buildWishlistLogDocument(wishlist, type),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async createWishlistProductLog(type, wishlist, product) {
|
|
195
|
+
await this.logRepository.create({
|
|
196
|
+
collection: 'wishlist',
|
|
197
|
+
date: new Date(),
|
|
198
|
+
operation: 'UPDATE',
|
|
199
|
+
documentId: wishlist.id,
|
|
200
|
+
document: {
|
|
201
|
+
...this.buildWishlistLogDocument(wishlist, type),
|
|
202
|
+
...this.buildProductLogData(product),
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
getOperationTypeFromWishlistLogType(type) {
|
|
207
|
+
if (type === WishlistLogType.CREATE)
|
|
208
|
+
return 'CREATE';
|
|
209
|
+
if (type === WishlistLogType.UPDATE)
|
|
210
|
+
return 'UPDATE';
|
|
211
|
+
return 'DELETE';
|
|
212
|
+
}
|
|
213
|
+
buildWishlistLogDocument(wishlist, type) {
|
|
214
|
+
return {
|
|
215
|
+
id: wishlist.id,
|
|
216
|
+
shop: this.shop,
|
|
217
|
+
name: wishlist.name,
|
|
218
|
+
description: wishlist.description,
|
|
219
|
+
published: wishlist.published,
|
|
220
|
+
type: type,
|
|
221
|
+
personType: wishlist.personType,
|
|
222
|
+
personId: wishlist.personId,
|
|
223
|
+
personName: wishlist.personName,
|
|
224
|
+
personIsSubscriber: wishlist.personIsSubscriber,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
buildProductLogData(product) {
|
|
228
|
+
return {
|
|
229
|
+
productId: product.id,
|
|
230
|
+
productEAN: product.EAN,
|
|
231
|
+
productSKU: product.sku,
|
|
232
|
+
productName: product.name,
|
|
233
|
+
productBrand: product.brand,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
WishlistService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService, deps: [{ token: 'WishlistRepository' }, { token: 'ProductRepository' }, { token: 'LogRepository' }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
238
|
+
WishlistService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService });
|
|
239
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService, decorators: [{
|
|
240
|
+
type: Injectable
|
|
241
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
242
|
+
type: Inject,
|
|
243
|
+
args: ['WishlistRepository']
|
|
244
|
+
}] }, { type: undefined, decorators: [{
|
|
245
|
+
type: Inject,
|
|
246
|
+
args: ['ProductRepository']
|
|
247
|
+
}] }, { type: undefined, decorators: [{
|
|
248
|
+
type: Inject,
|
|
249
|
+
args: ['LogRepository']
|
|
250
|
+
}] }, { type: i1.Shops, decorators: [{
|
|
251
|
+
type: Inject,
|
|
252
|
+
args: [DEFAULT_SHOP]
|
|
253
|
+
}] }]; } });
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lzaGxpc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvY2F0YWxvZy93aXNobGlzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFHTCxXQUFXLEVBR1gsS0FBSyxFQUNMLFFBQVEsRUFDUixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUE7QUFFMUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTs7O0FBTzNDLE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ2lELGtCQUFzQyxFQUN2QyxpQkFBb0MsRUFDeEMsYUFBNEIsRUFDL0IsSUFBVztRQUhILHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMvQixTQUFJLEdBQUosSUFBSSxDQUFPO0lBQ2pELENBQUM7SUFFSixrQkFBa0IsQ0FBQyxvQkFBMEMsRUFBRSxxQkFBNEM7UUFDekcsSUFBSSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzlELElBQUksQ0FBQyxlQUFlLEdBQUcscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFBO0lBQzVCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFBO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1Qs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QUFJLEVBQUUsSUFBSTtZQUNWLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtZQUMvQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7U0FDaEQsQ0FBQTtJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFnQjtRQUMxQyxPQUFPO1lBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3JCLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRztZQUN2QixVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDdkIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3pCLFlBQVksRUFBRSxPQUFPLENBQUMsS0FBSztTQUM1QixDQUFBO0lBQ0gsQ0FBQzs7NEdBcFZVLGVBQWUsa0JBS2hCLG9CQUFvQixhQUNwQixtQkFBbUIsYUFDbkIsZUFBZSxhQUNmLFlBQVk7Z0hBUlgsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVOzswQkFNTixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQzNCLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsTUFBTTsyQkFBQyxlQUFlOzswQkFDdEIsTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIExvZ1JlcG9zaXRvcnksXG4gIFBlcnNvblR5cGUsXG4gIFBlcnNvblR5cGVzLFxuICBQcm9kdWN0LFxuICBQcm9kdWN0UmVwb3NpdG9yeSxcbiAgU2hvcHMsXG4gIFdpc2hsaXN0LFxuICBXaXNobGlzdExvZ1R5cGUsXG4gIFdpc2hsaXN0UmVwb3NpdG9yeSxcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5cbmltcG9ydCB7IERFRkFVTFRfU0hPUCB9IGZyb20gJy4uLy4uL2NvbnN0cydcblxuaW1wb3J0IHsgQ2F0YWxvZ1NlcnZpY2UgfSBmcm9tICcuL2NhdGFsb2cuc2VydmljZSdcbmltcG9ydCB7IENhdGVnb3J5U2VydmljZSB9IGZyb20gJy4vY2F0ZWdvcnkuc2VydmljZSdcbmltcG9ydCB7IENhdGFsb2dTZXJ2aWNlRmFjYWRlLCBDYXRlZ29yeVNlcnZpY2VGYWNhZGUgfSBmcm9tICcuL2ZhY2FkZXMnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaXNobGlzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhdGFsb2dTZXJ2aWNlOiBDYXRhbG9nU2VydmljZVxuICBwcml2YXRlIGNhdGVnb3J5U2VydmljZTogQ2F0ZWdvcnlTZXJ2aWNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnV2lzaGxpc3RSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSB3aXNobGlzdFJlcG9zaXRvcnk6IFdpc2hsaXN0UmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KCdQcm9kdWN0UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFJlcG9zaXRvcnk6IFByb2R1Y3RSZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoJ0xvZ1JlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGxvZ1JlcG9zaXRvcnk6IExvZ1JlcG9zaXRvcnksXG4gICAgQEluamVjdChERUZBVUxUX1NIT1ApIHByaXZhdGUgcmVhZG9ubHkgc2hvcDogU2hvcHMsXG4gICkge31cblxuICBpbml0aWFsaXplU2VydmljZXMoY2F0YWxvZ1NlcnZpY2VGYWNhZGU6IENhdGFsb2dTZXJ2aWNlRmFjYWRlLCBjYXRlZ29yeVNlcnZpY2VGYWNhZGU6IENhdGVnb3J5U2VydmljZUZhY2FkZSk6IHZvaWQge1xuICAgIHRoaXMuY2F0YWxvZ1NlcnZpY2UgPSBjYXRhbG9nU2VydmljZUZhY2FkZS5nZXRDYXRhbG9nU2VydmljZSgpXG4gICAgdGhpcy5jYXRlZ29yeVNlcnZpY2UgPSBjYXRlZ29yeVNlcnZpY2VGYWNhZGUuZ2V0Q2F0ZWdvcnlTZXJ2aWNlKClcbiAgfVxuXG4gIGdldENhdGFsb2dTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlXG4gIH1cblxuICBnZXRDYXRlZ29yeVNlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcnlTZXJ2aWNlXG4gIH1cblxuICBhc3luYyBjcmVhdGUoe1xuICAgIHBlcnNvbklkLFxuICAgIHRpdGxlLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIHB1Ymxpc2hlZCxcbiAgICB1c2VyRnVsbE5hbWUsXG4gICAgdXNlclBob3RvLFxuICAgIHRoZW1lLFxuICAgIGJhbm5lclVybCxcbiAgICBwZXJzb25UeXBlLFxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcbiAgfToge1xuICAgIHBlcnNvbklkOiBzdHJpbmdcbiAgICB0aXRsZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHB1Ymxpc2hlZDogYm9vbGVhblxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXG4gICAgdXNlclBob3RvPzogc3RyaW5nXG4gICAgdGhlbWU/OiBzdHJpbmdcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcbiAgICBwZXJzb25UeXBlPzogUGVyc29uVHlwZVxuICAgIHBlcnNvbklzU3Vic2NyaWJlcj86IGJvb2xlYW5cbiAgfSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCB3aXNobGlzdERhdGEgPSB0aGlzLmJ1aWxkV2lzaGxpc3REYXRhKHtcbiAgICAgIHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBwdWJsaXNoZWQsXG4gICAgICB1c2VyRnVsbE5hbWUsXG4gICAgICB1c2VyUGhvdG8sXG4gICAgICB0aGVtZSxcbiAgICAgIGJhbm5lclVybCxcbiAgICAgIHBlcnNvblR5cGUsXG4gICAgICBwZXJzb25Jc1N1YnNjcmliZXIsXG4gICAgICBwZXJzb25JZCxcbiAgICB9KVxuXG4gICAgY29uc3QgZXhpc3RpbmdXaXNobGlzdCA9IGF3YWl0IHRoaXMuZmluZEV4aXN0aW5nV2lzaGxpc3RCeVBlcnNvbklkKHBlcnNvbklkKVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuQ1JFQVRFLCB3aXNobGlzdERhdGEgYXMgV2lzaGxpc3QpXG5cbiAgICBpZiAoZXhpc3RpbmdXaXNobGlzdCkgcmV0dXJuIGV4aXN0aW5nV2lzaGxpc3RcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1dpc2hsaXN0KHdpc2hsaXN0RGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXaXNobGlzdERhdGEoe1xuICAgIHRpdGxlLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIHB1Ymxpc2hlZCxcbiAgICB1c2VyRnVsbE5hbWUsXG4gICAgdXNlclBob3RvLFxuICAgIHRoZW1lLFxuICAgIGJhbm5lclVybCxcbiAgICBwZXJzb25UeXBlLFxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcbiAgICBwZXJzb25JZCxcbiAgfToge1xuICAgIHRpdGxlOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgcHVibGlzaGVkOiBib29sZWFuXG4gICAgdXNlckZ1bGxOYW1lOiBzdHJpbmdcbiAgICB1c2VyUGhvdG8/OiBzdHJpbmdcbiAgICB0aGVtZT86IHN0cmluZ1xuICAgIGJhbm5lclVybD86IHN0cmluZ1xuICAgIHBlcnNvblR5cGU/OiBQZXJzb25UeXBlXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyPzogYm9vbGVhblxuICAgIHBlcnNvbklkOiBzdHJpbmdcbiAgfSkge1xuICAgIHJldHVybiB7XG4gICAgICBzbHVnOiAnJyxcbiAgICAgIG5hbWU6IHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBtZXRhZGF0YXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcbiAgICAgICAgICB0aXRsZTogYCR7dXNlckZ1bGxOYW1lfSAtICR7dGl0bGV9YCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7dXNlckZ1bGxOYW1lfSAtICR7ZGVzY3JpcHRpb259YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICBzaG9wczogW3RoaXMuc2hvcF0sXG4gICAgICBwZXJzb25JZCxcbiAgICAgIHBlcnNvbk5hbWU6IHVzZXJGdWxsTmFtZSxcbiAgICAgIHBlcnNvblBob3RvOiB1c2VyUGhvdG8sXG4gICAgICBicmFuZENhdGVnb3J5OiBmYWxzZSxcbiAgICAgIHB1Ymxpc2hlZCxcbiAgICAgIHRoZW1lLFxuICAgICAgYmFubmVyVXJsLFxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRXhpc3RpbmdXaXNobGlzdEJ5UGVyc29uSWQocGVyc29uSWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3QgfCBudWxsPiB7XG4gICAgY29uc3QgaGFzV2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeVxuICAgICAgLmZpbmQoe1xuICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgcGVyc29uSWQsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbmFibGVDb3VudDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGVyQnk6IHtcbiAgICAgICAgICBpZDogJ2FzYycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpXG5cbiAgICByZXR1cm4gaGFzV2lzaGxpc3QubGVuZ3RoID8gaGFzV2lzaGxpc3QuYXQoMCkgOiBudWxsXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1dpc2hsaXN0KGRhdGE6IGFueSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCBuZXdXaXNobGlzdCA9IGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmNyZWF0ZShkYXRhKVxuXG4gICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkudXBkYXRlKHsgaWQ6IG5ld1dpc2hsaXN0LmlkLCBzbHVnOiBuZXdXaXNobGlzdC5pZCB9KVxuXG4gICAgcmV0dXJuIFdpc2hsaXN0LnRvSW5zdGFuY2UoeyAuLi5uZXdXaXNobGlzdC50b1BsYWluKCksIHNsdWc6IG5ld1dpc2hsaXN0LmlkIH0pXG4gIH1cblxuICBhc3luYyB1cGRhdGUoe1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIHB1Ymxpc2hlZCxcbiAgICB1c2VyRnVsbE5hbWUsXG4gICAgdXNlclBob3RvLFxuICAgIHRoZW1lLFxuICAgIGJhbm5lclVybCxcbiAgICBwZXJzb25UeXBlLFxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcbiAgfToge1xuICAgIGlkOiBzdHJpbmdcbiAgICB0aXRsZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHB1Ymxpc2hlZDogYm9vbGVhblxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXG4gICAgdXNlclBob3RvPzogc3RyaW5nXG4gICAgdGhlbWU/OiBzdHJpbmdcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcbiAgICBwZXJzb25UeXBlPzogUGVyc29uVHlwZVxuICAgIHBlcnNvbklzU3Vic2NyaWJlcj86IGJvb2xlYW5cbiAgfSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiB0aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcHVibGlzaGVkLFxuICAgICAgbWV0YWRhdGFzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICAgICAgdGl0bGU6IGAke3VzZXJGdWxsTmFtZX0gLSAke3RpdGxlfWAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3VzZXJGdWxsTmFtZX0gLSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcGVyc29uTmFtZTogdXNlckZ1bGxOYW1lLFxuICAgICAgcGVyc29uUGhvdG86IHVzZXJQaG90byxcbiAgICAgIHRoZW1lLFxuICAgICAgYmFubmVyVXJsLFxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuVVBEQVRFLCBkYXRhIGFzIFdpc2hsaXN0KVxuXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZShkYXRhKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKHdpc2hsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuREVMRVRFLCB3aXNobGlzdClcblxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5kZWxldGUoeyBpZDogd2lzaGxpc3RJZCB9KVxuICB9XG5cbiAgZ2V0V2lzaGxpc3RCeVNsdWcoc2x1Zzogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xuICAgIGNvbnN0IFtpZF0gPSBzbHVnLnNwbGl0KCctJylcblxuICAgIGlmICgraWQpIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXQoeyBpZCB9KVxuXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldFdpc2hsaXN0QnlTbHVnKHNsdWcpXG4gIH1cblxuICBnZXRXaXNobGlzdHNCeVBlcnNvbihwZXJzb25JZDogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldFdpc2hsaXN0QnlQZXJzb24ocGVyc29uSWQpXG4gIH1cblxuICBhc3luYyBhZGRQcm9kdWN0KHdpc2hsaXN0SWQ6IHN0cmluZywgcHJvZHVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XG4gICAgY29uc3Qgd2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXQoeyBpZDogd2lzaGxpc3RJZCB9KVxuICAgIGNvbnN0IGhhc1Byb2R1Y3QgPSB3aXNobGlzdC5wcm9kdWN0cy5zb21lKChwKSA9PiBwID09IHByb2R1Y3RJZClcblxuICAgIGNvbnN0IHdpc2hsaXN0RGF0YSA9IGF3YWl0IHRoaXMuZmluZEJ5SWQod2lzaGxpc3RJZClcbiAgICBjb25zdCBwcm9kdWN0RGF0YSA9IGF3YWl0IHRoaXMuZmluZFByb2R1Y3RCeUlkKHByb2R1Y3RJZClcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RMb2coV2lzaGxpc3RMb2dUeXBlLkFERF9QUk9EVUNULCB3aXNobGlzdERhdGEsIHByb2R1Y3REYXRhKVxuXG4gICAgaWYgKCFoYXNQcm9kdWN0KSB7XG4gICAgICB3aXNobGlzdC5wcm9kdWN0cyA9IFsuLi53aXNobGlzdC5wcm9kdWN0cywgcHJvZHVjdElkXVxuICAgICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuYWRkUHJvZHVjdCh3aXNobGlzdElkLCBwcm9kdWN0SWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpc2hsaXN0XG4gIH1cblxuICBhc3luYyByZW1vdmVQcm9kdWN0KHdpc2hsaXN0SWQ6IHN0cmluZywgcHJvZHVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XG4gICAgY29uc3Qgd2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXQoeyBpZDogd2lzaGxpc3RJZCB9KVxuICAgIGNvbnN0IHByb2R1Y3RJbmRleCA9IHdpc2hsaXN0LnByb2R1Y3RzLmZpbmRJbmRleCgocCkgPT4gcCA9PSBwcm9kdWN0SWQpXG5cbiAgICBpZiAocHJvZHVjdEluZGV4ICE9IC0xKSB7XG4gICAgICB3aXNobGlzdC5wcm9kdWN0cy5zcGxpY2UocHJvZHVjdEluZGV4LCAxKVxuICAgICAgY29uc3Qgd2lzaGxpc3REYXRhID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxuICAgICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXG5cbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RMb2coV2lzaGxpc3RMb2dUeXBlLlJFTU9WRV9QUk9EVUNULCB3aXNobGlzdERhdGEsIHByb2R1Y3REYXRhKVxuICAgICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkucmVtb3ZlUHJvZHVjdCh3aXNobGlzdElkLCBwcm9kdWN0SWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpc2hsaXN0XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpZWxkczogWydpZCcsICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ3BlcnNvbklkJywgJ3BlcnNvbklzU3Vic2NyaWJlcicsICdwZXJzb25UeXBlJywgJ3BlcnNvbk5hbWUnXSxcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUHJvZHVjdEJ5SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdD4ge1xuICAgIHJldHVybiB0aGlzLnByb2R1Y3RSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpZWxkczogWydpZCcsICdza3UnLCAnRUFOJywgJ25hbWUnLCAnYnJhbmQnXSxcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVXaXNobGlzdExvZyh0eXBlOiBXaXNobGlzdExvZ1R5cGUsIHdpc2hsaXN0OiBXaXNobGlzdCwgcHJvZHVjdD86IFByb2R1Y3QpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkNSRUFURTpcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLlVQREFURTpcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkRFTEVURTpcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdE9wZXJhdGlvbkxvZyh0eXBlLCB3aXNobGlzdClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBXaXNobGlzdExvZ1R5cGUuQUREX1BST0RVQ1Q6XG4gICAgICBjYXNlIFdpc2hsaXN0TG9nVHlwZS5SRU1PVkVfUFJPRFVDVDpcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdFByb2R1Y3RMb2codHlwZSwgd2lzaGxpc3QsIHByb2R1Y3QpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVXaXNobGlzdE9wZXJhdGlvbkxvZyh0eXBlOiBXaXNobGlzdExvZ1R5cGUsIHdpc2hsaXN0OiBXaXNobGlzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZ2V0T3BlcmF0aW9uVHlwZUZyb21XaXNobGlzdExvZ1R5cGUodHlwZSlcblxuICAgIGF3YWl0IHRoaXMubG9nUmVwb3NpdG9yeS5jcmVhdGUoe1xuICAgICAgY29sbGVjdGlvbjogJ3dpc2hsaXN0JyxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICBvcGVyYXRpb24sXG4gICAgICBkb2N1bWVudElkOiB3aXNobGlzdC5pZCxcbiAgICAgIGRvY3VtZW50OiB0aGlzLmJ1aWxkV2lzaGxpc3RMb2dEb2N1bWVudCh3aXNobGlzdCwgdHlwZSksXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlV2lzaGxpc3RQcm9kdWN0TG9nKHR5cGU6IFdpc2hsaXN0TG9nVHlwZSwgd2lzaGxpc3Q6IFdpc2hsaXN0LCBwcm9kdWN0OiBQcm9kdWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2dSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICBjb2xsZWN0aW9uOiAnd2lzaGxpc3QnLFxuICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIG9wZXJhdGlvbjogJ1VQREFURScsXG4gICAgICBkb2N1bWVudElkOiB3aXNobGlzdC5pZCxcbiAgICAgIGRvY3VtZW50OiB7XG4gICAgICAgIC4uLnRoaXMuYnVpbGRXaXNobGlzdExvZ0RvY3VtZW50KHdpc2hsaXN0LCB0eXBlKSxcbiAgICAgICAgLi4udGhpcy5idWlsZFByb2R1Y3RMb2dEYXRhKHByb2R1Y3QpLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcGVyYXRpb25UeXBlRnJvbVdpc2hsaXN0TG9nVHlwZSh0eXBlOiBXaXNobGlzdExvZ1R5cGUpOiAnQ1JFQVRFJyB8ICdVUERBVEUnIHwgJ0RFTEVURScge1xuICAgIGlmICh0eXBlID09PSBXaXNobGlzdExvZ1R5cGUuQ1JFQVRFKSByZXR1cm4gJ0NSRUFURSdcblxuICAgIGlmICh0eXBlID09PSBXaXNobGlzdExvZ1R5cGUuVVBEQVRFKSByZXR1cm4gJ1VQREFURSdcblxuICAgIHJldHVybiAnREVMRVRFJ1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdpc2hsaXN0TG9nRG9jdW1lbnQod2lzaGxpc3Q6IFdpc2hsaXN0LCB0eXBlOiBXaXNobGlzdExvZ1R5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHdpc2hsaXN0LmlkLFxuICAgICAgc2hvcDogdGhpcy5zaG9wLFxuICAgICAgbmFtZTogd2lzaGxpc3QubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB3aXNobGlzdC5kZXNjcmlwdGlvbixcbiAgICAgIHB1Ymxpc2hlZDogd2lzaGxpc3QucHVibGlzaGVkLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHBlcnNvblR5cGU6IHdpc2hsaXN0LnBlcnNvblR5cGUsXG4gICAgICBwZXJzb25JZDogd2lzaGxpc3QucGVyc29uSWQsXG4gICAgICBwZXJzb25OYW1lOiB3aXNobGlzdC5wZXJzb25OYW1lLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiB3aXNobGlzdC5wZXJzb25Jc1N1YnNjcmliZXIsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFByb2R1Y3RMb2dEYXRhKHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LmlkLFxuICAgICAgcHJvZHVjdEVBTjogcHJvZHVjdC5FQU4sXG4gICAgICBwcm9kdWN0U0tVOiBwcm9kdWN0LnNrdSxcbiAgICAgIHByb2R1Y3ROYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICBwcm9kdWN0QnJhbmQ6IHByb2R1Y3QuYnJhbmQsXG4gICAgfVxuICB9XG59XG4iXX0=
|