spree_api 6.0.2 → 6.0.4

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/spree/api/v3/admin/embed_permissions.rb +5 -2
  3. data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -1
  4. data/app/controllers/concerns/spree/api/v3/security_headers.rb +3 -0
  5. data/app/controllers/spree/api/v3/admin/base_controller.rb +31 -0
  6. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +21 -4
  7. data/app/controllers/spree/api/v3/admin/diagnostics_controller.rb +46 -0
  8. data/app/controllers/spree/api/v3/admin/me_controller.rb +0 -13
  9. data/app/controllers/spree/api/v3/admin/media_controller.rb +10 -0
  10. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +6 -2
  11. data/app/controllers/spree/api/v3/admin/products_controller.rb +56 -0
  12. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +39 -3
  13. data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +1 -3
  14. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +24 -1
  15. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +15 -1
  16. data/app/controllers/spree/api/v3/admin/updates_controller.rb +4 -15
  17. data/app/controllers/spree/api/v3/seller/products/media_controller.rb +46 -0
  18. data/app/controllers/spree/api/v3/seller/products_controller.rb +4 -2
  19. data/app/controllers/spree/api/v3/seller/profile_controller.rb +13 -5
  20. data/app/controllers/spree/api/v3/store/carts_controller.rb +10 -7
  21. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +2 -2
  22. data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +4 -0
  23. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +2 -1
  24. data/app/serializers/spree/api/v3/admin/diagnostics_serializer.rb +30 -0
  25. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +1 -1
  26. data/app/serializers/spree/api/v3/admin/import_serializer.rb +1 -1
  27. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +2 -2
  28. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +6 -1
  29. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +3 -1
  30. data/app/serializers/spree/api/v3/admin/product_serializer.rb +8 -0
  31. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +2 -2
  32. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +4 -1
  33. data/app/serializers/spree/api/v3/admin/promotion_serializer.rb +13 -0
  34. data/app/serializers/spree/api/v3/admin/return_serializer.rb +1 -1
  35. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +3 -2
  36. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +12 -2
  37. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +1 -1
  38. data/app/serializers/spree/api/v3/product_category_serializer.rb +26 -0
  39. data/app/serializers/spree/api/v3/product_collection_serializer.rb +26 -0
  40. data/app/serializers/spree/api/v3/seller/import_serializer.rb +1 -1
  41. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +2 -2
  42. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +2 -2
  43. data/app/serializers/spree/api/v3/seller/product_serializer.rb +8 -0
  44. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -2
  45. data/config/initializers/typelizer.rb +8 -19
  46. data/config/routes.rb +8 -1
  47. data/lib/spree/api/admin_document.rb +284 -0
  48. data/lib/spree/api/agent_operations.rb +300 -0
  49. data/lib/spree/api/agent_resource_map.rb +74 -14
  50. data/lib/spree/api/agent_write_schemas.rb +15 -51
  51. data/lib/spree/api/dependencies.rb +1 -1
  52. data/lib/spree/api/engine.rb +14 -1
  53. data/lib/spree/api/enum_types.rb +4 -1
  54. data/lib/spree/api/openapi/schema_helper.rb +3 -3
  55. data/lib/spree/api/sdk_types.rb +190 -0
  56. data/lib/spree/api/sdk_types_task.rb +68 -0
  57. data/lib/spree/api/testing_support/agent_tools.rb +35 -0
  58. data/lib/spree/api/testing_support/agent_tools_contract.rb +110 -0
  59. data/lib/spree/api/testing_support/deterministic_openapi.rb +147 -0
  60. data/lib/spree/api/testing_support/filter_parameters.rb +99 -0
  61. data/lib/spree/api/testing_support/openapi.rb +233 -0
  62. data/lib/spree/api/testing_support/openapi_tasks.rb +21 -0
  63. data/lib/spree/api/testing_support/sdk_method.rb +34 -0
  64. data/lib/spree/api/typelizer_generation.rb +39 -11
  65. data/lib/tasks/openapi.rake +5 -0
  66. data/lib/tasks/sdk_types.rake +6 -0
  67. data/lib/typelizer/open_enums.rb +13 -1
  68. data/openapi/admin.yaml +2241 -318
  69. data/openapi/store.yaml +125 -125
  70. metadata +26 -9
  71. data/lib/spree/api/agent_workflow_endpoints.rb +0 -113
@@ -5,6 +5,44 @@ module Spree
5
5
  # place where the API's and the email serializers are all loaded: running
6
6
  # it with any serializer missing would delete that serializer's types.
7
7
  module TypelizerGeneration
8
+ # Serializers that exist only for the Admin API, kept out of the Store
9
+ # SDK. Event serializers stay in: they describe the `data` of the typed
10
+ # webhook events the Store SDK ships.
11
+ STORE_EXCLUDED = %w[Asset CartPromotion OrderPromotion Report TaxCategory].to_set.freeze
12
+
13
+ # The store-level types the Seller SDK carries because a seller
14
+ # serializer nests them (see the seller writer in the initializer).
15
+ SELLER_STORE_TYPES = %w[Category CustomField OptionType OptionValue Seller].to_set.freeze
16
+
17
+ # Typelizer's Alba plugin, taught the custom Alba types (see alba.rb);
18
+ # unmapped typed attributes crash generation.
19
+ #
20
+ # @return [Hash] Typelizer's `plugin_configs`
21
+ def self.plugin_configs
22
+ {
23
+ alba: {
24
+ ts_mapper: Typelizer::SerializerPlugins::Alba::ALBA_TS_MAPPER.merge(
25
+ 'iso8601' => { type: :string },
26
+ 'string' => { type: :string }
27
+ )
28
+ }
29
+ }
30
+ end
31
+
32
+ # `interface` rather than `type`, so SDK consumers can extend generated
33
+ # types through declaration merging.
34
+ #
35
+ # @param dir [String, Pathname] a folder Typelizer wrote
36
+ def self.use_interfaces!(dir)
37
+ Dir[File.join(dir, '*.ts')].each do |file|
38
+ next if File.basename(file) == 'index.ts'
39
+
40
+ content = File.read(file)
41
+ updated = content.gsub(/^type (\w+) = \{/, 'interface \1 {')
42
+ File.write(file, updated) if updated != content
43
+ end
44
+ end
45
+
8
46
  # @param serializer_dirs [Array<String, Pathname>] directories to load before generating
9
47
  def self.call(serializer_dirs)
10
48
  serializer_dirs.each { |dir| Rails.autoloaders.main.eager_load_dir(dir.to_s) }
@@ -17,19 +55,9 @@ module Spree
17
55
  require 'typelizer/generator'
18
56
  Typelizer::Generator.call(force: true)
19
57
 
20
- # `interface` rather than `type`, so SDK consumers can extend generated
21
- # types through declaration merging.
22
58
  api_root = Spree::Api::Engine.root
23
59
  [api_root.join('../../packages/sdk/src/types/generated'), api_root.join('../../packages/admin-sdk/src/types/generated'),
24
- api_root.join('../../packages/admin-sdk/src/types/generated/emails')].each do |dir|
25
- Dir[File.join(dir, '*.ts')].each do |file|
26
- next if File.basename(file) == 'index.ts'
27
-
28
- content = File.read(file)
29
- updated = content.gsub(/^type (\w+) = \{/, 'interface \1 {')
30
- File.write(file, updated) if updated != content
31
- end
32
- end
60
+ api_root.join('../../packages/admin-sdk/src/types/generated/emails')].each { |dir| use_interfaces!(dir) }
33
61
 
34
62
  # The typed webhook events in @spree/sdk, from the event catalog.
35
63
  require Spree::Api::Engine.root.join('lib/spree/api/webhook_event_types').to_s
@@ -0,0 +1,5 @@
1
+ # `spree task openapi:generate` (`bin/rails spree:openapi:generate`) in a Spree
2
+ # application: writes openapi/admin.yaml from the app's own rswag specs, so the
3
+ # admin endpoints it adds are documented, and each documented action is an
4
+ # agent tool. Extensions get the same task from extension_rake.
5
+ load File.expand_path('../spree/api/testing_support/openapi_tasks.rb', __dir__)
@@ -0,0 +1,6 @@
1
+ # `spree task sdk:serializer_types OUT=…` (`bin/rails spree:sdk:serializer_types`)
2
+ # in a Spree application: writes the response types of a package that extends
3
+ # the SDKs for the app's own endpoints, from the app's serializers. Extensions
4
+ # get the same task from extension_rake.
5
+ require 'spree/api/sdk_types_task'
6
+ Spree::Api::SdkTypesTask.new
@@ -19,6 +19,14 @@ module Typelizer
19
19
  # the standard can add a country, a currency or a unit, and markets only
20
20
  # accept the locales `Spree::Locales::ALL` lists.
21
21
  module OpenEnums
22
+ class << self
23
+ # Where a named list's type is imported from. Spree's own SDKs re-export
24
+ # it from `@spree/sdk-core`; an extension's package (Spree::Api::SdkTypes)
25
+ # sets this to nil and defines its lists itself, open unless closed.
26
+ attr_accessor :source
27
+ end
28
+ self.source = '@spree/sdk-core'
29
+
22
30
  CLOSED_TYPE_NAMES = %w[CountryCode CurrencyCode LocaleCode WeightUnit DimensionUnit].freeze
23
31
 
24
32
  CLOSED_LIST_NAMES = %w[
@@ -61,7 +69,11 @@ module Typelizer
61
69
 
62
70
  module Property
63
71
  def enum_definition(...)
64
- super && "type { #{enum_type_name} } from '@spree/sdk-core'"
72
+ definition = super
73
+ return definition unless definition
74
+ return "type { #{enum_type_name} } from '#{OpenEnums.source}'" if OpenEnums.source
75
+
76
+ OpenEnums.closed?(enum_type_name) ? definition : "#{definition} | (string & {})"
65
77
  end
66
78
 
67
79
  # Typelizer skips rewriting a file whose digest is unchanged, and the