Add Wildberries product fetching and rate limiting functionality

This commit is contained in:
2025-07-04 13:30:50 +03:00
parent b48421e653
commit dc097c6fc8
67 changed files with 81355 additions and 110 deletions

5572
pkg/api/wb/02-products.yaml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,283 @@
// Code generated by ogen, DO NOT EDIT.
package api
import (
"net/http"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/trace"
ht "github.com/ogen-go/ogen/http"
"github.com/ogen-go/ogen/middleware"
"github.com/ogen-go/ogen/ogenerrors"
"github.com/ogen-go/ogen/otelogen"
)
var (
// Allocate option closure once.
clientSpanKind = trace.WithSpanKind(trace.SpanKindClient)
// Allocate option closure once.
serverSpanKind = trace.WithSpanKind(trace.SpanKindServer)
)
type (
optionFunc[C any] func(*C)
otelOptionFunc func(*otelConfig)
)
type otelConfig struct {
TracerProvider trace.TracerProvider
Tracer trace.Tracer
MeterProvider metric.MeterProvider
Meter metric.Meter
}
func (cfg *otelConfig) initOTEL() {
if cfg.TracerProvider == nil {
cfg.TracerProvider = otel.GetTracerProvider()
}
if cfg.MeterProvider == nil {
cfg.MeterProvider = otel.GetMeterProvider()
}
cfg.Tracer = cfg.TracerProvider.Tracer(otelogen.Name,
trace.WithInstrumentationVersion(otelogen.SemVersion()),
)
cfg.Meter = cfg.MeterProvider.Meter(otelogen.Name,
metric.WithInstrumentationVersion(otelogen.SemVersion()),
)
}
// ErrorHandler is error handler.
type ErrorHandler = ogenerrors.ErrorHandler
type serverConfig struct {
otelConfig
NotFound http.HandlerFunc
MethodNotAllowed func(w http.ResponseWriter, r *http.Request, allowed string)
ErrorHandler ErrorHandler
Prefix string
Middleware Middleware
MaxMultipartMemory int64
}
// ServerOption is server config option.
type ServerOption interface {
applyServer(*serverConfig)
}
var _ ServerOption = (optionFunc[serverConfig])(nil)
func (o optionFunc[C]) applyServer(c *C) {
o(c)
}
var _ ServerOption = (otelOptionFunc)(nil)
func (o otelOptionFunc) applyServer(c *serverConfig) {
o(&c.otelConfig)
}
func newServerConfig(opts ...ServerOption) serverConfig {
cfg := serverConfig{
NotFound: http.NotFound,
MethodNotAllowed: func(w http.ResponseWriter, r *http.Request, allowed string) {
status := http.StatusMethodNotAllowed
if r.Method == "OPTIONS" {
w.Header().Set("Access-Control-Allow-Methods", allowed)
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
status = http.StatusNoContent
} else {
w.Header().Set("Allow", allowed)
}
w.WriteHeader(status)
},
ErrorHandler: ogenerrors.DefaultErrorHandler,
Middleware: nil,
MaxMultipartMemory: 32 << 20, // 32 MB
}
for _, opt := range opts {
opt.applyServer(&cfg)
}
cfg.initOTEL()
return cfg
}
type baseServer struct {
cfg serverConfig
requests metric.Int64Counter
errors metric.Int64Counter
duration metric.Float64Histogram
}
func (s baseServer) notFound(w http.ResponseWriter, r *http.Request) {
s.cfg.NotFound(w, r)
}
func (s baseServer) notAllowed(w http.ResponseWriter, r *http.Request, allowed string) {
s.cfg.MethodNotAllowed(w, r, allowed)
}
func (cfg serverConfig) baseServer() (s baseServer, err error) {
s = baseServer{cfg: cfg}
if s.requests, err = otelogen.ServerRequestCountCounter(s.cfg.Meter); err != nil {
return s, err
}
if s.errors, err = otelogen.ServerErrorsCountCounter(s.cfg.Meter); err != nil {
return s, err
}
if s.duration, err = otelogen.ServerDurationHistogram(s.cfg.Meter); err != nil {
return s, err
}
return s, nil
}
type clientConfig struct {
otelConfig
Client ht.Client
}
// ClientOption is client config option.
type ClientOption interface {
applyClient(*clientConfig)
}
var _ ClientOption = (optionFunc[clientConfig])(nil)
func (o optionFunc[C]) applyClient(c *C) {
o(c)
}
var _ ClientOption = (otelOptionFunc)(nil)
func (o otelOptionFunc) applyClient(c *clientConfig) {
o(&c.otelConfig)
}
func newClientConfig(opts ...ClientOption) clientConfig {
cfg := clientConfig{
Client: http.DefaultClient,
}
for _, opt := range opts {
opt.applyClient(&cfg)
}
cfg.initOTEL()
return cfg
}
type baseClient struct {
cfg clientConfig
requests metric.Int64Counter
errors metric.Int64Counter
duration metric.Float64Histogram
}
func (cfg clientConfig) baseClient() (c baseClient, err error) {
c = baseClient{cfg: cfg}
if c.requests, err = otelogen.ClientRequestCountCounter(c.cfg.Meter); err != nil {
return c, err
}
if c.errors, err = otelogen.ClientErrorsCountCounter(c.cfg.Meter); err != nil {
return c, err
}
if c.duration, err = otelogen.ClientDurationHistogram(c.cfg.Meter); err != nil {
return c, err
}
return c, nil
}
// Option is config option.
type Option interface {
ServerOption
ClientOption
}
// WithTracerProvider specifies a tracer provider to use for creating a tracer.
//
// If none is specified, the global provider is used.
func WithTracerProvider(provider trace.TracerProvider) Option {
return otelOptionFunc(func(cfg *otelConfig) {
if provider != nil {
cfg.TracerProvider = provider
}
})
}
// WithMeterProvider specifies a meter provider to use for creating a meter.
//
// If none is specified, the otel.GetMeterProvider() is used.
func WithMeterProvider(provider metric.MeterProvider) Option {
return otelOptionFunc(func(cfg *otelConfig) {
if provider != nil {
cfg.MeterProvider = provider
}
})
}
// WithClient specifies http client to use.
func WithClient(client ht.Client) ClientOption {
return optionFunc[clientConfig](func(cfg *clientConfig) {
if client != nil {
cfg.Client = client
}
})
}
// WithNotFound specifies Not Found handler to use.
func WithNotFound(notFound http.HandlerFunc) ServerOption {
return optionFunc[serverConfig](func(cfg *serverConfig) {
if notFound != nil {
cfg.NotFound = notFound
}
})
}
// WithMethodNotAllowed specifies Method Not Allowed handler to use.
func WithMethodNotAllowed(methodNotAllowed func(w http.ResponseWriter, r *http.Request, allowed string)) ServerOption {
return optionFunc[serverConfig](func(cfg *serverConfig) {
if methodNotAllowed != nil {
cfg.MethodNotAllowed = methodNotAllowed
}
})
}
// WithErrorHandler specifies error handler to use.
func WithErrorHandler(h ErrorHandler) ServerOption {
return optionFunc[serverConfig](func(cfg *serverConfig) {
if h != nil {
cfg.ErrorHandler = h
}
})
}
// WithPathPrefix specifies server path prefix.
func WithPathPrefix(prefix string) ServerOption {
return optionFunc[serverConfig](func(cfg *serverConfig) {
cfg.Prefix = prefix
})
}
// WithMiddleware specifies middlewares to use.
func WithMiddleware(m ...Middleware) ServerOption {
return optionFunc[serverConfig](func(cfg *serverConfig) {
switch len(m) {
case 0:
cfg.Middleware = nil
case 1:
cfg.Middleware = m[0]
default:
cfg.Middleware = middleware.ChainMiddlewares(m...)
}
})
}
// WithMaxMultipartMemory specifies limit of memory for storing file parts.
// File parts which can't be stored in memory will be stored on disk in temporary files.
func WithMaxMultipartMemory(max int64) ServerOption {
return optionFunc[serverConfig](func(cfg *serverConfig) {
if max > 0 {
cfg.MaxMultipartMemory = max
}
})
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,166 @@
// Code generated by ogen, DO NOT EDIT.
package api
type APIV2BufferGoodsTaskGetRes interface {
aPIV2BufferGoodsTaskGetRes()
}
type APIV2BufferTasksGetRes interface {
aPIV2BufferTasksGetRes()
}
type APIV2HistoryGoodsTaskGetRes interface {
aPIV2HistoryGoodsTaskGetRes()
}
type APIV2HistoryTasksGetRes interface {
aPIV2HistoryTasksGetRes()
}
type APIV2ListGoodsFilterGetRes interface {
aPIV2ListGoodsFilterGetRes()
}
type APIV2ListGoodsSizeNmGetRes interface {
aPIV2ListGoodsSizeNmGetRes()
}
type APIV2QuarantineGoodsGetRes interface {
aPIV2QuarantineGoodsGetRes()
}
type APIV2UploadTaskClubDiscountPostRes interface {
aPIV2UploadTaskClubDiscountPostRes()
}
type APIV2UploadTaskPostRes interface {
aPIV2UploadTaskPostRes()
}
type APIV2UploadTaskSizePostRes interface {
aPIV2UploadTaskSizePostRes()
}
type APIV3OfficesGetRes interface {
aPIV3OfficesGetRes()
}
type APIV3StocksWarehouseIdDeleteRes interface {
aPIV3StocksWarehouseIdDeleteRes()
}
type APIV3StocksWarehouseIdPostRes interface {
aPIV3StocksWarehouseIdPostRes()
}
type APIV3StocksWarehouseIdPutRes interface {
aPIV3StocksWarehouseIdPutRes()
}
type APIV3WarehousesGetRes interface {
aPIV3WarehousesGetRes()
}
type APIV3WarehousesPostRes interface {
aPIV3WarehousesPostRes()
}
type APIV3WarehousesWarehouseIdDeleteRes interface {
aPIV3WarehousesWarehouseIdDeleteRes()
}
type APIV3WarehousesWarehouseIdPutRes interface {
aPIV3WarehousesWarehouseIdPutRes()
}
type ContentV2BarcodesPostRes interface {
contentV2BarcodesPostRes()
}
type ContentV2CardsDeleteTrashPostRes interface {
contentV2CardsDeleteTrashPostRes()
}
type ContentV2CardsErrorListGetRes interface {
contentV2CardsErrorListGetRes()
}
type ContentV2CardsLimitsGetRes interface {
contentV2CardsLimitsGetRes()
}
type ContentV2CardsRecoverPostRes interface {
contentV2CardsRecoverPostRes()
}
type ContentV2CardsUpdatePostRes interface {
contentV2CardsUpdatePostRes()
}
type ContentV2CardsUploadAddPostRes interface {
contentV2CardsUploadAddPostRes()
}
type ContentV2CardsUploadPostRes interface {
contentV2CardsUploadPostRes()
}
type ContentV2DirectoryColorsGetRes interface {
contentV2DirectoryColorsGetRes()
}
type ContentV2DirectoryCountriesGetRes interface {
contentV2DirectoryCountriesGetRes()
}
type ContentV2DirectoryKindsGetRes interface {
contentV2DirectoryKindsGetRes()
}
type ContentV2DirectorySeasonsGetRes interface {
contentV2DirectorySeasonsGetRes()
}
type ContentV2DirectoryTnvedGetRes interface {
contentV2DirectoryTnvedGetRes()
}
type ContentV2DirectoryVatGetRes interface {
contentV2DirectoryVatGetRes()
}
type ContentV2GetCardsListPostRes interface {
contentV2GetCardsListPostRes()
}
type ContentV2GetCardsTrashPostRes interface {
contentV2GetCardsTrashPostRes()
}
type ContentV2ObjectAllGetRes interface {
contentV2ObjectAllGetRes()
}
type ContentV2ObjectCharcsSubjectIdGetRes interface {
contentV2ObjectCharcsSubjectIdGetRes()
}
type ContentV2ObjectParentAllGetRes interface {
contentV2ObjectParentAllGetRes()
}
type ContentV2TagNomenclatureLinkPostRes interface {
contentV2TagNomenclatureLinkPostRes()
}
type ContentV2TagsGetRes interface {
contentV2TagsGetRes()
}
type ContentV3MediaFilePostRes interface {
contentV3MediaFilePostRes()
}
type ContentV3MediaSavePostRes interface {
contentV3MediaSavePostRes()
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,42 @@
// Code generated by ogen, DO NOT EDIT.
package api
import (
"context"
"go.opentelemetry.io/otel/attribute"
)
// Labeler is used to allow adding custom attributes to the server request metrics.
type Labeler struct {
attrs []attribute.KeyValue
}
// Add attributes to the Labeler.
func (l *Labeler) Add(attrs ...attribute.KeyValue) {
l.attrs = append(l.attrs, attrs...)
}
// AttributeSet returns the attributes added to the Labeler as an attribute.Set.
func (l *Labeler) AttributeSet() attribute.Set {
return attribute.NewSet(l.attrs...)
}
type labelerContextKey struct{}
// LabelerFromContext retrieves the Labeler from the provided context, if present.
//
// If no Labeler was found in the provided context a new, empty Labeler is returned and the second
// return value is false. In this case it is safe to use the Labeler but any attributes added to
// it will not be used.
func LabelerFromContext(ctx context.Context) (*Labeler, bool) {
if l, ok := ctx.Value(labelerContextKey{}).(*Labeler); ok {
return l, true
}
return &Labeler{}, false
}
func contextWithLabeler(ctx context.Context, l *Labeler) context.Context {
return context.WithValue(ctx, labelerContextKey{}, l)
}

View File

@@ -0,0 +1,10 @@
// Code generated by ogen, DO NOT EDIT.
package api
import (
"github.com/ogen-go/ogen/middleware"
)
// Middleware is middleware type.
type Middleware = middleware.Middleware

View File

@@ -0,0 +1,50 @@
// Code generated by ogen, DO NOT EDIT.
package api
// OperationName is the ogen operation name
type OperationName = string
const (
APIV2BufferGoodsTaskGetOperation OperationName = "APIV2BufferGoodsTaskGet"
APIV2BufferTasksGetOperation OperationName = "APIV2BufferTasksGet"
APIV2HistoryGoodsTaskGetOperation OperationName = "APIV2HistoryGoodsTaskGet"
APIV2HistoryTasksGetOperation OperationName = "APIV2HistoryTasksGet"
APIV2ListGoodsFilterGetOperation OperationName = "APIV2ListGoodsFilterGet"
APIV2ListGoodsSizeNmGetOperation OperationName = "APIV2ListGoodsSizeNmGet"
APIV2QuarantineGoodsGetOperation OperationName = "APIV2QuarantineGoodsGet"
APIV2UploadTaskClubDiscountPostOperation OperationName = "APIV2UploadTaskClubDiscountPost"
APIV2UploadTaskPostOperation OperationName = "APIV2UploadTaskPost"
APIV2UploadTaskSizePostOperation OperationName = "APIV2UploadTaskSizePost"
APIV3OfficesGetOperation OperationName = "APIV3OfficesGet"
APIV3StocksWarehouseIdDeleteOperation OperationName = "APIV3StocksWarehouseIdDelete"
APIV3StocksWarehouseIdPostOperation OperationName = "APIV3StocksWarehouseIdPost"
APIV3StocksWarehouseIdPutOperation OperationName = "APIV3StocksWarehouseIdPut"
APIV3WarehousesGetOperation OperationName = "APIV3WarehousesGet"
APIV3WarehousesPostOperation OperationName = "APIV3WarehousesPost"
APIV3WarehousesWarehouseIdDeleteOperation OperationName = "APIV3WarehousesWarehouseIdDelete"
APIV3WarehousesWarehouseIdPutOperation OperationName = "APIV3WarehousesWarehouseIdPut"
ContentV2BarcodesPostOperation OperationName = "ContentV2BarcodesPost"
ContentV2CardsDeleteTrashPostOperation OperationName = "ContentV2CardsDeleteTrashPost"
ContentV2CardsErrorListGetOperation OperationName = "ContentV2CardsErrorListGet"
ContentV2CardsLimitsGetOperation OperationName = "ContentV2CardsLimitsGet"
ContentV2CardsRecoverPostOperation OperationName = "ContentV2CardsRecoverPost"
ContentV2CardsUpdatePostOperation OperationName = "ContentV2CardsUpdatePost"
ContentV2CardsUploadAddPostOperation OperationName = "ContentV2CardsUploadAddPost"
ContentV2CardsUploadPostOperation OperationName = "ContentV2CardsUploadPost"
ContentV2DirectoryColorsGetOperation OperationName = "ContentV2DirectoryColorsGet"
ContentV2DirectoryCountriesGetOperation OperationName = "ContentV2DirectoryCountriesGet"
ContentV2DirectoryKindsGetOperation OperationName = "ContentV2DirectoryKindsGet"
ContentV2DirectorySeasonsGetOperation OperationName = "ContentV2DirectorySeasonsGet"
ContentV2DirectoryTnvedGetOperation OperationName = "ContentV2DirectoryTnvedGet"
ContentV2DirectoryVatGetOperation OperationName = "ContentV2DirectoryVatGet"
ContentV2GetCardsListPostOperation OperationName = "ContentV2GetCardsListPost"
ContentV2GetCardsTrashPostOperation OperationName = "ContentV2GetCardsTrashPost"
ContentV2ObjectAllGetOperation OperationName = "ContentV2ObjectAllGet"
ContentV2ObjectCharcsSubjectIdGetOperation OperationName = "ContentV2ObjectCharcsSubjectIdGet"
ContentV2ObjectParentAllGetOperation OperationName = "ContentV2ObjectParentAllGet"
ContentV2TagNomenclatureLinkPostOperation OperationName = "ContentV2TagNomenclatureLinkPost"
ContentV2TagsGetOperation OperationName = "ContentV2TagsGet"
ContentV3MediaFilePostOperation OperationName = "ContentV3MediaFilePost"
ContentV3MediaSavePostOperation OperationName = "ContentV3MediaSavePost"
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,315 @@
// Code generated by ogen, DO NOT EDIT.
package api
import (
"bytes"
"mime"
"mime/multipart"
"net/http"
"github.com/go-faster/errors"
"github.com/go-faster/jx"
ht "github.com/ogen-go/ogen/http"
"github.com/ogen-go/ogen/uri"
)
func encodeAPIV2UploadTaskClubDiscountPostRequest(
req *APIV2UploadTaskClubDiscountPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV2UploadTaskPostRequest(
req *APIV2UploadTaskPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV2UploadTaskSizePostRequest(
req *APIV2UploadTaskSizePostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV3StocksWarehouseIdDeleteRequest(
req *APIV3StocksWarehouseIdDeleteReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV3StocksWarehouseIdPostRequest(
req *APIV3StocksWarehouseIdPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV3StocksWarehouseIdPutRequest(
req OptAPIV3StocksWarehouseIdPutReq,
r *http.Request,
) error {
const contentType = "application/json"
if !req.Set {
// Keep request with empty body if value is not set.
return nil
}
e := new(jx.Encoder)
{
if req.Set {
req.Encode(e)
}
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV3WarehousesPostRequest(
req *APIV3WarehousesPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeAPIV3WarehousesWarehouseIdPutRequest(
req *APIV3WarehousesWarehouseIdPutReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2BarcodesPostRequest(
req *ContentV2BarcodesPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2CardsDeleteTrashPostRequest(
req *ContentV2CardsDeleteTrashPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2CardsRecoverPostRequest(
req *ContentV2CardsRecoverPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2CardsUpdatePostRequest(
req []ContentV2CardsUpdatePostReqItem,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
if req != nil {
e.ArrStart()
for _, elem := range req {
elem.Encode(e)
}
e.ArrEnd()
}
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2CardsUploadAddPostRequest(
req OptContentV2CardsUploadAddPostReq,
r *http.Request,
) error {
const contentType = "application/json"
if !req.Set {
// Keep request with empty body if value is not set.
return nil
}
e := new(jx.Encoder)
{
if req.Set {
req.Encode(e)
}
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2CardsUploadPostRequest(
req []ContentV2CardsUploadPostReqItem,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
if req != nil {
e.ArrStart()
for _, elem := range req {
elem.Encode(e)
}
e.ArrEnd()
}
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2GetCardsListPostRequest(
req *ContentV2GetCardsListPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2GetCardsTrashPostRequest(
req *ContentV2GetCardsTrashPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV2TagNomenclatureLinkPostRequest(
req *ContentV2TagNomenclatureLinkPostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeContentV3MediaFilePostRequest(
req *ContentV3MediaFilePostReq,
r *http.Request,
) error {
const contentType = "multipart/form-data"
request := req
q := uri.NewFormEncoder(map[string]string{})
body, boundary := ht.CreateMultipartBody(func(w *multipart.Writer) error {
if val, ok := request.Uploadfile.Get(); ok {
if err := val.WriteMultipart("uploadfile", w); err != nil {
return errors.Wrap(err, "write \"uploadfile\"")
}
}
if err := q.WriteMultipart(w); err != nil {
return errors.Wrap(err, "write multipart")
}
return nil
})
ht.SetCloserBody(r, body, mime.FormatMediaType(contentType, map[string]string{"boundary": boundary}))
return nil
}
func encodeContentV3MediaSavePostRequest(
req *ContentV3MediaSavePostReq,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,111 @@
// Code generated by ogen, DO NOT EDIT.
package api
import (
"context"
"net/http"
"strings"
"github.com/go-faster/errors"
"github.com/ogen-go/ogen/ogenerrors"
)
// SecurityHandler is handler for security parameters.
type SecurityHandler interface {
// HandleHeaderApiKey handles HeaderApiKey security.
HandleHeaderApiKey(ctx context.Context, operationName OperationName, t HeaderApiKey) (context.Context, error)
}
func findAuthorization(h http.Header, prefix string) (string, bool) {
v, ok := h["Authorization"]
if !ok {
return "", false
}
for _, vv := range v {
scheme, value, ok := strings.Cut(vv, " ")
if !ok || !strings.EqualFold(scheme, prefix) {
continue
}
return value, true
}
return "", false
}
var operationRolesHeaderApiKey = map[string][]string{
APIV2BufferGoodsTaskGetOperation: []string{},
APIV2BufferTasksGetOperation: []string{},
APIV2HistoryGoodsTaskGetOperation: []string{},
APIV2HistoryTasksGetOperation: []string{},
APIV2ListGoodsFilterGetOperation: []string{},
APIV2ListGoodsSizeNmGetOperation: []string{},
APIV2QuarantineGoodsGetOperation: []string{},
APIV2UploadTaskClubDiscountPostOperation: []string{},
APIV2UploadTaskPostOperation: []string{},
APIV2UploadTaskSizePostOperation: []string{},
APIV3OfficesGetOperation: []string{},
APIV3StocksWarehouseIdDeleteOperation: []string{},
APIV3StocksWarehouseIdPostOperation: []string{},
APIV3StocksWarehouseIdPutOperation: []string{},
APIV3WarehousesGetOperation: []string{},
APIV3WarehousesPostOperation: []string{},
APIV3WarehousesWarehouseIdDeleteOperation: []string{},
APIV3WarehousesWarehouseIdPutOperation: []string{},
ContentV2BarcodesPostOperation: []string{},
ContentV2CardsDeleteTrashPostOperation: []string{},
ContentV2CardsErrorListGetOperation: []string{},
ContentV2CardsLimitsGetOperation: []string{},
ContentV2CardsRecoverPostOperation: []string{},
ContentV2CardsUpdatePostOperation: []string{},
ContentV2CardsUploadAddPostOperation: []string{},
ContentV2CardsUploadPostOperation: []string{},
ContentV2DirectoryColorsGetOperation: []string{},
ContentV2DirectoryCountriesGetOperation: []string{},
ContentV2DirectoryKindsGetOperation: []string{},
ContentV2DirectorySeasonsGetOperation: []string{},
ContentV2DirectoryTnvedGetOperation: []string{},
ContentV2DirectoryVatGetOperation: []string{},
ContentV2GetCardsListPostOperation: []string{},
ContentV2GetCardsTrashPostOperation: []string{},
ContentV2ObjectAllGetOperation: []string{},
ContentV2ObjectCharcsSubjectIdGetOperation: []string{},
ContentV2ObjectParentAllGetOperation: []string{},
ContentV2TagNomenclatureLinkPostOperation: []string{},
ContentV2TagsGetOperation: []string{},
ContentV3MediaFilePostOperation: []string{},
ContentV3MediaSavePostOperation: []string{},
}
func (s *Server) securityHeaderApiKey(ctx context.Context, operationName OperationName, req *http.Request) (context.Context, bool, error) {
var t HeaderApiKey
const parameterName = "Authorization"
value := req.Header.Get(parameterName)
if value == "" {
return ctx, false, nil
}
t.APIKey = value
t.Roles = operationRolesHeaderApiKey[operationName]
rctx, err := s.sec.HandleHeaderApiKey(ctx, operationName, t)
if errors.Is(err, ogenerrors.ErrSkipServerSecurity) {
return nil, false, nil
} else if err != nil {
return nil, false, err
}
return rctx, true, err
}
// SecuritySource is provider of security values (tokens, passwords, etc.).
type SecuritySource interface {
// HeaderApiKey provides HeaderApiKey security value.
HeaderApiKey(ctx context.Context, operationName OperationName, client *Client) (HeaderApiKey, error)
}
func (s *Client) securityHeaderApiKey(ctx context.Context, operationName OperationName, req *http.Request) error {
t, err := s.sec.HeaderApiKey(ctx, operationName, s)
if err != nil {
return errors.Wrap(err, "security source \"HeaderApiKey\"")
}
req.Header.Set("Authorization", t.APIKey)
return nil
}

View File

@@ -0,0 +1,951 @@
// Code generated by ogen, DO NOT EDIT.
package api
import (
"context"
)
// Handler handles operations described by OpenAPI v3 specification.
type Handler interface {
// APIV2BufferGoodsTaskGet implements GET /api/v2/buffer/goods/task operation.
//
// Метод предоставляет информацию о товарах и ошибках в
// товарах из загрузки в обработке.
// <div class="description_important">
// Необработанная загрузка — это загрузка скидок для <a
// href="/openapi/promotion#tag/Kalendar-akcij">календаря акций</a>. Такие
// скидки применятся к товарам только в момент начала
// акции.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/buffer/goods/task
APIV2BufferGoodsTaskGet(ctx context.Context, params APIV2BufferGoodsTaskGetParams) (APIV2BufferGoodsTaskGetRes, error)
// APIV2BufferTasksGet implements GET /api/v2/buffer/tasks operation.
//
// Метод предоставляет информацию про загрузку скидок в
// обработке.
// <div class="description_important">
// Необработанная загрузка — это загрузка скидок для <a
// href="/openapi/promotion#tag/Kalendar-akcij">календаря акций</a>. Такие
// скидки применятся к товарам только в момент начала
// акции.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/buffer/tasks
APIV2BufferTasksGet(ctx context.Context, params APIV2BufferTasksGetParams) (APIV2BufferTasksGetRes, error)
// APIV2HistoryGoodsTaskGet implements GET /api/v2/history/goods/task operation.
//
// Метод предоставляет информацию о товарах и об
// ошибках в товарах в обработанной загрузке.
// <div class="description_important">
// Обработанная загрузка — это загрузка цен и скидок
// для <a
// href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task/post">товаров</a> и <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1size/post">размеров товаров</a>, а также скидок <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1club-discount/post">WB Клуба</a>.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/history/goods/task
APIV2HistoryGoodsTaskGet(ctx context.Context, params APIV2HistoryGoodsTaskGetParams) (APIV2HistoryGoodsTaskGetRes, error)
// APIV2HistoryTasksGet implements GET /api/v2/history/tasks operation.
//
// Метод предоставляет информацию об обработанной
// загрузке цен и скидок.
// <div class="description_important">
// Обработанная загрузка — это загрузка цен и скидок
// для <a
// href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task/post">товаров</a> и <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1size/post">размеров товаров</a>, а также скидок <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1club-discount/post">WB Клуба</a>.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/history/tasks
APIV2HistoryTasksGet(ctx context.Context, params APIV2HistoryTasksGetParams) (APIV2HistoryTasksGetRes, error)
// APIV2ListGoodsFilterGet implements GET /api/v2/list/goods/filter operation.
//
// Метод предоставляет информацию о товарах по их
// артикулам: цены, валюту, общие скидки и скидки для [WB
// Клуба](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1club-discount/post).
// <br><br>
// Чтобы получить информацию обо всех товарах продавца,
// оставьте артикул пустым, установите `limit=1000`, в
// параметре `offset` установите смещение по количеству
// записей. Количество нужно рассчитать по формуле: `offset`
// плюс `limit` из предыдущего запроса. Повторяйте запрос,
// пока вы не получите ответ с пустым массивом.<br> Чтобы
// получить информацию о размерах товара, используйте
// [отдельный
// метод](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1list~1goods~1size~1nm/get).
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/list/goods/filter
APIV2ListGoodsFilterGet(ctx context.Context, params APIV2ListGoodsFilterGetParams) (APIV2ListGoodsFilterGetRes, error)
// APIV2ListGoodsSizeNmGet implements GET /api/v2/list/goods/size/nm operation.
//
// Метод предоставляет информацию обо всех размерах
// одного товарам: цены, валюту, общие скидки и скидки
// для [WB
// Клуба](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1club-discount/post).
// <br><br>
// Работает только для товаров из категорий, где можно
// устанавливать цены отдельно для разных размеров. Для
// таких товаров `editableSizePrice: true`.
// <br><br>
// Чтобы получить информацию о самом товаре,
// используйте [отдельный
// метод](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1list~1goods~1filter/get).
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/list/goods/size/nm
APIV2ListGoodsSizeNmGet(ctx context.Context, params APIV2ListGoodsSizeNmGetParams) (APIV2ListGoodsSizeNmGetRes, error)
// APIV2QuarantineGoodsGet implements GET /api/v2/quarantine/goods operation.
//
// Метод предоставляет информацию о товарах в карантине.
// <br><br>
// Если новая цена товара со скидкой будет минимум в 3
// раза меньше старой, товар попадёт [в
// карантин](https://seller.wildberries.ru/discount-and-prices/quarantine) и будет
// продаваться по старой цене. Ошибка об этом будет в
// ответах методов [состояний
// загрузок](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1tasks/get).
// <br><br>
// Вы можете изменить цену или скидку с помощью API либо
// вывести товар из карантина [в личном
// кабинете](https://seller.wildberries.ru/discount-and-prices/quarantine).
// <br><br>
// Для товаров с [поразмерной установкой
// цен](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1size/post)
// карантин не применяется.
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// GET /api/v2/quarantine/goods
APIV2QuarantineGoodsGet(ctx context.Context, params APIV2QuarantineGoodsGetParams) (APIV2QuarantineGoodsGetRes, error)
// APIV2UploadTaskClubDiscountPost implements POST /api/v2/upload/task/club-discount operation.
//
// Устанавливает скидки для товаров в рамках подписки [WB
// Клуб](https://seller.wildberries.ru/help-center/article/A-337).
// <div class="description_important">
// Получить информацию о процессе установки цен и
// скидок можно с помощью методов <a
// href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1tasks/get">состояния</a> и <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1goods~1task/get">детализации</a> обработанной загрузки.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// POST /api/v2/upload/task/club-discount
APIV2UploadTaskClubDiscountPost(ctx context.Context, req *APIV2UploadTaskClubDiscountPostReq) (APIV2UploadTaskClubDiscountPostRes, error)
// APIV2UploadTaskPost implements POST /api/v2/upload/task operation.
//
// Метод устанавливает цены и скидки для товаров.
// <br><br>
// Чтобы установить цены и скидки для размеров товара,
// используйте [отдельный
// метод](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task~1size/post).
// <div class="description_important">
// Получить информацию о процессе установки цен и
// скидок можно с помощью методов <a
// href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1tasks/get">состояния</a> и <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1goods~1task/get">детализации</a> обработанной загрузки.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// POST /api/v2/upload/task
APIV2UploadTaskPost(ctx context.Context, req *APIV2UploadTaskPostReq) (APIV2UploadTaskPostRes, error)
// APIV2UploadTaskSizePost implements POST /api/v2/upload/task/size operation.
//
// Метод устанавливает цены отдельно для размеров
// товаров.
// Работает только для товаров из категорий, где можно
// устанавливать цены отдельно для разных размеров. Для
// [таких
// товаров](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1list~1goods~1size~1nm/get) `editableSizePrice: true`.
// Чтобы установить цены и скидки для самих товаров,
// используйте [отдельный
// метод](/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1upload~1task/post).
// <div class="description_important">
// Получить информацию о процессе установки цен и
// скидок можно с помощью методов <a
// href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1tasks/get">состояния</a> и <a href="/openapi/work-with-products#tag/Ceny-i-skidki/paths/~1api~1v2~1history~1goods~1task/get">детализации</a> обработанной загрузки.
// </div>
// <div class="description_limit">
// Максимум 10 запросов за 6 <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">секунд</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Цены и скидки</a>
// на один аккаунт продавца
// </div>.
//
// POST /api/v2/upload/task/size
APIV2UploadTaskSizePost(ctx context.Context, req *APIV2UploadTaskSizePostReq) (APIV2UploadTaskSizePostRes, error)
// APIV3OfficesGet implements GET /api/v3/offices operation.
//
// Метод предоставляет список всех складов WB для
// привязки к складам продавца. Предназначен для
// определения складов WB, чтобы сдавать готовые заказы
// по схеме [FBS](/openapi/orders-fbs#tag/Zakazy-FBS) (Fulfillment by Seller).
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// GET /api/v3/offices
APIV3OfficesGet(ctx context.Context) (APIV3OfficesGetRes, error)
// APIV3StocksWarehouseIdDelete implements DELETE /api/v3/stocks/{warehouseId} operation.
//
// Метод удаляет запись об остатках товаров продавца из
// [списка
// остатков](/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca/paths/~1api~1v3~1stocks~1%7BwarehouseId%7D/post).
// <div class="description_important">
// <strong>Действие необратимо</strong>. Удаленный остаток
// будет необходимо загрузить повторно для
// возобновления продаж.
// </div>
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// DELETE /api/v3/stocks/{warehouseId}
APIV3StocksWarehouseIdDelete(ctx context.Context, req *APIV3StocksWarehouseIdDeleteReq, params APIV3StocksWarehouseIdDeleteParams) (APIV3StocksWarehouseIdDeleteRes, error)
// APIV3StocksWarehouseIdPost implements POST /api/v3/stocks/{warehouseId} operation.
//
// Метод предоставляет данные об остатках товаров на
// [складах продавца](/openapi/work-with-products#tag/Sklady-prodavca).
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// POST /api/v3/stocks/{warehouseId}
APIV3StocksWarehouseIdPost(ctx context.Context, req *APIV3StocksWarehouseIdPostReq, params APIV3StocksWarehouseIdPostParams) (APIV3StocksWarehouseIdPostRes, error)
// APIV3StocksWarehouseIdPut implements PUT /api/v3/stocks/{warehouseId} operation.
//
// Метод обновляет количество остатков товаров
// продавца [в
// списке](/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca/paths/~1api~1v3~1stocks~1%7BwarehouseId%7D/post).
// <div class="description_important">
// Названия параметров запроса не валидируются. При
// отправке некорректных названий вы получите успешный
// ответ (<code>204</code>), но остатки не обновятся.
// </div>
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// PUT /api/v3/stocks/{warehouseId}
APIV3StocksWarehouseIdPut(ctx context.Context, req OptAPIV3StocksWarehouseIdPutReq, params APIV3StocksWarehouseIdPutParams) (APIV3StocksWarehouseIdPutRes, error)
// APIV3WarehousesGet implements GET /api/v3/warehouses operation.
//
// Метод предоставляет список всех складов продавца.
// Может использоваться для получения [остатков
// товаров](/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca/paths/~1api~1v3~1stocks~1%7BwarehouseId%7D/post).
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// GET /api/v3/warehouses
APIV3WarehousesGet(ctx context.Context) (APIV3WarehousesGetRes, error)
// APIV3WarehousesPost implements POST /api/v3/warehouses operation.
//
// Метод создаёт склад продавца для работы с [остатками
// товаров](/openapi/work-with-products#tag/Ostatki-na-skladah-prodavca/paths/~1api~1v3~1stocks~1%7BwarehouseId%7D/post). Нужно привязать к складу продавца [склад WB](/openapi/work-with-products#tag/Sklady-prodavca/paths/~1api~1v3~1offices/get) для работы по схеме [FBS](/openapi/orders-fbs#tag/Zakazy-FBS) (Fulfillment by Seller).
// <div class="description_important">
// Нельзя привязывать склад WB, который уже используется
// </div>
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// POST /api/v3/warehouses
APIV3WarehousesPost(ctx context.Context, req *APIV3WarehousesPostReq) (APIV3WarehousesPostRes, error)
// APIV3WarehousesWarehouseIdDelete implements DELETE /api/v3/warehouses/{warehouseId} operation.
//
// Метод удаляет склад продавца из [списка
// складов](/openapi/work-with-products#tag/Sklady-prodavca/paths/~1api~1v3~1warehouses/get).
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// DELETE /api/v3/warehouses/{warehouseId}
APIV3WarehousesWarehouseIdDelete(ctx context.Context, params APIV3WarehousesWarehouseIdDeleteParams) (APIV3WarehousesWarehouseIdDeleteRes, error)
// APIV3WarehousesWarehouseIdPut implements PUT /api/v3/warehouses/{warehouseId} operation.
//
// Метод обновляет данные склада продавца в [списке
// складов](/openapi/work-with-products#tag/Sklady-prodavca/paths/~1api~1v3~1warehouses/get).
// Данные о привязанном [складе
// WB](/openapi/work-with-products#tag/Sklady-prodavca/paths/~1api~1v3~1offices/get) можно
// изменить один раз в сутки.
// <div class="description_important">
// Нельзя привязывать склад WB, который уже используется
// </div>
// <div class="description_limit">
// Максимум 300 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Маркетплейс</a> на
// один аккаунт продавца.
// <br><br>
// Один запрос с кодом ответа <code>409</code> учитывается как 5
// запросов
// </div>.
//
// PUT /api/v3/warehouses/{warehouseId}
APIV3WarehousesWarehouseIdPut(ctx context.Context, req *APIV3WarehousesWarehouseIdPutReq, params APIV3WarehousesWarehouseIdPutParams) (APIV3WarehousesWarehouseIdPutRes, error)
// ContentV2BarcodesPost implements POST /content/v2/barcodes operation.
//
// Метод генерирует массив уникальных баркодов для
// создания размера в [карточке
// товара](/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post). Можно использовать, если у вас нет собственных баркодов.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v2/barcodes
ContentV2BarcodesPost(ctx context.Context, req *ContentV2BarcodesPostReq) (ContentV2BarcodesPostRes, error)
// ContentV2CardsDeleteTrashPost implements POST /content/v2/cards/delete/trash operation.
//
// Метод переносит [карточки товаров в
// корзину](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1trash/post). При этом карточки товаров не удаляются, их можно [восстановить](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1recover/post).
// <div class="description_important">
// После переноса в корзину карточке товара
// присваивается новый <code>imtID</code>.
// </div>
// Карточки товаров удаляются автоматически, если лежат
// в корзине больше 30 дней. Очистка корзины происходит
// каждую ночь по московскому времени.<br>
// Карточки товаров можно удалить в любое время в
// [личном кабинете](https://seller.wildberries.ru/new-goods/basket-cards).
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v2/cards/delete/trash
ContentV2CardsDeleteTrashPost(ctx context.Context, req *ContentV2CardsDeleteTrashPostReq) (ContentV2CardsDeleteTrashPostRes, error)
// ContentV2CardsErrorListGet implements GET /content/v2/cards/error/list operation.
//
// Метод предоставляет список карточек товаров, при
// создании или редактировании которых произошли
// ошибки, с описанием этих ошибок.
// <div class="description_important">
// Чтобы убрать карточку товара из списка, нужно
// повторно сделать запрос на <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создание</a> или редактирование карточки товара с исправленными ошибками.
// </div>
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/cards/error/list
ContentV2CardsErrorListGet(ctx context.Context, params ContentV2CardsErrorListGetParams) (ContentV2CardsErrorListGetRes, error)
// ContentV2CardsLimitsGet implements GET /content/v2/cards/limits operation.
//
// Возвращает бесплатные и платные лимиты продавца на
// [создание карточек
// товаров](/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post).<br><br>
// Формула для получения количества карточек, которые
// можно создать:
// > (`freeLimits` + `paidLimits`) - количество созданных карточек
// Созданными считаются карточки, которые можно
// получить через методы [список карточек
// товаров](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1list/post) и [список карточек товаров в корзине](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1trash/post).
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/cards/limits
ContentV2CardsLimitsGet(ctx context.Context) (ContentV2CardsLimitsGetRes, error)
// ContentV2CardsRecoverPost implements POST /content/v2/cards/recover operation.
//
// Метод восстанавливает [карточки товаров из
// корзины](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1trash/post).
// <div class="description_important">
// Карточка товара сохраняет тот же <code>imtID</code>, что был
// присвоен ей при <a
// href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1delete~1trash/post">перемещении в корзину</a>.
// </div>
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v2/cards/recover
ContentV2CardsRecoverPost(ctx context.Context, req *ContentV2CardsRecoverPostReq) (ContentV2CardsRecoverPostRes, error)
// ContentV2CardsUpdatePost implements POST /content/v2/cards/update operation.
//
// Метод обновляет карточки товаров. Данные для
// обновления можно получить через [список карточек
// товаров](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1list/post) и [список карточек товаров в корзине](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1trash/post).
// <div class="description_important">
// Карточка товара перезаписывается при обновлении.
// Поэтому в запросе нужно передать <strong>все</strong>
// параметры карточки, в том числе те, которые вы не
// собираетесь обновлять.
// </div>
// Нельзя редактировать или удалять баркоды, но можно
// добавить дополнительный баркод к карточке товара.
// Параметры `photos`, `video` и `tags` редактировать или удалять
// через данный метод нельзя.<br>
// Габариты товаров можно указать только в `сантиметрах`,
// вес товара с упаковкой — в `килограммах`.
// <br><br>
// В одном запросе можно отредактировать максимум 3000
// карточек товаров (`nmID`). Максимальный размер запроса 10
// Мб.<br>
// Если ответ `Успешно` (`200`), но какие-то карточки не
// обновились, получите [список несозданных карточек
// товаров](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1error~1list/get).
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня для метода будет отдельный
// лимит — 10 запросов в минуту на один аккаунт продавца
// </div>.
//
// POST /content/v2/cards/update
ContentV2CardsUpdatePost(ctx context.Context, req []ContentV2CardsUpdatePostReqItem) (ContentV2CardsUpdatePostRes, error)
// ContentV2CardsUploadAddPost implements POST /content/v2/cards/upload/add operation.
//
// Метод создаёт новые карточки товаров, присоединяя их
// к существующим карточкам.
// Габариты товаров можно указать только в `сантиметрах`,
// вес товара с упаковкой — в `килограммах`.
// <br><br>
// Создание карточки товара происходит асинхронно.
// После отправки запрос становится в очередь на
// обработку.<br>Максимальный размер запроса 10 Мб.<br>
// Если ответ `Успешно` (`200`), но какие-то карточки не
// обновились, получите [список несозданных карточек
// товаров](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1error~1list/get).
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня для метода будет отдельный
// лимит — 10 запросов в минуту на один аккаунт продавца
// </div>.
//
// POST /content/v2/cards/upload/add
ContentV2CardsUploadAddPost(ctx context.Context, req OptContentV2CardsUploadAddPostReq) (ContentV2CardsUploadAddPostRes, error)
// ContentV2CardsUploadPost implements POST /content/v2/cards/upload operation.
//
// Метод создаёт карточки товаров c указанием описаний и
// характеристик товаров.<br>
// <div class="description_important">
// Есть две формы запроса: для создания отдельных и
// объединённых карточек товаров.
// </div>
// Габариты товаров можно указать только в `сантиметрах`,
// вес товара с упаковкой — в `килограммах`.
// <br><br>
// Создание карточки товара происходит асинхронно.
// После отправки запрос становится в очередь на
// обработку.<br>
// В одном запросе можно создать максимум 100
// объединённых карточек товаров (`imtID`), по 30 карточек
// товаров в каждой. Максимальный размер запроса 10 Мб.<br>
// Если ответ `Успешно` (`200`), но какие-то карточки не
// обновились, получите [список несозданных карточек
// товаров](/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1error~1list/get).
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня для метода будет отдельный
// лимит — 10 запросов в минуту на один аккаунт продавца
// </div>.
//
// POST /content/v2/cards/upload
ContentV2CardsUploadPost(ctx context.Context, req []ContentV2CardsUploadPostReqItem) (ContentV2CardsUploadPostRes, error)
// ContentV2DirectoryColorsGet implements GET /content/v2/directory/colors operation.
//
// Метод предоставляет возможные значения
// [характеристики](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1charcs~1%7BsubjectId%7D/get) предмета `Цвет`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/directory/colors
ContentV2DirectoryColorsGet(ctx context.Context, params ContentV2DirectoryColorsGetParams) (ContentV2DirectoryColorsGetRes, error)
// ContentV2DirectoryCountriesGet implements GET /content/v2/directory/countries operation.
//
// Метод предоставляет возможные значения
// [характеристики](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1charcs~1%7BsubjectId%7D/get) предмета `Страна производства`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/directory/countries
ContentV2DirectoryCountriesGet(ctx context.Context, params ContentV2DirectoryCountriesGetParams) (ContentV2DirectoryCountriesGetRes, error)
// ContentV2DirectoryKindsGet implements GET /content/v2/directory/kinds operation.
//
// Метод предоставляет возможные значения
// [характеристики](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1charcs~1%7BsubjectId%7D/get) предмета `Пол`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/directory/kinds
ContentV2DirectoryKindsGet(ctx context.Context, params ContentV2DirectoryKindsGetParams) (ContentV2DirectoryKindsGetRes, error)
// ContentV2DirectorySeasonsGet implements GET /content/v2/directory/seasons operation.
//
// Метод предоставляет возможные значения
// [характеристики](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1charcs~1%7BsubjectId%7D/get) предмета `Сезон`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/directory/seasons
ContentV2DirectorySeasonsGet(ctx context.Context, params ContentV2DirectorySeasonsGetParams) (ContentV2DirectorySeasonsGetRes, error)
// ContentV2DirectoryTnvedGet implements GET /content/v2/directory/tnved operation.
//
// Метод предоставляет список ТНВЭД-кодов по ID
// [предмета](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1all/get) и фрагменту ТНВЭД-кода.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/directory/tnved
ContentV2DirectoryTnvedGet(ctx context.Context, params ContentV2DirectoryTnvedGetParams) (ContentV2DirectoryTnvedGetRes, error)
// ContentV2DirectoryVatGet implements GET /content/v2/directory/vat operation.
//
// Метод предоставляет возможные значения
// [характеристики](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1charcs~1%7BsubjectId%7D/get) предмета `Ставка НДС`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/directory/vat
ContentV2DirectoryVatGet(ctx context.Context, params ContentV2DirectoryVatGetParams) (ContentV2DirectoryVatGetRes, error)
// ContentV2GetCardsListPost implements POST /content/v2/get/cards/list operation.
//
// <div class="description_auth">
// Метод доступен по <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">токену</a> с
// категорией <strong>Контент</strong> или <strong>Продвижение</strong>
// </div>
// Метод предоставляет список созданных карточек
// товаров.
// <div class="description_important">
// В ответе метода не будет карточек, находящихся в
// корзине. Получить такие карточки можно через <a
// href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1get~1cards~1trash/post">отдельный метод</a>.
// </div>
// Чтобы получить **больше 100** карточек товаров,
// воспользуйтесь пагинацией:
// <ol>
// <li>Сделайте первый запрос: <br>
// <pre style="background-color: rgb(38 50 56 / 5%); color: #e53935">
// {
// "settings": {
// "cursor": {
// "limit": 100
// },
// "filter": {
// "withPhoto": -1
// }
// }
// }</pre>
// </li>
// <li>Пройдите в конец полученного списка карточек
// товаров.</li>
// <li>Скопируйте из <code>cursor</code> две строки:
// <ul>
// <li><code>"updatedAt": "***"</code></li>
// <li><code>"nmID": ***</code></li>
// </ul></li>
// <li>Вставьте скопированные строки в параметр запроса
// <code>cursor</code>.</li>
// <li>Повторите запрос. </li>
// <li>Повторяйте пункты со <b>2</b> по <b>5</b>, пока поле
// <code>total</code> в ответе не станет меньше чем параметр
// <code>limit</code> в запросе. Это будет означать, что вы
// получили все карточки.
// </ol>
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v2/get/cards/list
ContentV2GetCardsListPost(ctx context.Context, req *ContentV2GetCardsListPostReq, params ContentV2GetCardsListPostParams) (ContentV2GetCardsListPostRes, error)
// ContentV2GetCardsTrashPost implements POST /content/v2/get/cards/trash operation.
//
// <div class="description_auth">
// Метод доступен по <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">токену</a> с
// категорией <strong>Контент</strong> или <strong>Продвижение</strong>
// </div>
// Метод предоставляет список карточек товаров в
// корзине.<br><br>
// Чтобы получить **больше 100** карточек товаров,
// воспользуйтесь пагинацией:
// <ol>
// <li>Сделайте первый запрос: <br>
// <pre style="background-color: rgb(38 50 56 / 5%); color: #e53935">
// {
// "settings": {
// "cursor": {
// "limit": 100
// },
// "filter": {
// "withPhoto": -1
// }
// }
// }</pre>
// </li>
// <li>Пройдите в конец полученного списка карточек
// товаров.</li>
// <li>Скопируйте из <code>cursor</code> две строки:
// <ul>
// <li><code>"trashedAt": "***"</code></li>
// <li><code>"nmID": ***</code></li>
// </ul></li>
// <li>Вставьте скопированные строки в параметр запроса
// <code>cursor</code>.</li>
// <li>Повторите запрос. </li>
// <li>Повторяйте пункты со <b>2</b> по <b>5</b>, пока поле
// <code>total</code> в ответе не станет меньше чем параметр
// <code>limit</code> в запросе. Это будет означать, что вы
// получили все карточки.
// </ol>
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v2/get/cards/trash
ContentV2GetCardsTrashPost(ctx context.Context, req *ContentV2GetCardsTrashPostReq, params ContentV2GetCardsTrashPostParams) (ContentV2GetCardsTrashPostRes, error)
// ContentV2ObjectAllGet implements GET /content/v2/object/all operation.
//
// Метод предоставляет список названий [родительских
// категорий
// предметов](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1parent~1all/get) и их предметов с ID. Например, у категории `Игрушки` будут предметы `Калейдоскопы`, `Куклы`, `Мячики`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/object/all
ContentV2ObjectAllGet(ctx context.Context, params ContentV2ObjectAllGetParams) (ContentV2ObjectAllGetRes, error)
// ContentV2ObjectCharcsSubjectIdGet implements GET /content/v2/object/charcs/{subjectId} operation.
//
// Метод предоставляет параметры характеристик
// предмета: названия, типы данных, единицы измерения и
// так далее. В запросе необходимо указать ID
// [предмета](/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1object~1all/get).
// <div class="description_important">
// Для получения характеристик <a
// href="/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1directory~1colors/get">Цвет</a>, <a href="/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1directory~1kinds/get">Пол</a>, <a href="/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1directory~1countries/get">Страна производства</a>, <a href="/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1directory~1seasons/get">Сезон</a>, <a href="/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1directory~1vat/get">Ставка НДС</a> и <a href="/openapi/work-with-products#tag/Kategorii-predmety-i-harakteristiki/paths/~1content~1v2~1directory~1tnved/get">ТНВЭД-код</a> используйте отдельные методы
// </div>
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/object/charcs/{subjectId}
ContentV2ObjectCharcsSubjectIdGet(ctx context.Context, params ContentV2ObjectCharcsSubjectIdGetParams) (ContentV2ObjectCharcsSubjectIdGetRes, error)
// ContentV2ObjectParentAllGet implements GET /content/v2/object/parent/all operation.
//
// Метод предоставляет названия и ID всех родительских
// категорий для [создания карточек
// товаров](/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov): например,
// `Электроника`, `Бытовая химия`, `Рукоделие`.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/object/parent/all
ContentV2ObjectParentAllGet(ctx context.Context, params ContentV2ObjectParentAllGetParams) (ContentV2ObjectParentAllGetRes, error)
// ContentV2TagNomenclatureLinkPost implements POST /content/v2/tag/nomenclature/link operation.
//
// Метод добавляет или снимает ярлык с карточки товара.
// К карточке можно добавить максимум 15 ярлыков.<br>
// При удалении ярлыка из карточки товара он не
// удаляется из [списка
// ярлыков](/openapi/work-with-products#tag/Yarlyki/paths/~1content~1v2~1tags/get)
// продавца.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v2/tag/nomenclature/link
ContentV2TagNomenclatureLinkPost(ctx context.Context, req *ContentV2TagNomenclatureLinkPostReq) (ContentV2TagNomenclatureLinkPostRes, error)
// ContentV2TagsGet implements GET /content/v2/tags operation.
//
// Метод предоставляет список и характеристики всех
// ярлыков продавца для группировки и фильтрации
// товаров.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// GET /content/v2/tags
ContentV2TagsGet(ctx context.Context) (ContentV2TagsGetRes, error)
// ContentV3MediaFilePost implements POST /content/v3/media/file operation.
//
// Метод загружает и добавляет один медиафайл к
// карточке товара.
// Требования к изображениям:
// * максимум изображений для одной карточки товара — 30
// * минимальное разрешение — 700x900 px
// * максимальный размер — 32 Мб
// * минимальное качество — 65%
// * форматы — JPG, PNG, BMP, GIF (статичные), WebP
// Требования к видео:
// * максимум одно видео для одной карточки товара
// * максимальный размер — 50 Мб
// * форматы — MOV, MP4
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v3/media/file
ContentV3MediaFilePost(ctx context.Context, req *ContentV3MediaFilePostReq, params ContentV3MediaFilePostParams) (ContentV3MediaFilePostRes, error)
// ContentV3MediaSavePost implements POST /content/v3/media/save operation.
//
// Метод загружает набор медиафайлов в карточку товара
// через указание ссылок в запросе.
// <div class="description_important">
// Новые медиафайлы полностью заменяют старые. Чтобы
// добавить новые медиафайлы, укажите в запросе ссылки
// одновременно на новые и старые медиафайлы.
// </div>
// Требования к изображениям:
// * максимум изображений для одной карточки товара — 30
// * минимальное разрешение — 700×900 px
// * максимальный размер — 32 Мб
// * минимальное качество — 65%
// * форматы — JPG, PNG, BMP, GIF (статичные), WebP
// Требования к видео:
// * максимум одно видео для одной карточки товара
// * максимальный размер — 50 Мб
// * форматы — MOV, MP4
// Если видео или хотя бы одно изображение в запросе не
// соответствует требованиям, то даже при успешном
// ответе ни одно изображение/видео не загрузится.
// <div class="description_limit">
// Максимум 100 запросов в <a
// href="/openapi/api-information#tag/Vvedenie/Limity-zaprosov">минуту</a> для всех
// методов категории <a
// href="/openapi/api-information#tag/Avtorizaciya/Kak-sozdat-token">Контент</a> на один
// аккаунт продавца. С 5 июня — за исключением методов <a
// href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload/post">создания</a>, <a href="/openapi/work-with-products#tag/Sozdanie-kartochek-tovarov/paths/~1content~1v2~1cards~1upload~1add/post">создания с присоединением</a> и <a href="/openapi/work-with-products#tag/Kartochki-tovarov/paths/~1content~1v2~1cards~1update/post">редактирования</a> карточек товаров
// </div>.
//
// POST /content/v3/media/save
ContentV3MediaSavePost(ctx context.Context, req *ContentV3MediaSavePostReq) (ContentV3MediaSavePostRes, error)
}
// Server implements http server based on OpenAPI v3 specification and
// calls Handler to handle requests.
type Server struct {
h Handler
sec SecurityHandler
baseServer
}
// NewServer creates new Server.
func NewServer(h Handler, sec SecurityHandler, opts ...ServerOption) (*Server, error) {
s, err := newServerConfig(opts...).baseServer()
if err != nil {
return nil, err
}
return &Server{
h: h,
sec: sec,
baseServer: s,
}, nil
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3
pkg/api/wb/generate.go Normal file
View File

@@ -0,0 +1,3 @@
package wb
//go:generate go run github.com/ogen-go/ogen/cmd/ogen@latest --target client --clean 02-products.yaml

7
pkg/api/wb/ogen.yml Normal file
View File

@@ -0,0 +1,7 @@
generator:
ignore_not_implemented: [ "all" ]
content_type_aliases:
"application/problem+json": "application/json"
features:
enable:
- 'client/security/reentrant'