From 426de0e18d4197083f416ec95c58c6c5dc9e1c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Thu, 2 Oct 2025 04:10:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/api/api_test.go | 17 ++++++++++++- pkg/api/category.go | 29 +++++++++++++++++++++ pkg/api/template.go | 62 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 pkg/api/category.go create mode 100644 pkg/api/template.go diff --git a/pkg/api/api_test.go b/pkg/api/api_test.go index 2c5ea13a..356ad2f0 100644 --- a/pkg/api/api_test.go +++ b/pkg/api/api_test.go @@ -13,7 +13,7 @@ type APITestSuite struct { func TestAPITestSuite(t *testing.T) { suite.Run(t, &APITestSuite{ - api: NewAPI("2.3.0", "en"), + api: NewAPI("3.0.0", "en"), }) } @@ -27,6 +27,11 @@ func (s *APITestSuite) TestGetIntermediateVersions() { s.NoError(err) } +func (s *APITestSuite) TestGetCategories() { + _, err := s.api.Categories() + s.NoError(err) +} + func (s *APITestSuite) TestGetApps() { _, err := s.api.Apps() s.NoError(err) @@ -37,6 +42,16 @@ func (s *APITestSuite) TestGetAppBySlug() { s.NoError(err) } +func (s *APITestSuite) TestGetTemplates() { + _, err := s.api.Templates() + s.NoError(err) +} + +func (s *APITestSuite) TestGetTemplateBySlug() { + _, err := s.api.TemplateBySlug("nginx") + s.NoError(err) +} + func (s *APITestSuite) TestGetRewritesByType() { _, err := s.api.RewritesByType("nginx") s.NoError(err) diff --git a/pkg/api/category.go b/pkg/api/category.go new file mode 100644 index 00000000..1ace734e --- /dev/null +++ b/pkg/api/category.go @@ -0,0 +1,29 @@ +package api + +import "fmt" + +type Category struct { + Slug string `json:"slug"` + Name string `json:"name"` + Order int `json:"order"` +} + +type Categories []*Category + +// Categories 返回所有分类 +func (r *API) Categories() (*Categories, error) { + resp, err := r.client.R().SetResult(&Response{}).Get("/categories") + if err != nil { + return nil, err + } + if !resp.IsSuccess() { + return nil, fmt.Errorf("failed to get categories: %s", resp.String()) + } + + categories, err := getResponseData[Categories](resp) + if err != nil { + return nil, err + } + + return categories, nil +} diff --git a/pkg/api/template.go b/pkg/api/template.go new file mode 100644 index 00000000..fa981aeb --- /dev/null +++ b/pkg/api/template.go @@ -0,0 +1,62 @@ +package api + +import ( + "fmt" + "time" +) + +type Template struct { + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Slug string `json:"slug"` + Icon string `json:"icon"` + Name string `json:"name"` + Description string `json:"description"` + Categories []string `json:"categories"` + Version string `json:"version"` + Compose string `json:"compose"` + Environments []struct { + Name string `json:"name"` // 变量名 + Type string `json:"type"` // 变量类型, text, password, number, port, select + Options map[string]string `json:"options,omitempty"` // 下拉框选项,key -> value + Default string `json:"default"` // 默认值 + } `json:"environments"` +} + +type Templates []*Template + +// Templates 返回所有模版 +func (r *API) Templates() (*Templates, error) { + resp, err := r.client.R().SetResult(&Response{}).Get("/templates") + if err != nil { + return nil, err + } + if !resp.IsSuccess() { + return nil, fmt.Errorf("failed to get templates: %s", resp.String()) + } + + templates, err := getResponseData[Templates](resp) + if err != nil { + return nil, err + } + + return templates, nil +} + +// TemplateBySlug 根据slug返回模版 +func (r *API) TemplateBySlug(slug string) (*Template, error) { + resp, err := r.client.R().SetResult(&Response{}).Get(fmt.Sprintf("/templates/%s", slug)) + if err != nil { + return nil, err + } + if !resp.IsSuccess() { + return nil, fmt.Errorf("failed to get template: %s", resp.String()) + } + + template, err := getResponseData[Template](resp) + if err != nil { + return nil, err + } + + return template, nil +}