Files
medusa-store/packages/medusa
Kasper Fabricius Kristensen 577bcc23d4 feat: medusa-source-shopify loader (#563)
* added statuses to product + unit test for updating status

* add update to product model

* added integration tests

* added integration test to validate that updating status to null results in invalid_data error

* removed comment

* update GET /store/products integration test

* fixed unit test with IdMap

* init plugin

* changed dbehaviour on invalid status input on admin list products

* mprices

* updated migration to add status = published on all existing products + added integration test on GET /admin/products when status null is provided

* merged product status

* init ShopifyService

* made requested changes to migration and GET /store/products

* fixed test

* made requested changes to migration

* push progress on source plugin

* add webhook product/create handler

* fixed normalization of variant weight

* removed weight func

* work on events

* finished product hooks (error on new variant needs to be fixed)

* fixed order status

* create fulfillments

* update fulfillment on cancel

* refactored services, handle returns though medusa, helper methods

* order updates

* removed dist

* update gitignore

* emit cahnges to product

* added redis ignore check to prevent update loops

* fixed product-variant.deleted event

* fix more events

* fix test

* fix: order taxes

* added refund with no items

* fixes to hooks

* fixed handling refunds and returns issued from Shopify

* added unit tests to ShopifyProductService and ShopifyCollectionService

* linting fix

* prepared loader PR

* fix: jsDocs

* fix: pager

* fix: build output and babelrc

* chore: linting

* fix: address type

* fix: migration clean up

* fix: update snapshots with ext_ids

Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
2021-12-08 10:09:21 +01:00
..
2021-11-23 09:49:33 +01:00
2021-11-19 10:50:47 +01:00
2021-11-23 09:49:33 +01:00

Structure

  • Models (/models) This is where the data layer lives. Define data models here no logic only schema and data access layer. (Default is MongoDB so we have data access layer defined for us already)

  • Services (/services) This is where our business logic lives. Define services that perform calculations, update the data layer, synchronize services, etc.

  • Controllers (/api) This is the interface lives. Define how the user interacts with the service layer. Ensure that the user has permission to do what they intend to, authenticate requests, call service layer.

  • Jobs (/jobs) This is where background and recurring tasks live. Want to send some data somewhere every night, this would be where to do it. Calls service layer methods and should, like controllers, not contain business logic.

  • Subscribers (/subscribers) This is where events live. Want to perform a certain task whenever something else happens, this is where to do it.

Extending the core

The core will look for files in the folders listed above, and inject the custom code.

Checkout flow

To create an order from a cart the customer must have filled in:

  • their details (shipping/billing address, email)
  • shipping method
  • payment method

The steps can be done in any order. The standard path would probably be:

  1. submit details (PUT /cart/shipping-address, PUT /cart/email)
  2. select shipping method (PUT /cart/shipping-method)
  3. enter payment details (PUT /cart/payment-method)
  4. complete order (POST /order)

Assuming that shipping methods are static within each region we can display all shipping methods at checkout time. If shipping is dynamically calculated the price of the shipping method may change, we will ask the fulfillment provider for new rates.

Payment details can be entered at any point as long as the final amount is known. If the final amount changes after the payment details are entered the payment method may therefore be invalidated.

Within the store UI you could imagine each step being taken care of by a single button click, which calls all endpoints.