Saleor v3.0.0 Release Notes

    • 👌 Improve draft orders and orders webhooks - #SALEOR-4008 by @jakubkuc
    • 🚚 Mark X- headers as deprecated and add headers without prefix. All deprecated headers will be removed in Saleor 4.0 - #8179 by @L3str4nge
      • X-Saleor-Event -> Saleor-Event
      • X-Saleor-Domain -> Saleor-Domain
      • X-Saleor-Signature -> Saleor-Signature
      • X-Saleor-HMAC-SHA256 -> Saleor-HMAC-SHA256
    • Extend editorjs validator to accept blocks different than text - #SALEOR-3354 by @mociepka
    • ➕ Add query contains only schema validation - #6827 by @fowczarek
    • ➕ Add introspection caching - #6871 by @fowczarek
    • ♻️ Refactor plugins manager(add missing tracing, optimize imports, drop plugins manager from settings) - #6890 by @fowczarek
    • ⚡️ Add CUSTOMER_UPDATED webhook, add addresses field to customer CUSTOMER_CREATED webhook - #6898 by @piotrgrundas
    • ➕ Add missing span in PluginManager - #6900 by @fowczarek
    • 🛠 Fix Sentry reporting - #6902 by @fowczarek
    • 🛠 Fix removing page types in cleardb command - #6918 by @fowczarek
    • ➕ Add possibility to apply discount to order/order line with status DRAFT - #6930 by @korycins
    • 🗄 Deprecate API fields Order.discount, Order.discountName, Order.translatedDiscountName - #6874 by @korycins
    • 🛠 Fix argument validation in page resolver - #6960 by @fowczarek
    • ⬇️ Drop data field from checkout line model - #6961 by @fowczarek
    • Add PRODUCT_VARIANT_CREATED, PRODUCT_VARIANT_UPDATED, PRODUCT_VARIANT_DELETED webhooks, fix attributes field for PRODUCT_CREATED, PRODUCT_UPDATED webhooks - #6963 by @piotrgrundas
    • 🛠 Fix totalCount on connection resolver without first or last - #6975 by @fowczarek
    • 🛠 Fix variant resolver on DigitalContent - #6983 by @fowczarek
    • 🛠 Fix race condition on send_fulfillment-confirmation - #6988 by @fowczarek
    • 🛠 Fix resolver by id and slug for product and product variant - #6985 by @d-wysocki
    • ➕ Add optional support for reporting resource limits via a stub field in shop - #6967 by @NyanKiyoshi
    • 👍 Allow to use Bearer as an authorization prefix - #6996 by @korycins
    • ⚡️ Update checkout quantity when checkout lines are deleted - #7002 by @IKarbowiak
    • Raise an error when the user is trying to sort products by rank without search - #7013 by @IKarbowiak
    • 🛠 Fix available shipping methods - return also weight methods without weight limits - #7021 by @IKarbowiak
    • ✂ Remove redundant Opentracing spans - #6994 by @fowczarek
    • ⚡️ Trigger PRODUCT_UPDATED webhook for collections and categories mutations - #7051 by @d-wysocki
    • 👌 Support setting value for AttributeValue mutations - #7037 by @piotrgrundas
    • Validate discount value for percentage vouchers and sales - #7033 by @d-wysocki
    • ⚡️ Optimize children field on Category type - #7045 by @IKarbowiak
    • ➕ Added support for querying objects by metadata fields - #6683 by @LeOndaz, #7421 by @korycins
    • ➕ Add rich text attribute input - #7059 by @piotrgrundas
    • 🔌 Avoid using get_plugins_manager method - #7052 by @IKarbowiak
    • ➕ Add field languageCode to types: AccountInput, AccountRegisterInput, CheckoutCreateInput, CustomerInput, Order, User. Add field languageCodeEnum to Order type. Add new mutation CheckoutLanguageCodeUpdate. Deprecate field Order.languageCode. - #6609 by @korycins
    • ➕ Add benchmarks for triggered product and variants webhooks - #7061 by @d-wysocki
    • Extend Transaction type with gateway response and Payment type with filter - #7062 by @IKarbowiak
    • 🛠 Fix invalid tax rates for lines - #7058 by @IKarbowiak
    • 👍 Allow seeing unconfirmed orders - #7072 by @IKarbowiak
    • Raise GraphQLError when too big integer value is provided - #7076 by @IKarbowiak
    • ⚡️ Do not update draft order addresses when user is changing - #7088 by @IKarbowiak
    • Recalculate draft order when product/variant was deleted - #7085 by @d-wysocki
    • ➕ Added validation for DraftOrderCreate with negative quantity line - #7085 by @d-wysocki
    • ✂ Remove html tags from product description_plaintext - #7094 by @d-wysocki
    • 🐎 Performance upgrade on orders query with shipping and billing addresses - #7083 by @tomaszszymanski129
    • 🐎 Performance upgrade on orders query with payment status - #7125 by @tomaszszymanski129
    • 🐎 Performance upgrade on orders query with events - #7120 by @tomaszszymanski129
    • 🐎 Performance upgrade on orders query with user and userEmail fields - #7091 by @tomaszszymanski129
    • 🛠 Fix dataloader for fetching checkout info - #7084 by @IKarbowiak
    • ⚡️ Update also draft order line total price after getting the unit price from plugin - #7080 by @IKarbowiak
    • 🛠 Fix failing product tasks when instances are removed - #7092 by @IKarbowiak
    • Catch invalid object ID and raise ValidationError - #7114 by @d-wysocki
    • ⚡️ Update GraphQL endpoint to only match exactly /graphql/ without trailing characters - #7117 by @IKarbowiak
    • Introduce traced_resolver decorator instead of graphene middleware - #7159 by @tomaszszymanski129
    • 🛠 Fix failing export when exporting attribute without values - #7131 by @IKarbowiak
    • Extend Vatlayer functionalities - #7101 by @korycins:
      • Allow users to enter a list of exceptions (country ISO codes) that will use the source country rather than the destination country for tax purposes.
      • Allow users to enter a list of countries for which no VAT will be added.
    • 👍 Allow passing metadata to accountRegister mutation - #7152 by @piotrgrundas
    • 🛠 Fix incorrect payment data for klarna - #7150 by @IKarbowiak
    • ⬇️ Drop deleted images from storage - #7129 by @IKarbowiak
    • 🛠 Fix core sorting on related fields - #7195 by @tomaszszymanski129
    • 🛠 Fix variants dataloaders when querying with default channel - #7206 by @tomaszszymanski129
    • 🐎 Performance upgrade on orders query with subtotal field - #7174 by @tomaszszymanski129
    • 🐎 Performance upgrade on orders query with actions field - #7175 by @tomaszszymanski129
    • 🐎 Performance upgrade on orders query with totalAuthorized field - #7170 by @tomaszszymanski129
    • 🛠 Fix export with empty assignment values - #7207 by @IKarbowiak
    • 🔄 Change exported file name - #7218 by @IKarbowiak
    • 🐎 Performance upgrade on OrderLine type with thumbnail field - #7224 by @tomaszszymanski129
    • 👉 Use GraphQL IDs instead of database IDs in export - #7240 by @IKarbowiak
    • 🛠 Fix draft order tax mismatch - #7226 by @IKarbowiak
      • Introduce calculate_order_line_total plugin method
    • ⚡️ Update core logging for better Celery tasks handling - #7251 by @tomaszszymanski129
    • Raise ValidationError when refund cannot be performed - #7260 by @IKarbowiak
    • Extend order with origin and original order values - #7326 by @IKarbowiak
    • 🛠 Fix customer addresses missing after customer creation - #7327 by @tomaszszymanski129
    • 🛰 Extend order webhook payload with fulfillment fields - #7364, #7347 by @korycins
      • fulfillments extended with:
      • total_refund_amount
      • shipping_refund_amount
      • lines
      • fulfillment lines extended with:
      • total_price_net_amount
      • total_price_gross_amount
      • undiscounted_unit_price_net
      • undiscounted_unit_price_gross
      • unit_price_net
    • 🛰 Extend order payload with undiscounted prices and add psp_reference to payment model - #7339 by @IKarbowiak
      • order payload extended with the following fields:
      • undiscounted_total_net_amount
      • undiscounted_total_gross_amount
      • psp_reference on payment
      • order lines extended with:
      • undiscounted_unit_price_net_amount
      • undiscounted_unit_price_gross_amount
      • undiscounted_total_price_net_amount
      • undiscounted_total_price_gross_amount
    • 📇 Copy metadata fields when creating reissue - #7358 by @IKarbowiak
    • ➕ Add payment webhooks - #7044 by @maarcingebala
    • 🛠 Fix invoice generation - #7376 by @tomaszszymanski129
    • 👍 Allow defining only one field in translations - #7363 by @IKarbowiak
    • ⚡️ Trigger checkout_updated hook for checkout meta mutations - #7392 by @maarcingebala
    • ⚡️ Optimize inputType resolver on AttributeValue type - 7396 by @tomaszszymanski129
    • 👍 Allow filtering pages by ids - #7393 by @IKarbowiak
    • ♻️ Refactor account filters - 7419 by @tomaszszymanski129
    • Fix validate min_spent on vouchers to use net or gross value depends on settings.display_gross_prices - #7408 by @d-wysocki
    • 🛠 Fix invoice generation - #7376 by tomaszszymanski129
    • Unify channel ID params #7378
      • targetChannel from ChannelDeleteInput changed to channelId
      • channel from DraftOrderCreateInput changed to channelId
      • channel from DraftOrderInput changed to channelId
      • channel from pluginUpdate changed to channelId
    • Compress celery tasks related with user_emails and webhooks - #7445 by d-wysocki
    • 🐎 Order events performance - #7424 by tomaszszymanski129
    • ➕ Add hash to uploading images #7453 by @IKarbowiak
    • ➕ Add file format validation for uploaded images - #7447 by @IKarbowiak
    • ➕ Add boolean attributes - #7454 by @piotrgrundas
    • 🛠 Fix attaching params for address form errors - #7485 by @IKarbowiak
    • ⚡️ Update draft order validation - #7253 by @IKarbowiak
      • Extend Order type with errors: [OrderError!]! field
      • Create tasks for deleting order lines by deleting products or variants
    • 🛠 Fix doubled checkout total price for one line and zero shipping price - #7532 by @IKarbowiak
    • 🗄 Deprecate nested objects in TranslatableContent types - #7522 by @IKarbowiak
    • 🛠 Fix performance for User type on resolvers: orders, gift cards, events - #7574 by @tomaszszymanski129
    • 🛠 Fix failing account mutations for app - #7569 by @IKarbowiak
    • Modify order of auth middleware calls - #7572 by @tomaszszymanski129
    • ➕ Add app support for events - #7622 by @IKarbowiak
    • Fulfillment confirmation - #7675 by @tomaszszymanski129
    • ➕ Add date & date time attributes - #7500 by @piotrgrundas
    • ➕ Add withChoices flag for Attribute type - #7733 by @dexon44
    • ⬇️ Drop assigning cheapest shipping method in checkout - #7767 by @maarcingebala
    • Add product_id, product_variant_id, attribute_id and page_id when it's possible for AttributeValue translations webhook. - #7783 by @fowczarek
    • 🗄 Deprecate query argument in sales and vouchers queries - #7806 by @maarcingebala
    • 👍 Allow translating objects by translatable content ID - #7803 by @maarcingebala
    • Add page_type_id when it's possible for AttributeValue translations webhook. - #7825 by @fowczarek
    • ⚡️ Optimize available quantity loader. - #7802 by @fowczarek
    • 🔧 Configure a periodic task for removing empty allocations - #7885 by @fowczarek
    • Add webhooks for stock changes: PRODUCT_VARIANT_OUT_OF_STOCK and PRODUCT_VARIANT_BACK_IN_STOCK - #7590 by @mstrumeck
    • 👍 Allow impersonating user by an app/staff - #7754 by @korycins:
      • Add customerId to checkoutCustomerAttach mutation
      • Add new permision IMPERSONATE_USER
      • Handle SameSite cookie attribute in jwt refresh token middleware - #8209 by @jakubkuc
    • ➕ Add workaround for failing Avatax when line has price 0 - #8610 by @korycins
    • ➕ Add option to set tax code for shipping in Avatax configuration view - #8596 by @korycins

    💥 Breaking

    • Multichannel MVP: Multicurrency - #6242 by @fowczarek @d-wysocki
    • ⬇️ Drop deprecated meta mutations - #6422 by @maarcingebala
    • ⬇️ Drop deprecated service accounts and webhooks API - #6431 by @maarcingebala
    • ⬇️ Drop deprecated fields from the ProductVariant type: quantity, quantityAllocated, stockQuantity, isAvailable - #6436 by @maarcingebala
    • ⬇️ Drop authorization keys API - #6631 by @maarcingebala
    • ⬇️ Drop type field from AttributeValue type - #6710 by @IKarbowiak
    • Drop apply_taxes_to_shipping_price_range plugin hook - #6746 by @maarcingebala
    • Drop CHECKOUT_QUANTITY_CHANGED webhook - #6797 by @d-wysocki
    • ⬇️ Drop deprecated taxRate field from ProductType - #6795 by @d-wysocki
    • Unconfirmed order manipulation - #6829 by @tomaszszymanski129
      • Remove mutations for draft order lines manipulation: draftOrderLinesCreate, draftOrderLineDelete, draftOrderLineUpdate
      • Use orderLinesCreate, orderLineDelete, orderLineUpdate mutations instead.
      • Order events enums DRAFT_ADDED_PRODUCTS and DRAFT_REMOVED_PRODUCTS are now ADDED_PRODUCTS and REMOVED_PRODUCTS
    • 🔌 Email interface as a plugin - #6301 by @korycins
    • ✂ Remove resolving user's location from GeoIP; drop PaymentInput.billingAddress input field - #6784 by @maarcingebala
    • 🔄 Change the payload of the order webhook to handle discounts list, added fields: Order.discounts, OrderLine.unit_discount_amount,OrderLine.unit_discount_type, OrderLine.unit_discount_reason , remove fields: Order.discount_amount, Order.discount_name, Order.translated_discount_name- #6874 by @korycins
    • 🐎 Update checkout performance - introduce CheckoutInfo data class - #6958 by @IKarbowiak; Introduced changes in plugin methods definitions:
      • in the following methods, the checkout parameter changed to checkout_info:
      • calculate_checkout_total
      • calculate_checkout_subtotal
      • calculate_checkout_shipping
      • get_checkout_shipping_tax_rate
      • calculate_checkout_line_total
      • calculate_checkout_line_unit_price
      • get_checkout_line_tax_rate
      • preprocess_order_creation
      • additionally, preprocess_order_creation was extend with lines_info parameter
    • 🛠 Fix Avalara caching - #7036 by @fowczarek;
      • Introduced changes in plugin methods definitions:
      • calculate_checkout_line_total was extended with lines parameter
      • calculate_checkout_line_unit_price was extended with lines parameter
      • get_checkout_line_tax_rate was extended with lines parameter To get proper taxes we should always send the whole checkout to Avalara.
    • ⚡️ Remove triggering a webhook event PRODUCT_UPDATED when calling ProductVariantCreate mutation. Use PRODUCT_VARIANT_CREATED instead - #6963 by @piotrgrundas
    • ⚡️ Remove triggering a webhook event PRODUCT_UPDATED when calling ProductVariantChannelListingUpdate mutation. Use PRODUCT_VARIANT_UPDATED instead - #6963 by @piotrgrundas
    • Refactor listing payment gateways - #7050 by @maarcingebala. Breaking changes in plugin methods: removed get_payment_gateway and get_payment_gateway_for_checkout; instead get_payment_gateways was added.
    • 🔄 Change error class in CollectionBulkDelete to CollectionErrors - #7061 by @d-wysocki
    • 🛠 Fix doubling price in checkout for products without tax - #7056 by @IKarbowiak
      • Introduce changes in plugins method:
      • calculate_checkout_subtotal has been dropped from plugins, for correct subtotal calculation, calculate_checkout_line_total must be set (manager method for calculating checkout subtotal uses calculate_checkout_line_total method)
    • 🛰 Make order property of invoice webhook payload contain order instead of order lines - #7081 by @pdblaszczyk
      • Affected webhook events: INVOICE_REQUESTED, INVOICE_SENT, INVOICE_DELETED
    • 👉 Make quantity field on StockInput required - #7082 by @IKarbowiak
    • 🔧 Extend plugins manager to configure plugins for each plugins - #7198 by @korycins:

      • Introduce changes in API:
      • paymentInitialize - add channel parameter. Optional when only one channel exists.
      • pluginUpdate - add channel parameter.
      • availablePaymentGateways - add channel parameter.
      • storedPaymentSources - add channel parameter.
      • requestPasswordReset - add channel parameter.
      • requestEmailChange - add channel parameter.
      • confirmEmailChange - add channel parameter.
      • accountRequestDeletion - add channel parameter.
      • change structure of type Plugin:
        • add globalConfiguration field for storing configuration when a plugin is globally configured
        • add channelConfigurations field for storing plugin configuration for each channel
        • removed configuration field, use globalConfiguration and channelConfigurations instead
      • change structure of input PluginFilterInput:
        • add statusInChannels field
        • add type field
        • removed active field. Use statusInChannels instead
      • Change plugin webhook endpoint - #7332 by @korycins.
      • Use /plugins/channel// for plugins with channel configuration
      • Use /plugins/global/ for plugins with global configuration
      • Remove /plugin/ endpoint
    • ➕ Add description to shipping method - #7116 by @IKarbowiak

      • ShippingMethod was extended with description field.
      • ShippingPriceInput was extended with description field
      • Extended shippingPriceUpdate, shippingPriceCreate mutation to add/edit description
      • Input field in shippingPriceTranslate changed to ShippingPriceTranslationInput
    • ⬇️ Drop deprecated queries and mutations - #7199 by @IKarbowiak

      • drop url field from Category type
      • drop url field from Category type
      • drop url field from Product type
      • drop localized fild from Money type
      • drop permissions field from User type
      • drop navigation field from Shop type
      • drop isActive from AppInput
      • drop value from AttributeInput
      • drop customerId from checkoutCustomerAttach
      • drop stockAvailability argument from products query
      • drop created and status arguments from orders query
      • drop created argument from draftOrders query
      • drop productType from ProductFilter
      • deprecate mutations' <name>Errors, typed errors fields and remove deprecation
    • ➕ Add channel data to Order webhook - #7299 by @krzysztofwolski

    • 🚚 Deprecated Stripe plugin - will be removed in Saleor 4.0

      • rename StripeGatewayPlugin to DeprecatedStripeGatewayPlugin.
      • introduce new StripeGatewayPlugin plugin.
    • Always create new checkout in checkoutCreate mutation - #7318 by @IKarbowiak

      • deprecate created return field on checkoutCreate mutation
    • Return empty values list for attribute without choices - #7394 by @fowczarek

      • values for attributes without choices from now are empty list.
      • attributes with choices - DROPDOWN and MULTISELECT
      • attributes without choices - FILE, REFERENCE, NUMERIC and RICH_TEXT
    • Unify checkout identifier in checkout mutations and queries - #7511 by @IKarbowiak

    • 👉 Use root level channel argument for filtering and sorting - #7374 by @IKarbowiak

      • drop channel field from filters and sorters
    • ⬇️ Drop top-level checkoutLine query from the schema with related resolver, use checkout query instead - #7623 by @dexon44

    • 👉 Make SKU an optional field on ProductVariant - #7633 by @rafalp

    • 📇 Change metadata mutations to use token for order and checkout as identifier - #8426 by @IKarbowiak

      • After changes, using the order id for changing order metadata is deprecated

    Other

    • 🛠 Fix creating translations with app - #6804 by @krzysztofwolski
    • ➕ Add possibility to provide external payment ID during the conversion draft order to order - #6320 by @korycins
    • ➕ Add basic rating for Products - #6284 by @korycins
    • ➕ Add metadata to shipping zones and shipping methods - #6340 by @maarcingebala
    • ➕ Add Page Types - #6261 by @IKarbowiak
    • Migrate draftjs content to editorjs format - #6430 by @IKarbowiak
    • ➕ Add editorjs sanitizer - #6456 by @IKarbowiak
    • ➕ Add generic FileUpload mutation - #6470 by @IKarbowiak
    • Order confirmation backend - #6498 by @tomaszszymanski129
    • 🛠 Fix password reset request - #6351 by @Manfred-Madelaine-pro, Ambroise and Pierre
    • 👍 Refund products support - #6530 by @korycins
    • ➕ Add possibility to exclude products from shipping method - #6506 by @korycins
    • ➕ Add availableShippingMethods to the Shop type - #6551 by @IKarbowiak
    • ➕ Add delivery time to shipping method - #6564 by @IKarbowiak
    • Introduce file attributes - #6568 by @IKarbowiak
    • Shipping zone description - #6653 by @tomaszszymanski129
    • ➕ Add metadata to menu and menu item - #6648 by @tomaszszymanski129
    • 🔌 Get tax rate from plugins - #6649 by @IKarbowiak
    • ➕ Added support for querying user by email - #6632 @LeOndaz
    • ➕ Add order shipping tax rate - #6678 by @IKarbowiak
    • 🗄 Deprecate field descriptionJSON from Product, Category, Collection and field contentJSON from Page - #6692 by @d-wysocki
    • 🛠 Fix products visibility - #6704 by @IKarbowiak
    • Introduce page reference attributes - #6624 by @IKarbowiak
    • Introduce product reference attributes - #6711 by @IKarbowiak
    • ➕ Add metadata to warehouse - #6727 by @d-wysocki
    • Add page webhooks: PAGE_CREATED, PAGE_UPDATED and PAGE_DELETED - #6787 by @d-wysocki
    • Introduce numeric attributes - #6790 by @IKarbowiak
    • ➕ Add PRODUCT_DELETED webhook - #6794 by @d-wysocki
    • ⚡️ Fix product_updated and product_created webhooks - #6798 by @d-wysocki
    • ➕ Add interface for integrating the auth plugins - #6799 by @korycins
    • 🛠 Fix page contentJson field to return JSON - #6832 by @d-wysocki
    • ➕ Add SendgridPlugin - #6793 by @korycins
    • ➕ Add SearchRank to search product by name and description. New enum added to ProductOrderField - RANK - which returns results sorted by search rank - #6872 by @d-wysocki
    • Allocate stocks for order lines in a bulk way - #6877 by @IKarbowiak
    • ➕ Add product description_plaintext to populatedb - #6894 by @d-wysocki
    • ➕ Add uploading video URLs to product's gallery - #6838 by @GrzegorzDerdak
    • Deallocate stocks for order lines in a bulk way - #6896 by @IKarbowiak
    • Prevent negative available quantity - #6897 by @d-wysocki
    • 🛠 Fix CheckoutLinesInfoByCheckoutTokenLoader dataloader - #6929 by @IKarbowiak
    • 🔄 Change the app query to return info about the currently authenticated app - #6928 by @d-wysocki
    • ➕ Add default sorting by rank for search products - #6936 by @d-wysocki
    • 🛠 Fix exporting product description to xlsx - #6959 by @IKarbowiak
    • ➕ Add Shop.version field to query API version - #6980 by @maarcingebala
    • Return empty results when filtering by non-existing attribute - #7025 by @maarcingebala
    • ➕ Add new authorization header Authorization-Bearer - #6998 by @korycins
    • ➕ Add field paymentMethodType to Payment object - #7073 by @korycins
    • Unify Warehouse Address API - #7481 by @d-wysocki
      • deprecate companyName on Warehouse type
      • remove companyName on WarehouseInput type
      • remove WarehouseAddressInput on WarehouseUpdateInput and WarehouseCreateInput, and change it to AddressInput
    • 🛠 Fix passing incorrect customer email to payment gateways - #7486 by @korycins
    • ➕ Add HTTP meta tag for Content-Security-Policy in GraphQL Playground - #7662 by @NyanKiyoshi