@unchainedshop/api 2.12.2 → 3.0.0-alpha2
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/lib/api-index.d.ts +13 -4
- package/lib/api-index.d.ts.map +1 -1
- package/lib/api-index.js +4 -5
- package/lib/api-index.js.map +1 -1
- package/lib/context.d.ts +14 -1
- package/lib/context.d.ts.map +1 -1
- package/lib/context.js +10 -9
- package/lib/context.js.map +1 -1
- package/lib/createGraphQLServer.d.ts +1 -2
- package/lib/createGraphQLServer.d.ts.map +1 -1
- package/lib/createGraphQLServer.js +22 -31
- package/lib/createGraphQLServer.js.map +1 -1
- package/lib/errors.d.ts +3 -6
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +6 -9
- package/lib/errors.js.map +1 -1
- package/lib/events.d.ts +5 -0
- package/lib/events.d.ts.map +1 -0
- package/lib/events.js +8 -0
- package/lib/events.js.map +1 -0
- package/lib/express/createBulkImportMiddleware.d.ts +6 -1
- package/lib/express/createBulkImportMiddleware.d.ts.map +1 -1
- package/lib/express/createBulkImportMiddleware.js +2 -3
- package/lib/express/createBulkImportMiddleware.js.map +1 -1
- package/lib/express/createERCMetadataMiddleware.d.ts +4 -1
- package/lib/express/createERCMetadataMiddleware.d.ts.map +1 -1
- package/lib/express/createERCMetadataMiddleware.js +1 -3
- package/lib/express/createERCMetadataMiddleware.js.map +1 -1
- package/lib/express/index.d.ts +7 -6
- package/lib/express/index.d.ts.map +1 -1
- package/lib/express/index.js +98 -13
- package/lib/express/index.js.map +1 -1
- package/lib/express/passport/access-token-strategy.d.ts +10 -0
- package/lib/express/passport/access-token-strategy.d.ts.map +1 -0
- package/lib/express/passport/access-token-strategy.js +33 -0
- package/lib/express/passport/access-token-strategy.js.map +1 -0
- package/lib/express/passport/setup.d.ts +4 -0
- package/lib/express/passport/setup.d.ts.map +1 -0
- package/lib/express/passport/setup.js +30 -0
- package/lib/express/passport/setup.js.map +1 -0
- package/lib/loaders/index.d.ts +1 -2
- package/lib/loaders/index.d.ts.map +1 -1
- package/lib/loaders/index.js +2 -2
- package/lib/loaders/index.js.map +1 -1
- package/lib/locale-context.d.ts +7 -4
- package/lib/locale-context.d.ts.map +1 -1
- package/lib/locale-context.js +22 -23
- package/lib/locale-context.js.map +1 -1
- package/lib/resolvers/index.d.ts.map +1 -1
- package/lib/resolvers/index.js +0 -2
- package/lib/resolvers/index.js.map +1 -1
- package/lib/resolvers/mutations/accounts/addEmail.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/addEmail.js +10 -2
- package/lib/resolvers/mutations/accounts/addEmail.js.map +1 -1
- package/lib/resolvers/mutations/accounts/addWebAuthnCredentials.js +1 -1
- package/lib/resolvers/mutations/accounts/addWebAuthnCredentials.js.map +1 -1
- package/lib/resolvers/mutations/accounts/changePassword.d.ts +2 -2
- package/lib/resolvers/mutations/accounts/changePassword.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/changePassword.js +13 -7
- package/lib/resolvers/mutations/accounts/changePassword.js.map +1 -1
- package/lib/resolvers/mutations/accounts/createUser.d.ts +2 -3
- package/lib/resolvers/mutations/accounts/createUser.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/createUser.js +21 -26
- package/lib/resolvers/mutations/accounts/createUser.js.map +1 -1
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialCreationOptions.d.ts +1 -1
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialCreationOptions.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialCreationOptions.js +2 -2
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialCreationOptions.js.map +1 -1
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialRequestOptions.d.ts +1 -1
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialRequestOptions.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialRequestOptions.js +3 -3
- package/lib/resolvers/mutations/accounts/createWebAuthnCredentialRequestOptions.js.map +1 -1
- package/lib/resolvers/mutations/accounts/enrollUser.d.ts +1 -1
- package/lib/resolvers/mutations/accounts/enrollUser.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/enrollUser.js +13 -16
- package/lib/resolvers/mutations/accounts/enrollUser.js.map +1 -1
- package/lib/resolvers/mutations/accounts/forgotPassword.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/forgotPassword.js +11 -8
- package/lib/resolvers/mutations/accounts/forgotPassword.js.map +1 -1
- package/lib/resolvers/mutations/accounts/loginAsGuest.d.ts +1 -2
- package/lib/resolvers/mutations/accounts/loginAsGuest.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/loginAsGuest.js +18 -3
- package/lib/resolvers/mutations/accounts/loginAsGuest.js.map +1 -1
- package/lib/resolvers/mutations/accounts/loginWithPassword.d.ts +2 -4
- package/lib/resolvers/mutations/accounts/loginWithPassword.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/loginWithPassword.js +23 -26
- package/lib/resolvers/mutations/accounts/loginWithPassword.js.map +1 -1
- package/lib/resolvers/mutations/accounts/loginWithWebAuthn.d.ts +1 -2
- package/lib/resolvers/mutations/accounts/loginWithWebAuthn.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/loginWithWebAuthn.js +13 -14
- package/lib/resolvers/mutations/accounts/loginWithWebAuthn.js.map +1 -1
- package/lib/resolvers/mutations/accounts/logout.d.ts +1 -3
- package/lib/resolvers/mutations/accounts/logout.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/logout.js +5 -18
- package/lib/resolvers/mutations/accounts/logout.js.map +1 -1
- package/lib/resolvers/mutations/accounts/removeEmail.js +1 -1
- package/lib/resolvers/mutations/accounts/removeEmail.js.map +1 -1
- package/lib/resolvers/mutations/accounts/resetPassword.d.ts +2 -3
- package/lib/resolvers/mutations/accounts/resetPassword.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/resetPassword.js +48 -43
- package/lib/resolvers/mutations/accounts/resetPassword.js.map +1 -1
- package/lib/resolvers/mutations/accounts/sendEnrollmentEmail.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/sendEnrollmentEmail.js +5 -1
- package/lib/resolvers/mutations/accounts/sendEnrollmentEmail.js.map +1 -1
- package/lib/resolvers/mutations/accounts/sendVerificationEmail.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/sendVerificationEmail.js +15 -4
- package/lib/resolvers/mutations/accounts/sendVerificationEmail.js.map +1 -1
- package/lib/resolvers/mutations/accounts/setPassword.d.ts +1 -1
- package/lib/resolvers/mutations/accounts/setPassword.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/setPassword.js +11 -3
- package/lib/resolvers/mutations/accounts/setPassword.js.map +1 -1
- package/lib/resolvers/mutations/accounts/setUsername.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/setUsername.js +10 -2
- package/lib/resolvers/mutations/accounts/setUsername.js.map +1 -1
- package/lib/resolvers/mutations/accounts/verifyEmail.d.ts +1 -2
- package/lib/resolvers/mutations/accounts/verifyEmail.d.ts.map +1 -1
- package/lib/resolvers/mutations/accounts/verifyEmail.js +14 -6
- package/lib/resolvers/mutations/accounts/verifyEmail.js.map +1 -1
- package/lib/resolvers/mutations/assortments/createAssortment.d.ts +5 -7
- package/lib/resolvers/mutations/assortments/createAssortment.d.ts.map +1 -1
- package/lib/resolvers/mutations/assortments/createAssortment.js +7 -5
- package/lib/resolvers/mutations/assortments/createAssortment.js.map +1 -1
- package/lib/resolvers/mutations/countries/updateCountry.d.ts +3 -1
- package/lib/resolvers/mutations/countries/updateCountry.d.ts.map +1 -1
- package/lib/resolvers/mutations/countries/updateCountry.js +5 -1
- package/lib/resolvers/mutations/countries/updateCountry.js.map +1 -1
- package/lib/resolvers/mutations/enrollments/createEnrollment.d.ts.map +1 -1
- package/lib/resolvers/mutations/enrollments/createEnrollment.js +2 -1
- package/lib/resolvers/mutations/enrollments/createEnrollment.js.map +1 -1
- package/lib/resolvers/mutations/filters/createFilter.d.ts +4 -5
- package/lib/resolvers/mutations/filters/createFilter.d.ts.map +1 -1
- package/lib/resolvers/mutations/filters/createFilter.js +7 -2
- package/lib/resolvers/mutations/filters/createFilter.js.map +1 -1
- package/lib/resolvers/mutations/filters/createFilterOption.d.ts +3 -4
- package/lib/resolvers/mutations/filters/createFilterOption.d.ts.map +1 -1
- package/lib/resolvers/mutations/filters/createFilterOption.js +5 -2
- package/lib/resolvers/mutations/filters/createFilterOption.js.map +1 -1
- package/lib/resolvers/mutations/index.d.ts +0 -12
- package/lib/resolvers/mutations/index.d.ts.map +1 -1
- package/lib/resolvers/mutations/index.js +0 -24
- package/lib/resolvers/mutations/index.js.map +1 -1
- package/lib/resolvers/mutations/orders/addCartDiscount.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/addCartDiscount.js +3 -1
- package/lib/resolvers/mutations/orders/addCartDiscount.js.map +1 -1
- package/lib/resolvers/mutations/orders/addCartProduct.js +1 -0
- package/lib/resolvers/mutations/orders/addCartProduct.js.map +1 -1
- package/lib/resolvers/mutations/orders/addCartQuotation.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/addCartQuotation.js +3 -1
- package/lib/resolvers/mutations/orders/addCartQuotation.js.map +1 -1
- package/lib/resolvers/mutations/orders/addMultipleCartProducts.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/addMultipleCartProducts.js +3 -1
- package/lib/resolvers/mutations/orders/addMultipleCartProducts.js.map +1 -1
- package/lib/resolvers/mutations/orders/emptyCart.js +2 -2
- package/lib/resolvers/mutations/orders/emptyCart.js.map +1 -1
- package/lib/resolvers/mutations/orders/removeCartDiscount.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/removeCartDiscount.js +3 -1
- package/lib/resolvers/mutations/orders/removeCartDiscount.js.map +1 -1
- package/lib/resolvers/mutations/orders/removeCartItem.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/removeCartItem.js +3 -1
- package/lib/resolvers/mutations/orders/removeCartItem.js.map +1 -1
- package/lib/resolvers/mutations/orders/setOrderDeliveryProvider.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/setOrderDeliveryProvider.js +2 -2
- package/lib/resolvers/mutations/orders/setOrderDeliveryProvider.js.map +1 -1
- package/lib/resolvers/mutations/orders/setOrderPaymentProvider.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/setOrderPaymentProvider.js +2 -1
- package/lib/resolvers/mutations/orders/setOrderPaymentProvider.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateCart.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/updateCart.js +5 -4
- package/lib/resolvers/mutations/orders/updateCart.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateCartItem.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/updateCartItem.js +3 -1
- package/lib/resolvers/mutations/orders/updateCartItem.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderDeliveryPickUp.js +6 -2
- package/lib/resolvers/mutations/orders/updateOrderDeliveryPickUp.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderDeliveryShipping.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderDeliveryShipping.js +8 -1
- package/lib/resolvers/mutations/orders/updateOrderDeliveryShipping.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentCard.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentCard.js +3 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentCard.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentGeneric.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentGeneric.js +3 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentGeneric.js.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentInvoice.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentInvoice.js +3 -1
- package/lib/resolvers/mutations/orders/updateOrderPaymentInvoice.js.map +1 -1
- package/lib/resolvers/mutations/products/createProduct.d.ts +5 -6
- package/lib/resolvers/mutations/products/createProduct.d.ts.map +1 -1
- package/lib/resolvers/mutations/products/createProduct.js +6 -5
- package/lib/resolvers/mutations/products/createProduct.js.map +1 -1
- package/lib/resolvers/mutations/products/createProductVariation.d.ts +3 -3
- package/lib/resolvers/mutations/products/createProductVariation.d.ts.map +1 -1
- package/lib/resolvers/mutations/products/createProductVariation.js +7 -4
- package/lib/resolvers/mutations/products/createProductVariation.js.map +1 -1
- package/lib/resolvers/mutations/products/createProductVariationOption.d.ts +4 -5
- package/lib/resolvers/mutations/products/createProductVariationOption.d.ts.map +1 -1
- package/lib/resolvers/mutations/products/createProductVariationOption.js +8 -5
- package/lib/resolvers/mutations/products/createProductVariationOption.js.map +1 -1
- package/lib/resolvers/mutations/warehousing/exportToken.d.ts.map +1 -1
- package/lib/resolvers/mutations/warehousing/exportToken.js +20 -20
- package/lib/resolvers/mutations/warehousing/exportToken.js.map +1 -1
- package/lib/resolvers/queries/events/events.js +1 -1
- package/lib/resolvers/queries/events/events.js.map +1 -1
- package/lib/resolvers/queries/index.d.ts +0 -2
- package/lib/resolvers/queries/index.d.ts.map +1 -1
- package/lib/resolvers/queries/index.js +0 -2
- package/lib/resolvers/queries/index.js.map +1 -1
- package/lib/resolvers/queries/shopInfo.d.ts +0 -2
- package/lib/resolvers/queries/shopInfo.d.ts.map +1 -1
- package/lib/resolvers/queries/shopInfo.js +0 -3
- package/lib/resolvers/queries/shopInfo.js.map +1 -1
- package/lib/resolvers/queries/users/validateResetPasswordToken.js +1 -1
- package/lib/resolvers/queries/users/validateResetPasswordToken.js.map +1 -1
- package/lib/resolvers/queries/users/validateVerifyEmailToken.js +1 -1
- package/lib/resolvers/queries/users/validateVerifyEmailToken.js.map +1 -1
- package/lib/resolvers/type/assortment/assortment-types.d.ts.map +1 -1
- package/lib/resolvers/type/assortment/assortment-types.js +1 -0
- package/lib/resolvers/type/assortment/assortment-types.js.map +1 -1
- package/lib/resolvers/type/country-types.js +2 -2
- package/lib/resolvers/type/country-types.js.map +1 -1
- package/lib/resolvers/type/delivery-provider-types.d.ts.map +1 -1
- package/lib/resolvers/type/delivery-provider-types.js +2 -5
- package/lib/resolvers/type/delivery-provider-types.js.map +1 -1
- package/lib/resolvers/type/event-types.d.ts +1 -1
- package/lib/resolvers/type/event-types.d.ts.map +1 -1
- package/lib/resolvers/type/index.d.ts +4 -36
- package/lib/resolvers/type/index.d.ts.map +1 -1
- package/lib/resolvers/type/index.js +2 -6
- package/lib/resolvers/type/index.js.map +1 -1
- package/lib/resolvers/type/login-method-response-types.d.ts +3 -27
- package/lib/resolvers/type/login-method-response-types.d.ts.map +1 -1
- package/lib/resolvers/type/login-method-response-types.js +1 -6
- package/lib/resolvers/type/login-method-response-types.js.map +1 -1
- package/lib/resolvers/type/payment/payment-provider-types.d.ts.map +1 -1
- package/lib/resolvers/type/payment/payment-provider-types.js +2 -5
- package/lib/resolvers/type/payment/payment-provider-types.js.map +1 -1
- package/lib/resolvers/type/product/product-bundle-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-configurable-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-configurable-types.js +2 -8
- package/lib/resolvers/type/product/product-configurable-types.js.map +1 -1
- package/lib/resolvers/type/product/product-plan-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-plan-types.js +4 -13
- package/lib/resolvers/type/product/product-plan-types.js.map +1 -1
- package/lib/resolvers/type/product/product-simple-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-tokenized-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-types.js +1 -0
- package/lib/resolvers/type/product/product-types.js.map +1 -1
- package/lib/resolvers/type/user-types.d.ts +1 -3
- package/lib/resolvers/type/user-types.d.ts.map +1 -1
- package/lib/resolvers/type/user-types.js +0 -14
- package/lib/resolvers/type/user-types.js.map +1 -1
- package/lib/resolvers/type/webauthn-credentials-types.js +1 -1
- package/lib/resolvers/type/webauthn-credentials-types.js.map +1 -1
- package/lib/roles/all.d.ts.map +1 -1
- package/lib/roles/all.js +1 -7
- package/lib/roles/all.js.map +1 -1
- package/lib/roles/index.d.ts.map +1 -1
- package/lib/roles/index.js +0 -6
- package/lib/roles/index.js.map +1 -1
- package/lib/roles/loggedIn.d.ts.map +1 -1
- package/lib/roles/loggedIn.js +0 -4
- package/lib/roles/loggedIn.js.map +1 -1
- package/lib/schema/directives.d.ts.map +1 -1
- package/lib/schema/directives.js +1 -5
- package/lib/schema/directives.js.map +1 -1
- package/lib/schema/inputTypes.d.ts.map +1 -1
- package/lib/schema/inputTypes.js +13 -26
- package/lib/schema/inputTypes.js.map +1 -1
- package/lib/schema/mutation.d.ts.map +1 -1
- package/lib/schema/mutation.js +24 -83
- package/lib/schema/mutation.js.map +1 -1
- package/lib/schema/query.d.ts.map +1 -1
- package/lib/schema/query.js +0 -4
- package/lib/schema/query.js.map +1 -1
- package/lib/schema/scalars.d.ts.map +1 -1
- package/lib/schema/scalars.js +0 -1
- package/lib/schema/scalars.js.map +1 -1
- package/lib/schema/types/product/product.js +1 -1
- package/lib/schema/types/product/tokenized-product.js +1 -1
- package/lib/schema/types/shop.d.ts.map +1 -1
- package/lib/schema/types/shop.js +0 -1
- package/lib/schema/types/shop.js.map +1 -1
- package/lib/schema/types/user.d.ts.map +1 -1
- package/lib/schema/types/user.js +2 -21
- package/lib/schema/types/user.js.map +1 -1
- package/package.json +23 -17
- package/src/api-index.ts +19 -14
- package/src/context.ts +23 -10
- package/src/createGraphQLServer.ts +25 -36
- package/src/errors.ts +15 -21
- package/src/events.ts +8 -0
- package/src/express/createBulkImportMiddleware.ts +9 -4
- package/src/express/createERCMetadataMiddleware.ts +6 -4
- package/src/express/index.ts +127 -21
- package/src/express/passport/access-token-strategy.ts +39 -0
- package/src/express/passport/setup.ts +44 -0
- package/src/loaders/index.ts +2 -8
- package/src/locale-context.ts +60 -52
- package/src/resolvers/index.ts +0 -2
- package/src/resolvers/mutations/accounts/addEmail.ts +7 -2
- package/src/resolvers/mutations/accounts/addWebAuthnCredentials.ts +1 -1
- package/src/resolvers/mutations/accounts/changePassword.ts +18 -8
- package/src/resolvers/mutations/accounts/createUser.ts +30 -37
- package/src/resolvers/mutations/accounts/createWebAuthnCredentialCreationOptions.ts +3 -3
- package/src/resolvers/mutations/accounts/createWebAuthnCredentialRequestOptions.ts +4 -4
- package/src/resolvers/mutations/accounts/enrollUser.ts +18 -17
- package/src/resolvers/mutations/accounts/forgotPassword.ts +11 -7
- package/src/resolvers/mutations/accounts/loginAsGuest.ts +23 -4
- package/src/resolvers/mutations/accounts/loginWithPassword.ts +33 -36
- package/src/resolvers/mutations/accounts/loginWithWebAuthn.ts +22 -15
- package/src/resolvers/mutations/accounts/logout.ts +5 -21
- package/src/resolvers/mutations/accounts/removeEmail.ts +1 -1
- package/src/resolvers/mutations/accounts/resetPassword.ts +50 -53
- package/src/resolvers/mutations/accounts/sendEnrollmentEmail.ts +5 -1
- package/src/resolvers/mutations/accounts/sendVerificationEmail.ts +13 -4
- package/src/resolvers/mutations/accounts/setPassword.ts +9 -4
- package/src/resolvers/mutations/accounts/setUsername.ts +8 -2
- package/src/resolvers/mutations/accounts/verifyEmail.ts +15 -6
- package/src/resolvers/mutations/assortments/createAssortment.ts +16 -7
- package/src/resolvers/mutations/countries/updateCountry.ts +7 -2
- package/src/resolvers/mutations/enrollments/createEnrollment.ts +2 -1
- package/src/resolvers/mutations/filters/createFilter.ts +8 -3
- package/src/resolvers/mutations/filters/createFilterOption.ts +9 -7
- package/src/resolvers/mutations/index.ts +0 -24
- package/src/resolvers/mutations/orders/addCartDiscount.ts +3 -1
- package/src/resolvers/mutations/orders/addCartProduct.ts +1 -1
- package/src/resolvers/mutations/orders/addCartQuotation.ts +3 -1
- package/src/resolvers/mutations/orders/addMultipleCartProducts.ts +23 -19
- package/src/resolvers/mutations/orders/emptyCart.ts +2 -2
- package/src/resolvers/mutations/orders/removeCartDiscount.ts +3 -1
- package/src/resolvers/mutations/orders/removeCartItem.ts +3 -1
- package/src/resolvers/mutations/orders/setOrderDeliveryProvider.ts +2 -3
- package/src/resolvers/mutations/orders/setOrderPaymentProvider.ts +2 -1
- package/src/resolvers/mutations/orders/updateCart.ts +5 -4
- package/src/resolvers/mutations/orders/updateCartItem.ts +3 -1
- package/src/resolvers/mutations/orders/updateOrderDeliveryPickUp.ts +7 -7
- package/src/resolvers/mutations/orders/updateOrderDeliveryShipping.ts +8 -1
- package/src/resolvers/mutations/orders/updateOrderPaymentCard.ts +3 -1
- package/src/resolvers/mutations/orders/updateOrderPaymentGeneric.ts +3 -1
- package/src/resolvers/mutations/orders/updateOrderPaymentInvoice.ts +3 -1
- package/src/resolvers/mutations/products/createProduct.ts +9 -7
- package/src/resolvers/mutations/products/createProductVariation.ts +11 -6
- package/src/resolvers/mutations/products/createProductVariationOption.ts +13 -6
- package/src/resolvers/mutations/warehousing/exportToken.ts +19 -20
- package/src/resolvers/queries/events/events.ts +1 -1
- package/src/resolvers/queries/index.ts +0 -2
- package/src/resolvers/queries/shopInfo.ts +0 -5
- package/src/resolvers/queries/users/validateResetPasswordToken.ts +1 -1
- package/src/resolvers/queries/users/validateVerifyEmailToken.ts +1 -1
- package/src/resolvers/type/assortment/assortment-types.ts +1 -0
- package/src/resolvers/type/country-types.ts +2 -2
- package/src/resolvers/type/delivery-provider-types.ts +2 -10
- package/src/resolvers/type/event-types.ts +1 -1
- package/src/resolvers/type/index.ts +2 -6
- package/src/resolvers/type/login-method-response-types.ts +1 -12
- package/src/resolvers/type/payment/payment-provider-types.ts +2 -9
- package/src/resolvers/type/product/product-configurable-types.ts +3 -16
- package/src/resolvers/type/product/product-plan-types.ts +5 -25
- package/src/resolvers/type/product/product-types.ts +1 -0
- package/src/resolvers/type/user-types.ts +1 -17
- package/src/resolvers/type/webauthn-credentials-types.ts +1 -1
- package/src/roles/all.ts +1 -7
- package/src/roles/index.ts +0 -6
- package/src/roles/loggedIn.ts +0 -4
- package/src/schema/directives.ts +1 -5
- package/src/schema/inputTypes.ts +13 -26
- package/src/schema/mutation.ts +24 -83
- package/src/schema/query.ts +0 -4
- package/src/schema/scalars.ts +0 -1
- package/src/schema/types/product/product.ts +1 -1
- package/src/schema/types/product/tokenized-product.ts +1 -1
- package/src/schema/types/shop.ts +0 -1
- package/src/schema/types/user.ts +2 -21
- package/lib/express/createApolloMiddleware.d.ts +0 -4
- package/lib/express/createApolloMiddleware.d.ts.map +0 -1
- package/lib/express/createApolloMiddleware.js +0 -36
- package/lib/express/createApolloMiddleware.js.map +0 -1
- package/lib/express/createSingleSignOnMiddleware.d.ts +0 -5
- package/lib/express/createSingleSignOnMiddleware.d.ts.map +0 -1
- package/lib/express/createSingleSignOnMiddleware.js +0 -73
- package/lib/express/createSingleSignOnMiddleware.js.map +0 -1
- package/lib/hashPassword.d.ts +0 -2
- package/lib/hashPassword.d.ts.map +0 -1
- package/lib/hashPassword.js +0 -5
- package/lib/hashPassword.js.map +0 -1
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.d.ts +0 -3
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.js +0 -6
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.js.map +0 -1
- package/lib/resolvers/mutations/accounts/disableTOTP.d.ts +0 -6
- package/lib/resolvers/mutations/accounts/disableTOTP.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/disableTOTP.js +0 -27
- package/lib/resolvers/mutations/accounts/disableTOTP.js.map +0 -1
- package/lib/resolvers/mutations/accounts/enableTOTP.d.ts +0 -6
- package/lib/resolvers/mutations/accounts/enableTOTP.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/enableTOTP.js +0 -20
- package/lib/resolvers/mutations/accounts/enableTOTP.js.map +0 -1
- package/lib/resolvers/mutations/accounts/impersonate.d.ts +0 -10
- package/lib/resolvers/mutations/accounts/impersonate.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/impersonate.js +0 -15
- package/lib/resolvers/mutations/accounts/impersonate.js.map +0 -1
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.d.ts +0 -7
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.js +0 -30
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.js.map +0 -1
- package/lib/resolvers/mutations/accounts/loginWithOAuth.d.ts +0 -8
- package/lib/resolvers/mutations/accounts/loginWithOAuth.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/loginWithOAuth.js +0 -25
- package/lib/resolvers/mutations/accounts/loginWithOAuth.js.map +0 -1
- package/lib/resolvers/mutations/accounts/logoutAllSessions.d.ts +0 -5
- package/lib/resolvers/mutations/accounts/logoutAllSessions.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/logoutAllSessions.js +0 -20
- package/lib/resolvers/mutations/accounts/logoutAllSessions.js.map +0 -1
- package/lib/resolvers/mutations/accounts/stopImpersonation.d.ts +0 -7
- package/lib/resolvers/mutations/accounts/stopImpersonation.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/stopImpersonation.js +0 -21
- package/lib/resolvers/mutations/accounts/stopImpersonation.js.map +0 -1
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.d.ts +0 -6
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.d.ts.map +0 -1
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.js +0 -13
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.js.map +0 -1
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.d.ts +0 -6
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.d.ts.map +0 -1
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.js +0 -18
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.js.map +0 -1
- package/lib/resolvers/mutations/products/addProductMedia.d.ts +0 -6
- package/lib/resolvers/mutations/products/addProductMedia.d.ts.map +0 -1
- package/lib/resolvers/mutations/products/addProductMedia.js +0 -18
- package/lib/resolvers/mutations/products/addProductMedia.js.map +0 -1
- package/lib/resolvers/mutations/users/updateUserAvatar.d.ts +0 -6
- package/lib/resolvers/mutations/users/updateUserAvatar.d.ts.map +0 -1
- package/lib/resolvers/mutations/users/updateUserAvatar.js +0 -22
- package/lib/resolvers/mutations/users/updateUserAvatar.js.map +0 -1
- package/lib/resolvers/queries/users/impersonator.d.ts +0 -3
- package/lib/resolvers/queries/users/impersonator.d.ts.map +0 -1
- package/lib/resolvers/queries/users/impersonator.js +0 -12
- package/lib/resolvers/queries/users/impersonator.js.map +0 -1
- package/lib/resolvers/type/oauth-account.d.ts +0 -6
- package/lib/resolvers/type/oauth-account.d.ts.map +0 -1
- package/lib/resolvers/type/oauth-account.js +0 -7
- package/lib/resolvers/type/oauth-account.js.map +0 -1
- package/lib/resolvers/type/oauth-provider.d.ts +0 -6
- package/lib/resolvers/type/oauth-provider.d.ts.map +0 -1
- package/lib/resolvers/type/oauth-provider.js +0 -6
- package/lib/resolvers/type/oauth-provider.js.map +0 -1
- package/lib/user-context.d.ts +0 -7
- package/lib/user-context.d.ts.map +0 -1
- package/lib/user-context.js +0 -64
- package/lib/user-context.js.map +0 -1
- package/src/express/createApolloMiddleware.ts +0 -40
- package/src/express/createSingleSignOnMiddleware.ts +0 -92
- package/src/hashPassword.ts +0 -5
- package/src/resolvers/mutations/accounts/buildSecretTOTPAuthURL.ts +0 -8
- package/src/resolvers/mutations/accounts/disableTOTP.ts +0 -36
- package/src/resolvers/mutations/accounts/enableTOTP.ts +0 -23
- package/src/resolvers/mutations/accounts/impersonate.ts +0 -21
- package/src/resolvers/mutations/accounts/linkOAuthAccount.ts +0 -51
- package/src/resolvers/mutations/accounts/loginWithOAuth.ts +0 -38
- package/src/resolvers/mutations/accounts/logoutAllSessions.ts +0 -27
- package/src/resolvers/mutations/accounts/stopImpersonation.ts +0 -31
- package/src/resolvers/mutations/accounts/unlinkOAuthAccount.ts +0 -24
- package/src/resolvers/mutations/assortments/addAssortmentMedia.ts +0 -26
- package/src/resolvers/mutations/products/addProductMedia.ts +0 -24
- package/src/resolvers/mutations/users/updateUserAvatar.ts +0 -39
- package/src/resolvers/queries/users/impersonator.ts +0 -19
- package/src/resolvers/type/oauth-account.ts +0 -8
- package/src/resolvers/type/oauth-provider.ts +0 -5
- package/src/user-context.ts +0 -87
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Strategy from 'passport-strategy';
|
|
2
|
+
|
|
3
|
+
export default class AccessTokenStrategy extends Strategy {
|
|
4
|
+
name: string;
|
|
5
|
+
|
|
6
|
+
pass: any;
|
|
7
|
+
|
|
8
|
+
_verify: any;
|
|
9
|
+
|
|
10
|
+
success: any;
|
|
11
|
+
|
|
12
|
+
constructor(verify) {
|
|
13
|
+
super();
|
|
14
|
+
|
|
15
|
+
if (!verify) {
|
|
16
|
+
throw new TypeError('AccessTokenStrategy requires a verify callback');
|
|
17
|
+
}
|
|
18
|
+
// eslint-disable-next-line
|
|
19
|
+
this._verify = verify;
|
|
20
|
+
|
|
21
|
+
// Set the default name of our strategy
|
|
22
|
+
this.name = 'access-token';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
authenticate(req) {
|
|
26
|
+
if (req.headers.authorization) {
|
|
27
|
+
const [type, token] = req.headers.authorization.split(' ');
|
|
28
|
+
if (type === 'Bearer') {
|
|
29
|
+
// eslint-disable-next-line
|
|
30
|
+
this._verify(token, (err, user) => {
|
|
31
|
+
if (!user || err) return this.pass();
|
|
32
|
+
this.success(user);
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.pass();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
2
|
+
import { Passport } from 'passport';
|
|
3
|
+
import AccessTokenStrategy from './access-token-strategy.js';
|
|
4
|
+
|
|
5
|
+
const setupPassport = (unchainedAPI: UnchainedCore) => {
|
|
6
|
+
const passport = new Passport();
|
|
7
|
+
|
|
8
|
+
passport.serializeUser(function serialize(user, done) {
|
|
9
|
+
done(null, user._id);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
passport.deserializeUser(function deserialize(_id, done) {
|
|
13
|
+
unchainedAPI.modules.users.findUserById(_id).then(
|
|
14
|
+
(user) => {
|
|
15
|
+
done(null, user);
|
|
16
|
+
},
|
|
17
|
+
(error) => {
|
|
18
|
+
done(error, null);
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
passport.use(
|
|
24
|
+
new AccessTokenStrategy(function verify(userToken, done) {
|
|
25
|
+
const [username] = userToken.split(':');
|
|
26
|
+
unchainedAPI.modules.users.findUserByToken(userToken).then(
|
|
27
|
+
(user) => {
|
|
28
|
+
if (user?.username === username) {
|
|
29
|
+
done(null, user);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
done(null, null);
|
|
33
|
+
},
|
|
34
|
+
(error) => {
|
|
35
|
+
done(error, null);
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
}),
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return passport;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export default setupPassport;
|
package/src/loaders/index.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { IncomingMessage, OutgoingMessage } from 'http';
|
|
2
1
|
import DataLoader from 'dataloader';
|
|
3
2
|
import { systemLocale } from '@unchainedshop/utils';
|
|
4
3
|
import localePkg from 'locale';
|
|
@@ -15,7 +14,7 @@ function getLocaleStrings(localeObj) {
|
|
|
15
14
|
function findMatchingText(texts, localeStrings) {
|
|
16
15
|
return localeStrings.reduce((acc, localeString) => {
|
|
17
16
|
if (acc) return acc;
|
|
18
|
-
return texts.find((p) => p.locale === localeString);
|
|
17
|
+
return texts.find((p) => p.locale.toLowerCase() === localeString.toLowerCase());
|
|
19
18
|
}, null);
|
|
20
19
|
}
|
|
21
20
|
|
|
@@ -32,11 +31,7 @@ function getFilteredQueries({ queries, texts, filterFn }) {
|
|
|
32
31
|
});
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
const loaders = async (
|
|
36
|
-
req: IncomingMessage,
|
|
37
|
-
res: OutgoingMessage,
|
|
38
|
-
unchainedAPI: UnchainedCore,
|
|
39
|
-
): Promise<UnchainedLoaders['loaders']> => {
|
|
34
|
+
const loaders = async (unchainedAPI: UnchainedCore): Promise<UnchainedLoaders['loaders']> => {
|
|
40
35
|
return {
|
|
41
36
|
assortmentLoader: new DataLoader(
|
|
42
37
|
async (queries) => {
|
|
@@ -216,7 +211,6 @@ const loaders = async (
|
|
|
216
211
|
({ filterId, filterOptionValue }) =>
|
|
217
212
|
(text) =>
|
|
218
213
|
text.filterId === filterId && text.filterOptionValue === filterOptionValue;
|
|
219
|
-
|
|
220
214
|
return getFilteredQueries({ queries, texts, filterFn });
|
|
221
215
|
},
|
|
222
216
|
{ batchScheduleFn: (cb) => setImmediate(cb) },
|
package/src/locale-context.ts
CHANGED
|
@@ -1,78 +1,86 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { UnchainedLocaleContext } from '@unchainedshop/types/api.js';
|
|
1
|
+
import { UnchainedLocaleContext, UnchainedHTTPServerContext } from '@unchainedshop/types/api.js';
|
|
3
2
|
import localePkg from 'locale';
|
|
4
|
-
import 'abort-controller/polyfill.js';
|
|
5
3
|
import { log, LogLevel } from '@unchainedshop/logger';
|
|
6
4
|
import {
|
|
7
5
|
resolveBestCountry,
|
|
8
6
|
resolveBestSupported,
|
|
9
|
-
|
|
7
|
+
resolveBestCurrency,
|
|
10
8
|
systemLocale,
|
|
11
9
|
} from '@unchainedshop/utils';
|
|
12
10
|
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
13
|
-
import
|
|
11
|
+
import memoizee from 'memoizee';
|
|
14
12
|
|
|
15
13
|
const { Locales } = localePkg;
|
|
16
14
|
|
|
17
15
|
const { NODE_ENV } = process.env;
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
export type GetHeaderFn = (key: string) => string | string[];
|
|
20
18
|
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
19
|
+
export const resolveDefaultContext = memoizee(
|
|
20
|
+
async ({ acceptLang, acceptCountry }, unchainedAPI) => {
|
|
21
|
+
const languages = await unchainedAPI.modules.languages.findLanguages(
|
|
22
|
+
{ includeInactive: false },
|
|
23
|
+
{ projection: { isoCode: 1, isActive: 1 } },
|
|
24
|
+
);
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
): Promise<UnchainedLocaleContext> => {
|
|
31
|
-
const cacheKey = `${req.headers['accept-language']}:${req.headers['x-shop-country']}`;
|
|
32
|
-
const cachedContext = localeContextCache.get(cacheKey) as UnchainedLocaleContext;
|
|
26
|
+
const countries = await unchainedAPI.modules.countries.findCountries(
|
|
27
|
+
{ includeInactive: false },
|
|
28
|
+
{ projection: { isoCode: 1, isActive: 1 } },
|
|
29
|
+
);
|
|
33
30
|
|
|
34
|
-
|
|
35
|
-
const { remoteAddress, remotePort } = resolveUserRemoteAddress(req);
|
|
31
|
+
const currencies = await unchainedAPI.modules.currencies.findCurrencies({ includeInactive: false });
|
|
36
32
|
|
|
37
|
-
|
|
33
|
+
const supportedLocaleStrings = languages.reduce((accumulator, language) => {
|
|
34
|
+
const added = countries.map((country) => {
|
|
35
|
+
return `${language.isoCode}-${country.isoCode}`;
|
|
36
|
+
});
|
|
37
|
+
return accumulator.concat(added);
|
|
38
|
+
}, []);
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
// return the best resolved normalized locale by locale according to system-wide configuration
|
|
41
|
-
// else fallback to base language & base country
|
|
40
|
+
const supportedLocales = new Locales(supportedLocaleStrings, systemLocale.code);
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
{ projection: { isoCode: 1, isActive: 1 } },
|
|
46
|
-
);
|
|
42
|
+
const localeContext = resolveBestSupported(acceptLang, supportedLocales);
|
|
43
|
+
const countryContext = resolveBestCountry(localeContext.country, acceptCountry, countries);
|
|
47
44
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
{ projection: { isoCode: 1, isActive: 1 } },
|
|
51
|
-
);
|
|
45
|
+
const countryObject = countries.find((country) => country.isoCode === countryContext);
|
|
46
|
+
const currencyContext = resolveBestCurrency(countryObject.defaultCurrencyCode, currencies);
|
|
52
47
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return `${language.isoCode}-${country.isoCode}`;
|
|
48
|
+
log(`Locale Context: Resolved ${localeContext.normalized} ${countryContext} ${currencyContext}`, {
|
|
49
|
+
level: LogLevel.Debug,
|
|
56
50
|
});
|
|
57
|
-
return accumulator.concat(added);
|
|
58
|
-
}, []);
|
|
59
51
|
|
|
60
|
-
|
|
52
|
+
const newContext: UnchainedLocaleContext = {
|
|
53
|
+
localeContext,
|
|
54
|
+
countryContext,
|
|
55
|
+
currencyContext,
|
|
56
|
+
};
|
|
61
57
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
localeContext,
|
|
73
|
-
countryContext,
|
|
74
|
-
};
|
|
75
|
-
localeContextCache.set(cacheKey, newContext);
|
|
58
|
+
return newContext;
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
maxAge: NODE_ENV === 'production' ? 1000 * 60 : 100, // minute or 100ms
|
|
62
|
+
promise: true,
|
|
63
|
+
normalizer(args) {
|
|
64
|
+
return `${args[0].acceptLang}-${args[0].acceptCountry}`;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
);
|
|
76
68
|
|
|
77
|
-
|
|
69
|
+
export const getLocaleContext = async (
|
|
70
|
+
{
|
|
71
|
+
remoteAddress,
|
|
72
|
+
remotePort,
|
|
73
|
+
getHeader,
|
|
74
|
+
}: {
|
|
75
|
+
remoteAddress: string;
|
|
76
|
+
remotePort: number;
|
|
77
|
+
} & UnchainedHTTPServerContext,
|
|
78
|
+
unchainedAPI: UnchainedCore,
|
|
79
|
+
): Promise<UnchainedLocaleContext> => {
|
|
80
|
+
const userAgent = getHeader('user-agent');
|
|
81
|
+
const context = await resolveDefaultContext(
|
|
82
|
+
{ acceptLang: getHeader('accept-language'), acceptCountry: getHeader('x-shop-country') },
|
|
83
|
+
unchainedAPI,
|
|
84
|
+
);
|
|
85
|
+
return { remoteAddress, remotePort, userAgent, ...context };
|
|
78
86
|
};
|
package/src/resolvers/index.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import GraphQLUpload from 'graphql-upload/GraphQLUpload.mjs';
|
|
2
1
|
import { JSONResolver, TimestampResolver, DateTimeResolver, DateResolver } from 'graphql-scalars';
|
|
3
2
|
import Query from './queries/index.js';
|
|
4
3
|
import Mutation from './mutations/index.js';
|
|
@@ -8,7 +7,6 @@ import CustomScalars from './scalars/index.js';
|
|
|
8
7
|
export default {
|
|
9
8
|
...Types,
|
|
10
9
|
...CustomScalars,
|
|
11
|
-
Upload: GraphQLUpload,
|
|
12
10
|
JSON: JSONResolver,
|
|
13
11
|
Query,
|
|
14
12
|
Mutation,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { log } from '@unchainedshop/logger';
|
|
2
2
|
import { Context, Root } from '@unchainedshop/types/api.js';
|
|
3
|
-
import { UserNotFoundError } from '../../../errors.js';
|
|
3
|
+
import { EmailAlreadyExistsError, UserNotFoundError } from '../../../errors.js';
|
|
4
4
|
|
|
5
5
|
export default async function addEmail(
|
|
6
6
|
root: Root,
|
|
@@ -14,7 +14,12 @@ export default async function addEmail(
|
|
|
14
14
|
if (!(await modules.users.userExists({ userId: normalizedUserId })))
|
|
15
15
|
throw new UserNotFoundError({ userId: normalizedUserId });
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
try {
|
|
18
|
+
await modules.users.addEmail(normalizedUserId, params.email);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
if (e.cause === 'EMAIL_INVALID') throw new EmailAlreadyExistsError({ email: params?.email });
|
|
21
|
+
else throw e;
|
|
22
|
+
}
|
|
18
23
|
|
|
19
24
|
return modules.users.findUserById(normalizedUserId);
|
|
20
25
|
}
|
|
@@ -10,7 +10,7 @@ export default async function addWebAuthnCredentials(
|
|
|
10
10
|
userId,
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
const webAuthnService = await modules.
|
|
13
|
+
const webAuthnService = await modules.users.webAuthn.verifyCredentialCreation(
|
|
14
14
|
user.username,
|
|
15
15
|
credentials,
|
|
16
16
|
);
|
|
@@ -1,30 +1,40 @@
|
|
|
1
1
|
import { log } from '@unchainedshop/logger';
|
|
2
2
|
import { Context, Root } from '@unchainedshop/types/api.js';
|
|
3
|
-
import {
|
|
3
|
+
import { InvalidCredentialsError, PasswordInvalidError } from '../../../errors.js';
|
|
4
4
|
|
|
5
5
|
export default async function changePassword(
|
|
6
6
|
root: Root,
|
|
7
7
|
params: {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
oldPassword?: string;
|
|
9
|
+
newPassword?: string;
|
|
10
10
|
},
|
|
11
11
|
{ modules, userId }: Context,
|
|
12
12
|
) {
|
|
13
13
|
log('mutation changePassword', { userId });
|
|
14
14
|
|
|
15
|
-
if (!params.
|
|
15
|
+
if (!params.newPassword) {
|
|
16
16
|
throw new Error('New password is required');
|
|
17
17
|
}
|
|
18
|
-
if (!params.
|
|
18
|
+
if (!params.oldPassword) {
|
|
19
19
|
throw new Error('Old password is required');
|
|
20
20
|
}
|
|
21
|
+
|
|
22
|
+
const user = await modules.users.findUserById(userId);
|
|
23
|
+
|
|
24
|
+
const isValidCurrentPassword =
|
|
25
|
+
user.services?.password &&
|
|
26
|
+
(await modules.users.verifyPassword(user.services?.password, params.oldPassword));
|
|
27
|
+
if (!isValidCurrentPassword) throw new InvalidCredentialsError({});
|
|
28
|
+
|
|
21
29
|
let success = false;
|
|
30
|
+
|
|
22
31
|
try {
|
|
23
|
-
|
|
32
|
+
await modules.users.setPassword(user._id, params.newPassword);
|
|
33
|
+
success = true;
|
|
24
34
|
} catch (e) {
|
|
25
35
|
success = false;
|
|
26
|
-
if (e.
|
|
27
|
-
else throw
|
|
36
|
+
if (e.cause === 'PASSWORD_INVALID') throw new PasswordInvalidError({ userId });
|
|
37
|
+
else throw e;
|
|
28
38
|
}
|
|
29
39
|
|
|
30
40
|
return { success };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { UserData } from '@unchainedshop/types/
|
|
1
|
+
import { UserData } from '@unchainedshop/types/user.js';
|
|
2
2
|
import { Context, Root } from '@unchainedshop/types/api.js';
|
|
3
3
|
import { log } from '@unchainedshop/logger';
|
|
4
|
-
import { hashPassword } from '../../../hashPassword.js';
|
|
5
4
|
import {
|
|
6
5
|
AuthOperationFailedError,
|
|
7
6
|
EmailAlreadyExistsError,
|
|
8
7
|
UsernameAlreadyExistsError,
|
|
9
8
|
UsernameOrEmailRequiredError,
|
|
9
|
+
PasswordOrWebAuthnPublicKeyRequiredError,
|
|
10
|
+
PasswordInvalidError,
|
|
10
11
|
} from '../../../errors.js';
|
|
11
12
|
|
|
12
13
|
export default async function createUser(root: Root, params: UserData, context: Context) {
|
|
@@ -14,48 +15,40 @@ export default async function createUser(root: Root, params: UserData, context:
|
|
|
14
15
|
|
|
15
16
|
log('mutation createUser', { email: params.email, username: params.username, userId });
|
|
16
17
|
|
|
17
|
-
if (!params.
|
|
18
|
-
throw new
|
|
18
|
+
if (!params.username && !params.email) {
|
|
19
|
+
throw new UsernameOrEmailRequiredError({ username: params?.username });
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
mappedUser.password = hashPassword(mappedUser.plainPassword);
|
|
24
|
-
}
|
|
25
|
-
delete mappedUser.plainPassword;
|
|
26
|
-
delete mappedUser.webAuthnPublicKeyCredentials;
|
|
27
|
-
|
|
28
|
-
const webAuthnService =
|
|
29
|
-
params.webAuthnPublicKeyCredentials &&
|
|
30
|
-
(await modules.accounts.webAuthn.verifyCredentialCreation(
|
|
31
|
-
params.username,
|
|
32
|
-
params.webAuthnPublicKeyCredentials,
|
|
33
|
-
));
|
|
34
|
-
let newUserId;
|
|
35
|
-
try {
|
|
36
|
-
newUserId = await modules.accounts.createUser(mappedUser, {
|
|
37
|
-
skipPasswordEnrollment: !!webAuthnService,
|
|
38
|
-
});
|
|
39
|
-
} catch (e) {
|
|
40
|
-
if (e.code === 'EmailAlreadyExists') throw new EmailAlreadyExistsError({ email: params?.email });
|
|
41
|
-
else if (e.code === 'UsernameAlreadyExists')
|
|
42
|
-
throw new UsernameAlreadyExistsError({ username: params?.username });
|
|
43
|
-
else if (e.code === 'UsernameOrEmailRequired')
|
|
44
|
-
throw new UsernameOrEmailRequiredError({ username: params?.username });
|
|
45
|
-
else throw new AuthOperationFailedError({ username: params?.username, email: params.email });
|
|
22
|
+
if (!params.password && !params.webAuthnPublicKeyCredentials) {
|
|
23
|
+
throw new PasswordOrWebAuthnPublicKeyRequiredError({ username: params?.username });
|
|
46
24
|
}
|
|
47
25
|
|
|
48
|
-
|
|
49
|
-
await modules.users.
|
|
50
|
-
{ _id: newUserId },
|
|
26
|
+
try {
|
|
27
|
+
const newUserId = await modules.users.createUser(
|
|
51
28
|
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
},
|
|
29
|
+
...params,
|
|
30
|
+
initialPassword: false,
|
|
55
31
|
},
|
|
56
32
|
{},
|
|
57
33
|
);
|
|
58
|
-
}
|
|
59
34
|
|
|
60
|
-
|
|
35
|
+
let user = await modules.users.findUserById(newUserId);
|
|
36
|
+
|
|
37
|
+
user = await context.modules.users.updateHeartbeat(user._id, {
|
|
38
|
+
remoteAddress: context.remoteAddress,
|
|
39
|
+
remotePort: context.remotePort,
|
|
40
|
+
userAgent: context.userAgent,
|
|
41
|
+
locale: context.localeContext.normalized,
|
|
42
|
+
countryCode: context.countryContext,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return context.login(user);
|
|
46
|
+
} catch (e) {
|
|
47
|
+
if (e.cause === 'EMAIL_INVALID') throw new EmailAlreadyExistsError({ email: params?.email });
|
|
48
|
+
else if (e.cause === 'USERNAME_INVALID')
|
|
49
|
+
throw new UsernameAlreadyExistsError({ username: params?.username });
|
|
50
|
+
else if (e.cause === 'PASSWORD_INVALID')
|
|
51
|
+
throw new PasswordInvalidError({ username: params?.username });
|
|
52
|
+
else throw new AuthOperationFailedError({ username: params?.username, email: params.email });
|
|
53
|
+
}
|
|
61
54
|
}
|
|
@@ -4,14 +4,14 @@ import { Context, Root } from '@unchainedshop/types/api.js';
|
|
|
4
4
|
export default async function createWebAuthnCredentialCreationOptions(
|
|
5
5
|
root: Root,
|
|
6
6
|
{ extensionOptions, username }: { username: string; extensionOptions: any },
|
|
7
|
-
{ modules, userId,
|
|
7
|
+
{ modules, userId, getHeader }: Context,
|
|
8
8
|
) {
|
|
9
9
|
log(`mutation createWebAuthnCredentialCreationOptions ${username}`, {
|
|
10
10
|
userId,
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
const options = await modules.
|
|
14
|
-
|
|
13
|
+
const options = await modules.users.webAuthn.createCredentialCreationOptions(
|
|
14
|
+
getHeader('origin') as string,
|
|
15
15
|
username,
|
|
16
16
|
extensionOptions,
|
|
17
17
|
);
|
|
@@ -4,20 +4,20 @@ import { Context, Root } from '@unchainedshop/types/api.js';
|
|
|
4
4
|
export default async function createWebAuthnCredentialRequestOptions(
|
|
5
5
|
root: Root,
|
|
6
6
|
{ extensionOptions, username }: { username: string; extensionOptions: any },
|
|
7
|
-
{ modules, userId,
|
|
7
|
+
{ modules, userId, getHeader }: Context,
|
|
8
8
|
) {
|
|
9
9
|
log(`mutation createWebAuthnCredentialRequestOptions ${username}`, {
|
|
10
10
|
userId,
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
const options = await modules.
|
|
14
|
-
|
|
13
|
+
const options = await modules.users.webAuthn.createCredentialRequestOptions(
|
|
14
|
+
getHeader('origin') as string,
|
|
15
15
|
username,
|
|
16
16
|
extensionOptions,
|
|
17
17
|
);
|
|
18
18
|
|
|
19
19
|
if (username) {
|
|
20
|
-
const user = await modules.users.
|
|
20
|
+
const user = await modules.users.findUserByUsername(username);
|
|
21
21
|
options.allowCredentials = user?.services?.webAuthn?.map(({ id, type }) => ({
|
|
22
22
|
id,
|
|
23
23
|
type: type || options.type || 'public-key',
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { log } from '@unchainedshop/logger';
|
|
2
2
|
import { Context, Root } from '@unchainedshop/types/api.js';
|
|
3
|
-
import { UserData } from '@unchainedshop/types/
|
|
4
|
-
import { hashPassword } from '../../../hashPassword.js';
|
|
3
|
+
import { UserData } from '@unchainedshop/types/user.js';
|
|
5
4
|
import {
|
|
6
5
|
AuthOperationFailedError,
|
|
7
6
|
EmailAlreadyExistsError,
|
|
7
|
+
PasswordInvalidError,
|
|
8
8
|
UsernameAlreadyExistsError,
|
|
9
9
|
UsernameOrEmailRequiredError,
|
|
10
10
|
} from '../../../errors.js';
|
|
@@ -14,27 +14,28 @@ export default async function enrollUser(root: Root, params: UserData, context:
|
|
|
14
14
|
|
|
15
15
|
log('mutation enrollUser', { email: params.email, userId: context.userId });
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (mappedUserData.plainPassword) {
|
|
20
|
-
mappedUserData.password = hashPassword(mappedUserData.plainPassword);
|
|
17
|
+
if (!params.username && !params.email) {
|
|
18
|
+
throw new UsernameOrEmailRequiredError({});
|
|
21
19
|
}
|
|
22
|
-
delete mappedUserData.plainPassword;
|
|
23
20
|
|
|
24
|
-
// Skip Messaging when password is set so we
|
|
25
|
-
// don't send a verification e-mail after enrollment
|
|
26
21
|
try {
|
|
27
|
-
const userId = await modules.
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
const userId = await modules.users.createUser(
|
|
23
|
+
{
|
|
24
|
+
...params,
|
|
25
|
+
initialPassword: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
skipMessaging: !!params.password,
|
|
29
|
+
},
|
|
30
|
+
);
|
|
30
31
|
|
|
31
32
|
return modules.users.findUserById(userId);
|
|
32
33
|
} catch (e) {
|
|
33
|
-
if (e.
|
|
34
|
-
else if (e.
|
|
35
|
-
throw new UsernameAlreadyExistsError({ username: params?.username
|
|
36
|
-
else if (e.
|
|
37
|
-
throw new
|
|
34
|
+
if (e.cause === 'EMAIL_INVALID') throw new EmailAlreadyExistsError({ email: params?.email });
|
|
35
|
+
else if (e.cause === 'USERNAME_INVALID')
|
|
36
|
+
throw new UsernameAlreadyExistsError({ username: params?.username });
|
|
37
|
+
else if (e.cause === 'PASSWORD_INVALID')
|
|
38
|
+
throw new PasswordInvalidError({ username: params?.username });
|
|
38
39
|
else throw new AuthOperationFailedError({ username: params?.username, email: params.email });
|
|
39
40
|
}
|
|
40
41
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { log } from '@unchainedshop/logger';
|
|
2
2
|
import { Context, Root } from '@unchainedshop/types/api.js';
|
|
3
|
-
import {
|
|
3
|
+
import { UserNotFoundError } from '../../../errors.js';
|
|
4
4
|
|
|
5
5
|
export default async function forgotPassword(
|
|
6
6
|
root: Root,
|
|
@@ -9,13 +9,17 @@ export default async function forgotPassword(
|
|
|
9
9
|
) {
|
|
10
10
|
log('mutation forgotPassword', { email, userId });
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
const user = await modules.users.findUserByEmail(email);
|
|
13
|
+
if (!user) throw new UserNotFoundError({ email });
|
|
14
|
+
|
|
13
15
|
try {
|
|
14
|
-
|
|
16
|
+
await modules.users.sendResetPasswordEmail(user._id, email);
|
|
17
|
+
return {
|
|
18
|
+
success: true,
|
|
19
|
+
};
|
|
15
20
|
} catch (e) {
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
};
|
|
18
24
|
}
|
|
19
|
-
|
|
20
|
-
return { success };
|
|
21
25
|
}
|
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
import { Context, Root } from '@unchainedshop/types/api.js';
|
|
2
2
|
import { log } from '@unchainedshop/logger';
|
|
3
|
+
import moniker from 'moniker';
|
|
4
|
+
import { randomValueHex } from '@unchainedshop/utils';
|
|
3
5
|
|
|
4
6
|
export default async function loginAsGuest(root: Root, _: any, context: Context) {
|
|
5
|
-
const { modules } = context;
|
|
6
|
-
|
|
7
7
|
log('mutation loginAsGuest');
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const guestname = `${moniker.choose()}-${randomValueHex(5)}`;
|
|
10
|
+
const guestUserId = await context.modules.users.createUser(
|
|
11
|
+
{
|
|
12
|
+
email: `${guestname}@unchained.local`,
|
|
13
|
+
guest: true,
|
|
14
|
+
password: null,
|
|
15
|
+
initialPassword: true,
|
|
16
|
+
},
|
|
17
|
+
{ skipMessaging: true },
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
let user = await context.modules.users.findUserById(guestUserId);
|
|
21
|
+
|
|
22
|
+
user = await context.modules.users.updateHeartbeat(user._id, {
|
|
23
|
+
remoteAddress: context.remoteAddress,
|
|
24
|
+
remotePort: context.remotePort,
|
|
25
|
+
userAgent: context.userAgent,
|
|
26
|
+
locale: context.localeContext.normalized,
|
|
27
|
+
countryCode: context.countryContext,
|
|
28
|
+
});
|
|
10
29
|
|
|
11
|
-
return
|
|
30
|
+
return context.login(user);
|
|
12
31
|
}
|