106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
//go:build ignore
|
||
|
||
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io"
|
||
"net/http"
|
||
"net/url"
|
||
"os"
|
||
"path/filepath"
|
||
"time"
|
||
)
|
||
|
||
func main() {
|
||
base := "http://127.0.0.1:8888"
|
||
|
||
fmt.Println("== token ==")
|
||
tokBody, _ := json.Marshal(map[string]any{
|
||
"tenant_id": 1,
|
||
"user_id": 1,
|
||
"secret": "dev-only-change-me",
|
||
})
|
||
code, raw := do(http.MethodPost, base+"/api/v1/auth/token", tokBody, "")
|
||
fmt.Printf("status=%d\n%s\n", code, raw)
|
||
var tok struct {
|
||
AccessToken string `json:"access_token"`
|
||
}
|
||
must(json.Unmarshal(raw, &tok))
|
||
if tok.AccessToken == "" {
|
||
panic("empty access_token")
|
||
}
|
||
bearer := tok.AccessToken
|
||
|
||
// 若已发布则跳过 publish,验证元数据落库后重启仍可 CRUD
|
||
fmt.Println("== blueprint (check existing) ==")
|
||
bpCode, bpRaw := do(http.MethodGet, base+"/api/v1/apps/inventory_ledger/blueprint", nil, bearer)
|
||
fmt.Printf("status=%d\n", bpCode)
|
||
|
||
if bpCode != 200 {
|
||
bpPath := filepath.Join("..", "blueprint", "examples", "inventory-ledger.blueprint.json")
|
||
bp, err := os.ReadFile(bpPath)
|
||
must(err)
|
||
pubBody, _ := json.Marshal(map[string]json.RawMessage{"blueprint": bp})
|
||
fmt.Println("== publish ==")
|
||
printDo(http.MethodPost, base+"/api/v1/apps/inventory_ledger/publish", pubBody, bearer)
|
||
} else {
|
||
fmt.Println("skip publish: app already in meta store")
|
||
fmt.Printf("%s\n", truncate(bpRaw, 200))
|
||
}
|
||
|
||
sku := fmt.Sprintf("A-%d", time.Now().Unix()%100000)
|
||
row, _ := json.Marshal(map[string]any{
|
||
"sku": sku, "product_name": "无线鼠标", "warehouse": "华东仓",
|
||
"qty": 120, "unit_price": 59.9, "status": "在售",
|
||
})
|
||
fmt.Println("== create ==")
|
||
printDo(http.MethodPost, base+"/api/v1/apps/inventory_ledger/inventory_items", row, bearer)
|
||
|
||
q := url.Values{}
|
||
q.Set("filter.warehouse", "华东仓")
|
||
q.Set("sort", "-qty")
|
||
fmt.Println("== list ==")
|
||
printDo(http.MethodGet, base+"/api/v1/apps/inventory_ledger/inventory_items?"+q.Encode(), nil, bearer)
|
||
}
|
||
|
||
func truncate(b []byte, n int) string {
|
||
if len(b) <= n {
|
||
return string(b)
|
||
}
|
||
return string(b[:n]) + "..."
|
||
}
|
||
|
||
func must(err error) {
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
}
|
||
|
||
func printDo(method, rawURL string, body []byte, bearer string) {
|
||
code, raw := do(method, rawURL, body, bearer)
|
||
fmt.Printf("status=%d\n%s\n", code, raw)
|
||
}
|
||
|
||
func do(method, rawURL string, body []byte, bearer string) (int, []byte) {
|
||
var r io.Reader
|
||
if body != nil {
|
||
r = bytes.NewReader(body)
|
||
}
|
||
req, err := http.NewRequest(method, rawURL, r)
|
||
must(err)
|
||
if body != nil {
|
||
req.Header.Set("Content-Type", "application/json")
|
||
}
|
||
if bearer != "" {
|
||
req.Header.Set("Authorization", "Bearer "+bearer)
|
||
}
|
||
resp, err := http.DefaultClient.Do(req)
|
||
must(err)
|
||
defer resp.Body.Close()
|
||
b, _ := io.ReadAll(resp.Body)
|
||
return resp.StatusCode, b
|
||
}
|