SDK находится в стадии разработки!
Некоторые методы могут отсутствовать или работать неправильно!
Подробная документация в процессе написания.
Требуемая версия go >= 1.21
go get -u github.com/arcsub/go-moysklad@HEAD
Каждый запрос на создание/изменение/удаление возвращает 3 аргумента. Рассмотрим объявление функции
func (s *endpointCreate[T]) Create(ctx context.Context, entity *T, params ...*Params) (*T, *resty.Response, error)
В примере выше нас интересуют возвращаемые аргументы: (*T, *resty.Response, error)
*T
– указатель на сущность/документ, например *Product при вызовеCreate()
(возвращаетbool
при вызове методаDelete()
).*resty.Response
– ответ на запрос, содержащий *http.Response и некоторую другую информацию.error
– ошибки, если они были. При возникновении ошибок от API МойСклад в качестве ошибки будет заполненная структураApiErrors
Поля структур сущностей и документов являются указателями.
- Чтобы получить значение по указателю необходимо вызвать метод структуры
GetFieldName()
.FieldName
- наименование поля.
Например:
name := product.GetName()
id := product.GetID()
- Чтобы установить значение необходимо передать значение в соответствующий метод
SetFieldName(value)
FieldName
- наименование поляvalue
- передаваемое значение.
Note
Методы SetFieldName()
возвращают указатель на объект, что позволяет вызывать методы по цепочке.
Например:
product := new(moysklad.Product)
product.SetName("iPhone 16 Pro Max").SetCode("APPL15PM")
Для безопасного разыменовывания указателя необходимо передать указатель в методDeref()
Чтобы установить указатель на примитивное значение поля также существуют вспомогательные методы:Bool()
возвращает *boolInt()
возвращает *intUint()
возвращает *uint64Float()
возвращает *float64String()
возвращает *string
client := moysklad.New(
moysklad.WithTokenAuth(os.Getenv("MOYSKLAD_TOKEN")), // с использованием токена
// moysklad.WithBasicAuth(os.Getenv("MOYSKLAD_USERNAME"), os.Getenv("MOYSKLAD_PASSWORD")), // или с использование логина и пароля
)
httpClient := &http.Client{Timeout: 5 * time.Minute}
client := moysklad.New(
moysklad.WithHTTPClient(httpClient),
moysklad.WithTokenAuth(os.Getenv("MOYSKLAD_TOKEN")),
)
restyClient := resty.New()
client := moysklad.New(
moysklad.WithRestyClient(httpClient),
moysklad.WithTokenAuth(os.Getenv("MOYSKLAD_TOKEN")),
)
Получить простой клиент с авторизацией через токен.
client := moysklad.New(
moysklad.WithTokenAuth(os.Getenv("MOYSKLAD_TOKEN")),
)
Получить простой клиент с авторизацией через пару логин/пароль.
client := moysklad.New(
moysklad.WithBasicAuth(os.Getenv("MOYSKLAD_USERNAME"), os.Getenv("MOYSKLAD_PASSWORD")),
)
Установить необходимый таймаут для http клиента.
client := moysklad.New(
moysklad.WithTimeout(15 * time.Minute), // таймаут 15 минут
)
Временное отключение уведомлений вебхуков
client := moysklad.New(
moysklad.WithDisabledWebhookContent(true), // отключим уведомления вебхуков на данном клиенте
)
Позволяет указать набор префиксов url-адресов.
client := moysklad.New(
moysklad.WithDisabledWebhookByPrefix("https://abc.ru/ms/v1/wh1", "https://abc.ru/ms/v1/wh2"),
)
Пример:
moysklad.WithLimit(100)
Пример:
moysklad.WithOffset(100)
Пример:
moysklad.WithSearch("iPhone 16 Pro Max")
Пример:
moysklad.WithExpand("positions").WithExpand("group")
Пример:
moysklad.WithFilterEquals("name", "Яблоко")
Пример:
moysklad.WithFilterGreater("sum", "100")
Пример:
moysklad.WithFilterLesser("sum", "1000")
Пример:
moysklad.WithFilterGreaterOrEquals("moment", "2023-06-01")
Пример:
moysklad.WithFilterLesserOrEquals("moment", "2023-06-01")
Пример:
moysklad.WithFilterNotEquals("name", "0001")
Пример:
moysklad.WithFilterEquivalence("code", "ms")
Пример:
moysklad.WithFilterEquivalenceLeft("code", "ms")
Пример:
moysklad.WithFilterEquivalenceRight("code", "ms")
Пример:
moysklad.WithFilterNotEquivalence("code", "ms")
Пример:
moysklad.WithFilterDeleted(true)
Пример:
moysklad.WithFilterPrinted(true)
Пример:
moysklad.WithFilterPublished(true)
Пример:
moysklad.WithFilterArchived(true)
Пример:
moysklad.WithGroupBy(moysklad.GroupByProduct)
Метод принимает указатель на сохранённый фильтр.
Пример:
moysklad.WithNamedFilter(&NamedFilter{...})
Пример:
moysklad.WithOrder("name")
Пример:
moysklad.WithOrderAsc("name")
Пример:
moysklad.WithOrderDesc("name")
Метод устанавливает лимит позиций в 100 единиц, а также применяет замену ссылок объектами для поля positions
Пример:
moysklad.WithStockFiled()
Используется в отчёте "Остатки"
Пример:
moysklad.WithStockType(moysklad.StockDefault)
Используется в отчётах
Пример:
moysklad.WithInterval(moysklad.IntervalMonth)
Метод принимает time.Time
Пример:
moysklad.WithMomentFrom(time.Now())
Метод принимает time.Time
Пример:
moysklad.WithMomentTo(time.Now())
list, _, err := client.Entity().Product().GetList(context.Background(),
moysklad.WithExpand("country"),
moysklad.WithOrder("name"),
moysklad.WithLimit(10),
)
Для перехода к определённому сервису необходимо вызвать цепочку методов, аналогично пути запроса.
Сервис для работы с товарами.
Относительный путь: /entity/product
Цепочка вызовов от клиента будет выглядеть следующим образом:
client := moysklad.New(
moysklad.WithTokenAuth(os.Getenv("MOYSKLAD_TOKEN")),
)
// `/entity/product`
_ = client.Entity().Product()
// `/entity/variant`
_ = client.Entity().Variant()
// `/context/companysettings`
_ = client.Context().CompanySettings()
// `/report/dashboard`
_ = client.Report().Dashboard()
Если возникает необходимость точечно запросить информацию о сущности, имея только её Meta
, можно использовать
метод FetchMeta
.
Чтобы использовать данный функционал необходимо точно знать, какой тип данных мы ожидаем получить в ответ.
Метод имеет следующую сигнатуру:
func FetchMeta[T any](ctx context.Context, client *Client, meta Meta, params *Params) (*T, *resty.Response, error)
Пример:
productFromMeta, resp, err := moysklad.FetchMeta[moysklad.Product](ctx, client, product.GetMeta(), nil)
package main
import (
"context"
"fmt"
"github.com/arcsub/go-moysklad/moysklad"
"os"
)
func main() {
// инициализируем простой клиент с аутентификацией по паре логин/пароль
client := moysklad.New(
moysklad.WithBasicAuth(os.Getenv("MOYSKLAD_USERNAME"), os.Getenv("MOYSKLAD_PASSWORD")),
moysklad.WithDisabledWebhookContent(true),
)
// сервис для работы с товарами
productService := client.Entity().Product()
// выполняем запрос на получение списка товаров без дополнительных параметров
products, _, err := productService.GetList(context.Background())
if err != nil {
panic(err)
}
// выводим названия полученных товаров
for _, product := range products.Rows {
fmt.Println(product.GetName())
}
// создадим новый товар
product := new(moysklad.Product)
product.SetName("Created Product")
// отправим запрос на создание товара
// в качестве аргументов передадим контекст и товар
productCreated, _, err := productService.Create(context.Background(), product,
moysklad.WithExpand("country", "owner", "productFolder"), // пример передачи параметров запроса
)
if err != nil {
panic(err)
}
// выведем название созданного товара
fmt.Println(productCreated.GetName())
// изменим название товара
productCreated.SetName("Updated Product")
// отправим запрос на изменение товара
// в качестве аргументов передадим контекст, ID изменяемой сущности и изменённый товар
productUpdated, _, err := productService.Update(context.Background(), productCreated.GetID(), productCreated)
if err != nil {
panic(err)
}
// выведем название изменённого товара
fmt.Println(productUpdated.GetName())
// отправим запрос на удаление товара
// в качестве аргументов передадим контекст и удаляемую сущность, в которой содержится идентификатор
success, _, err := productService.Delete(context.Background(), productUpdated)
if err != nil {
panic(err)
}
// выведем состояние выполненного запроса, где true - успешно удалено, false – не удалено, см ошибки
fmt.Println("Deleted", success)
}
Буду рад видеть ваши идеи и предложения в Issues.