Skip to content

Commit e304cbe

Browse files
authored
Merge pull request #32 from factorysh/features/more-latest-routes
More latest routes
2 parents 872da08 + c5beb53 commit e304cbe

File tree

6 files changed

+100
-176
lines changed

6 files changed

+100
-176
lines changed

application/application.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func New(cfg *conf.Conf) (*Application, error) {
126126
r.Use(authMiddleware.Middleware())
127127
r.Use(a.ServiceMiddleware)
128128
r.Get("/", a.ReadmeHandler)
129-
r.Get("/-{taskID}", a.TaskHandler)
129+
r.Get("/-{taskID}", a.TaskIDHandler)
130130
})
131131
r.Route("/service/{serviceID}/{project}", func(r chi.Router) {
132132
r.Use(authMiddleware.Middleware())
@@ -135,13 +135,17 @@ func New(cfg *conf.Conf) (*Application, error) {
135135
r.Route("/{branch}", func(r chi.Router) {
136136
r.Route("/{commit}", func(r chi.Router) {
137137
r.Post("/", a.PostTaskHandler)
138-
r.Get("/", a.TaskHandler)
138+
r.Get("/", a.TaskHandler(false))
139139
r.Get("/status", badge.StatusBadge(a.storage, false))
140-
r.Get("/badge/{badge}", a.TaskMyBadgeHandler)
141-
r.Get("/volumes/*", a.VolumesHandler(6))
140+
r.Get("/badge/{badge}", a.BadgeMyTaskHandler(false))
141+
r.Get("/volumes/*", a.VolumesHandler(6, false))
142+
})
143+
r.Route("/latest", func(r chi.Router) {
144+
r.Get("/", a.TaskHandler(true))
145+
r.Get("/status", badge.StatusBadge(a.storage, true))
146+
r.Get("/badge/{badge}", a.BadgeMyTaskHandler(true))
147+
r.Get("/volumes/*", a.VolumesHandler(6, true))
142148
})
143-
r.Get("/latest", nil)
144-
r.Get("/latest/status", badge.StatusBadge(a.storage, true))
145149
})
146150
})
147151
})

application/badge.go

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,53 +13,56 @@ import (
1313
"go.uber.org/zap"
1414
)
1515

16-
func (a *Application) TaskMyBadgeHandler(w http.ResponseWriter, r *http.Request) {
17-
l := a.logger.With(
18-
zap.String("url", r.URL.String()),
19-
zap.String("service", chi.URLParam(r, "serviceID")),
20-
zap.String("project", chi.URLParam(r, "project")),
21-
zap.String("branch", chi.URLParam(r, "branch")),
22-
zap.String("commit", chi.URLParam(r, "commit")),
23-
zap.String("branch", chi.URLParam(r, "branch")),
24-
)
25-
service := chi.URLParam(r, "serviceID")
26-
project := chi.URLParam(r, "project")
27-
branch := chi.URLParam(r, "branch")
28-
commit := chi.URLParam(r, "commit")
29-
bdg := chi.URLParam(r, "badge")
16+
// BadgeMyTaskHandler generates a badge for a given task
17+
func (a *Application) BadgeMyTaskHandler(latest bool) http.HandlerFunc {
18+
return func(w http.ResponseWriter, r *http.Request) {
19+
l := a.logger.With(
20+
zap.String("url", r.URL.String()),
21+
zap.String("service", chi.URLParam(r, "serviceID")),
22+
zap.String("project", chi.URLParam(r, "project")),
23+
zap.String("branch", chi.URLParam(r, "branch")),
24+
zap.String("commit", chi.URLParam(r, "commit")),
25+
zap.String("branch", chi.URLParam(r, "branch")),
26+
)
27+
service := chi.URLParam(r, "serviceID")
28+
project := chi.URLParam(r, "project")
29+
branch := chi.URLParam(r, "branch")
30+
commit := chi.URLParam(r, "commit")
31+
bdg := chi.URLParam(r, "badge")
3032

31-
t, err := a.storage.GetByCommit(service, project, branch, commit, false)
32-
if err != nil {
33-
l.Warn("Task get error", zap.Error(err))
34-
w.WriteHeader(http.StatusNotFound)
35-
return
36-
}
33+
t, err := a.storage.GetByCommit(service, project, branch, commit, latest)
34+
if err != nil {
35+
l.Warn("Task get error", zap.Error(err))
36+
w.WriteHeader(http.StatusNotFound)
37+
return
38+
}
3739

38-
p := filepath.Join(a.storage.GetVolumePath(t), "/data", fmt.Sprintf("%s.badge", bdg))
40+
p := filepath.Join(a.storage.GetVolumePath(t), "/data", fmt.Sprintf("%s.badge", bdg))
3941

40-
_, err = os.Stat(p)
41-
if err != nil {
42-
l.Warn("Task get error", zap.Error(err))
43-
if os.IsNotExist(err) {
44-
w.WriteHeader(http.StatusNotFound)
45-
} else {
46-
w.WriteHeader(http.StatusBadRequest)
42+
_, err = os.Stat(p)
43+
if err != nil {
44+
l.Warn("Task get error", zap.Error(err))
45+
if os.IsNotExist(err) {
46+
w.WriteHeader(http.StatusNotFound)
47+
} else {
48+
w.WriteHeader(http.StatusBadRequest)
49+
}
50+
return
4751
}
48-
return
49-
}
50-
l = l.With(zap.String("path", p))
51-
b, err := ioutil.ReadFile(p)
52-
if err != nil {
53-
l.Error("reading file", zap.Error(err))
54-
w.WriteHeader(http.StatusInternalServerError)
55-
return
56-
}
57-
var badge _badge.Badge
58-
err = json.Unmarshal(b, &badge)
59-
if err != nil {
60-
l.Error("JSON unmarshal", zap.Error(err))
61-
w.WriteHeader(http.StatusInternalServerError)
62-
return
52+
l = l.With(zap.String("path", p))
53+
b, err := ioutil.ReadFile(p)
54+
if err != nil {
55+
l.Error("reading file", zap.Error(err))
56+
w.WriteHeader(http.StatusInternalServerError)
57+
return
58+
}
59+
var badge _badge.Badge
60+
err = json.Unmarshal(b, &badge)
61+
if err != nil {
62+
l.Error("JSON unmarshal", zap.Error(err))
63+
w.WriteHeader(http.StatusInternalServerError)
64+
return
65+
}
66+
badge.Render(w, r)
6367
}
64-
badge.Render(w, r)
6568
}

application/task.go

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,20 +111,48 @@ func (a *Application) PostTaskHandler(w http.ResponseWriter, r *http.Request) {
111111
}
112112

113113
// TaskHandler show a Task
114-
func (a *Application) TaskHandler(w http.ResponseWriter, r *http.Request) {
114+
func (a *Application) TaskHandler(latest bool) http.HandlerFunc {
115+
return func(w http.ResponseWriter, r *http.Request) {
116+
117+
l := a.logger.With(
118+
zap.String("url", r.URL.String()),
119+
zap.String("service", chi.URLParam(r, "serviceID")),
120+
zap.String("project", chi.URLParam(r, "project")),
121+
zap.String("branch", chi.URLParam(r, "branch")),
122+
zap.String("commit", chi.URLParam(r, "commit")),
123+
)
124+
t, err := a.storage.GetByCommit(
125+
chi.URLParam(r, "serviceID"),
126+
chi.URLParam(r, "project"),
127+
chi.URLParam(r, "branch"),
128+
chi.URLParam(r, "commit"),
129+
latest,
130+
)
131+
if err != nil {
132+
l.Warn("Task get error", zap.Error(err))
133+
if os.IsNotExist(err) {
134+
w.WriteHeader(http.StatusNotFound)
135+
} else {
136+
w.WriteHeader(http.StatusBadRequest)
137+
}
138+
return
139+
}
140+
err = json.NewEncoder(w).Encode(t)
141+
if err != nil {
142+
l.Error("Json encoding error", zap.Error(err))
143+
panic(err)
144+
}
145+
}
146+
}
147+
148+
// TaskIDHandler get a task using it's ID
149+
func (a *Application) TaskIDHandler(w http.ResponseWriter, r *http.Request) {
115150
l := a.logger.With(
116151
zap.String("url", r.URL.String()),
117-
zap.String("service", chi.URLParam(r, "serviceID")),
118-
zap.String("project", chi.URLParam(r, "project")),
119-
zap.String("branch", chi.URLParam(r, "branch")),
120-
zap.String("commit", chi.URLParam(r, "commit")),
121-
)
122-
t, err := a.volumes.Get(
123-
chi.URLParam(r, "serviceID"),
124-
chi.URLParam(r, "project"),
125-
chi.URLParam(r, "branch"),
126-
chi.URLParam(r, "commit"),
152+
zap.String("task ID", chi.URLParam(r, "taskID")),
127153
)
154+
155+
t, err := a.storage.Get(chi.URLParam(r, "taskID"))
128156
if err != nil {
129157
l.Warn("Task get error", zap.Error(err))
130158
if os.IsNotExist(err) {
@@ -134,9 +162,10 @@ func (a *Application) TaskHandler(w http.ResponseWriter, r *http.Request) {
134162
}
135163
return
136164
}
165+
137166
err = json.NewEncoder(w).Encode(t)
138167
if err != nil {
139168
l.Error("Json encoding error", zap.Error(err))
140-
panic(err)
169+
return
141170
}
142171
}

application/volume.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
)
1414

1515
// VolumesHandler expose volumes of a task
16-
func (a *Application) VolumesHandler(basePathLen int) http.HandlerFunc {
16+
func (a *Application) VolumesHandler(basePathLen int, latest bool) http.HandlerFunc {
1717
return func(w http.ResponseWriter, r *http.Request) {
1818
l := a.logger.With(
1919
zap.String("url", r.URL.String()),
@@ -28,7 +28,7 @@ func (a *Application) VolumesHandler(basePathLen int) http.HandlerFunc {
2828
branch := chi.URLParam(r, "branch")
2929
commit := chi.URLParam(r, "commit")
3030

31-
t, err := a.storage.GetByCommit(service, project, branch, commit, false)
31+
t, err := a.storage.GetByCommit(service, project, branch, commit, latest)
3232
if err != nil {
3333
l.Error("Get task", zap.Error(err))
3434
w.WriteHeader(http.StatusNotFound)

volumes/volumes.go

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package volumes
22

33
import (
4-
"encoding/json"
54
"io/fs"
6-
"io/ioutil"
75
"os"
86
"path/filepath"
9-
"sort"
107

118
"github.com/factorysh/microdensity/task"
129
"go.uber.org/zap"
@@ -60,79 +57,7 @@ func (v *Volumes) Create(t *task.Task) error {
6057
return err
6158
}
6259

63-
func (v *Volumes) Get(service, project, branch, commit string) (*task.Task, error) {
64-
p := v.Path(service, project, branch)
65-
l := v.logger.With(
66-
zap.String("root", v.root),
67-
zap.String("service", service),
68-
zap.String("project", project),
69-
zap.String("branch", branch),
70-
zap.String("commit", commit),
71-
zap.String("path", p),
72-
)
73-
_, err := os.Stat(p)
74-
if err != nil {
75-
if os.IsNotExist(err) {
76-
l.Warn("Volume not found")
77-
} else {
78-
l.Error("Stat error", zap.Error(err))
79-
}
80-
return nil, err
81-
}
82-
83-
commits, err := ioutil.ReadDir(p)
84-
if err != nil {
85-
l.Error("Readall error", zap.Error(err))
86-
return nil, err
87-
}
88-
for _, com := range commits {
89-
l = l.With(zap.String("commit", com.Name()))
90-
f, err := os.OpenFile(v.Path(service, project, branch, com.Name(), "task.json"), os.O_RDONLY, 0)
91-
if err != nil {
92-
l.Error("open commit file", zap.Error(err))
93-
return nil, err
94-
}
95-
var t task.Task
96-
err = json.NewDecoder(f).Decode(&t)
97-
if err != nil {
98-
l.Error("JSON decode", zap.Error(err))
99-
return nil, err
100-
}
101-
if t.Commit == commit {
102-
return &t, nil
103-
}
104-
}
105-
return nil, nil
106-
}
107-
10860
// Path will return the full path for this volume
10961
func (v *Volumes) Path(elem ...string) string {
11062
return filepath.Join(v.root, filepath.Join(elem...))
11163
}
112-
113-
// ByProjectByBranch returns all subvolumes for a specific branch of a project
114-
func (v *Volumes) ByProjectByBranch(project string, branch string) ([]string, error) {
115-
vols, err := ioutil.ReadDir(v.Path(project, branch))
116-
if err != nil || !containsFiles(vols) {
117-
v.logger.Error("by project by branch",
118-
zap.String("project", project),
119-
zap.String("brnach", branch),
120-
zap.Error(err),
121-
)
122-
return nil, err
123-
}
124-
125-
var res []string
126-
for _, run := range vols {
127-
if run.IsDir() {
128-
res = append(res, v.Path(project, branch, run.Name()))
129-
}
130-
}
131-
sort.Strings(res)
132-
133-
return res, nil
134-
}
135-
136-
func containsFiles(files []fs.FileInfo) bool {
137-
return len(files) > 0
138-
}

volumes/volumes_test.go

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@ package volumes
22

33
import (
44
"os"
5-
"strings"
65
"testing"
7-
"time"
86

9-
"github.com/factorysh/microdensity/task"
10-
"github.com/google/uuid"
117
"github.com/stretchr/testify/assert"
128
)
139

@@ -42,36 +38,3 @@ func TestNewVolumes(t *testing.T) {
4238
})
4339
}
4440
}
45-
46-
func TestListByProjectByBranch(t *testing.T) {
47-
defer cleanDir()
48-
49-
v, err := New(testRootDir)
50-
assert.NoError(t, err)
51-
var first uuid.UUID
52-
var last uuid.UUID
53-
for i := 0; i < 10; i++ {
54-
id, err := uuid.NewUUID()
55-
assert.NoError(t, err)
56-
c := time.Now()
57-
if first == uuid.Nil {
58-
first = id
59-
}
60-
last = id
61-
err = v.Create(&task.Task{
62-
Project: "group%2Fproject",
63-
Branch: "master",
64-
Id: id,
65-
Creation: c,
66-
Commit: "70ea687225ea4869311c500a954e8cc5e687e608",
67-
})
68-
assert.NoError(t, err)
69-
}
70-
71-
dirs, err := v.ByProjectByBranch("group%2Fproject", "master")
72-
assert.NoError(t, err)
73-
assert.Len(t, dirs, 10, "one folder should be found")
74-
assert.True(t, strings.HasSuffix(dirs[0], first.String()), dirs[0])
75-
assert.True(t, strings.HasSuffix(dirs[9], last.String()))
76-
cleanDir()
77-
}

0 commit comments

Comments
 (0)