From 5a1d99989fa32be1684b9290b4a58e8418b7b92d Mon Sep 17 00:00:00 2001
From: shenwc <spd260@126.com>
Date: 星期二, 26 十一月 2024 17:57:50 +0800
Subject: [PATCH] 11111
---
stores/apex/apex.go | 123 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 123 insertions(+), 0 deletions(-)
diff --git a/stores/apex/apex.go b/stores/apex/apex.go
new file mode 100755
index 0000000..2fbebdb
--- /dev/null
+++ b/stores/apex/apex.go
@@ -0,0 +1,123 @@
+// Package apex provides an Apex release store.
+package apex
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "time"
+
+ "github.com/pkg/errors"
+ update "github.com/zan8in/goupdate"
+)
+
+// Store is the store implementation.
+type Store struct {
+ URL string
+ Product string
+ Plan string
+ Version string
+ AccessKey string
+}
+
+// Release model.
+type Release struct {
+ Version string `json:"version"`
+ Notes string `json:"notes"`
+ Files []*File `json:"files"`
+ CreatedAt time.Time `json:"created_at"`
+}
+
+// File model.
+type File struct {
+ Name string `json:"name"`
+ Key string `json:"key"`
+ Size int64 `json:"size"`
+ URL string `json:"url"`
+}
+
+// GetRelease returns the specified release or ErrNotFound.
+func (s *Store) GetRelease(version string) (*update.Release, error) {
+ releases, err := s.releases()
+ if err != nil {
+ return nil, err
+ }
+
+ for _, r := range releases {
+ if r.Version == version {
+ return r, nil
+ }
+ }
+
+ return nil, update.ErrNotFound
+}
+
+// LatestReleases returns releases newer than Version, or nil.
+func (s *Store) LatestReleases() (latest []*update.Release, err error) {
+ releases, err := s.releases()
+ if err != nil {
+ return
+ }
+
+ for _, r := range releases {
+ if r.Version == s.Version {
+ break
+ }
+
+ latest = append(latest, r)
+ }
+
+ return
+}
+
+// releases returns all releases.
+func (s *Store) releases() (all []*update.Release, err error) {
+ url := fmt.Sprintf("%s/%s/%s", s.URL, s.Product, s.Plan)
+
+ req, err := http.NewRequest("GET", url, nil)
+ if err != nil {
+ return nil, errors.Wrap(err, "creating request")
+ }
+ req.Header.Set("Authorization", "Bearer "+s.AccessKey)
+
+ res, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return nil, errors.Wrap(err, "requesting")
+ }
+ defer res.Body.Close()
+
+ if res.StatusCode >= 400 {
+ return nil, errors.Errorf("response status code is %d", res.StatusCode)
+ }
+
+ var releases []*Release
+
+ if err := json.NewDecoder(res.Body).Decode(&releases); err != nil {
+ return nil, errors.Wrap(err, "unmarshaling")
+ }
+
+ for _, r := range releases {
+ all = append(all, toRelease(r))
+ }
+
+ return
+}
+
+// toRelease returns a Release.
+func toRelease(r *Release) *update.Release {
+ out := &update.Release{
+ Version: r.Version,
+ Notes: r.Notes,
+ PublishedAt: r.CreatedAt,
+ }
+
+ for _, f := range r.Files {
+ out.Assets = append(out.Assets, &update.Asset{
+ Name: f.Name,
+ Size: int(f.Size),
+ URL: f.URL,
+ })
+ }
+
+ return out
+}
--
Gitblit v1.8.0