Skip to content

The reliable way to import/update/export a bazillion products of your Shopware 6 shop.

License

Notifications You must be signed in to change notification settings

thomaspeissl/v-shopware-api-client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

V Shopware 6 admin API client

This is a pure V module that can be used to communicate with Shopware 6.

Requires at least Shopware version 6.4.

Shopware Admin API credentials can be generated in the shopware backend (Settings->System->Integrations).

Shopware 6 Admin API Endpoint Reference

Shopware 6 Developer Documentation

I recommend to configure the api credentials via .env - take a look at my dotenv module.

Features

  • built-in oauth token renewal
  • useful helper functions for file upload and search

Why V

  • can handle big imports that may take several hours
  • parallel processing
  • errors during compile time

Installation

Install and use this module as a dependency via v.mod (recommended)

Run "v init" to auto-generate your v.mod file.

v init

Then edit the dependencies in your v.mod file to look like this:

dependencies: ['thomaspeissl.shopwareac']

And install with:

v install

To update your dependencies later just run "v install" again.

Or via VPM:

v install thomaspeissl.shopwareac

Or through Git:

git clone https://github.com/thomaspeissl/v-shopware-api-client.git ~/.vmodules/thomaspeissl/shopwareac

Running the examples

Fill in your api credentials in the code placeholders an then run.

cd examples
v run simple.v
v run search.v

Example

This example gets products from the admin api and prints out their product ids.

module main

import thomaspeissl.shopwareac
import json

struct ShopResponse {
	data []ShopResponseData
}
struct ShopResponseData {
	id string
}

fn main() {
	mut sw_api := shopwareac.Login{ // mut is needed for the automated oauth2 token renewal
		api_url: 'http://localhost:8000/api/'
		client_id: 'XXXXXXXXXXXXXXXXXXXXXXXXXX' // get this from Shopware 6 backend Settings->System->Integrations
		client_secret: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
	}
	response := sw_api.get('product?limit=1')
	response_data := json.decode(ShopResponse, response) or { ShopResponse{} }
	for product in response_data.data {
		println(product.id)
	}
}

Module documentation

Contents

date_time

fn date_time() string

current time formatted for Shopware date time custom fields eg. "2022-01-16T12:00:00+00:00"

[Return to contents]

decode

fn decode(data string) map[string]json2.Any

[Return to contents]

encode

fn encode(s string) string

Percent-encoding reserved characters eg. for filter parameters

[Return to contents]

strip

fn strip(s string) string

strip not allowed chars

[Return to contents]

Attributes

struct Attributes {
pub:
	media_id               string            @[json: mediaId]
	cover_id               string            @[json: coverId]
	child_count            int               @[json: childCount]
	stock                  int
	custom_fields          map[string]string @[json: customFields]
	active                 bool
	product_number         string            @[json: productNumber]
	custom_search_keywords []string          @[json: customSearchKeywords]
	payment_method_id      string            @[json: paymentMethodId]
	name                   string
	parent_id              string            @[json: parentId]
	cms_page_id            string            @[json: cmsPageId]
}

[Return to contents]

Category

struct Category {
pub mut:
	id          string
	name        string @[omitempty]
	parent_id   string @[json: parentId; omitempty]
	cms_page_id string @[json: cmsPageId]
}

[Return to contents]

ConfiguratorSetting

struct ConfiguratorSetting {
pub mut:
	id        string @[omitempty]
	option_id string @[json: 'optionId'; omitempty]
}

[Return to contents]

CustomField

struct CustomField {
pub mut:
	custom_import_field1 string @[omitempty]
	custom_import_field2 string @[omitempty]
	custom_import_field3 string @[omitempty]
	custom_import_field4 string @[omitempty]
	custom_import_field5 string @[omitempty]
	custom_import_field6 string @[omitempty]
	custom_import_field7 string @[omitempty]
	custom_import_field8 string @[omitempty]
	custom_import_field9 string @[omitempty]
}

[Return to contents]

Id

struct Id {
pub mut:
	id string @[omitempty]
}

[Return to contents]

Login

struct Login {
mut:
	token AuthToken
pub:
	client_id     string
	client_secret string
pub mut:
	api_url string
}

[Return to contents]

add_media_to_product

fn (mut l Login) add_media_to_product(media_id string, product_id string, set_as_cover bool, position int)

add_media_to_product position should begin with 0

[Return to contents]

auth

fn (mut l Login) auth() bool

auth get's called automatic and renews the oauth token if needed

[Return to contents]

delete

fn (mut l Login) delete(endpoint string, id string)

[Return to contents]

find_category_by_customfield

fn (mut l Login) find_category_by_customfield(field string, value string) !ShopResponseData

[Return to contents]

find_media_by_name

fn (mut l Login) find_media_by_name(name string) !ShopResponseData

[Return to contents]

find_product_by_customfield

fn (mut l Login) find_product_by_customfield(field string, value string) !ShopResponseData

[Return to contents]

find_product_by_productnumber

fn (mut l Login) find_product_by_productnumber(productnumber string) !ShopResponseData

[Return to contents]

find_property_by_name

fn (mut l Login) find_property_by_name(name string, group string) !ShopResponseData

[Return to contents]

find_subcategory_by_name

fn (mut l Login) find_subcategory_by_name(name string, parent string) !ShopResponseData

[Return to contents]

get

fn (mut l Login) get(endpoint string) string

[Return to contents]

get_default_category

fn (mut l Login) get_default_category() string

[Return to contents]

get_default_cms_page

fn (mut l Login) get_default_cms_page() string

[Return to contents]

get_default_media_folder

fn (mut l Login) get_default_media_folder() string

[Return to contents]

get_default_payment_method

fn (mut l Login) get_default_payment_method() string

[Return to contents]

get_default_sales_channel

fn (mut l Login) get_default_sales_channel() string

[Return to contents]

get_default_tax

fn (mut l Login) get_default_tax() string

[Return to contents]

get_last_sync

fn (mut l Login) get_last_sync() string

get_last_sync returns the last sync payload

[Return to contents]

get_raw

fn (mut l Login) get_raw(endpoint string) http.Response

[Return to contents]

patch

fn (mut l Login) patch(endpoint string, data string)

[Return to contents]

post

fn (mut l Login) post(endpoint string, data string) string

post returns the id of the created content on success

[Return to contents]

resend_sync

fn (mut l Login) resend_sync()

resend_sync sends the last sync operation (sync saves data into a file) again to the shop api - useful for debugging or temporary errors

[Return to contents]

search

fn (mut l Login) search(entity string, data string) string

[Return to contents]

sync

fn (mut l Login) sync(data string) !string

sync API is an add-on to the Admin API that allows you to perform multiple write operations (creating/updating and deleting) simultaneously

[Return to contents]

sync_delete

fn (mut l Login) sync_delete(entity string, data []string)

sync_delete is a shorthand function for sync with data chunking for large arrays

[Return to contents]

sync_upsert

fn (mut l Login) sync_upsert(entity string, data []string)

sync_upsert is a shorthand function for sync with data chunking for large arrays

[Return to contents]

update_media_from_url

fn (mut l Login) update_media_from_url(media_id string, url string)

Attach resource data to the media object from the given url

[Return to contents]

upload

fn (mut l Login) upload(file_url string, name string, media_folder_id string) !string

upload returns the mediaId of the uploaded file on success

[Return to contents]

upload_file

fn (mut l Login) upload_file(media_id string, name string, _ext string, data string) !

upload_file via binary blob

[Return to contents]

Manufacturer

struct Manufacturer {
pub mut:
	id          string
	name        string @[omitempty]
	link        string @[omitempty]
	description string @[omitempty]
	media       Media  @[omitempty]
}

[Return to contents]

Media

struct Media {
pub:
	id              string @[omitempty]
	media_folder_id string @[json: 'mediaFolderId'; omitempty]
}

[Return to contents]

Option_

struct Option_ { // Option is a reserved word
pub mut:
	id       string @[omitempty]
	name     string @[omitempty]
	group_id string @[json: 'groupId'; omitempty]
}

[Return to contents]

Price

struct Price {
pub mut:
	net         f64
	gross       f64
	currency_id string = 'b7d2554b0ce847cd82f3ac9bd1c0dfca' @[json: 'currencyId']
	linked      bool = true
}

[Return to contents]

Product

struct Product {
pub mut:
	id                     string
	name                   string                @[omitempty]
	stock                  ?int                  @[omitempty]
	product_number         string                @[json: 'productNumber'; omitempty]
	description            string                @[omitempty]
	manufacturer           Id                    @[omitempty]
	categories             []Id                  @[omitempty]
	visibilities           []Visibility          @[omitempty]
	tax_id                 string                @[json: 'taxId'; omitempty]
	keywords               string                @[omitempty]
	custom_search_keywords []string              @[json: 'customSearchKeywords'; omitempty]
	options                []Option_             @[omitempty]
	weight                 int                   @[omitempty]
	price                  []Price               @[omitempty]
	cover_id               string                @[json: 'coverId'; omitempty]
	unit_id                string                @[json: 'unitId'; omitempty]
	media                  []ProductMedia        @[omitempty]
	custom_fields          CustomField           @[json: 'customFields'; omitempty]
	ean                    string                @[omitempty]
	meta_title             string                @[json: 'metaTitle'; omitempty]
	meta_description       string                @[json: 'metaDescription'; omitempty]
	parent_id              string                @[json: 'parentId'; omitempty]
	reference_unit         f64                   @[json: 'referenceUnit'; omitempty]
	purchase_unit          f64                   @[json: 'purchaseUnit'; omitempty]
	max_purchase           int                   @[json: 'maxPurchase'; omitempty]
	configurator_settings  []ConfiguratorSetting @[json: 'configuratorSettings'; omitempty]
}

[Return to contents]

ProductMedia

struct ProductMedia {
pub mut:
	id       string
	position int
	media    Media
}

[Return to contents]

PropertyGroup

struct PropertyGroup {
pub mut:
	id   string @[omitempty]
	name string @[omitempty]
}

[Return to contents]

ShopResponseData

struct ShopResponseData {
pub:
	id         string
	attributes Attributes
}

[Return to contents]

Tax

struct Tax {
pub mut:
	id       string @[omitempty]
	name     string @[omitempty]
	tax_rate ?f64   @[json: 'taxRate'; omitempty]
}

[Return to contents]

Unit

struct Unit {
pub mut:
	id         string
	name       string @[omitempty]
	short_code string @[json: 'shortCode'; omitempty]
}

[Return to contents]

Visibility

struct Visibility {
pub mut:
	id               string @[omitempty]
	sales_channel_id string @[json: 'salesChannelId'; omitempty]
	visibility       int = 30    @[omitempty]
}

[Return to contents]

Powered by vdoc. Generated on: 28 Nov 2023 11:52:49

v doc -f md .

License

AGPL-3.0

About

The reliable way to import/update/export a bazillion products of your Shopware 6 shop.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Sponsor this project