itd-api 0.8.0 → 0.9.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/README.md +63 -18
- package/dist/events/index.cjs +3 -3
- package/dist/events/index.d.cts +2 -2
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.js +3 -3
- package/dist/index.cjs +26 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +5 -4
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -2
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +4 -3
- package/dist/node/index.js.map +1 -1
- package/dist/rest/index.cjs +16 -4
- package/dist/rest/index.cjs.map +1 -1
- package/dist/rest/index.d.cts +5 -3
- package/dist/rest/index.d.ts +5 -3
- package/dist/rest/index.js +9 -5
- package/dist/rest/index.js.map +1 -1
- package/dist/shared/{events-TfhKh26b.js → events-C5wnTXPT.js} +3 -3
- package/dist/shared/{events-TfhKh26b.js.map → events-C5wnTXPT.js.map} +1 -1
- package/dist/shared/{events-QyhQZrnC.d.ts → events-CqtkP65d.d.ts} +2 -2
- package/dist/shared/{events-Br2r7coi.d.cts → events-DGAWlCaI.d.cts} +2 -2
- package/dist/shared/{events-iTteVsd_.cjs → events-FZfnEez0.cjs} +3 -3
- package/dist/shared/{events-iTteVsd_.cjs.map → events-FZfnEez0.cjs.map} +1 -1
- package/dist/shared/{storage-BLmXmzKF.cjs → key-value-store-B5GYVEYZ.cjs} +1 -85
- package/dist/shared/key-value-store-B5GYVEYZ.cjs.map +1 -0
- package/dist/shared/{storage-CCxn0Kkv.js → key-value-store-Bt2PSMxY.js} +2 -68
- package/dist/shared/key-value-store-Bt2PSMxY.js.map +1 -0
- package/dist/shared/key-value-store-COZaNHZS.d.cts +69 -0
- package/dist/shared/key-value-store-COZaNHZS.d.ts +69 -0
- package/dist/shared/{multi-storage-DccjD7Ww.d.ts → multi-storage-BEL7tcKn.d.cts} +3 -2
- package/dist/shared/{multi-storage-CCUgkqvI.cjs → multi-storage-CDKLa956.cjs} +8 -7
- package/dist/shared/{multi-storage-CCUgkqvI.cjs.map → multi-storage-CDKLa956.cjs.map} +1 -1
- package/dist/shared/{multi-storage-CjAPB5Kq.d.cts → multi-storage-LkljOSzA.d.ts} +3 -2
- package/dist/shared/{multi-storage-1AEZTczk.js → multi-storage-SoW05uzO.js} +4 -3
- package/dist/shared/{multi-storage-1AEZTczk.js.map → multi-storage-SoW05uzO.js.map} +1 -1
- package/dist/shared/{options-BUfoHE9G.cjs → options-DOJYtoti.cjs} +2 -2
- package/dist/shared/{options-BUfoHE9G.cjs.map → options-DOJYtoti.cjs.map} +1 -1
- package/dist/shared/{options-BNP633A5.js → options-DhgGg7Ms.js} +2 -2
- package/dist/shared/{options-BNP633A5.js.map → options-DhgGg7Ms.js.map} +1 -1
- package/dist/shared/{redact-DB9EMGJx.cjs → redact-BP00URmQ.cjs} +15 -4
- package/dist/shared/{redact-DB9EMGJx.cjs.map → redact-BP00URmQ.cjs.map} +1 -1
- package/dist/shared/{redact-FNK29Fv-.js → redact-Ba5iSVYZ.js} +15 -4
- package/dist/shared/{redact-FNK29Fv-.js.map → redact-Ba5iSVYZ.js.map} +1 -1
- package/dist/shared/{render-DVB7T8pm.d.ts → render-B4qis7Sb.d.ts} +348 -3
- package/dist/shared/{render-BszcKF7S.d.cts → render-DDwy2Ame.d.cts} +348 -3
- package/dist/shared/{render-DNTESBSl.cjs → render-Dqi8Owqk.cjs} +457 -4
- package/dist/shared/render-Dqi8Owqk.cjs.map +1 -0
- package/dist/shared/{render-CiL1VS0b.js → render-hiWFh2s4.js} +411 -6
- package/dist/shared/render-hiWFh2s4.js.map +1 -0
- package/dist/shared/storage-BQrtKon9.d.cts +86 -0
- package/dist/shared/storage-CTRGT5wF.d.ts +86 -0
- package/dist/shared/storage-CfHKzVHf.js +71 -0
- package/dist/shared/storage-CfHKzVHf.js.map +1 -0
- package/dist/shared/storage-QNVxzpDB.cjs +88 -0
- package/dist/shared/storage-QNVxzpDB.cjs.map +1 -0
- package/dist/shared/{url-CFN1sT9S.cjs → url-Bsb3xE5U.cjs} +83 -4
- package/dist/shared/{url-CFN1sT9S.cjs.map → url-Bsb3xE5U.cjs.map} +1 -1
- package/dist/shared/{url-B3ocFlHj.js → url-DP33mp3s.js} +78 -5
- package/dist/shared/{url-B3ocFlHj.js.map → url-DP33mp3s.js.map} +1 -1
- package/dist/shared/{url-Be9jlWRv.d.ts → url-XBsMdAcv.d.cts} +75 -2
- package/dist/shared/{url-Be9jlWRv.d.cts → url-XBsMdAcv.d.ts} +75 -2
- package/dist/web/index.cjs +4 -3
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.js +2 -1
- package/dist/web/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/shared/render-CiL1VS0b.js.map +0 -1
- package/dist/shared/render-DNTESBSl.cjs.map +0 -1
- package/dist/shared/storage-BLmXmzKF.cjs.map +0 -1
- package/dist/shared/storage-CCxn0Kkv.js.map +0 -1
- package/dist/shared/storage-C_eICCep.d.cts +0 -152
- package/dist/shared/storage-C_eICCep.d.ts +0 -152
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
const require_url = require("./url-
|
|
1
|
+
const require_url = require("./url-Bsb3xE5U.cjs");
|
|
2
2
|
const require_errors = require("./errors-BmP3TKoW.cjs");
|
|
3
|
-
const require_redact = require("./redact-
|
|
4
|
-
const require_options = require("./options-
|
|
3
|
+
const require_redact = require("./redact-BP00URmQ.cjs");
|
|
4
|
+
const require_options = require("./options-DOJYtoti.cjs");
|
|
5
|
+
const require_key_value_store = require("./key-value-store-B5GYVEYZ.cjs");
|
|
5
6
|
//#region src/core/feature-catalog.ts
|
|
6
7
|
/**
|
|
7
8
|
* Изменяемый слой над каталогом конкретного API.
|
|
@@ -3531,6 +3532,195 @@ var SearchResource = class extends BaseResource {
|
|
|
3531
3532
|
}
|
|
3532
3533
|
};
|
|
3533
3534
|
//#endregion
|
|
3535
|
+
//#region src/resources/shop.ts
|
|
3536
|
+
const PRODUCTS_LIST = require_url.passthroughOperation("shop.products.list");
|
|
3537
|
+
const PRODUCTS_GET = require_url.passthroughOperation("shop.products.get");
|
|
3538
|
+
const DELIVERY_COUNTRIES = require_url.passthroughOperation("shop.delivery.countries");
|
|
3539
|
+
const DELIVERY_CITIES = require_url.passthroughOperation("shop.delivery.cities");
|
|
3540
|
+
const DELIVERY_POINTS = require_url.passthroughOperation("shop.delivery.points");
|
|
3541
|
+
const DELIVERY_CALCULATE = require_url.passthroughOperation("shop.delivery.calculate");
|
|
3542
|
+
const ORDERS_CREATE = require_url.passthroughOperation("shop.orders.create");
|
|
3543
|
+
const ORDERS_LIST = require_url.passthroughOperation("shop.orders.list");
|
|
3544
|
+
const ORDERS_GET = require_url.passthroughOperation("shop.orders.get");
|
|
3545
|
+
const ORDERS_PAY = require_url.passthroughOperation("shop.orders.pay");
|
|
3546
|
+
const ORDERS_REQUEST_ACCESS_CODE = require_url.voidOperation("shop.orders.requestAccessCode");
|
|
3547
|
+
const ORDERS_VERIFY_ACCESS_CODE = require_url.passthroughOperation("shop.orders.verifyAccessCode");
|
|
3548
|
+
const CONSENTS_RECORD = require_url.voidOperation("shop.consents.record");
|
|
3549
|
+
function orderRequestOptions(options) {
|
|
3550
|
+
const { orderAccessToken, useItdAuth, headers, ...request } = options;
|
|
3551
|
+
return {
|
|
3552
|
+
...request,
|
|
3553
|
+
...useItdAuth === false ? { skipAuth: true } : {},
|
|
3554
|
+
headers: {
|
|
3555
|
+
...headers,
|
|
3556
|
+
...orderAccessToken ? { "X-Order-Token": orderAccessToken } : {}
|
|
3557
|
+
}
|
|
3558
|
+
};
|
|
3559
|
+
}
|
|
3560
|
+
/** Каталог товаров магазина. */
|
|
3561
|
+
var ShopProductsResource = class extends BaseResource {
|
|
3562
|
+
/** Загружает все товары. */
|
|
3563
|
+
list(options = {}) {
|
|
3564
|
+
return this.http.execute(PRODUCTS_LIST, {
|
|
3565
|
+
path: "/api/v1/shop/products",
|
|
3566
|
+
raw: true,
|
|
3567
|
+
...options
|
|
3568
|
+
});
|
|
3569
|
+
}
|
|
3570
|
+
/** Загружает товар по идентификатору. */
|
|
3571
|
+
async get(productId, options = {}) {
|
|
3572
|
+
try {
|
|
3573
|
+
return await this.http.execute(PRODUCTS_GET, {
|
|
3574
|
+
path: `/api/v1/shop/products/${require_redact.encodePathSegment(productId, "идентификатор товара")}`,
|
|
3575
|
+
raw: true,
|
|
3576
|
+
...options
|
|
3577
|
+
});
|
|
3578
|
+
} catch (error) {
|
|
3579
|
+
if (require_errors.isItdApiError(error) && error.status === 404) return null;
|
|
3580
|
+
throw error;
|
|
3581
|
+
}
|
|
3582
|
+
}
|
|
3583
|
+
};
|
|
3584
|
+
/** Расчёт и выбор доставки. */
|
|
3585
|
+
var ShopDeliveryResource = class extends BaseResource {
|
|
3586
|
+
/** Загружает страны, в которые доступна доставка. */
|
|
3587
|
+
countries(options = {}) {
|
|
3588
|
+
return this.http.execute(DELIVERY_COUNTRIES, {
|
|
3589
|
+
path: "/api/v1/shop/delivery/countries",
|
|
3590
|
+
raw: true,
|
|
3591
|
+
...options
|
|
3592
|
+
});
|
|
3593
|
+
}
|
|
3594
|
+
/** Ищет города службы доставки. */
|
|
3595
|
+
cities(query, countryCode, options = {}) {
|
|
3596
|
+
return this.http.execute(DELIVERY_CITIES, {
|
|
3597
|
+
path: "/api/v1/shop/delivery/cities",
|
|
3598
|
+
query: {
|
|
3599
|
+
q: query,
|
|
3600
|
+
country: countryCode
|
|
3601
|
+
},
|
|
3602
|
+
raw: true,
|
|
3603
|
+
...options
|
|
3604
|
+
});
|
|
3605
|
+
}
|
|
3606
|
+
/** Загружает пункты выдачи в городе. */
|
|
3607
|
+
points(cityCode, options = {}) {
|
|
3608
|
+
return this.http.execute(DELIVERY_POINTS, {
|
|
3609
|
+
path: "/api/v1/shop/delivery/points",
|
|
3610
|
+
query: { cityCode },
|
|
3611
|
+
raw: true,
|
|
3612
|
+
...options
|
|
3613
|
+
});
|
|
3614
|
+
}
|
|
3615
|
+
/** Рассчитывает стоимость и срок доставки. */
|
|
3616
|
+
calculate(items, destination, options = {}) {
|
|
3617
|
+
return this.http.execute(DELIVERY_CALCULATE, {
|
|
3618
|
+
path: "/api/v1/shop/delivery/calculate",
|
|
3619
|
+
body: {
|
|
3620
|
+
items,
|
|
3621
|
+
to: destination
|
|
3622
|
+
},
|
|
3623
|
+
raw: true,
|
|
3624
|
+
...options
|
|
3625
|
+
});
|
|
3626
|
+
}
|
|
3627
|
+
};
|
|
3628
|
+
/** Создание, просмотр и оплата заказов. */
|
|
3629
|
+
var ShopOrdersResource = class extends BaseResource {
|
|
3630
|
+
/** Создаёт заказ. */
|
|
3631
|
+
create(input, options = {}) {
|
|
3632
|
+
const { idempotencyKey = require_redact.createDeviceId(), headers, ...request } = options;
|
|
3633
|
+
return this.http.execute(ORDERS_CREATE, {
|
|
3634
|
+
path: "/api/v1/shop/orders",
|
|
3635
|
+
body: input,
|
|
3636
|
+
headers: {
|
|
3637
|
+
...headers,
|
|
3638
|
+
"Idempotency-Key": idempotencyKey
|
|
3639
|
+
},
|
|
3640
|
+
raw: true,
|
|
3641
|
+
...request
|
|
3642
|
+
});
|
|
3643
|
+
}
|
|
3644
|
+
/** Загружает заказы аккаунта ИТД или владельца временного токена. */
|
|
3645
|
+
list(options = {}) {
|
|
3646
|
+
return this.http.execute(ORDERS_LIST, {
|
|
3647
|
+
path: "/api/v1/shop/orders/my",
|
|
3648
|
+
raw: true,
|
|
3649
|
+
...orderRequestOptions(options)
|
|
3650
|
+
});
|
|
3651
|
+
}
|
|
3652
|
+
/** Загружает заказ по номеру. */
|
|
3653
|
+
get(orderNumber, options = {}) {
|
|
3654
|
+
return this.http.execute(ORDERS_GET, {
|
|
3655
|
+
path: `/api/v1/shop/orders/${require_redact.encodePathSegment(orderNumber, "номер заказа")}`,
|
|
3656
|
+
raw: true,
|
|
3657
|
+
...orderRequestOptions(options)
|
|
3658
|
+
});
|
|
3659
|
+
}
|
|
3660
|
+
/** Создаёт ссылку на оплату заказа. */
|
|
3661
|
+
pay(orderNumber, options) {
|
|
3662
|
+
const { returnUrl, ...access } = options;
|
|
3663
|
+
return this.http.execute(ORDERS_PAY, {
|
|
3664
|
+
path: `/api/v1/shop/orders/${require_redact.encodePathSegment(orderNumber, "номер заказа")}/pay`,
|
|
3665
|
+
body: { returnUrl },
|
|
3666
|
+
raw: true,
|
|
3667
|
+
...orderRequestOptions(access)
|
|
3668
|
+
});
|
|
3669
|
+
}
|
|
3670
|
+
/** Отправляет на почту код доступа к гостевым заказам. */
|
|
3671
|
+
requestAccessCode(email, options = {}) {
|
|
3672
|
+
return this.http.execute(ORDERS_REQUEST_ACCESS_CODE, {
|
|
3673
|
+
path: "/api/v1/shop/orders/lookup/request",
|
|
3674
|
+
body: { email },
|
|
3675
|
+
raw: true,
|
|
3676
|
+
skipAuth: true,
|
|
3677
|
+
...options
|
|
3678
|
+
});
|
|
3679
|
+
}
|
|
3680
|
+
/** Проверяет код из письма и возвращает временный токен заказов. */
|
|
3681
|
+
verifyAccessCode(email, code, options = {}) {
|
|
3682
|
+
return this.http.execute(ORDERS_VERIFY_ACCESS_CODE, {
|
|
3683
|
+
path: "/api/v1/shop/orders/lookup/verify",
|
|
3684
|
+
body: {
|
|
3685
|
+
email,
|
|
3686
|
+
code
|
|
3687
|
+
},
|
|
3688
|
+
raw: true,
|
|
3689
|
+
skipAuth: true,
|
|
3690
|
+
...options
|
|
3691
|
+
});
|
|
3692
|
+
}
|
|
3693
|
+
};
|
|
3694
|
+
/** Запись согласий магазина. */
|
|
3695
|
+
var ShopConsentsResource = class extends BaseResource {
|
|
3696
|
+
/** Записывает согласия покупателя. */
|
|
3697
|
+
record(consents, consentContext, options = {}) {
|
|
3698
|
+
return this.http.execute(CONSENTS_RECORD, {
|
|
3699
|
+
path: "/api/v1/shop/consents",
|
|
3700
|
+
body: {
|
|
3701
|
+
consents,
|
|
3702
|
+
consentContext
|
|
3703
|
+
},
|
|
3704
|
+
raw: true,
|
|
3705
|
+
...options
|
|
3706
|
+
});
|
|
3707
|
+
}
|
|
3708
|
+
};
|
|
3709
|
+
/** Магазин ИТД. */
|
|
3710
|
+
var ShopResource = class {
|
|
3711
|
+
products;
|
|
3712
|
+
delivery;
|
|
3713
|
+
orders;
|
|
3714
|
+
consents;
|
|
3715
|
+
/** @internal */
|
|
3716
|
+
constructor(http) {
|
|
3717
|
+
this.products = new ShopProductsResource(http);
|
|
3718
|
+
this.delivery = new ShopDeliveryResource(http);
|
|
3719
|
+
this.orders = new ShopOrdersResource(http);
|
|
3720
|
+
this.consents = new ShopConsentsResource(http);
|
|
3721
|
+
}
|
|
3722
|
+
};
|
|
3723
|
+
//#endregion
|
|
3534
3724
|
//#region src/resources/subscription.ts
|
|
3535
3725
|
const SUBSCRIPTION_METHODS = require_url.defineBuiltInOperation("subscription.methods", (body) => Array.isArray(body) ? body : []);
|
|
3536
3726
|
const SUBSCRIPTION_STATUS = require_url.passthroughOperation("subscription.status");
|
|
@@ -4282,6 +4472,7 @@ function createResources(deps) {
|
|
|
4282
4472
|
let subscription;
|
|
4283
4473
|
let platform;
|
|
4284
4474
|
let telemetry;
|
|
4475
|
+
let shop;
|
|
4285
4476
|
const bag = {
|
|
4286
4477
|
get users() {
|
|
4287
4478
|
users ??= new UsersResource(deps.http, { uploadFile });
|
|
@@ -4331,6 +4522,10 @@ function createResources(deps) {
|
|
|
4331
4522
|
telemetry ??= new TelemetryResource(deps.http);
|
|
4332
4523
|
return telemetry;
|
|
4333
4524
|
},
|
|
4525
|
+
get shop() {
|
|
4526
|
+
shop ??= new ShopResource(deps.http);
|
|
4527
|
+
return shop;
|
|
4528
|
+
},
|
|
4334
4529
|
closeTelemetry: (forDispose) => forDispose ? closeTelemetryForDispose(telemetry) : telemetry?.close() ?? Promise.resolve(),
|
|
4335
4530
|
prepareTelemetryClose: () => prepareTelemetryForDispose(telemetry)
|
|
4336
4531
|
};
|
|
@@ -4404,6 +4599,36 @@ function isMyProfile(profile) {
|
|
|
4404
4599
|
return "subscription" in profile;
|
|
4405
4600
|
}
|
|
4406
4601
|
//#endregion
|
|
4602
|
+
//#region src/models/shop.ts
|
|
4603
|
+
/** Категория товара магазина. */
|
|
4604
|
+
const ShopProductCategory = Object.freeze({
|
|
4605
|
+
Apparel: "apparel",
|
|
4606
|
+
Accessories: "accessories",
|
|
4607
|
+
Print: "print"
|
|
4608
|
+
});
|
|
4609
|
+
/** Состояние товара в каталоге. */
|
|
4610
|
+
const ShopProductStatus = Object.freeze({
|
|
4611
|
+
Available: "available",
|
|
4612
|
+
Preorder: "preorder",
|
|
4613
|
+
SoldOut: "soldout"
|
|
4614
|
+
});
|
|
4615
|
+
/** Вид согласия, которое принимает покупатель. */
|
|
4616
|
+
const ShopConsentKind = Object.freeze({
|
|
4617
|
+
Offer: "offer",
|
|
4618
|
+
PersonalData: "personal_data",
|
|
4619
|
+
Cookie: "cookie"
|
|
4620
|
+
});
|
|
4621
|
+
/** Состояние заказа. */
|
|
4622
|
+
const ShopOrderStatus = Object.freeze({
|
|
4623
|
+
New: "new",
|
|
4624
|
+
Paid: "paid",
|
|
4625
|
+
Shipping: "ship",
|
|
4626
|
+
Done: "done",
|
|
4627
|
+
Cancelled: "cancelled",
|
|
4628
|
+
Refunded: "refunded",
|
|
4629
|
+
Expired: "expired"
|
|
4630
|
+
});
|
|
4631
|
+
//#endregion
|
|
4407
4632
|
//#region src/models/status-helpers.ts
|
|
4408
4633
|
const STATUS_WINDOW_DAYS = 90;
|
|
4409
4634
|
/**
|
|
@@ -4425,6 +4650,186 @@ function statusDays(service) {
|
|
|
4425
4650
|
return Array.from({ length: STATUS_WINDOW_DAYS }, (_, index) => service.days[String(index)] ?? null);
|
|
4426
4651
|
}
|
|
4427
4652
|
//#endregion
|
|
4653
|
+
//#region src/shop/order-access.ts
|
|
4654
|
+
function copySession(session) {
|
|
4655
|
+
return { ...session };
|
|
4656
|
+
}
|
|
4657
|
+
/** Хранилище доступа к заказам в памяти процесса. */
|
|
4658
|
+
var MemoryShopOrderAccessStorage = class {
|
|
4659
|
+
#session;
|
|
4660
|
+
constructor(initial = null) {
|
|
4661
|
+
this.#session = initial ? copySession(initial) : null;
|
|
4662
|
+
}
|
|
4663
|
+
get() {
|
|
4664
|
+
return this.#session ? copySession(this.#session) : null;
|
|
4665
|
+
}
|
|
4666
|
+
set(session) {
|
|
4667
|
+
this.#session = copySession(session);
|
|
4668
|
+
}
|
|
4669
|
+
clear() {
|
|
4670
|
+
this.#session = null;
|
|
4671
|
+
}
|
|
4672
|
+
};
|
|
4673
|
+
/** Создаёт хранилище доступа к заказам поверх `KeyValueStore`. */
|
|
4674
|
+
function createShopOrderAccessStorage(store, options = {}) {
|
|
4675
|
+
const key = options.key ?? "shop-order-access";
|
|
4676
|
+
if (typeof key !== "string" || key.length === 0) throw new require_errors.ItdConfigError("ключ хранилища доступа к заказам должен быть непустой строкой");
|
|
4677
|
+
const backend = require_key_value_store.createKeyValueStore(store);
|
|
4678
|
+
return {
|
|
4679
|
+
async get() {
|
|
4680
|
+
const session = await backend.get(key);
|
|
4681
|
+
return session ? copySession(session) : null;
|
|
4682
|
+
},
|
|
4683
|
+
set: (session) => backend.set(key, copySession(session)),
|
|
4684
|
+
clear: () => backend.delete(key)
|
|
4685
|
+
};
|
|
4686
|
+
}
|
|
4687
|
+
/** Создаёт независимое хранилище доступа к заказам в памяти. */
|
|
4688
|
+
function createMemoryShopOrderAccessStorage() {
|
|
4689
|
+
return createShopOrderAccessStorage(new require_key_value_store.MemoryKeyValueStore());
|
|
4690
|
+
}
|
|
4691
|
+
//#endregion
|
|
4692
|
+
//#region src/shop/feature.ts
|
|
4693
|
+
const Operation = Object.freeze({
|
|
4694
|
+
RequestCode: "request-code",
|
|
4695
|
+
VerifyCode: "verify-code",
|
|
4696
|
+
List: "list",
|
|
4697
|
+
Get: "get",
|
|
4698
|
+
Pay: "pay"
|
|
4699
|
+
});
|
|
4700
|
+
function requireEmail(value) {
|
|
4701
|
+
const email = value.trim();
|
|
4702
|
+
if (!email?.includes("@")) throw new require_errors.ItdConfigError("укажите адрес почты");
|
|
4703
|
+
return email;
|
|
4704
|
+
}
|
|
4705
|
+
/** Создаёт подключаемый модуль для доступа к заказам по коду из письма. */
|
|
4706
|
+
function createShopFeature(options = {}) {
|
|
4707
|
+
return {
|
|
4708
|
+
name: "shop",
|
|
4709
|
+
buckets: {
|
|
4710
|
+
[Operation.RequestCode]: { limit: 4 },
|
|
4711
|
+
[Operation.VerifyCode]: { limit: 13 },
|
|
4712
|
+
[Operation.List]: { limit: 150 },
|
|
4713
|
+
[Operation.Get]: { limit: 150 },
|
|
4714
|
+
[Operation.Pay]: { limit: 13 }
|
|
4715
|
+
},
|
|
4716
|
+
operations: {
|
|
4717
|
+
[Operation.RequestCode]: {
|
|
4718
|
+
method: "POST",
|
|
4719
|
+
retrySafety: require_url.RetrySafety.Unsafe,
|
|
4720
|
+
read: require_url.voidResult,
|
|
4721
|
+
bucket: Operation.RequestCode
|
|
4722
|
+
},
|
|
4723
|
+
[Operation.VerifyCode]: {
|
|
4724
|
+
method: "POST",
|
|
4725
|
+
retrySafety: require_url.RetrySafety.Unsafe,
|
|
4726
|
+
bucket: Operation.VerifyCode
|
|
4727
|
+
},
|
|
4728
|
+
[Operation.List]: {
|
|
4729
|
+
method: "GET",
|
|
4730
|
+
retrySafety: require_url.RetrySafety.Safe,
|
|
4731
|
+
bucket: Operation.List
|
|
4732
|
+
},
|
|
4733
|
+
[Operation.Get]: {
|
|
4734
|
+
method: "GET",
|
|
4735
|
+
retrySafety: require_url.RetrySafety.Safe,
|
|
4736
|
+
bucket: Operation.Get
|
|
4737
|
+
},
|
|
4738
|
+
[Operation.Pay]: {
|
|
4739
|
+
method: "POST",
|
|
4740
|
+
retrySafety: require_url.RetrySafety.Unsafe,
|
|
4741
|
+
bucket: Operation.Pay
|
|
4742
|
+
}
|
|
4743
|
+
},
|
|
4744
|
+
setup(context) {
|
|
4745
|
+
const storage = options.storage ?? createMemoryShopOrderAccessStorage();
|
|
4746
|
+
let pendingEmail = null;
|
|
4747
|
+
const readSession = async () => {
|
|
4748
|
+
const session = await storage.get();
|
|
4749
|
+
if (!session) return null;
|
|
4750
|
+
if (session.expiresAt > context.clock.now()) return { ...session };
|
|
4751
|
+
await storage.clear();
|
|
4752
|
+
return null;
|
|
4753
|
+
};
|
|
4754
|
+
const requireSession = async () => {
|
|
4755
|
+
const session = await readSession();
|
|
4756
|
+
if (!session) throw new require_errors.ItdConfigError("доступ к заказам отсутствует или истёк; запросите новый код");
|
|
4757
|
+
return session;
|
|
4758
|
+
};
|
|
4759
|
+
const withAccess = async (run) => {
|
|
4760
|
+
const session = await requireSession();
|
|
4761
|
+
try {
|
|
4762
|
+
return await run(session.token);
|
|
4763
|
+
} catch (error) {
|
|
4764
|
+
if (require_errors.isItdApiError(error) && error.status === 401) await storage.clear();
|
|
4765
|
+
throw error;
|
|
4766
|
+
}
|
|
4767
|
+
};
|
|
4768
|
+
const request = (operation, token, requestOptions) => context.request(operation, {
|
|
4769
|
+
...requestOptions,
|
|
4770
|
+
headers: {
|
|
4771
|
+
...requestOptions.headers,
|
|
4772
|
+
"X-Order-Token": token
|
|
4773
|
+
},
|
|
4774
|
+
skipAuth: true,
|
|
4775
|
+
raw: true
|
|
4776
|
+
});
|
|
4777
|
+
return { api: Object.freeze({
|
|
4778
|
+
async requestCode(email, requestOptions = {}) {
|
|
4779
|
+
const normalized = requireEmail(email);
|
|
4780
|
+
await context.request(Operation.RequestCode, {
|
|
4781
|
+
path: "/api/v1/shop/orders/lookup/request",
|
|
4782
|
+
body: { email: normalized },
|
|
4783
|
+
skipAuth: true,
|
|
4784
|
+
raw: true,
|
|
4785
|
+
...requestOptions
|
|
4786
|
+
});
|
|
4787
|
+
pendingEmail = normalized;
|
|
4788
|
+
},
|
|
4789
|
+
async verifyCode(code, requestOptions = {}) {
|
|
4790
|
+
if (!pendingEmail) throw new require_errors.ItdConfigError("сначала запросите код для адреса почты");
|
|
4791
|
+
const verified = await context.request(Operation.VerifyCode, {
|
|
4792
|
+
path: "/api/v1/shop/orders/lookup/verify",
|
|
4793
|
+
body: {
|
|
4794
|
+
email: pendingEmail,
|
|
4795
|
+
code
|
|
4796
|
+
},
|
|
4797
|
+
skipAuth: true,
|
|
4798
|
+
raw: true,
|
|
4799
|
+
...requestOptions
|
|
4800
|
+
});
|
|
4801
|
+
const session = {
|
|
4802
|
+
email: pendingEmail,
|
|
4803
|
+
token: verified.token,
|
|
4804
|
+
expiresAt: context.clock.now() + verified.expiresInSec * 1e3
|
|
4805
|
+
};
|
|
4806
|
+
await storage.set(session);
|
|
4807
|
+
pendingEmail = null;
|
|
4808
|
+
return { ...session };
|
|
4809
|
+
},
|
|
4810
|
+
session: readSession,
|
|
4811
|
+
async clear() {
|
|
4812
|
+
pendingEmail = null;
|
|
4813
|
+
await storage.clear();
|
|
4814
|
+
},
|
|
4815
|
+
list: (requestOptions = {}) => withAccess((token) => request(Operation.List, token, {
|
|
4816
|
+
path: "/api/v1/shop/orders/my",
|
|
4817
|
+
...requestOptions
|
|
4818
|
+
})),
|
|
4819
|
+
get: (orderNumber, requestOptions = {}) => withAccess((token) => request(Operation.Get, token, {
|
|
4820
|
+
path: `/api/v1/shop/orders/${require_redact.encodePathSegment(orderNumber, "номер заказа")}`,
|
|
4821
|
+
...requestOptions
|
|
4822
|
+
})),
|
|
4823
|
+
pay: (orderNumber, returnUrl, requestOptions = {}) => withAccess((token) => request(Operation.Pay, token, {
|
|
4824
|
+
path: `/api/v1/shop/orders/${require_redact.encodePathSegment(orderNumber, "номер заказа")}/pay`,
|
|
4825
|
+
body: { returnUrl },
|
|
4826
|
+
...requestOptions
|
|
4827
|
+
}))
|
|
4828
|
+
}) };
|
|
4829
|
+
}
|
|
4830
|
+
};
|
|
4831
|
+
}
|
|
4832
|
+
//#endregion
|
|
4428
4833
|
//#region src/spans/render.ts
|
|
4429
4834
|
/** Формат результата {@link renderSpans}. */
|
|
4430
4835
|
const SpanRenderFormat = Object.freeze({
|
|
@@ -4657,6 +5062,12 @@ Object.defineProperty(exports, "IMAGE_MIME_TYPES", {
|
|
|
4657
5062
|
return IMAGE_MIME_TYPES;
|
|
4658
5063
|
}
|
|
4659
5064
|
});
|
|
5065
|
+
Object.defineProperty(exports, "MemoryShopOrderAccessStorage", {
|
|
5066
|
+
enumerable: true,
|
|
5067
|
+
get: function() {
|
|
5068
|
+
return MemoryShopOrderAccessStorage;
|
|
5069
|
+
}
|
|
5070
|
+
});
|
|
4660
5071
|
Object.defineProperty(exports, "NotificationsResource", {
|
|
4661
5072
|
enumerable: true,
|
|
4662
5073
|
get: function() {
|
|
@@ -4675,6 +5086,30 @@ Object.defineProperty(exports, "Paginator", {
|
|
|
4675
5086
|
return Paginator;
|
|
4676
5087
|
}
|
|
4677
5088
|
});
|
|
5089
|
+
Object.defineProperty(exports, "ShopConsentKind", {
|
|
5090
|
+
enumerable: true,
|
|
5091
|
+
get: function() {
|
|
5092
|
+
return ShopConsentKind;
|
|
5093
|
+
}
|
|
5094
|
+
});
|
|
5095
|
+
Object.defineProperty(exports, "ShopOrderStatus", {
|
|
5096
|
+
enumerable: true,
|
|
5097
|
+
get: function() {
|
|
5098
|
+
return ShopOrderStatus;
|
|
5099
|
+
}
|
|
5100
|
+
});
|
|
5101
|
+
Object.defineProperty(exports, "ShopProductCategory", {
|
|
5102
|
+
enumerable: true,
|
|
5103
|
+
get: function() {
|
|
5104
|
+
return ShopProductCategory;
|
|
5105
|
+
}
|
|
5106
|
+
});
|
|
5107
|
+
Object.defineProperty(exports, "ShopProductStatus", {
|
|
5108
|
+
enumerable: true,
|
|
5109
|
+
get: function() {
|
|
5110
|
+
return ShopProductStatus;
|
|
5111
|
+
}
|
|
5112
|
+
});
|
|
4678
5113
|
Object.defineProperty(exports, "SpanRenderFormat", {
|
|
4679
5114
|
enumerable: true,
|
|
4680
5115
|
get: function() {
|
|
@@ -4705,12 +5140,30 @@ Object.defineProperty(exports, "createFeatureHost", {
|
|
|
4705
5140
|
return createFeatureHost;
|
|
4706
5141
|
}
|
|
4707
5142
|
});
|
|
5143
|
+
Object.defineProperty(exports, "createMemoryShopOrderAccessStorage", {
|
|
5144
|
+
enumerable: true,
|
|
5145
|
+
get: function() {
|
|
5146
|
+
return createMemoryShopOrderAccessStorage;
|
|
5147
|
+
}
|
|
5148
|
+
});
|
|
4708
5149
|
Object.defineProperty(exports, "createResources", {
|
|
4709
5150
|
enumerable: true,
|
|
4710
5151
|
get: function() {
|
|
4711
5152
|
return createResources;
|
|
4712
5153
|
}
|
|
4713
5154
|
});
|
|
5155
|
+
Object.defineProperty(exports, "createShopFeature", {
|
|
5156
|
+
enumerable: true,
|
|
5157
|
+
get: function() {
|
|
5158
|
+
return createShopFeature;
|
|
5159
|
+
}
|
|
5160
|
+
});
|
|
5161
|
+
Object.defineProperty(exports, "createShopOrderAccessStorage", {
|
|
5162
|
+
enumerable: true,
|
|
5163
|
+
get: function() {
|
|
5164
|
+
return createShopOrderAccessStorage;
|
|
5165
|
+
}
|
|
5166
|
+
});
|
|
4714
5167
|
Object.defineProperty(exports, "createStatusFeature", {
|
|
4715
5168
|
enumerable: true,
|
|
4716
5169
|
get: function() {
|
|
@@ -4808,4 +5261,4 @@ Object.defineProperty(exports, "utcStampToIso", {
|
|
|
4808
5261
|
}
|
|
4809
5262
|
});
|
|
4810
5263
|
|
|
4811
|
-
//# sourceMappingURL=render-
|
|
5264
|
+
//# sourceMappingURL=render-Dqi8Owqk.cjs.map
|