init parser
This commit is contained in:
113
plati/categories.go
Normal file
113
plati/categories.go
Normal file
@ -0,0 +1,113 @@
|
||||
package plati
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type Categories []*Category
|
||||
|
||||
func (categories Categories) FlatNames(nameOfParent string) {
|
||||
for _, c := range categories {
|
||||
name := ""
|
||||
if len(c.Name) > 0 {
|
||||
name = c.Name[0].Value
|
||||
}
|
||||
if c.Title != "" {
|
||||
name = c.Title + "/" + name
|
||||
}
|
||||
c.FlatName = fmt.Sprintf("%s/%s", nameOfParent, name)
|
||||
if len(c.Children) > 0 {
|
||||
c.Children.FlatNames(c.FlatName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (categories Categories) FixParentID(parentID int) {
|
||||
for _, c := range categories {
|
||||
if c.ParentID == 0 {
|
||||
c.ParentID = parentID
|
||||
}
|
||||
c.Children.FixParentID(c.ID)
|
||||
}
|
||||
}
|
||||
|
||||
type Category struct {
|
||||
FlatName string `json:"flat_name,omitempty"`
|
||||
ID int `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Level int `json:"level"`
|
||||
ParentID int `json:"parent_id"`
|
||||
Name []struct {
|
||||
Locale string `json:"locale"`
|
||||
Value string `json:"value"`
|
||||
} `json:"name"`
|
||||
Children Categories `json:"children"`
|
||||
CanAdd bool `json:"can_add"`
|
||||
}
|
||||
|
||||
type CategoriesResponse struct {
|
||||
Retval int `json:"retval"`
|
||||
Retdesc any `json:"retdesc"`
|
||||
Errors any `json:"errors"`
|
||||
Content Categories `json:"content"`
|
||||
}
|
||||
|
||||
func (c *Client) GetCategories(ctx context.Context) (*CategoriesResponse, error) {
|
||||
req, err := http.NewRequestWithContext(ctx, "GET", "https://api.digiseller.ru/api/dictionary/platforms/categories/plati", http.NoBody)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("new request: %w", err)
|
||||
}
|
||||
req.Header.Add("Accept", "application/json")
|
||||
|
||||
resp, err := c.httpCli.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("http do: %w", err)
|
||||
}
|
||||
|
||||
// dump, err := httputil.DumpResponse(resp, true)
|
||||
// log.Printf("%d %s", resp.StatusCode, string(dump))
|
||||
|
||||
defer resp.Body.Close()
|
||||
|
||||
out := CategoriesResponse{}
|
||||
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
|
||||
return nil, fmt.Errorf("json decode: %w", err)
|
||||
}
|
||||
|
||||
return &out, nil
|
||||
}
|
||||
|
||||
type SubCategories struct {
|
||||
Retval int `json:"retval"`
|
||||
Retdesc any `json:"retdesc"`
|
||||
Errors any `json:"errors"`
|
||||
Content []*Category `json:"content"`
|
||||
}
|
||||
|
||||
func (c *Client) GetSubCategories(ctx context.Context, categoryID int) (*SubCategories, error) {
|
||||
req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("https://api.digiseller.ru/api/dictionary/platforms/subcategories/%d", categoryID), http.NoBody)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("new request: %w", err)
|
||||
}
|
||||
req.Header.Add("Accept", "application/json")
|
||||
|
||||
resp, err := c.httpCli.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("http do: %w", err)
|
||||
}
|
||||
|
||||
// dump, err := httputil.DumpResponse(resp, true)
|
||||
// log.Printf("%d %s", resp.StatusCode, string(dump))
|
||||
|
||||
defer resp.Body.Close()
|
||||
|
||||
out := SubCategories{}
|
||||
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
|
||||
return nil, fmt.Errorf("json decode: %w", err)
|
||||
}
|
||||
|
||||
return &out, nil
|
||||
}
|
Reference in New Issue
Block a user