@unchainedshop/api 2.13.0 → 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 +1 -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 +6 -4
- package/lib/locale-context.d.ts.map +1 -1
- package/lib/locale-context.js +4 -6
- 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/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/confirmOrder.d.ts +0 -1
- package/lib/resolvers/mutations/orders/confirmOrder.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/confirmOrder.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/rejectOrder.d.ts +0 -1
- package/lib/resolvers/mutations/orders/rejectOrder.d.ts.map +1 -1
- package/lib/resolvers/mutations/orders/rejectOrder.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/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/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-plan-types.d.ts.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 +11 -25
- package/lib/schema/inputTypes.js.map +1 -1
- package/lib/schema/mutation.d.ts.map +1 -1
- package/lib/schema/mutation.js +26 -85
- 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 +18 -12
- 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 +8 -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 +13 -9
- 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/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/confirmOrder.ts +0 -1
- package/src/resolvers/mutations/orders/emptyCart.ts +2 -2
- package/src/resolvers/mutations/orders/rejectOrder.ts +0 -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/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/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 +11 -25
- package/src/schema/mutation.ts +26 -85
- 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
package/src/context.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AdminUiConfig, Context, UnchainedHTTPServerContext } from '@unchainedshop/types/api.js';
|
|
2
2
|
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
3
3
|
import instantiateLoaders from './loaders/index.js';
|
|
4
4
|
import { getLocaleContext } from './locale-context.js';
|
|
5
|
-
import { getUserContext } from './user-context.js';
|
|
6
5
|
|
|
7
6
|
let context;
|
|
8
7
|
|
|
@@ -12,6 +11,18 @@ export const setCurrentContextResolver = (newContext: UnchainedContextResolver)
|
|
|
12
11
|
context = newContext;
|
|
13
12
|
};
|
|
14
13
|
|
|
14
|
+
export type UnchainedContextResolver = (
|
|
15
|
+
params: UnchainedHTTPServerContext & {
|
|
16
|
+
cookies?: Record<string, string>;
|
|
17
|
+
remoteAddress?: string;
|
|
18
|
+
remotePort?: number;
|
|
19
|
+
user?: any;
|
|
20
|
+
userId?: string;
|
|
21
|
+
login: (user: any) => Promise<{ _id: string; user: any; tokenExpires: Date }>;
|
|
22
|
+
logout: () => Promise<boolean>;
|
|
23
|
+
},
|
|
24
|
+
) => Promise<Context>;
|
|
25
|
+
|
|
15
26
|
export const createContextResolver =
|
|
16
27
|
(
|
|
17
28
|
unchainedAPI: UnchainedCore,
|
|
@@ -19,21 +30,23 @@ export const createContextResolver =
|
|
|
19
30
|
version: string,
|
|
20
31
|
adminUiConfig?: AdminUiConfig,
|
|
21
32
|
): UnchainedContextResolver =>
|
|
22
|
-
async ({
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const localeContext = await getLocaleContext(
|
|
33
|
+
async ({ getHeader, setHeader, cookies, remoteAddress, remotePort, user, userId, login, logout }) => {
|
|
34
|
+
const abstractHttpServerContext = { remoteAddress, remotePort, getHeader, setHeader, cookies };
|
|
35
|
+
const loaders = await instantiateLoaders(unchainedAPI);
|
|
36
|
+
const localeContext = await getLocaleContext(abstractHttpServerContext, unchainedAPI);
|
|
26
37
|
|
|
27
38
|
return {
|
|
28
|
-
req,
|
|
29
|
-
res,
|
|
30
|
-
...apolloContext,
|
|
31
39
|
...unchainedAPI,
|
|
32
|
-
...userContext,
|
|
33
40
|
...localeContext,
|
|
41
|
+
user,
|
|
42
|
+
userId,
|
|
43
|
+
login,
|
|
44
|
+
logout,
|
|
34
45
|
loaders,
|
|
35
46
|
roles,
|
|
36
47
|
version,
|
|
37
48
|
adminUiConfig,
|
|
49
|
+
setHeader,
|
|
50
|
+
getHeader,
|
|
38
51
|
};
|
|
39
52
|
};
|
|
@@ -1,28 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { log, LogLevel } from '@unchainedshop/logger';
|
|
3
|
-
import { GraphQLFormattedError } from 'graphql';
|
|
1
|
+
import { createLogger } from '@unchainedshop/logger';
|
|
4
2
|
import { buildDefaultTypeDefs } from './schema/index.js';
|
|
5
3
|
import resolvers from './resolvers/index.js';
|
|
6
4
|
import { actions } from './roles/index.js';
|
|
5
|
+
import { createYoga, createSchema } from 'graphql-yoga';
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
try {
|
|
10
|
-
const {
|
|
11
|
-
message,
|
|
12
|
-
extensions: { stacktrace, ...parameters },
|
|
13
|
-
...rest
|
|
14
|
-
} = error;
|
|
15
|
-
|
|
16
|
-
const nativeError = new Error(message);
|
|
17
|
-
nativeError.stack = (stacktrace as string[]).join('\n');
|
|
18
|
-
nativeError.name = parameters.code as string;
|
|
19
|
-
log(nativeError, {
|
|
20
|
-
level: LogLevel.Error,
|
|
21
|
-
...parameters,
|
|
22
|
-
...rest,
|
|
23
|
-
});
|
|
24
|
-
} catch (e) {} // eslint-disable-line
|
|
25
|
-
};
|
|
7
|
+
const logger = createLogger('unchained:api');
|
|
26
8
|
|
|
27
9
|
export default async (options) => {
|
|
28
10
|
const {
|
|
@@ -30,24 +12,31 @@ export default async (options) => {
|
|
|
30
12
|
resolvers: additionalResolvers = [],
|
|
31
13
|
events = [],
|
|
32
14
|
workTypes = [],
|
|
33
|
-
|
|
15
|
+
schema: customSchema,
|
|
16
|
+
...graphQLServerOptions
|
|
34
17
|
} = options || {};
|
|
35
18
|
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
19
|
+
const schema =
|
|
20
|
+
customSchema ||
|
|
21
|
+
createSchema({
|
|
22
|
+
typeDefs: [
|
|
23
|
+
...buildDefaultTypeDefs({
|
|
24
|
+
actions: Object.keys(actions),
|
|
25
|
+
events,
|
|
26
|
+
workTypes,
|
|
27
|
+
}),
|
|
28
|
+
...additionalTypeDefs,
|
|
29
|
+
],
|
|
30
|
+
resolvers: [resolvers, ...additionalResolvers],
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const server = createYoga({
|
|
34
|
+
schema,
|
|
35
|
+
logging: logger,
|
|
36
|
+
context: async (ctx: any) => {
|
|
37
|
+
return (ctx.req as any)?.unchainedContext;
|
|
49
38
|
},
|
|
50
|
-
...
|
|
39
|
+
...graphQLServerOptions,
|
|
51
40
|
});
|
|
52
41
|
|
|
53
42
|
return server;
|
package/src/errors.ts
CHANGED
|
@@ -217,12 +217,12 @@ export const CyclicAssortmentLinkNotSupportedError = createError(
|
|
|
217
217
|
|
|
218
218
|
export const EmailAlreadyExistsError = createError(
|
|
219
219
|
'EmailAlreadyExists',
|
|
220
|
-
'Email already
|
|
220
|
+
'Email already exists or is invalid',
|
|
221
221
|
);
|
|
222
222
|
|
|
223
223
|
export const UsernameAlreadyExistsError = createError(
|
|
224
224
|
'UsernameAlreadyExists',
|
|
225
|
-
'Username already
|
|
225
|
+
'Username already exists or is invalid',
|
|
226
226
|
);
|
|
227
227
|
|
|
228
228
|
export const UsernameOrEmailRequiredError = createError(
|
|
@@ -230,28 +230,27 @@ export const UsernameOrEmailRequiredError = createError(
|
|
|
230
230
|
'No username or email is provided.',
|
|
231
231
|
);
|
|
232
232
|
|
|
233
|
-
export const
|
|
234
|
-
'
|
|
235
|
-
|
|
233
|
+
export const PasswordInvalidError = createError(
|
|
234
|
+
'PasswordInvalidError',
|
|
235
|
+
'The provided password is invalid, maybe too insecure',
|
|
236
236
|
);
|
|
237
237
|
|
|
238
|
-
export const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
export const TwoFactorNotSetError = createError('TwoFactorNotSet', '2FA not set for user');
|
|
238
|
+
export const PasswordOrWebAuthnPublicKeyRequiredError = createError(
|
|
239
|
+
'PasswordOrWebAuthnPublicKeyRequired',
|
|
240
|
+
'A password or a WebAuthn public key is required',
|
|
241
|
+
);
|
|
243
242
|
|
|
244
243
|
export const InvalidCredentialsError = createError('InvalidCredentials', 'Invalid credentials provided');
|
|
245
244
|
|
|
246
|
-
export const InvalidResetTokenError = createError('InvalidResetTokenError', 'Token
|
|
247
|
-
|
|
248
|
-
export const NoEmailSetError = createError('NoEmailSet', 'User has no email set');
|
|
245
|
+
export const InvalidResetTokenError = createError('InvalidResetTokenError', 'Token invalid or expired');
|
|
249
246
|
|
|
250
|
-
export const
|
|
251
|
-
'
|
|
252
|
-
'Token
|
|
247
|
+
export const InvalidEmailVerificationTokenError = createError(
|
|
248
|
+
'InvalidEmailVerificationTokenError',
|
|
249
|
+
'Token invalid or expired',
|
|
253
250
|
);
|
|
254
251
|
|
|
252
|
+
export const NoEmailSetError = createError('NoEmailSet', 'User has no email set');
|
|
253
|
+
|
|
255
254
|
export const ResetPasswordLinkUnknownAddressError = createError(
|
|
256
255
|
'ResetPasswordLinkUnknownAddress',
|
|
257
256
|
'Valid token but no email address found for the entry',
|
|
@@ -292,11 +291,6 @@ export const ProductLinkedToQuotationError = createError(
|
|
|
292
291
|
'Product is part of a requested/proposed quotations item, remove it from any requested/proposed quotations item before deleting',
|
|
293
292
|
);
|
|
294
293
|
|
|
295
|
-
export const ImpersonatingAdminUserError = createError(
|
|
296
|
-
'ImpersonatingAdminUserError',
|
|
297
|
-
'Can not impersonate a admin user account',
|
|
298
|
-
);
|
|
299
|
-
|
|
300
294
|
export const FileNotFoundError = createError('FileNotFoundError', 'File not found');
|
|
301
295
|
|
|
302
296
|
export const FileUploadExpiredError = createError('FileUploadExpired', 'File upload has expired');
|
package/src/events.ts
ADDED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
2
2
|
import { checkAction } from '../acl.js';
|
|
3
3
|
import { actions } from '../roles/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { IncomingMessage } from 'http';
|
|
5
|
+
import { Context } from '@unchainedshop/types/api.js';
|
|
5
6
|
|
|
6
7
|
const logger = createLogger('unchained:bulk-import');
|
|
7
8
|
|
|
@@ -17,15 +18,18 @@ const methodWrongHandler = (res) => () => {
|
|
|
17
18
|
res.end();
|
|
18
19
|
};
|
|
19
20
|
|
|
20
|
-
export default async function bulkImportMiddleware(
|
|
21
|
+
export default async function bulkImportMiddleware(
|
|
22
|
+
req: IncomingMessage & { query?: any; unchainedContext: Context },
|
|
23
|
+
res,
|
|
24
|
+
) {
|
|
21
25
|
try {
|
|
26
|
+
const context = req.unchainedContext;
|
|
27
|
+
|
|
22
28
|
if (req.method !== 'POST') {
|
|
23
29
|
methodWrongHandler(res)();
|
|
24
30
|
return;
|
|
25
31
|
}
|
|
26
32
|
|
|
27
|
-
const contextResolver = getCurrentContextResolver();
|
|
28
|
-
const context = await contextResolver({ req, res });
|
|
29
33
|
await checkAction(context, (actions as any).bulkImport);
|
|
30
34
|
|
|
31
35
|
const input: any = {
|
|
@@ -3,7 +3,7 @@ import path from 'path';
|
|
|
3
3
|
import { createLogger } from '@unchainedshop/logger';
|
|
4
4
|
import { systemLocale } from '@unchainedshop/utils';
|
|
5
5
|
import localePkg from 'locale';
|
|
6
|
-
import {
|
|
6
|
+
import { Context } from '@unchainedshop/types/api.js';
|
|
7
7
|
|
|
8
8
|
const { Locale } = localePkg;
|
|
9
9
|
|
|
@@ -21,15 +21,17 @@ const methodWrongHandler = (res) => () => {
|
|
|
21
21
|
res.end();
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
export default async function ercMetadataMiddleware(
|
|
24
|
+
export default async function ercMetadataMiddleware(
|
|
25
|
+
req: IncomingMessage & { unchainedContext: Context },
|
|
26
|
+
res,
|
|
27
|
+
) {
|
|
25
28
|
try {
|
|
26
29
|
if (req.method !== 'GET') {
|
|
27
30
|
methodWrongHandler(res)();
|
|
28
31
|
return;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
|
-
const
|
|
32
|
-
const context = await contextResolver({ req, res });
|
|
34
|
+
const context = req.unchainedContext;
|
|
33
35
|
const url = new URL(req.url, process.env.ROOT_URL);
|
|
34
36
|
const parsedPath = path.parse(url.pathname);
|
|
35
37
|
|
package/src/express/index.ts
CHANGED
|
@@ -1,48 +1,154 @@
|
|
|
1
|
-
import { IncomingMessage, OutgoingMessage } from 'http';
|
|
2
|
-
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
3
|
-
import { ApolloServer } from '@apollo/server';
|
|
4
1
|
import type e from 'express';
|
|
5
2
|
import { getCurrentContextResolver } from '../context.js';
|
|
6
3
|
import createBulkImportMiddleware from './createBulkImportMiddleware.js';
|
|
7
4
|
import createERCMetadataMiddleware from './createERCMetadataMiddleware.js';
|
|
8
|
-
import
|
|
9
|
-
import
|
|
5
|
+
import cookieParser from 'cookie-parser';
|
|
6
|
+
import session from 'express-session';
|
|
7
|
+
import MongoStore from 'connect-mongo';
|
|
8
|
+
import { YogaServer } from 'graphql-yoga';
|
|
9
|
+
import setupPassport from './passport/setup.js';
|
|
10
|
+
import { mongodb } from '@unchainedshop/mongodb';
|
|
11
|
+
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
12
|
+
import { emit } from '@unchainedshop/events';
|
|
13
|
+
import { API_EVENTS } from '../events.js';
|
|
14
|
+
|
|
15
|
+
const resolveUserRemoteAddress = (req) => {
|
|
16
|
+
const remoteAddress =
|
|
17
|
+
req.headers['x-real-ip'] ||
|
|
18
|
+
req.headers['x-forwarded-for'] ||
|
|
19
|
+
req.connection?.remoteAddress ||
|
|
20
|
+
req.socket?.remoteAddress ||
|
|
21
|
+
req.connection?.socket?.remoteAddress;
|
|
22
|
+
|
|
23
|
+
const remotePort =
|
|
24
|
+
req.connection?.remotePort || req.socket?.remotePort || req.connection?.socket?.remotePort;
|
|
25
|
+
|
|
26
|
+
return { remoteAddress, remotePort };
|
|
27
|
+
};
|
|
10
28
|
|
|
11
29
|
const {
|
|
12
30
|
BULK_IMPORT_API_PATH = '/bulk-import',
|
|
13
31
|
ERC_METADATA_API_PATH = '/erc-metadata',
|
|
14
32
|
GRAPHQL_API_PATH = '/graphql',
|
|
33
|
+
UNCHAINED_COOKIE_NAME = 'unchained_token',
|
|
34
|
+
UNCHAINED_COOKIE_PATH = '/',
|
|
35
|
+
UNCHAINED_COOKIE_DOMAIN,
|
|
36
|
+
NODE_ENV,
|
|
15
37
|
} = process.env;
|
|
16
38
|
|
|
17
39
|
const addContext = async function middlewareWithContext(
|
|
18
|
-
req:
|
|
19
|
-
res:
|
|
20
|
-
next,
|
|
40
|
+
req: e.Request & { cookies: any },
|
|
41
|
+
res: e.Response,
|
|
42
|
+
next: e.NextFunction,
|
|
21
43
|
) {
|
|
22
44
|
try {
|
|
45
|
+
const setHeader = (key, value) => res.setHeader(key, value);
|
|
46
|
+
const getHeader = (key) => req.headers[key];
|
|
47
|
+
const cookies = req.cookies;
|
|
48
|
+
const { remoteAddress, remotePort } = resolveUserRemoteAddress(req);
|
|
49
|
+
|
|
23
50
|
const context = getCurrentContextResolver();
|
|
24
|
-
|
|
51
|
+
|
|
52
|
+
const login = async (user) => {
|
|
53
|
+
await new Promise((resolve, reject) => {
|
|
54
|
+
(req as any).login(user, (error, result) => {
|
|
55
|
+
if (error) {
|
|
56
|
+
return reject(error);
|
|
57
|
+
}
|
|
58
|
+
return resolve(result);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const tokenObject = {
|
|
63
|
+
_id: (req as any).sessionID,
|
|
64
|
+
/* eslint-disable-next-line */
|
|
65
|
+
tokenExpires: new Date((req as any).session?.cookie._expires),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
await emit(API_EVENTS.API_LOGIN_TOKEN_CREATED, { userId: user._id, ...tokenObject });
|
|
69
|
+
|
|
70
|
+
/* eslint-disable-next-line */
|
|
71
|
+
(user as any)._inLoginMethodResponse = true;
|
|
72
|
+
return { user, ...tokenObject };
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const logout = async (sessionId?: string) => { /* eslint-disable-line */
|
|
76
|
+
// TODO: this should only logout an explicitly provided session if sessionID
|
|
77
|
+
// has been provided
|
|
78
|
+
// express-session destroy
|
|
79
|
+
const { user } = req as any;
|
|
80
|
+
if (!user) return false;
|
|
81
|
+
|
|
82
|
+
const tokenObject = {
|
|
83
|
+
_id: sessionId || (req as any).sessionID,
|
|
84
|
+
userId: user._id,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
await new Promise((resolve, reject) => {
|
|
88
|
+
(req as any).logout((error, result) => {
|
|
89
|
+
if (error) {
|
|
90
|
+
return reject(error);
|
|
91
|
+
}
|
|
92
|
+
return resolve(result);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await emit(API_EVENTS.API_LOGOUT, tokenObject);
|
|
97
|
+
return true;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
(req as any).unchainedContext = await context({
|
|
101
|
+
setHeader,
|
|
102
|
+
getHeader,
|
|
103
|
+
cookies,
|
|
104
|
+
remoteAddress,
|
|
105
|
+
remotePort,
|
|
106
|
+
login,
|
|
107
|
+
logout,
|
|
108
|
+
user: (req as any).user,
|
|
109
|
+
userId: (req as any).user?._id,
|
|
110
|
+
});
|
|
25
111
|
next();
|
|
26
112
|
} catch (error) {
|
|
27
113
|
next(error);
|
|
28
114
|
}
|
|
29
115
|
};
|
|
30
116
|
|
|
31
|
-
export const useMiddlewareWithCurrentContext = (expressApp, path, ...middleware) => {
|
|
32
|
-
if (!path) {
|
|
33
|
-
throw new Error('Path is required for useMiddlewareWithCurrentContext');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
expressApp.use(path, addContext, ...middleware);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
117
|
export const connect = (
|
|
40
118
|
expressApp: e.Express,
|
|
41
|
-
{
|
|
42
|
-
|
|
119
|
+
{
|
|
120
|
+
yogaServer,
|
|
121
|
+
db,
|
|
122
|
+
unchainedAPI,
|
|
123
|
+
}: { yogaServer: YogaServer<any, any>; db: mongodb.Db; unchainedAPI: UnchainedCore },
|
|
43
124
|
) => {
|
|
44
|
-
expressApp.use(
|
|
125
|
+
expressApp.use(cookieParser(), addContext);
|
|
126
|
+
const passport = setupPassport(unchainedAPI);
|
|
127
|
+
expressApp.use(passport.initialize());
|
|
128
|
+
expressApp.use(
|
|
129
|
+
session({
|
|
130
|
+
secret: process.env.UNCHAINED_TOKEN_SECRET,
|
|
131
|
+
store: MongoStore.create({
|
|
132
|
+
client: (db as any).client,
|
|
133
|
+
dbName: db.databaseName,
|
|
134
|
+
collectionName: 'sessions',
|
|
135
|
+
}),
|
|
136
|
+
name: UNCHAINED_COOKIE_NAME,
|
|
137
|
+
saveUninitialized: false,
|
|
138
|
+
resave: false,
|
|
139
|
+
cookie: {
|
|
140
|
+
domain: UNCHAINED_COOKIE_DOMAIN,
|
|
141
|
+
httpOnly: true,
|
|
142
|
+
path: UNCHAINED_COOKIE_PATH,
|
|
143
|
+
sameSite: NODE_ENV === 'production' ? 'lax' : 'none',
|
|
144
|
+
secure: NODE_ENV === 'production',
|
|
145
|
+
maxAge: 1000 * 60 * 60 * 24 * 7,
|
|
146
|
+
},
|
|
147
|
+
}),
|
|
148
|
+
);
|
|
149
|
+
expressApp.use(passport.session());
|
|
150
|
+
expressApp.use(passport.authenticate('access-token', { session: false }));
|
|
151
|
+
expressApp.use(GRAPHQL_API_PATH, yogaServer.handle);
|
|
45
152
|
expressApp.use(ERC_METADATA_API_PATH, createERCMetadataMiddleware);
|
|
46
153
|
expressApp.use(BULK_IMPORT_API_PATH, createBulkImportMiddleware);
|
|
47
|
-
expressApp.use(['/', '/.well-known/unchained/cloud-sso'], createSingleSignOnMiddleware);
|
|
48
154
|
};
|
|
@@ -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,13 +1,10 @@
|
|
|
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
|
-
resolveUserRemoteAddress,
|
|
11
8
|
systemLocale,
|
|
12
9
|
} from '@unchainedshop/utils';
|
|
13
10
|
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
@@ -17,6 +14,8 @@ const { Locales } = localePkg;
|
|
|
17
14
|
|
|
18
15
|
const { NODE_ENV } = process.env;
|
|
19
16
|
|
|
17
|
+
export type GetHeaderFn = (key: string) => string | string[];
|
|
18
|
+
|
|
20
19
|
export const resolveDefaultContext = memoizee(
|
|
21
20
|
async ({ acceptLang, acceptCountry }, unchainedAPI) => {
|
|
22
21
|
const languages = await unchainedAPI.modules.languages.findLanguages(
|
|
@@ -68,14 +67,19 @@ export const resolveDefaultContext = memoizee(
|
|
|
68
67
|
);
|
|
69
68
|
|
|
70
69
|
export const getLocaleContext = async (
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
{
|
|
71
|
+
remoteAddress,
|
|
72
|
+
remotePort,
|
|
73
|
+
getHeader,
|
|
74
|
+
}: {
|
|
75
|
+
remoteAddress: string;
|
|
76
|
+
remotePort: number;
|
|
77
|
+
} & UnchainedHTTPServerContext,
|
|
73
78
|
unchainedAPI: UnchainedCore,
|
|
74
79
|
): Promise<UnchainedLocaleContext> => {
|
|
75
|
-
const userAgent =
|
|
76
|
-
const { remoteAddress, remotePort } = resolveUserRemoteAddress(req);
|
|
80
|
+
const userAgent = getHeader('user-agent');
|
|
77
81
|
const context = await resolveDefaultContext(
|
|
78
|
-
{ acceptLang:
|
|
82
|
+
{ acceptLang: getHeader('accept-language'), acceptCountry: getHeader('x-shop-country') },
|
|
79
83
|
unchainedAPI,
|
|
80
84
|
);
|
|
81
85
|
return { remoteAddress, remotePort, userAgent, ...context };
|
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
|
);
|