@thorprovider/medusa-extended 1.11.7 → 1.11.9
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/dist/index.d.mts +123 -2
- package/dist/index.d.ts +123 -2
- package/dist/index.js +235 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +233 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +3 -0
- package/src/recovery.ts +328 -0
- package/src/request-resilience.ts +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
|
|
1
|
+
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse, TokenVerifyResult, RecoveryConfirmResult, SubmitApplicationBody, SubmitApplicationResult } from '@thorprovider/types';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview Medusa Multi-Tenant Admin Client
|
|
@@ -830,4 +830,125 @@ declare class DropshipperClient {
|
|
|
830
830
|
getGeoCities(code: string): Promise<GetGeoCitiesResponse>;
|
|
831
831
|
}
|
|
832
832
|
|
|
833
|
-
|
|
833
|
+
/**
|
|
834
|
+
* @fileoverview Recovery Client — Thor Commerce Extended
|
|
835
|
+
* @module @thorprovider/medusa-extended/recovery
|
|
836
|
+
*
|
|
837
|
+
* Public HTTP client for account-recovery flows (password reset + activation).
|
|
838
|
+
*
|
|
839
|
+
* Unlike `DropshipperClient`, this client does NOT require a JWT: it talks to
|
|
840
|
+
* public storefront endpoints so a user can recover access without being
|
|
841
|
+
* logged in. Backend URLs are owned here; the dashboard never builds them.
|
|
842
|
+
*
|
|
843
|
+
* Endpoints:
|
|
844
|
+
* - `POST /auth/user/emailpass/reset-password` (request reset, Medusa native)
|
|
845
|
+
* - `GET /store/dropshipper/auth/reset-password/verify` (verify reset token, no consume)
|
|
846
|
+
* - `POST /auth/user/emailpass/update` (confirm reset, consumes token)
|
|
847
|
+
* - `GET /store/dropshipper/applications/activate/verify`(verify activation token, no consume)
|
|
848
|
+
* - `POST /store/dropshipper/applications/activate` (confirm activation, consumes token)
|
|
849
|
+
* - `POST /public/dropshipper/applications` (submit application, no auth)
|
|
850
|
+
*
|
|
851
|
+
* Confirm methods follow the two-phase contract: verify (no consume) first,
|
|
852
|
+
* then confirm (atomic consume). A re-verify after a failed confirm maps the
|
|
853
|
+
* TOCTOU state (used/expired/revoked) into `RecoveryConfirmResult.status`.
|
|
854
|
+
*
|
|
855
|
+
* `submitApplication` returns a discriminated `SubmitApplicationResult` instead
|
|
856
|
+
* of throwing on 400/409/429 so the caller can surface the backend's structured
|
|
857
|
+
* payload (existing application on 409, retry window on 429). Network/5xx
|
|
858
|
+
* errors are re-thrown as `ProviderAPIError`.
|
|
859
|
+
*/
|
|
860
|
+
|
|
861
|
+
/**
|
|
862
|
+
* Configuration required to instantiate the recovery client.
|
|
863
|
+
*/
|
|
864
|
+
interface RecoveryClientConfig {
|
|
865
|
+
/** Medusa backend base URL */
|
|
866
|
+
baseUrl: string;
|
|
867
|
+
/** Enable debug logging */
|
|
868
|
+
debug?: boolean;
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* HTTP client for account-recovery endpoints (public, no auth required).
|
|
872
|
+
*
|
|
873
|
+
* All methods throw `ProviderAPIError` on non-2xx responses except the
|
|
874
|
+
* confirm methods, which normalize failures into `RecoveryConfirmResult`.
|
|
875
|
+
*
|
|
876
|
+
* @example
|
|
877
|
+
* ```typescript
|
|
878
|
+
* const client = new RecoveryClient({
|
|
879
|
+
* baseUrl: process.env.MEDUSA_BACKEND_URL!,
|
|
880
|
+
* });
|
|
881
|
+
*
|
|
882
|
+
* await client.requestUserPasswordReset('juan@ejemplo.com');
|
|
883
|
+
* const result = await client.verifyUserPasswordResetToken(token);
|
|
884
|
+
* const confirm = await client.confirmUserPasswordReset(token, 'NuevaClave1');
|
|
885
|
+
* ```
|
|
886
|
+
*/
|
|
887
|
+
declare class RecoveryClient {
|
|
888
|
+
private baseUrl;
|
|
889
|
+
private logger;
|
|
890
|
+
constructor(config: RecoveryClientConfig);
|
|
891
|
+
private request;
|
|
892
|
+
/**
|
|
893
|
+
* Decodes the `entity_id` (email) claim from a Medusa reset-password JWT.
|
|
894
|
+
*
|
|
895
|
+
* The JWT is unsigned-trust for this claim: the email is later sent to
|
|
896
|
+
* `POST /auth/user/emailpass/update`, where Medusa itself re-validates the
|
|
897
|
+
* token signature and payload before applying the change.
|
|
898
|
+
*/
|
|
899
|
+
private decodeResetTokenEmail;
|
|
900
|
+
/**
|
|
901
|
+
* Solicita un email de reset de contraseña para el actor `user`
|
|
902
|
+
* (dropshippers). El backend responde de forma uniforme exista o no la
|
|
903
|
+
* cuenta (anti enumeración).
|
|
904
|
+
*
|
|
905
|
+
* `POST /auth/user/emailpass/reset-password`
|
|
906
|
+
*/
|
|
907
|
+
requestUserPasswordReset(email: string): Promise<void>;
|
|
908
|
+
/**
|
|
909
|
+
* Verifica un token de reset de contraseña sin consumirlo. Devuelve el
|
|
910
|
+
* email enmascarado (p. ej. `j***@ejemplo.com`) solo cuando `status === 'valid'`.
|
|
911
|
+
*
|
|
912
|
+
* `GET /store/dropshipper/auth/reset-password/verify`
|
|
913
|
+
*/
|
|
914
|
+
verifyUserPasswordResetToken(token: string): Promise<TokenVerifyResult>;
|
|
915
|
+
/**
|
|
916
|
+
* Confirma el reset: re-verifica el token (sin consumir), luego consume el
|
|
917
|
+
* token vía `POST /auth/user/emailpass/update`. El email se deriva del
|
|
918
|
+
* propio JWT. Nunca devuelve auto-login: al éxito, la UI redirige a /login.
|
|
919
|
+
*/
|
|
920
|
+
confirmUserPasswordReset(token: string, password: string): Promise<RecoveryConfirmResult>;
|
|
921
|
+
/**
|
|
922
|
+
* Verifica un token de activación de cuenta dropshipper sin consumirlo.
|
|
923
|
+
*
|
|
924
|
+
* `GET /store/dropshipper/applications/activate/verify`
|
|
925
|
+
*/
|
|
926
|
+
verifyActivationToken(token: string): Promise<TokenVerifyResult>;
|
|
927
|
+
/**
|
|
928
|
+
* Activa la cuenta: re-verifica el token (sin consumir), luego consume el
|
|
929
|
+
* token vía `POST /store/dropshipper/applications/activate` y establece la
|
|
930
|
+
* contraseña inicial. Al éxito, la UI redirige a /login sin auto-login.
|
|
931
|
+
*/
|
|
932
|
+
activateAccount(token: string, password: string): Promise<RecoveryConfirmResult>;
|
|
933
|
+
/**
|
|
934
|
+
* Envía una solicitud de acceso dropshipper al endpoint público.
|
|
935
|
+
*
|
|
936
|
+
* `POST /public/dropshipper/applications`
|
|
937
|
+
*
|
|
938
|
+
* No requiere autenticación. Devuelve un resultado discriminado:
|
|
939
|
+
* - `{ ok: true }` → 201, solicitud creada (`application.number`).
|
|
940
|
+
* - `{ ok: false, reason: 'conflict' }` → 409, email ya registrado; la
|
|
941
|
+
* solicitud existente incluye `status_label`/`reason` para la UI.
|
|
942
|
+
* - `{ ok: false, reason: 'rate_limited' }` → 429, se respetó el límite del
|
|
943
|
+
* backend; `retryAfterSeconds` indica cuándo reintentar.
|
|
944
|
+
* - `{ ok: false, reason: 'invalid_data' }` → 400, validación del backend.
|
|
945
|
+
*
|
|
946
|
+
* Los errores de red/5xx se re-lanzan como `ProviderAPIError` para que el
|
|
947
|
+
* llamador los categorice (p. ej. con `parseError`). El 429 no se reintenta
|
|
948
|
+
* (`retryableStatusCodes` sin 429) para que el caller reciba de inmediato el
|
|
949
|
+
* `retry_after_seconds` del backend y pueda bloquear el envío.
|
|
950
|
+
*/
|
|
951
|
+
submitApplication(body: SubmitApplicationBody): Promise<SubmitApplicationResult>;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
export { type ChatStreamEvent, DropshipperClient, type DropshipperClientConfig, MedusaAdminClient, type MedusaAdminClientConfig, RecoveryClient, type RecoveryClientConfig };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
|
|
1
|
+
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse, TokenVerifyResult, RecoveryConfirmResult, SubmitApplicationBody, SubmitApplicationResult } from '@thorprovider/types';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview Medusa Multi-Tenant Admin Client
|
|
@@ -830,4 +830,125 @@ declare class DropshipperClient {
|
|
|
830
830
|
getGeoCities(code: string): Promise<GetGeoCitiesResponse>;
|
|
831
831
|
}
|
|
832
832
|
|
|
833
|
-
|
|
833
|
+
/**
|
|
834
|
+
* @fileoverview Recovery Client — Thor Commerce Extended
|
|
835
|
+
* @module @thorprovider/medusa-extended/recovery
|
|
836
|
+
*
|
|
837
|
+
* Public HTTP client for account-recovery flows (password reset + activation).
|
|
838
|
+
*
|
|
839
|
+
* Unlike `DropshipperClient`, this client does NOT require a JWT: it talks to
|
|
840
|
+
* public storefront endpoints so a user can recover access without being
|
|
841
|
+
* logged in. Backend URLs are owned here; the dashboard never builds them.
|
|
842
|
+
*
|
|
843
|
+
* Endpoints:
|
|
844
|
+
* - `POST /auth/user/emailpass/reset-password` (request reset, Medusa native)
|
|
845
|
+
* - `GET /store/dropshipper/auth/reset-password/verify` (verify reset token, no consume)
|
|
846
|
+
* - `POST /auth/user/emailpass/update` (confirm reset, consumes token)
|
|
847
|
+
* - `GET /store/dropshipper/applications/activate/verify`(verify activation token, no consume)
|
|
848
|
+
* - `POST /store/dropshipper/applications/activate` (confirm activation, consumes token)
|
|
849
|
+
* - `POST /public/dropshipper/applications` (submit application, no auth)
|
|
850
|
+
*
|
|
851
|
+
* Confirm methods follow the two-phase contract: verify (no consume) first,
|
|
852
|
+
* then confirm (atomic consume). A re-verify after a failed confirm maps the
|
|
853
|
+
* TOCTOU state (used/expired/revoked) into `RecoveryConfirmResult.status`.
|
|
854
|
+
*
|
|
855
|
+
* `submitApplication` returns a discriminated `SubmitApplicationResult` instead
|
|
856
|
+
* of throwing on 400/409/429 so the caller can surface the backend's structured
|
|
857
|
+
* payload (existing application on 409, retry window on 429). Network/5xx
|
|
858
|
+
* errors are re-thrown as `ProviderAPIError`.
|
|
859
|
+
*/
|
|
860
|
+
|
|
861
|
+
/**
|
|
862
|
+
* Configuration required to instantiate the recovery client.
|
|
863
|
+
*/
|
|
864
|
+
interface RecoveryClientConfig {
|
|
865
|
+
/** Medusa backend base URL */
|
|
866
|
+
baseUrl: string;
|
|
867
|
+
/** Enable debug logging */
|
|
868
|
+
debug?: boolean;
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* HTTP client for account-recovery endpoints (public, no auth required).
|
|
872
|
+
*
|
|
873
|
+
* All methods throw `ProviderAPIError` on non-2xx responses except the
|
|
874
|
+
* confirm methods, which normalize failures into `RecoveryConfirmResult`.
|
|
875
|
+
*
|
|
876
|
+
* @example
|
|
877
|
+
* ```typescript
|
|
878
|
+
* const client = new RecoveryClient({
|
|
879
|
+
* baseUrl: process.env.MEDUSA_BACKEND_URL!,
|
|
880
|
+
* });
|
|
881
|
+
*
|
|
882
|
+
* await client.requestUserPasswordReset('juan@ejemplo.com');
|
|
883
|
+
* const result = await client.verifyUserPasswordResetToken(token);
|
|
884
|
+
* const confirm = await client.confirmUserPasswordReset(token, 'NuevaClave1');
|
|
885
|
+
* ```
|
|
886
|
+
*/
|
|
887
|
+
declare class RecoveryClient {
|
|
888
|
+
private baseUrl;
|
|
889
|
+
private logger;
|
|
890
|
+
constructor(config: RecoveryClientConfig);
|
|
891
|
+
private request;
|
|
892
|
+
/**
|
|
893
|
+
* Decodes the `entity_id` (email) claim from a Medusa reset-password JWT.
|
|
894
|
+
*
|
|
895
|
+
* The JWT is unsigned-trust for this claim: the email is later sent to
|
|
896
|
+
* `POST /auth/user/emailpass/update`, where Medusa itself re-validates the
|
|
897
|
+
* token signature and payload before applying the change.
|
|
898
|
+
*/
|
|
899
|
+
private decodeResetTokenEmail;
|
|
900
|
+
/**
|
|
901
|
+
* Solicita un email de reset de contraseña para el actor `user`
|
|
902
|
+
* (dropshippers). El backend responde de forma uniforme exista o no la
|
|
903
|
+
* cuenta (anti enumeración).
|
|
904
|
+
*
|
|
905
|
+
* `POST /auth/user/emailpass/reset-password`
|
|
906
|
+
*/
|
|
907
|
+
requestUserPasswordReset(email: string): Promise<void>;
|
|
908
|
+
/**
|
|
909
|
+
* Verifica un token de reset de contraseña sin consumirlo. Devuelve el
|
|
910
|
+
* email enmascarado (p. ej. `j***@ejemplo.com`) solo cuando `status === 'valid'`.
|
|
911
|
+
*
|
|
912
|
+
* `GET /store/dropshipper/auth/reset-password/verify`
|
|
913
|
+
*/
|
|
914
|
+
verifyUserPasswordResetToken(token: string): Promise<TokenVerifyResult>;
|
|
915
|
+
/**
|
|
916
|
+
* Confirma el reset: re-verifica el token (sin consumir), luego consume el
|
|
917
|
+
* token vía `POST /auth/user/emailpass/update`. El email se deriva del
|
|
918
|
+
* propio JWT. Nunca devuelve auto-login: al éxito, la UI redirige a /login.
|
|
919
|
+
*/
|
|
920
|
+
confirmUserPasswordReset(token: string, password: string): Promise<RecoveryConfirmResult>;
|
|
921
|
+
/**
|
|
922
|
+
* Verifica un token de activación de cuenta dropshipper sin consumirlo.
|
|
923
|
+
*
|
|
924
|
+
* `GET /store/dropshipper/applications/activate/verify`
|
|
925
|
+
*/
|
|
926
|
+
verifyActivationToken(token: string): Promise<TokenVerifyResult>;
|
|
927
|
+
/**
|
|
928
|
+
* Activa la cuenta: re-verifica el token (sin consumir), luego consume el
|
|
929
|
+
* token vía `POST /store/dropshipper/applications/activate` y establece la
|
|
930
|
+
* contraseña inicial. Al éxito, la UI redirige a /login sin auto-login.
|
|
931
|
+
*/
|
|
932
|
+
activateAccount(token: string, password: string): Promise<RecoveryConfirmResult>;
|
|
933
|
+
/**
|
|
934
|
+
* Envía una solicitud de acceso dropshipper al endpoint público.
|
|
935
|
+
*
|
|
936
|
+
* `POST /public/dropshipper/applications`
|
|
937
|
+
*
|
|
938
|
+
* No requiere autenticación. Devuelve un resultado discriminado:
|
|
939
|
+
* - `{ ok: true }` → 201, solicitud creada (`application.number`).
|
|
940
|
+
* - `{ ok: false, reason: 'conflict' }` → 409, email ya registrado; la
|
|
941
|
+
* solicitud existente incluye `status_label`/`reason` para la UI.
|
|
942
|
+
* - `{ ok: false, reason: 'rate_limited' }` → 429, se respetó el límite del
|
|
943
|
+
* backend; `retryAfterSeconds` indica cuándo reintentar.
|
|
944
|
+
* - `{ ok: false, reason: 'invalid_data' }` → 400, validación del backend.
|
|
945
|
+
*
|
|
946
|
+
* Los errores de red/5xx se re-lanzan como `ProviderAPIError` para que el
|
|
947
|
+
* llamador los categorice (p. ej. con `parseError`). El 429 no se reintenta
|
|
948
|
+
* (`retryableStatusCodes` sin 429) para que el caller reciba de inmediato el
|
|
949
|
+
* `retry_after_seconds` del backend y pueda bloquear el envío.
|
|
950
|
+
*/
|
|
951
|
+
submitApplication(body: SubmitApplicationBody): Promise<SubmitApplicationResult>;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
export { type ChatStreamEvent, DropshipperClient, type DropshipperClientConfig, MedusaAdminClient, type MedusaAdminClientConfig, RecoveryClient, type RecoveryClientConfig };
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
23
|
DropshipperClient: () => DropshipperClient,
|
|
24
|
-
MedusaAdminClient: () => MedusaAdminClient
|
|
24
|
+
MedusaAdminClient: () => MedusaAdminClient,
|
|
25
|
+
RecoveryClient: () => RecoveryClient
|
|
25
26
|
});
|
|
26
27
|
module.exports = __toCommonJS(src_exports);
|
|
27
28
|
|
|
@@ -1900,9 +1901,241 @@ function mapUiMessageStreamToEvents(stream, logger) {
|
|
|
1900
1901
|
}
|
|
1901
1902
|
});
|
|
1902
1903
|
}
|
|
1904
|
+
|
|
1905
|
+
// src/recovery.ts
|
|
1906
|
+
var import_adapters4 = require("@thorprovider/adapters");
|
|
1907
|
+
var RecoveryClient = class {
|
|
1908
|
+
baseUrl;
|
|
1909
|
+
logger;
|
|
1910
|
+
constructor(config) {
|
|
1911
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
1912
|
+
this.logger = (0, import_adapters4.createLogger)("RecoveryClient", config.debug);
|
|
1913
|
+
}
|
|
1914
|
+
// -------------------------------------------------------------------------
|
|
1915
|
+
// Private — HTTP helper
|
|
1916
|
+
// -------------------------------------------------------------------------
|
|
1917
|
+
async request(method, path, body, retryConfig) {
|
|
1918
|
+
const url = `${this.baseUrl}${path}`;
|
|
1919
|
+
this.logger.debug(`[recovery] ${method} ${path}`);
|
|
1920
|
+
const headers = {
|
|
1921
|
+
"Content-Type": "application/json"
|
|
1922
|
+
};
|
|
1923
|
+
const init = {
|
|
1924
|
+
method,
|
|
1925
|
+
headers,
|
|
1926
|
+
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
1927
|
+
};
|
|
1928
|
+
let response;
|
|
1929
|
+
try {
|
|
1930
|
+
response = await fetchBackendWithResilience(url, init, retryConfig);
|
|
1931
|
+
} catch (networkError) {
|
|
1932
|
+
throw new import_adapters4.ProviderAPIError(
|
|
1933
|
+
`[recovery] Network error on ${method} ${path}: ${networkError.message}`,
|
|
1934
|
+
"NETWORK_ERROR",
|
|
1935
|
+
networkError
|
|
1936
|
+
);
|
|
1937
|
+
}
|
|
1938
|
+
if (!response.ok) {
|
|
1939
|
+
let message = `HTTP ${response.status}`;
|
|
1940
|
+
let details;
|
|
1941
|
+
try {
|
|
1942
|
+
const json = await response.json();
|
|
1943
|
+
message = json?.message ?? message;
|
|
1944
|
+
details = json && typeof json === "object" ? json : void 0;
|
|
1945
|
+
} catch {
|
|
1946
|
+
}
|
|
1947
|
+
throw new import_adapters4.ProviderAPIError(
|
|
1948
|
+
`[recovery] ${method} ${path} failed: ${message}`,
|
|
1949
|
+
`RECOVERY_API_${response.status}`,
|
|
1950
|
+
response.status,
|
|
1951
|
+
details
|
|
1952
|
+
);
|
|
1953
|
+
}
|
|
1954
|
+
return response.json();
|
|
1955
|
+
}
|
|
1956
|
+
// -------------------------------------------------------------------------
|
|
1957
|
+
// Private — reset token helpers
|
|
1958
|
+
// -------------------------------------------------------------------------
|
|
1959
|
+
/**
|
|
1960
|
+
* Decodes the `entity_id` (email) claim from a Medusa reset-password JWT.
|
|
1961
|
+
*
|
|
1962
|
+
* The JWT is unsigned-trust for this claim: the email is later sent to
|
|
1963
|
+
* `POST /auth/user/emailpass/update`, where Medusa itself re-validates the
|
|
1964
|
+
* token signature and payload before applying the change.
|
|
1965
|
+
*/
|
|
1966
|
+
decodeResetTokenEmail(token) {
|
|
1967
|
+
const parts = token.split(".");
|
|
1968
|
+
if (parts.length !== 3) return null;
|
|
1969
|
+
try {
|
|
1970
|
+
const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
|
|
1971
|
+
return typeof payload.entity_id === "string" && payload.entity_id.length > 0 ? payload.entity_id : null;
|
|
1972
|
+
} catch {
|
|
1973
|
+
return null;
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
// -------------------------------------------------------------------------
|
|
1977
|
+
// Password reset
|
|
1978
|
+
// -------------------------------------------------------------------------
|
|
1979
|
+
/**
|
|
1980
|
+
* Solicita un email de reset de contraseña para el actor `user`
|
|
1981
|
+
* (dropshippers). El backend responde de forma uniforme exista o no la
|
|
1982
|
+
* cuenta (anti enumeración).
|
|
1983
|
+
*
|
|
1984
|
+
* `POST /auth/user/emailpass/reset-password`
|
|
1985
|
+
*/
|
|
1986
|
+
async requestUserPasswordReset(email) {
|
|
1987
|
+
await this.request("POST", "/auth/user/emailpass/reset-password", {
|
|
1988
|
+
identifier: email
|
|
1989
|
+
});
|
|
1990
|
+
}
|
|
1991
|
+
/**
|
|
1992
|
+
* Verifica un token de reset de contraseña sin consumirlo. Devuelve el
|
|
1993
|
+
* email enmascarado (p. ej. `j***@ejemplo.com`) solo cuando `status === 'valid'`.
|
|
1994
|
+
*
|
|
1995
|
+
* `GET /store/dropshipper/auth/reset-password/verify`
|
|
1996
|
+
*/
|
|
1997
|
+
async verifyUserPasswordResetToken(token) {
|
|
1998
|
+
return this.request("GET", `/store/dropshipper/auth/reset-password/verify?token=${encodeURIComponent(token)}`);
|
|
1999
|
+
}
|
|
2000
|
+
/**
|
|
2001
|
+
* Confirma el reset: re-verifica el token (sin consumir), luego consume el
|
|
2002
|
+
* token vía `POST /auth/user/emailpass/update`. El email se deriva del
|
|
2003
|
+
* propio JWT. Nunca devuelve auto-login: al éxito, la UI redirige a /login.
|
|
2004
|
+
*/
|
|
2005
|
+
async confirmUserPasswordReset(token, password) {
|
|
2006
|
+
const verify = await this.verifyUserPasswordResetToken(token);
|
|
2007
|
+
if (verify.status !== "valid") {
|
|
2008
|
+
return { ok: false, status: verify.status };
|
|
2009
|
+
}
|
|
2010
|
+
const email = this.decodeResetTokenEmail(token);
|
|
2011
|
+
if (!email) {
|
|
2012
|
+
return { ok: false, status: "invalid" };
|
|
2013
|
+
}
|
|
2014
|
+
try {
|
|
2015
|
+
const headers = {
|
|
2016
|
+
Authorization: `Bearer ${token}`,
|
|
2017
|
+
"Content-Type": "application/json"
|
|
2018
|
+
};
|
|
2019
|
+
const response = await fetchBackendWithResilience(`${this.baseUrl}/auth/user/emailpass/update`, {
|
|
2020
|
+
method: "POST",
|
|
2021
|
+
headers,
|
|
2022
|
+
body: JSON.stringify({ email, password })
|
|
2023
|
+
});
|
|
2024
|
+
if (!response.ok) {
|
|
2025
|
+
throw new import_adapters4.ProviderAPIError(
|
|
2026
|
+
`[recovery] POST /auth/user/emailpass/update failed: HTTP ${response.status}`,
|
|
2027
|
+
"RECOVERY_API_" + response.status,
|
|
2028
|
+
response.status
|
|
2029
|
+
);
|
|
2030
|
+
}
|
|
2031
|
+
return { ok: true };
|
|
2032
|
+
} catch (error) {
|
|
2033
|
+
this.logger.warn("[recovery] confirmUserPasswordReset failed, re-verifying", error);
|
|
2034
|
+
try {
|
|
2035
|
+
const recheck = await this.verifyUserPasswordResetToken(token);
|
|
2036
|
+
return { ok: false, status: recheck.status };
|
|
2037
|
+
} catch {
|
|
2038
|
+
return { ok: false, status: "invalid" };
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
// -------------------------------------------------------------------------
|
|
2043
|
+
// Account activation
|
|
2044
|
+
// -------------------------------------------------------------------------
|
|
2045
|
+
/**
|
|
2046
|
+
* Verifica un token de activación de cuenta dropshipper sin consumirlo.
|
|
2047
|
+
*
|
|
2048
|
+
* `GET /store/dropshipper/applications/activate/verify`
|
|
2049
|
+
*/
|
|
2050
|
+
async verifyActivationToken(token) {
|
|
2051
|
+
return this.request("GET", `/store/dropshipper/applications/activate/verify?token=${encodeURIComponent(token)}`);
|
|
2052
|
+
}
|
|
2053
|
+
/**
|
|
2054
|
+
* Activa la cuenta: re-verifica el token (sin consumir), luego consume el
|
|
2055
|
+
* token vía `POST /store/dropshipper/applications/activate` y establece la
|
|
2056
|
+
* contraseña inicial. Al éxito, la UI redirige a /login sin auto-login.
|
|
2057
|
+
*/
|
|
2058
|
+
async activateAccount(token, password) {
|
|
2059
|
+
const verify = await this.verifyActivationToken(token);
|
|
2060
|
+
if (verify.status !== "valid") {
|
|
2061
|
+
return { ok: false, status: verify.status };
|
|
2062
|
+
}
|
|
2063
|
+
try {
|
|
2064
|
+
await this.request("POST", "/store/dropshipper/applications/activate", { token, password });
|
|
2065
|
+
return { ok: true };
|
|
2066
|
+
} catch (error) {
|
|
2067
|
+
this.logger.warn("[recovery] activateAccount failed, re-verifying", error);
|
|
2068
|
+
try {
|
|
2069
|
+
const recheck = await this.verifyActivationToken(token);
|
|
2070
|
+
return { ok: false, status: recheck.status };
|
|
2071
|
+
} catch {
|
|
2072
|
+
return { ok: false, status: "invalid" };
|
|
2073
|
+
}
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
// -------------------------------------------------------------------------
|
|
2077
|
+
// Dropshipper application submission
|
|
2078
|
+
// -------------------------------------------------------------------------
|
|
2079
|
+
/**
|
|
2080
|
+
* Envía una solicitud de acceso dropshipper al endpoint público.
|
|
2081
|
+
*
|
|
2082
|
+
* `POST /public/dropshipper/applications`
|
|
2083
|
+
*
|
|
2084
|
+
* No requiere autenticación. Devuelve un resultado discriminado:
|
|
2085
|
+
* - `{ ok: true }` → 201, solicitud creada (`application.number`).
|
|
2086
|
+
* - `{ ok: false, reason: 'conflict' }` → 409, email ya registrado; la
|
|
2087
|
+
* solicitud existente incluye `status_label`/`reason` para la UI.
|
|
2088
|
+
* - `{ ok: false, reason: 'rate_limited' }` → 429, se respetó el límite del
|
|
2089
|
+
* backend; `retryAfterSeconds` indica cuándo reintentar.
|
|
2090
|
+
* - `{ ok: false, reason: 'invalid_data' }` → 400, validación del backend.
|
|
2091
|
+
*
|
|
2092
|
+
* Los errores de red/5xx se re-lanzan como `ProviderAPIError` para que el
|
|
2093
|
+
* llamador los categorice (p. ej. con `parseError`). El 429 no se reintenta
|
|
2094
|
+
* (`retryableStatusCodes` sin 429) para que el caller reciba de inmediato el
|
|
2095
|
+
* `retry_after_seconds` del backend y pueda bloquear el envío.
|
|
2096
|
+
*/
|
|
2097
|
+
async submitApplication(body) {
|
|
2098
|
+
try {
|
|
2099
|
+
const response = await this.request(
|
|
2100
|
+
"POST",
|
|
2101
|
+
"/public/dropshipper/applications",
|
|
2102
|
+
body,
|
|
2103
|
+
{ retryableStatusCodes: [408, 500, 502, 503, 504] }
|
|
2104
|
+
);
|
|
2105
|
+
return { ok: true, application: response.application };
|
|
2106
|
+
} catch (error) {
|
|
2107
|
+
if (error instanceof import_adapters4.ProviderAPIError) {
|
|
2108
|
+
const details = error.details ?? {};
|
|
2109
|
+
if (error.status === 409 && details.application) {
|
|
2110
|
+
return {
|
|
2111
|
+
ok: false,
|
|
2112
|
+
reason: "conflict",
|
|
2113
|
+
application: details.application
|
|
2114
|
+
};
|
|
2115
|
+
}
|
|
2116
|
+
if (error.status === 429 && typeof details.retry_after_seconds === "number") {
|
|
2117
|
+
return {
|
|
2118
|
+
ok: false,
|
|
2119
|
+
reason: "rate_limited",
|
|
2120
|
+
retryAfterSeconds: details.retry_after_seconds
|
|
2121
|
+
};
|
|
2122
|
+
}
|
|
2123
|
+
if (error.status === 400) {
|
|
2124
|
+
return {
|
|
2125
|
+
ok: false,
|
|
2126
|
+
reason: "invalid_data",
|
|
2127
|
+
fields: details.fields
|
|
2128
|
+
};
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
throw error;
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
};
|
|
1903
2135
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1904
2136
|
0 && (module.exports = {
|
|
1905
2137
|
DropshipperClient,
|
|
1906
|
-
MedusaAdminClient
|
|
2138
|
+
MedusaAdminClient,
|
|
2139
|
+
RecoveryClient
|
|
1907
2140
|
});
|
|
1908
2141
|
//# sourceMappingURL=index.js.map
|