Admin API
Token
The token class contains the majority of the logic for communicating with shopify.
To use the token class, you must define a child class for the tokens you are using
and implement a subset of the save
and load
abstract methods. Your option for
child classes are OnlineTokenABC
, OfflineTokenABC
or PrivateTokenABC
:
Implement Token Classes
class OfflineToken(OfflineTokenABC):
async def save(self):
# Some code to save the token to a database
@classmethod
async def load(cls, store_name: str):
# Some code to load the token from the database
class OnlineToken(OnlineTokenABC):
async def save(self):
# Some code to save the token to a database
@classmethod
async def load(cls, store_name: str, associated_user: str):
# Some code to load the token from the database
class PrivateToken(PrivateTokenABC):
@classmethod
async def load(cls, store_name: str):
# Some code to load the token from the database
# No need for save, as it is static.
Change Shopify API version
-
As shown in the
Implement Token Classes
, token can be used as following:from spylib.admin_api import OfflineTokenABC class OfflineToken(OfflineTokenABC): async def save(self): pass @classmethod async def load(cls, store_name: str): pass
-
If the Shopify API version used in Spylib is not the desired version, it can be changed with the following:
class OfflineToken(OfflineTokenABC): # Add the version to be used here api_version: ClassVar[Optional[str]] = '2023-04' async def save(self): pass @classmethod async def load(cls, store_name: str): pass
:warning: Warning: For version <= 0.8.1, async is not available for load function
class OfflineToken(OfflineTokenABC):
@classmethod
def load(cls, store_name: str):
pass
Create Token
Once you have defined these methods, we can create an instance of a token using one of the following:
token = OfflineToken(
store_name,
access_token,
scope
)
token = OnlineToken(
store_name,
access_token,
scope,
expires_in,
associated_user_scope,
associated_user_id
)
token = PrivateToken(
store_name,
access_token,
scope
)
Token Operations
# save using the token instance
await token.save()
# load using the token class
await OfflineToken.load(store_name)
await OnlineToken.load(store_name, associated_user_id)
await PrivateToken.load(store_name)
Querying Shopify
REST
We can query the store using the REST endpoint:
await token.execute_rest(
request: Request,
endpoint: str,
json: Optional[Dict[str, Any]],
debug: Optional[str],
)
For example, if you want to query a product from shopify you can run:
product_json = await token.execute_rest(
request = GET,
endpoint = f'/products/{product_id}.json'
)
If you want to update a product in a shop you can run:
product_json = await token.execute_rest(
request = PUT,
endpoint = f'/products/{product_id}.json',
json = {
"product":
{
"id": product_id,
"title": "New Title"
}
}
)
The REST
method takes a request
parameter which is one of the Request
constants defined in
the rest file.
The options are GET
, POST
, PUT
, or DELETE
.
Endpoint is the API endpoint string that we are querying, this should be similar to the following format:
f'/{resource}.json?fields={resource.param}&{[params]}'
The debug
parameter is the message that is returned when there is an error. It is optional as it defaults to ""
.
GraphQL
We can also query Shopify using the GraphQL endpoint:
token.execute_gql(
query: str,
variables: Dict[str, Any],
operation_name: Optional[str]
)
For example, if you want to query a product from shopify you can run:
query = """
{
product(id: "gid://shopify/Product/1974208299030") {
id,
title
}
}"""
product_json = await token.execute_gql(query=query)
If you want to update a product in a shop you can run:
query = """
mutation productUpdateMutation($id: ID, $title: String) {
productUpdate(input: {
id: $id,
title: $title
})
{
product {
id
}
}
}"""
variables = {
'id': 'gid://shopify/Product/108828309',
'title': "Sweet new product - GraphQL Edition"
}
product_json = await token.execute_gql(
query = query,
variables = variables
)
The query
is a GraphQL query that will be passed to shopify for execution. You can use the GQL explorer
for your shop to create a query. For example, the shopify demo GQL explorer.
The variables
are a dictionary of variables that will be substituted into the query.
The operation_name
is a name for the query you are about to run.