feat(oas): medusa-oas-cli as OAS build tool (#3213)
## What
Introduce a CLI for extracting OAS from the core `medusa` package.
## Why
We need to decouple OAS tooling from documentation tooling in order to allow packages and external systems to leverage our OAS has a dependency.
## How
Introduce a new OAS workspace within packages in order to organize current and future OAS related package. Only 1 OAS package for now.
Introduce a new CLI only package to act as the main gateway for all upcoming OAS tooling. Only 1 command for now.
Update documentation tooling pertaining to OAS to use the CLI instead.
## Test
### Prerequisite
From the monorepo root:
* `yarn install`
* `yarn build`
### Documentation
#### Case - validation only - success
* Run `yarn openapi:generate --dry-run`
* Expect console output `🟢 Valid OAS` but no mention of `🔵 Exported OAS`
#### Case - validation only - invalid
* Introduce a bug by renaming `@schema Cart` to `@schema Kart` in [models/cart.ts](0adb0d9ff9/packages/medusa/src/models/cart.ts (L2))
* Run `yarn build` to update `@medusajs/medusa` package with the bug.
* Run `yarn openapi:generate --dry-run`
* Expect console output `🔴 Invalid OAS` with a stack trace of the issue.
#### Case - docs generation
* Run `yarn openapi:generate`
* Expect `docs/api/` directory to contain:
* `admin.oas.json` (raw OAS)
* `store.oas.json` (raw OAS)
* `admin.oas.yaml` (sanitized OAS)
* `store.oas.yaml` (sanitized OAS)
* `admin/` (updated redocly split output)
* `store/` (updated redocly split output)
### CLI
#### Case - crawl additional paths
* From a local medusa server (`medusa-starter-default`), add an `index.ts` file in `src/models/`
* In the `index.ts`, add dummy OAS JSDoc like `/** @schema Foobar */`
* From the root of the monorepo, run `yarn medusa-oas --type store --paths path-to-medusa-server/src`
* Expect a `store.oas.json` to be created at the root of the monorepo.
* The `store.oas.json` should contain an additional `Foobar` entry in `components.schemas`.
This commit is contained in:
@@ -1,342 +0,0 @@
|
||||
openapi: 3.0.0
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Medusa Admin API
|
||||
description: |
|
||||
API reference for Medusa's Admin endpoints. All endpoints are prefixed with `/admin`.
|
||||
|
||||
## Authentication
|
||||
|
||||
There are two ways to send authenticated requests to the Medusa server: Using a user's API token, or using a Cookie Session ID.
|
||||
|
||||
<!-- ReDoc-Inject: <SecurityDefinitions> -->
|
||||
|
||||
## Expanding Fields
|
||||
|
||||
In many endpoints you'll find an `expand` query parameter that can be passed to the endpoint. You can use the `expand` query parameter to unpack an entity's relations and return them in the response.
|
||||
|
||||
For example, when you list customers you can also retrieve their groups by passing to the `expand` query parameter the value `groups`.
|
||||
|
||||
You can expand more than one relation by separating the relations in the `expand` query parameter with a comma. For example, to retrieve both the orders and the groups of a customer, pass to the `expand` query parameter the value `groups,orders`.
|
||||
|
||||
Please note that the parameters you pass to `expand` replace any relations that are expanded by default.
|
||||
|
||||
## Selecting Fields
|
||||
|
||||
In many endpoints you'll find a `fields` query parameter that can be passed to the endpoint. You can use the `fields` query parameter to specify which fields in the entity should be returned in the response.
|
||||
|
||||
You can pass more than one field by seperating the field names in the `fields` query parameter with a comma.
|
||||
|
||||
Only the fields you pass to `field` will be retrieved and returned in the response. Any fields that are returned by default will not be returned in this case. This does not affect relations.
|
||||
|
||||
For example, to only select the `title` and `description` fields of a product, pass to the `fields` query parameter the value `title,description`.
|
||||
|
||||
## Pagination
|
||||
|
||||
### Query Parameters
|
||||
|
||||
In listing endpoints, such as list customers or list products, you can control the pagination using the query parameters `limit` and `offset`.
|
||||
|
||||
`limit` is used to specify the maximum number of items that can be return in the response. `offset` is used to specify how many items to skip before returning the resulting entities.
|
||||
|
||||
You can use the `offset` query parameter to change between pages. For example, if the limit is 50, at page 1 the offset should be 0; at page 2 the offset should be 50, and so on.
|
||||
|
||||
### Response Fields
|
||||
|
||||
In listing fields, aside from the entities retrieved, there are three pagination-related fields returned: `count`, `limit`, and `offset`.
|
||||
|
||||
Similarly to the query parameters, `limit` is the maximum number of items that can be returned in the response, and `field` is the number of items that were skipped before the entities in the result.
|
||||
|
||||
`count` is the total number of available items of this entity. It can be used to determine how many pages are there.
|
||||
|
||||
For example, if the `count` is 100 and the `limit` is 50, you can divide the `count` by the `limit` to get the number of pages: `100/50 = 2 pages`.
|
||||
|
||||
license:
|
||||
name: MIT
|
||||
url: https://github.com/medusajs/medusa/blob/master/LICENSE
|
||||
tags:
|
||||
- name: Auth
|
||||
description: Auth endpoints that allow authorization of admin Users and manages
|
||||
their sessions.
|
||||
- name: App
|
||||
description: App endpoints that allow handling apps in Medusa.
|
||||
- name: Batch Job
|
||||
description: Batch Job endpoints that allow handling batch jobs in Medusa.
|
||||
- name: Claim
|
||||
description: Claim endpoints that allow handling claims in Medusa.
|
||||
- name: Collection
|
||||
description: Collection endpoints that allow handling collections in Medusa.
|
||||
- name: Customer
|
||||
description: Customer endpoints that allow handling customers in Medusa.
|
||||
- name: Customer Group
|
||||
description: Customer Group endpoints that allow handling customer groups in Medusa.
|
||||
- name: Discount
|
||||
description: Discount endpoints that allow handling discounts in Medusa.
|
||||
- name: Discount Condition
|
||||
description: Discount Condition endpoints that allow handling discount conditions
|
||||
in Medusa.
|
||||
- name: Draft Order
|
||||
description: Draft Order endpoints that allow handling draft orders in Medusa.
|
||||
- name: Gift Card
|
||||
description: Gift Card endpoints that allow handling gift cards in Medusa.
|
||||
- name: Invite
|
||||
description: Invite endpoints that allow handling invites in Medusa.
|
||||
- name: Note
|
||||
description: Note endpoints that allow handling notes in Medusa.
|
||||
- name: Notification
|
||||
description: Notification endpoints that allow handling notifications in Medusa.
|
||||
- name: Order
|
||||
description: Order endpoints that allow handling orders in Medusa.
|
||||
- name: Price List
|
||||
description: Price List endpoints that allow handling price lists in Medusa.
|
||||
- name: Product
|
||||
description: Product endpoints that allow handling products in Medusa.
|
||||
- name: Product Tag
|
||||
description: Product Tag endpoints that allow handling product tags in Medusa.
|
||||
- name: Product Type
|
||||
description: Product Types endpoints that allow handling product types in Medusa.
|
||||
- name: Product Variant
|
||||
description: Product Variant endpoints that allow handling product variants in Medusa.
|
||||
- name: Region
|
||||
description: Region endpoints that allow handling regions in Medusa.
|
||||
- name: Return Reason
|
||||
description: Return Reason endpoints that allow handling return reasons in Medusa.
|
||||
- name: Return
|
||||
description: Return endpoints that allow handling returns in Medusa.
|
||||
- name: Sales Channel
|
||||
description: Sales Channel endpoints that allow handling sales channels in Medusa.
|
||||
- name: Shipping Option
|
||||
description: Shipping Option endpoints that allow handling shipping options in Medusa.
|
||||
- name: Shipping Profile
|
||||
description: Shipping Profile endpoints that allow handling shipping profiles in
|
||||
Medusa.
|
||||
- name: Store
|
||||
description: Store endpoints that allow handling stores in Medusa.
|
||||
- name: Swap
|
||||
description: Swap endpoints that allow handling swaps in Medusa.
|
||||
- name: Tax Rate
|
||||
description: Tax Rate endpoints that allow handling tax rates in Medusa.
|
||||
- name: Upload
|
||||
description: Upload endpoints that allow handling uploads in Medusa.
|
||||
- name: User
|
||||
description: User endpoints that allow handling users in Medusa.
|
||||
servers:
|
||||
- url: https://api.medusa-commerce.com/admin
|
||||
paths: { }
|
||||
components:
|
||||
responses:
|
||||
default_error:
|
||||
description: Default Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
code: "unknown_error"
|
||||
message: "An unknown error occurred."
|
||||
type: "unknown_error"
|
||||
invalid_state_error:
|
||||
description: Invalid State Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
code: "unknown_error"
|
||||
message: "The request conflicted with another request. You may retry the request with the provided Idempotency-Key."
|
||||
type: "QueryRunnerAlreadyReleasedError"
|
||||
invalid_request_error:
|
||||
description: Invalid Request Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
code: "invalid_request_error"
|
||||
message: "Discount with code TEST already exists."
|
||||
type: "duplicate_error"
|
||||
not_found_error:
|
||||
description: Not Found Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
message: "Entity with id 1 was not found"
|
||||
type: "not_found"
|
||||
400_error:
|
||||
description: Client Error or Multiple Errors
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
oneOf:
|
||||
- $ref: "#/components/schemas/Error"
|
||||
- $ref: "#/components/schemas/MultipleErrors"
|
||||
examples:
|
||||
not_allowed:
|
||||
$ref: "#/components/examples/not_allowed_error"
|
||||
invalid_data:
|
||||
$ref: "#/components/examples/invalid_data_error"
|
||||
MultipleErrors:
|
||||
$ref: "#/components/examples/multiple_errors"
|
||||
500_error:
|
||||
description: Server Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
examples:
|
||||
database:
|
||||
$ref: "#/components/examples/database_error"
|
||||
unexpected_state:
|
||||
$ref: "#/components/examples/unexpected_state_error"
|
||||
invalid_argument:
|
||||
$ref: "#/components/examples/invalid_argument_error"
|
||||
default_error:
|
||||
$ref: "#/components/examples/default_error"
|
||||
unauthorized:
|
||||
description: 'User is not authorized. Must log in first'
|
||||
content:
|
||||
text/plain:
|
||||
schema:
|
||||
type: string
|
||||
default: Unauthorized
|
||||
example: Unauthorized
|
||||
incorrect_credentials:
|
||||
description: 'User does not exist or incorrect credentials'
|
||||
content:
|
||||
text/plain:
|
||||
schema:
|
||||
type: string
|
||||
default: Unauthorized
|
||||
example: Unauthorized
|
||||
examples:
|
||||
not_allowed_error:
|
||||
summary: Not Allowed Error
|
||||
value:
|
||||
message: "Discount must be set to dynamic"
|
||||
type: "not_allowed"
|
||||
invalid_data_error:
|
||||
summary: Invalid Data Error
|
||||
value:
|
||||
message: "first_name must be a string"
|
||||
type: "invalid_data"
|
||||
multiple_errors:
|
||||
summary: Multiple Errors
|
||||
value:
|
||||
message: "Provided request body contains errors. Please check the data and retry the request"
|
||||
errors:
|
||||
- message: "first_name must be a string"
|
||||
type: "invalid_data"
|
||||
- message: "Discount must be set to dynamic"
|
||||
type: "not_allowed"
|
||||
database_error:
|
||||
summary: Database Error
|
||||
value:
|
||||
code: "api_error"
|
||||
message: "An error occured while hashing password"
|
||||
type: "database_error"
|
||||
unexpected_state_error:
|
||||
summary: Unexpected State Error
|
||||
value:
|
||||
message: "cart.total must be defined"
|
||||
type: "unexpected_state"
|
||||
invalid_argument_error:
|
||||
summary: Invalid Argument Error
|
||||
value:
|
||||
message: "cart.total must be defined"
|
||||
type: "unexpected_state"
|
||||
default_error:
|
||||
summary: Default Error
|
||||
value:
|
||||
code: "unknown_error"
|
||||
message: "An unknown error occurred."
|
||||
type: "unknown_error"
|
||||
securitySchemes:
|
||||
api_token:
|
||||
type: http
|
||||
x-displayName: API Token
|
||||
description: |
|
||||
Use a user's API Token to send authenticated requests.
|
||||
|
||||
### How to Add API Token to a User
|
||||
|
||||
At the moment, there's no direct way of adding an API Token for a user. The only way it can be done is through directly editing the database.
|
||||
|
||||
If you're using a PostgreSQL database, you can run the following commands in your command line to add API token:
|
||||
|
||||
```bash
|
||||
psql -d <DB_NAME> -U <DB_USER>
|
||||
UPDATE public.user SET api_token='<API_TOKEN>' WHERE email='<USER_EMAIL>';
|
||||
```
|
||||
|
||||
Where:
|
||||
- `<DB_NAME>` is the name of the database schema you use for the Medusa server.
|
||||
- `<DB_USER>` is the name of the user that has privileges over the database schema.
|
||||
- `<API_TOKEN>` is the API token you want to associate with the user. You can use [this tool to generate a random token](https://randomkeygen.com/).
|
||||
- `<USER_EMAIL>` is the email address of the admin user you want to have this API token.
|
||||
|
||||
### How to Use the API Token
|
||||
|
||||
The API token can be used for Bearer Authentication. It's passed in the `Authorization` header as the following:
|
||||
|
||||
```
|
||||
Authorization: Bearer {api_token}
|
||||
```
|
||||
|
||||
In this API reference, you'll find in the cURL request samples the use of `{api_token}`. This is where you must pass the API token.
|
||||
|
||||
If you're following along with the JS Client request samples, you must provide the `apiKey` option when creating the Medusa client:
|
||||
|
||||
```ts
|
||||
const medusa = new Medusa({ baseUrl: MEDUSA_BACKEND_URL, maxRetries: 3, apiKey: '{api_token}' })
|
||||
```
|
||||
|
||||
If you're using Medusa React, you can pass the `apiKey` prop to `MedusaProvider`:
|
||||
|
||||
```tsx
|
||||
<MedusaProvider
|
||||
apiKey='api_token}'
|
||||
//...
|
||||
>
|
||||
```
|
||||
scheme: bearer
|
||||
cookie_auth:
|
||||
type: apiKey
|
||||
in: cookie
|
||||
name: connect.sid
|
||||
x-displayName: Cookie Session ID
|
||||
description: |
|
||||
Use a cookie session to send authenticated requests.
|
||||
|
||||
### How to Obtain the Cookie Session
|
||||
|
||||
If you're sending requests through a browser, using JS Client, or using tools like Postman, the cookie session should be automatically set when the admin user is logged in.
|
||||
|
||||
If you're sending requests using cURL, you must set the Session ID in the cookie manually.
|
||||
|
||||
To do that, send a request to [authenticate the user](#tag/Auth/operation/PostAuth) and pass the cURL option `-v`:
|
||||
|
||||
```bash
|
||||
curl -v --location --request POST 'https://medusa-url.com/admin/auth' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"email": "user@example.com",
|
||||
"password": "supersecret"
|
||||
}'
|
||||
```
|
||||
|
||||
The headers will be logged in the terminal as well as the response. You should find in the headers a Cookie header similar to this:
|
||||
|
||||
```bash
|
||||
Set-Cookie: connect.sid=s%3A2Bu8BkaP9JUfHu9rG59G16Ma0QZf6Gj1.WT549XqX37PN8n0OecqnMCq798eLjZC5IT7yiDCBHPM;
|
||||
```
|
||||
|
||||
Copy the value after `connect.sid` (without the `;` at the end) and pass it as a cookie in subsequent requests as the following:
|
||||
|
||||
```bash
|
||||
curl --location --request GET 'https://medusa-url.com/admin/products' \
|
||||
--header 'Cookie: connect.sid={sid}'
|
||||
```
|
||||
|
||||
Where `{sid}` is the value of `connect.sid` that you copied.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,958 +0,0 @@
|
||||
{
|
||||
"resources": {
|
||||
"region": {
|
||||
"id": "reg_01F0YES4R67TXXC1QBQ8P54A8Y",
|
||||
"name": "Test Region",
|
||||
"currency_code": "usd",
|
||||
"tax_rate": "0",
|
||||
"tax_code": null,
|
||||
"payment_providers": [],
|
||||
"fulfillment_providers": [
|
||||
{
|
||||
"id": "test-ful",
|
||||
"is_installed": true
|
||||
}
|
||||
],
|
||||
"created_at": "2021-03-16T21:24:00.389Z",
|
||||
"updated_at": "2021-03-16T21:24:00.389Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"shipping_option": {
|
||||
"id": "so_01F0YES4T6ZHH52Z4KZEDT1312",
|
||||
"name": "Free Shipping",
|
||||
"region_id": "reg_01F0YES4R67TXXC1QBQ8P54A8Y",
|
||||
"region": {
|
||||
"id": "reg_01F0YES4R67TXXC1QBQ8P54A8Y",
|
||||
"name": "Test Region",
|
||||
"currency_code": "usd",
|
||||
"tax_rate": "0",
|
||||
"tax_code": null,
|
||||
"payment_providers": [],
|
||||
"fulfillment_providers": [
|
||||
{
|
||||
"id": "test-ful",
|
||||
"is_installed": true
|
||||
}
|
||||
],
|
||||
"created_at": "2021-03-16T21:24:00.389Z",
|
||||
"updated_at": "2021-03-16T21:24:00.389Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"profile_id": "sp_01F0YES4Q77FGG18GPFWW5BZP9",
|
||||
"profile": {
|
||||
"id": "sp_01F0YES4Q77FGG18GPFWW5BZP9",
|
||||
"name": "Default Shipping Profile",
|
||||
"type": "default",
|
||||
"created_at": "2021-03-16T21:24:00.307Z",
|
||||
"updated_at": "2021-03-16T21:24:00.307Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"provider_id": "test-ful",
|
||||
"price_type": "flat_rate",
|
||||
"amount": 100,
|
||||
"is_return": false,
|
||||
"requirements": [],
|
||||
"data": {},
|
||||
"created_at": "2021-03-16T21:24:00.439Z",
|
||||
"updated_at": "2021-03-16T21:24:00.439Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"cart": {
|
||||
"id": "cart_01F0YES82DA12W88KQ90EY6W4C",
|
||||
"email": null,
|
||||
"billing_address_id": null,
|
||||
"billing_address": null,
|
||||
"shipping_address_id": "addr_01F0YES82D4Y16JKGF0NFSSS3P",
|
||||
"shipping_address": {
|
||||
"id": "addr_01F0YES82D4Y16JKGF0NFSSS3P",
|
||||
"customer_id": null,
|
||||
"company": null,
|
||||
"first_name": null,
|
||||
"last_name": null,
|
||||
"address_1": null,
|
||||
"address_2": null,
|
||||
"city": null,
|
||||
"country_code": "us",
|
||||
"province": null,
|
||||
"postal_code": null,
|
||||
"phone": null,
|
||||
"created_at": "2021-03-16T21:24:03.766Z",
|
||||
"updated_at": "2021-03-16T21:24:03.766Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"items": [],
|
||||
"region_id": "region",
|
||||
"region": {
|
||||
"id": "region",
|
||||
"name": "Test Region",
|
||||
"currency_code": "usd",
|
||||
"tax_rate": "0",
|
||||
"tax_code": null,
|
||||
"countries": [
|
||||
{
|
||||
"id": 236,
|
||||
"iso_2": "us",
|
||||
"iso_3": "usa",
|
||||
"num_code": 840,
|
||||
"name": "UNITED STATES",
|
||||
"display_name": "United States",
|
||||
"region_id": "region"
|
||||
}
|
||||
],
|
||||
"payment_providers": [],
|
||||
"fulfillment_providers": [],
|
||||
"created_at": "2021-03-16T21:24:03.743Z",
|
||||
"updated_at": "2021-03-16T21:24:03.743Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"discounts": [],
|
||||
"gift_cards": [],
|
||||
"customer_id": null,
|
||||
"payment_sessions": [],
|
||||
"payment_id": null,
|
||||
"payment": null,
|
||||
"shipping_methods": [],
|
||||
"type": "default",
|
||||
"completed_at": null,
|
||||
"created_at": "2021-03-16T21:24:03.766Z",
|
||||
"updated_at": "2021-03-16T21:24:03.857Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null,
|
||||
"idempotency_key": null,
|
||||
"context": {
|
||||
"ip": "::ffff:127.0.0.1",
|
||||
"user_agent": "axios/0.21.1"
|
||||
},
|
||||
"shipping_total": 0,
|
||||
"discount_total": 0,
|
||||
"tax_total": 0,
|
||||
"gift_card_total": 0,
|
||||
"subtotal": 0,
|
||||
"total": 0
|
||||
},
|
||||
"product_collection": {
|
||||
"id": "pcol_01F0YESBFAZ0DV6V831JXWH0BG",
|
||||
"title": "Summer Collection",
|
||||
"handle": "summer-collection",
|
||||
"created_at": "2021-03-16T21:24:07.273Z",
|
||||
"updated_at": "2021-03-16T21:24:07.273Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"gift_card": {
|
||||
"id": "gift_01F0YESEKYJ5578VCAPV4XYFDP",
|
||||
"code": "1J3U-WXO0-SZ0H-O5QU",
|
||||
"value": 1000,
|
||||
"balance": 1000,
|
||||
"region_id": "reg_01F0YESEJP4H8Q517XSPGK6TD6",
|
||||
"region": {
|
||||
"id": "reg_01F0YESEJP4H8Q517XSPGK6TD6",
|
||||
"name": "Test Region",
|
||||
"currency_code": "usd",
|
||||
"tax_rate": "0",
|
||||
"tax_code": null,
|
||||
"payment_providers": [],
|
||||
"fulfillment_providers": [],
|
||||
"created_at": "2021-03-16T21:24:10.454Z",
|
||||
"updated_at": "2021-03-16T21:24:10.454Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"is_disabled": false,
|
||||
"ends_at": null,
|
||||
"created_at": "2021-03-16T21:24:10.484Z",
|
||||
"updated_at": "2021-03-16T21:24:10.484Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"product": {
|
||||
"id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"title": "Test product",
|
||||
"subtitle": null,
|
||||
"description": "test-product-description",
|
||||
"handle": "test-product",
|
||||
"is_giftcard": false,
|
||||
"images": [],
|
||||
"thumbnail": null,
|
||||
"options": [
|
||||
{
|
||||
"id": "opt_01F0YESHQBZVKCEXJ24BS6PCX3",
|
||||
"title": "size",
|
||||
"product_id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
{
|
||||
"id": "opt_01F0YESHQBV8MMNN4V7WSDMH6G",
|
||||
"title": "color",
|
||||
"product_id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"variants": [
|
||||
{
|
||||
"id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"title": "Test variant",
|
||||
"product_id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"product": {
|
||||
"id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"title": "Test product",
|
||||
"subtitle": null,
|
||||
"description": "test-product-description",
|
||||
"handle": "test-product",
|
||||
"is_giftcard": false,
|
||||
"thumbnail": null,
|
||||
"profile_id": "sp_01F0YESHMKRB4V3B7F6MVQHGNN",
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"collection_id": "test-collection",
|
||||
"type_id": "test-type",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"prices": [
|
||||
{
|
||||
"id": "ma_01F0YESHRFQNH5S8Q0PK84YYZN",
|
||||
"currency_code": "usd",
|
||||
"amount": 100,
|
||||
"sale_amount": null,
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"region_id": null,
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null
|
||||
}
|
||||
],
|
||||
"sku": null,
|
||||
"barcode": null,
|
||||
"ean": null,
|
||||
"upc": null,
|
||||
"inventory_quantity": 10,
|
||||
"allow_backorder": false,
|
||||
"manage_inventory": true,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"options": [
|
||||
{
|
||||
"id": "optval_01F0YESHR7S6ECD03RF6W12DSJ",
|
||||
"value": "large",
|
||||
"option_id": "opt_01F0YESHQBZVKCEXJ24BS6PCX3",
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
{
|
||||
"id": "optval_01F0YESHR7N2GHM1RN3GKYPN6P",
|
||||
"value": "green",
|
||||
"option_id": "opt_01F0YESHQBV8MMNN4V7WSDMH6G",
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"profile_id": "sp_01F0YESHMKRB4V3B7F6MVQHGNN",
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"collection_id": "test-collection",
|
||||
"collection": {
|
||||
"id": "test-collection",
|
||||
"title": "Test collection",
|
||||
"handle": null,
|
||||
"created_at": "2021-03-16T21:24:13.603Z",
|
||||
"updated_at": "2021-03-16T21:24:13.603Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"type_id": "test-type",
|
||||
"type": {
|
||||
"id": "test-type",
|
||||
"value": "test-type",
|
||||
"created_at": "2021-03-16T21:24:13.613Z",
|
||||
"updated_at": "2021-03-16T21:24:13.613Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"tags": [
|
||||
{
|
||||
"id": "tag1",
|
||||
"value": "123",
|
||||
"created_at": "2021-03-16T21:24:13.609Z",
|
||||
"updated_at": "2021-03-16T21:24:13.609Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
{
|
||||
"id": "ptag_01F0YESHPZYY3H4SJ3A5918SBN",
|
||||
"value": "456",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"metadata": null
|
||||
},
|
||||
"product_variant": {
|
||||
"id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"title": "Test variant",
|
||||
"product_id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"product": {
|
||||
"id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"title": "Test product",
|
||||
"subtitle": null,
|
||||
"description": "test-product-description",
|
||||
"handle": "test-product",
|
||||
"is_giftcard": false,
|
||||
"thumbnail": null,
|
||||
"profile_id": "sp_01F0YESHMKRB4V3B7F6MVQHGNN",
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"collection_id": "test-collection",
|
||||
"type_id": "test-type",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"prices": [
|
||||
{
|
||||
"id": "ma_01F0YESHRFQNH5S8Q0PK84YYZN",
|
||||
"currency_code": "usd",
|
||||
"amount": 100,
|
||||
"sale_amount": null,
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"region_id": null,
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null
|
||||
}
|
||||
],
|
||||
"sku": null,
|
||||
"barcode": null,
|
||||
"ean": null,
|
||||
"upc": null,
|
||||
"inventory_quantity": 10,
|
||||
"allow_backorder": false,
|
||||
"manage_inventory": true,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"options": [
|
||||
{
|
||||
"id": "optval_01F0YESHR7S6ECD03RF6W12DSJ",
|
||||
"value": "large",
|
||||
"option_id": "opt_01F0YESHQBZVKCEXJ24BS6PCX3",
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
{
|
||||
"id": "optval_01F0YESHR7N2GHM1RN3GKYPN6P",
|
||||
"value": "green",
|
||||
"option_id": "opt_01F0YESHQBV8MMNN4V7WSDMH6G",
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"product_option": {
|
||||
"id": "opt_01F0YESHQBZVKCEXJ24BS6PCX3",
|
||||
"title": "size",
|
||||
"product_id": "prod_01F0YESHQ27Y31CAMD0NV6W9YP",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"product_option_value": {
|
||||
"id": "optval_01F0YESHR7S6ECD03RF6W12DSJ",
|
||||
"value": "large",
|
||||
"option_id": "opt_01F0YESHQBZVKCEXJ24BS6PCX3",
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"money_amount": {
|
||||
"id": "ma_01F0YESHRFQNH5S8Q0PK84YYZN",
|
||||
"currency_code": "usd",
|
||||
"amount": 100,
|
||||
"sale_amount": null,
|
||||
"variant_id": "variant_01F0YESHR7P2YAYBDBY5B6X3PK",
|
||||
"region_id": null,
|
||||
"created_at": "2021-03-16T21:24:13.657Z",
|
||||
"updated_at": "2021-03-16T21:24:13.657Z",
|
||||
"deleted_at": null
|
||||
},
|
||||
"discount": {
|
||||
"id": "disc_01F0YESMW10MGHWJKZSDDMN0VN",
|
||||
"code": "10DISC",
|
||||
"is_dynamic": false,
|
||||
"rule_id": "dru_01F0YESMVK96HVX7N419E3CJ7C",
|
||||
"rule": {
|
||||
"id": "dru_01F0YESMVK96HVX7N419E3CJ7C",
|
||||
"description": "10 Percent",
|
||||
"type": "percentage",
|
||||
"value": 10,
|
||||
"allocation": "total",
|
||||
"usage_limit": null,
|
||||
"created_at": "2021-03-16T21:24:16.872Z",
|
||||
"updated_at": "2021-03-16T21:24:16.872Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"is_disabled": false,
|
||||
"parent_discount_id": null,
|
||||
"starts_at": "2021-03-16T21:24:16.872Z",
|
||||
"ends_at": null,
|
||||
"created_at": "2021-03-16T21:24:16.872Z",
|
||||
"updated_at": "2021-03-16T21:24:16.872Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"discount_rule": {
|
||||
"id": "dru_01F0YESMVK96HVX7N419E3CJ7C",
|
||||
"description": "10 Percent",
|
||||
"type": "percentage",
|
||||
"value": 10,
|
||||
"allocation": "total",
|
||||
"usage_limit": null,
|
||||
"created_at": "2021-03-16T21:24:16.872Z",
|
||||
"updated_at": "2021-03-16T21:24:16.872Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"customer": {
|
||||
"id": "cus_01F0YESQXFZ5WKMHTXJ4JDPBDZ",
|
||||
"email": "test1@email.com",
|
||||
"first_name": null,
|
||||
"last_name": null,
|
||||
"billing_address_id": null,
|
||||
"password_hash": null,
|
||||
"phone": null,
|
||||
"has_account": false,
|
||||
"orders": [],
|
||||
"created_at": "2021-03-16T21:24:20.015Z",
|
||||
"updated_at": "2021-03-16T21:24:20.015Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"shipping_profile": {
|
||||
"id": "sp_01F0YESTZQFW15SFEZSS29EZ5R",
|
||||
"name": "Default Shipping Profile",
|
||||
"type": "default",
|
||||
"created_at": "2021-03-16T21:24:23.116Z",
|
||||
"updated_at": "2021-03-16T21:24:23.116Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"store": {
|
||||
"id": "store_01F0YESXYNJNTJJY5G5Z26KHKJ",
|
||||
"name": "Medusa Store",
|
||||
"default_currency_code": "usd",
|
||||
"default_currency": {
|
||||
"code": "usd",
|
||||
"symbol": "$",
|
||||
"symbol_native": "$",
|
||||
"name": "US Dollar"
|
||||
},
|
||||
"currencies": [],
|
||||
"swap_link_template": null,
|
||||
"created_at": "2021-03-16T21:24:26.191Z",
|
||||
"updated_at": "2021-03-16T21:24:26.191Z",
|
||||
"metadata": null,
|
||||
"payment_providers": [
|
||||
{
|
||||
"id": "test-pay",
|
||||
"is_installed": true
|
||||
}
|
||||
],
|
||||
"fulfillment_providers": [
|
||||
{
|
||||
"id": "test-ful",
|
||||
"is_installed": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"user": {
|
||||
"id": "admin_user",
|
||||
"email": "admin@medusa.js",
|
||||
"first_name": null,
|
||||
"last_name": null,
|
||||
"api_token": "test_token",
|
||||
"created_at": "2021-03-16T21:24:29.411Z",
|
||||
"updated_at": "2021-03-16T21:24:29.411Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"notification": {
|
||||
"id": "noti_01F0YET45G9NHP08Z66CE4QKBS",
|
||||
"resource_type": "order",
|
||||
"resource_id": "order_01F0BF66ZBXNJ98WDQ9SCWH8Y7",
|
||||
"event_name": "order.placed",
|
||||
"to": "test@email.com",
|
||||
"provider_id": "test-not",
|
||||
"created_at": "2021-03-16T21:24:32.560Z",
|
||||
"updated_at": "2021-03-16T21:24:32.560Z",
|
||||
"resends": []
|
||||
},
|
||||
"order": {
|
||||
"id": "order_01F0YET7CZ741ECWG1J3N34RXF",
|
||||
"status": "pending",
|
||||
"fulfillment_status": "not_fulfilled",
|
||||
"payment_status": "not_paid",
|
||||
"display_id": 1,
|
||||
"cart_id": null,
|
||||
"customer_id": "cus_01F0YET7C3H3D5M8QPNPP5CDAX",
|
||||
"customer": {
|
||||
"id": "cus_01F0YET7C3H3D5M8QPNPP5CDAX",
|
||||
"email": "test@email.com",
|
||||
"first_name": null,
|
||||
"last_name": null,
|
||||
"billing_address_id": null,
|
||||
"password_hash": null,
|
||||
"phone": null,
|
||||
"has_account": false,
|
||||
"created_at": "2021-03-16T21:24:35.843Z",
|
||||
"updated_at": "2021-03-16T21:24:35.843Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"email": "test@email.com",
|
||||
"billing_address": {
|
||||
"id": "addr_01F0YET7CZZX0842X5AHQYAZ80",
|
||||
"customer_id": null,
|
||||
"company": null,
|
||||
"first_name": "lebron",
|
||||
"last_name": null,
|
||||
"address_1": null,
|
||||
"address_2": null,
|
||||
"city": null,
|
||||
"country_code": null,
|
||||
"province": null,
|
||||
"postal_code": null,
|
||||
"phone": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"shipping_address": {
|
||||
"id": "addr_01F0YET7CZDHXHXYJ3JTXPH4T7",
|
||||
"customer_id": null,
|
||||
"company": null,
|
||||
"first_name": "lebron",
|
||||
"last_name": null,
|
||||
"address_1": null,
|
||||
"address_2": null,
|
||||
"city": null,
|
||||
"country_code": "us",
|
||||
"province": null,
|
||||
"postal_code": null,
|
||||
"phone": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"region_id": "reg_01F0YET7BZTARY9MKN1SJ7AAXF",
|
||||
"region": {
|
||||
"id": "reg_01F0YET7BZTARY9MKN1SJ7AAXF",
|
||||
"name": "Test Region",
|
||||
"currency_code": "usd",
|
||||
"tax_rate": "0",
|
||||
"tax_code": null,
|
||||
"payment_providers": [],
|
||||
"fulfillment_providers": [],
|
||||
"created_at": "2021-03-16T21:24:35.839Z",
|
||||
"updated_at": "2021-03-16T21:24:35.839Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"currency_code": "usd",
|
||||
"tax_rate": 0,
|
||||
"discounts": [
|
||||
{
|
||||
"id": "test-discount",
|
||||
"code": "TEST134",
|
||||
"is_dynamic": false,
|
||||
"rule_id": "dru_01F0YET7CZQDGWTFQYY8T4KYRZ",
|
||||
"rule": {
|
||||
"id": "dru_01F0YET7CZQDGWTFQYY8T4KYRZ",
|
||||
"description": "Test Discount",
|
||||
"type": "percentage",
|
||||
"value": 10,
|
||||
"allocation": "total",
|
||||
"usage_limit": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"is_disabled": false,
|
||||
"parent_discount_id": null,
|
||||
"starts_at": "2021-03-16T21:24:35.871Z",
|
||||
"ends_at": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"gift_cards": [],
|
||||
"shipping_methods": [
|
||||
{
|
||||
"id": "sm_01F0YET7DR2E7CYVSDHM593QG2",
|
||||
"shipping_option_id": "so_01F0YET7C758MMXF1WNVCPGKZJ",
|
||||
"order_id": "order_01F0YET7CZ741ECWG1J3N34RXF",
|
||||
"claim_order_id": null,
|
||||
"cart_id": null,
|
||||
"swap_id": null,
|
||||
"return_id": null,
|
||||
"shipping_option": {
|
||||
"id": "so_01F0YET7C758MMXF1WNVCPGKZJ",
|
||||
"name": "test-option",
|
||||
"region_id": "reg_01F0YET7BZTARY9MKN1SJ7AAXF",
|
||||
"profile_id": "sp_01F0YET7AF62TCC9CMWK5TXXAQ",
|
||||
"provider_id": "test-ful",
|
||||
"price_type": "flat_rate",
|
||||
"amount": 1000,
|
||||
"is_return": false,
|
||||
"data": {},
|
||||
"created_at": "2021-03-16T21:24:35.846Z",
|
||||
"updated_at": "2021-03-16T21:24:35.846Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"price": 1000,
|
||||
"data": {}
|
||||
}
|
||||
],
|
||||
"payments": [
|
||||
{
|
||||
"id": "test-payment",
|
||||
"swap_id": null,
|
||||
"cart_id": null,
|
||||
"order_id": "order_01F0YET7CZ741ECWG1J3N34RXF",
|
||||
"amount": 10000,
|
||||
"currency_code": "usd",
|
||||
"amount_refunded": 0,
|
||||
"provider_id": "test",
|
||||
"data": {},
|
||||
"captured_at": null,
|
||||
"canceled_at": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"metadata": null,
|
||||
"idempotency_key": null
|
||||
}
|
||||
],
|
||||
"fulfillments": [],
|
||||
"returns": [],
|
||||
"claims": [],
|
||||
"refunds": [],
|
||||
"swaps": [],
|
||||
"items": [
|
||||
{
|
||||
"id": "test-item",
|
||||
"cart_id": null,
|
||||
"order_id": "order_01F0YET7CZ741ECWG1J3N34RXF",
|
||||
"swap_id": null,
|
||||
"claim_order_id": null,
|
||||
"title": "Line Item",
|
||||
"description": "Line Item Desc",
|
||||
"thumbnail": "https://test.js/1234",
|
||||
"is_giftcard": false,
|
||||
"should_merge": true,
|
||||
"allow_discounts": true,
|
||||
"has_shipping": null,
|
||||
"unit_price": 8000,
|
||||
"variant_id": "variant_01F0YET7BMD9FGWA5NTPBWT2SS",
|
||||
"variant": {
|
||||
"id": "variant_01F0YET7BMD9FGWA5NTPBWT2SS",
|
||||
"title": "test variant",
|
||||
"product_id": "prod_01F0YET7BA4AQ8WEK687BNWP3N",
|
||||
"product": {
|
||||
"id": "prod_01F0YET7BA4AQ8WEK687BNWP3N",
|
||||
"title": "test product",
|
||||
"subtitle": null,
|
||||
"description": null,
|
||||
"handle": "test-product",
|
||||
"is_giftcard": false,
|
||||
"thumbnail": null,
|
||||
"profile_id": "sp_01F0YET7AF62TCC9CMWK5TXXAQ",
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"collection_id": null,
|
||||
"type_id": null,
|
||||
"created_at": "2021-03-16T21:24:35.818Z",
|
||||
"updated_at": "2021-03-16T21:24:35.818Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"sku": null,
|
||||
"barcode": null,
|
||||
"ean": null,
|
||||
"upc": null,
|
||||
"inventory_quantity": 1,
|
||||
"allow_backorder": false,
|
||||
"manage_inventory": true,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"created_at": "2021-03-16T21:24:35.828Z",
|
||||
"updated_at": "2021-03-16T21:24:35.828Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"quantity": 1,
|
||||
"fulfilled_quantity": 1,
|
||||
"returned_quantity": null,
|
||||
"shipped_quantity": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"metadata": null,
|
||||
"refundable": 7200
|
||||
}
|
||||
],
|
||||
"gift_card_transactions": [],
|
||||
"canceled_at": null,
|
||||
"created_at": "2021-03-16T21:24:35.871Z",
|
||||
"updated_at": "2021-03-16T21:24:35.871Z",
|
||||
"metadata": null,
|
||||
"shipping_total": 1000,
|
||||
"gift_card_total": 0,
|
||||
"discount_total": 800,
|
||||
"tax_total": 0,
|
||||
"subtotal": 8000,
|
||||
"total": 8200,
|
||||
"refunded_total": 0,
|
||||
"refundable_amount": 8200
|
||||
},
|
||||
"return": {
|
||||
"id": "ret_01F0YET7XPCMF8RZ0Y151NZV2V",
|
||||
"status": "requested",
|
||||
"items": [
|
||||
{
|
||||
"return_id": "ret_01F0YET7XPCMF8RZ0Y151NZV2V",
|
||||
"item_id": "test-item",
|
||||
"quantity": 1,
|
||||
"is_requested": true,
|
||||
"requested_quantity": 1,
|
||||
"received_quantity": null,
|
||||
"reason_id": null,
|
||||
"reason": null,
|
||||
"note": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"swap_id": null,
|
||||
"claim_order_id": null,
|
||||
"order_id": "order_01F0YET7RD6NWQTEM0ZN5DRRVD",
|
||||
"shipping_method": null,
|
||||
"shipping_data": null,
|
||||
"refund_amount": 7200,
|
||||
"received_at": null,
|
||||
"created_at": "2021-03-16T21:24:36.381Z",
|
||||
"updated_at": "2021-03-16T21:24:36.381Z",
|
||||
"metadata": null,
|
||||
"idempotency_key": "f3dee891-7a24-4e34-9071-62606035563d"
|
||||
},
|
||||
"swap": {
|
||||
"id": "swap_01F0YET86Y9G92D3YDR9Y6V676",
|
||||
"fulfillment_status": "not_fulfilled",
|
||||
"payment_status": "not_paid",
|
||||
"order_id": "order_01F0YET82SR6NB8K61TNRN36FW",
|
||||
"additional_items": [
|
||||
{
|
||||
"id": "item_01F0YET86YR1J3GX155E9R81A3",
|
||||
"cart_id": "cart_01F0YET896KVZ17Y2QDVT28QFE",
|
||||
"order_id": null,
|
||||
"swap_id": "swap_01F0YET86Y9G92D3YDR9Y6V676",
|
||||
"claim_order_id": null,
|
||||
"title": "test product",
|
||||
"description": "test variant",
|
||||
"thumbnail": null,
|
||||
"is_giftcard": false,
|
||||
"should_merge": true,
|
||||
"allow_discounts": true,
|
||||
"has_shipping": null,
|
||||
"unit_price": 8000,
|
||||
"variant_id": "variant_01F0YET825M92TKN1ZGAVBPX1B",
|
||||
"variant": {
|
||||
"id": "variant_01F0YET825M92TKN1ZGAVBPX1B",
|
||||
"title": "test variant",
|
||||
"product_id": "prod_01F0YET8213X0J501ZZHZ56Y7Y",
|
||||
"product": {
|
||||
"id": "prod_01F0YET8213X0J501ZZHZ56Y7Y",
|
||||
"title": "test product",
|
||||
"subtitle": null,
|
||||
"description": null,
|
||||
"handle": "test-product",
|
||||
"is_giftcard": false,
|
||||
"thumbnail": null,
|
||||
"profile_id": "sp_01F0YET7AF62TCC9CMWK5TXXAQ",
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"collection_id": null,
|
||||
"type_id": null,
|
||||
"created_at": "2021-03-16T21:24:36.545Z",
|
||||
"updated_at": "2021-03-16T21:24:36.545Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"sku": null,
|
||||
"barcode": null,
|
||||
"ean": null,
|
||||
"upc": null,
|
||||
"inventory_quantity": 1,
|
||||
"allow_backorder": false,
|
||||
"manage_inventory": true,
|
||||
"hs_code": null,
|
||||
"origin_country": null,
|
||||
"mid_code": null,
|
||||
"material": null,
|
||||
"weight": null,
|
||||
"length": null,
|
||||
"height": null,
|
||||
"width": null,
|
||||
"created_at": "2021-03-16T21:24:36.549Z",
|
||||
"updated_at": "2021-03-16T21:24:36.549Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null
|
||||
},
|
||||
"quantity": 2,
|
||||
"fulfilled_quantity": null,
|
||||
"returned_quantity": null,
|
||||
"shipped_quantity": null,
|
||||
"created_at": "2021-03-16T21:24:36.659Z",
|
||||
"updated_at": "2021-03-16T21:24:36.659Z",
|
||||
"metadata": {}
|
||||
}
|
||||
],
|
||||
"return_order": {
|
||||
"id": "ret_01F0YET873ZAXQ7PYVKVFMT9FP",
|
||||
"status": "requested",
|
||||
"items": [
|
||||
{
|
||||
"return_id": "ret_01F0YET873ZAXQ7PYVKVFMT9FP",
|
||||
"item_id": "test-item",
|
||||
"quantity": 1,
|
||||
"is_requested": true,
|
||||
"requested_quantity": 1,
|
||||
"received_quantity": null,
|
||||
"reason_id": null,
|
||||
"reason": null,
|
||||
"note": null,
|
||||
"metadata": null
|
||||
}
|
||||
],
|
||||
"swap_id": "swap_01F0YET86Y9G92D3YDR9Y6V676",
|
||||
"claim_order_id": null,
|
||||
"order_id": null,
|
||||
"shipping_method": null,
|
||||
"shipping_data": null,
|
||||
"refund_amount": 7200,
|
||||
"received_at": null,
|
||||
"created_at": "2021-03-16T21:24:36.659Z",
|
||||
"updated_at": "2021-03-16T21:24:36.659Z",
|
||||
"metadata": null,
|
||||
"idempotency_key": null
|
||||
},
|
||||
"fulfillments": [],
|
||||
"payment": null,
|
||||
"difference_due": null,
|
||||
"shipping_address_id": null,
|
||||
"shipping_address": null,
|
||||
"shipping_methods": [],
|
||||
"cart_id": "cart_01F0YET896KVZ17Y2QDVT28QFE",
|
||||
"confirmed_at": null,
|
||||
"created_at": "2021-03-16T21:24:36.659Z",
|
||||
"updated_at": "2021-03-16T21:24:36.659Z",
|
||||
"deleted_at": null,
|
||||
"metadata": null,
|
||||
"idempotency_key": "10804103-2f4f-41ef-b44e-7049459f157d"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,256 +0,0 @@
|
||||
openapi: 3.0.0
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Medusa Storefront API
|
||||
description: |
|
||||
API reference for Medusa's Storefront endpoints. All endpoints are prefixed with `/store`.
|
||||
|
||||
## Authentication
|
||||
|
||||
To send requests as an authenticated customer, you must use the Cookie Session ID.
|
||||
|
||||
<!-- ReDoc-Inject: <SecurityDefinitions> -->
|
||||
|
||||
## Expanding Fields
|
||||
|
||||
In many endpoints you'll find an `expand` query parameter that can be passed to the endpoint. You can use the `expand` query parameter to unpack an entity's relations and return them in the response.
|
||||
|
||||
For example, when you list customers you can also retrieve their groups by passing to the `expand` query parameter the value `groups`.
|
||||
|
||||
You can expand more than one relation by separating the relations in the `expand` query parameter with a comma. For example, to retrieve both the orders and the groups of a customer, pass to the `expand` query parameter the value `groups,orders`.
|
||||
|
||||
Please note that the parameters you pass to `expand` replace any relations that are expanded by default.
|
||||
|
||||
## Selecting Fields
|
||||
|
||||
In many endpoints you'll find a `fields` query parameter that can be passed to the endpoint. You can use the `fields` query parameter to specify which fields in the entity should be returned in the response.
|
||||
|
||||
You can pass more than one field by seperating the field names in the `fields` query parameter with a comma.
|
||||
|
||||
Only the fields you pass to `field` will be retrieved and returned in the response. Any fields that are returned by default will not be returned in this case. This does not affect relations.
|
||||
|
||||
For example, to only select the `title` and `description` fields of a product, pass to the `fields` query parameter the value `title,description`.
|
||||
|
||||
## Pagination
|
||||
|
||||
### Query Parameters
|
||||
|
||||
In listing endpoints, such as list customers or list products, you can control the pagination using the query parameters `limit` and `offset`.
|
||||
|
||||
`limit` is used to specify the maximum number of items that can be return in the response. `offset` is used to specify how many items to skip before returning the resulting entities.
|
||||
|
||||
You can use the `offset` query parameter to change between pages. For example, if the limit is 50, at page 1 the offset should be 0; at page 2 the offset should be 50, and so on.
|
||||
|
||||
### Response Fields
|
||||
|
||||
In listing fields, aside from the entities retrieved, there are three pagination-related fields returned: `count`, `limit`, and `offset`.
|
||||
|
||||
Similarly to the query parameters, `limit` is the maximum number of items that can be returned in the response, and `field` is the number of items that were skipped before the entities in the result.
|
||||
|
||||
`count` is the total number of available items of this entity. It can be used to determine how many pages are there.
|
||||
|
||||
For example, if the `count` is 100 and the `limit` is 50, you can divide the `count` by the `limit` to get the number of pages: `100/50 = 2 pages`.
|
||||
|
||||
license:
|
||||
name: MIT
|
||||
url: https://github.com/medusajs/medusa/blob/master/LICENSE
|
||||
tags:
|
||||
- name: Auth
|
||||
description: Auth endpoints that allow authorization of customers and manages their
|
||||
sessions.
|
||||
- name: Cart
|
||||
description: Cart endpoints that allow handling carts in Medusa.
|
||||
- name: Collection
|
||||
description: Collection endpoints that allow handling collections in Medusa.
|
||||
- name: Customer
|
||||
description: Customer endpoints that allow handling customers in Medusa.
|
||||
- name: Gift Card
|
||||
description: Gift Card endpoints that allow handling gift cards in Medusa.
|
||||
- name: Order
|
||||
description: Order endpoints that allow handling orders in Medusa.
|
||||
- name: Product
|
||||
description: Product endpoints that allow handling products in Medusa.
|
||||
- name: Product Variant
|
||||
description: Product Variant endpoints that allow handling product variants in Medusa.
|
||||
- name: Region
|
||||
description: Region endpoints that allow handling regions in Medusa.
|
||||
- name: Return Reason
|
||||
description: Return Reason endpoints that allow handling return reasons in Medusa.
|
||||
- name: Return
|
||||
description: Return endpoints that allow handling returns in Medusa.
|
||||
- name: Shipping Option
|
||||
description: Shipping Option endpoints that allow handling shipping options in Medusa.
|
||||
- name: Swap
|
||||
description: Swap endpoints that allow handling swaps in Medusa.
|
||||
servers:
|
||||
- url: https://api.medusa-commerce.com/store
|
||||
paths: { }
|
||||
components:
|
||||
responses:
|
||||
default_error:
|
||||
description: Default Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
code: "unknown_error"
|
||||
message: "An unknown error occurred."
|
||||
type: "unknown_error"
|
||||
invalid_state_error:
|
||||
description: Invalid State Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
code: "unknown_error"
|
||||
message: "The request conflicted with another request. You may retry the request with the provided Idempotency-Key."
|
||||
type: "QueryRunnerAlreadyReleasedError"
|
||||
invalid_request_error:
|
||||
description: Invalid Request Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
code: "invalid_request_error"
|
||||
message: "Discount with code TEST already exists."
|
||||
type: "duplicate_error"
|
||||
not_found_error:
|
||||
description: Not Found Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
example:
|
||||
message: "Entity with id 1 was not found"
|
||||
type: "not_found"
|
||||
400_error:
|
||||
description: Client Error or Multiple Errors
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
oneOf:
|
||||
- $ref: "#/components/schemas/Error"
|
||||
- $ref: "#/components/schemas/MultipleErrors"
|
||||
examples:
|
||||
not_allowed:
|
||||
$ref: "#/components/examples/not_allowed_error"
|
||||
invalid_data:
|
||||
$ref: "#/components/examples/invalid_data_error"
|
||||
MultipleErrors:
|
||||
$ref: "#/components/examples/multiple_errors"
|
||||
500_error:
|
||||
description: Server Error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Error"
|
||||
examples:
|
||||
database:
|
||||
$ref: "#/components/examples/database_error"
|
||||
unexpected_state:
|
||||
$ref: "#/components/examples/unexpected_state_error"
|
||||
invalid_argument:
|
||||
$ref: "#/components/examples/invalid_argument_error"
|
||||
default_error:
|
||||
$ref: "#/components/examples/default_error"
|
||||
unauthorized:
|
||||
description: 'User is not authorized. Must log in first'
|
||||
content:
|
||||
text/plain:
|
||||
schema:
|
||||
type: string
|
||||
default: Unauthorized
|
||||
example: Unauthorized
|
||||
incorrect_credentials:
|
||||
description: 'User does not exist or incorrect credentials'
|
||||
content:
|
||||
text/plain:
|
||||
schema:
|
||||
type: string
|
||||
default: Unauthorized
|
||||
example: Unauthorized
|
||||
examples:
|
||||
not_allowed_error:
|
||||
summary: Not Allowed Error
|
||||
value:
|
||||
message: "Discount must be set to dynamic"
|
||||
type: "not_allowed"
|
||||
invalid_data_error:
|
||||
summary: Invalid Data Error
|
||||
value:
|
||||
message: "first_name must be a string"
|
||||
type: "invalid_data"
|
||||
multiple_errors:
|
||||
summary: Multiple Errors
|
||||
value:
|
||||
message: "Provided request body contains errors. Please check the data and retry the request"
|
||||
errors:
|
||||
- message: "first_name must be a string"
|
||||
type: "invalid_data"
|
||||
- message: "Discount must be set to dynamic"
|
||||
type: "not_allowed"
|
||||
database_error:
|
||||
summary: Database Error
|
||||
value:
|
||||
code: "api_error"
|
||||
message: "An error occured while hashing password"
|
||||
type: "database_error"
|
||||
unexpected_state_error:
|
||||
summary: Unexpected State Error
|
||||
value:
|
||||
message: "cart.total must be defined"
|
||||
type: "unexpected_state"
|
||||
invalid_argument_error:
|
||||
summary: Invalid Argument Error
|
||||
value:
|
||||
message: "cart.total must be defined"
|
||||
type: "unexpected_state"
|
||||
default_error:
|
||||
summary: Default Error
|
||||
value:
|
||||
code: "unknown_error"
|
||||
message: "An unknown error occurred."
|
||||
type: "unknown_error"
|
||||
securitySchemes:
|
||||
cookie_auth:
|
||||
type: apiKey
|
||||
x-displayName: Cookie Session ID
|
||||
in: cookie
|
||||
name: connect.sid
|
||||
description: |
|
||||
Use a cookie session to send authenticated requests.
|
||||
|
||||
### How to Obtain the Cookie Session
|
||||
|
||||
If you're sending requests through a browser, using JS Client, or using tools like Postman, the cookie session should be automatically set when the customer is logged in.
|
||||
|
||||
If you're sending requests using cURL, you must set the Session ID in the cookie manually.
|
||||
|
||||
To do that, send a request to [authenticate the customer](#tag/Auth/operation/PostAuth) and pass the cURL option `-v`:
|
||||
|
||||
```bash
|
||||
curl -v --location --request POST 'https://medusa-url.com/store/auth' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"email": "user@example.com",
|
||||
"password": "supersecret"
|
||||
}'
|
||||
```
|
||||
|
||||
The headers will be logged in the terminal as well as the response. You should find in the headers a Cookie header similar to this:
|
||||
|
||||
```bash
|
||||
Set-Cookie: connect.sid=s%3A2Bu8BkaP9JUfHu9rG59G16Ma0QZf6Gj1.WT549XqX37PN8n0OecqnMCq798eLjZC5IT7yiDCBHPM;
|
||||
```
|
||||
|
||||
Copy the value after `connect.sid` (without the `;` at the end) and pass it as a cookie in subsequent requests as the following:
|
||||
|
||||
```bash
|
||||
curl --location --request GET 'https://medusa-url.com/store/customers/me/orders' \
|
||||
--header 'Cookie: connect.sid={sid}'
|
||||
```
|
||||
|
||||
Where `{sid}` is the value of `connect.sid` that you copied.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user