apps/kepler/api.go 1.6 K raw
1
package main
2
3
import (
4
	"encoding/json"
5
	"net/http"
6
	"time"
7
)
8
9
type apiRepo struct {
10
	Name        string    `json:"name"`
11
	Description string    `json:"description,omitempty"`
12
	DefaultRef  string    `json:"default_ref,omitempty"`
13
	LastCommit  time.Time `json:"last_commit,omitempty"`
14
	URL         string    `json:"url"`
15
	AtomURL     string    `json:"atom_url"`
16
	CloneHTTPS  string    `json:"clone_https,omitempty"`
17
	CloneSSH    string    `json:"clone_ssh,omitempty"`
18
}
19
20
type apiReposResponse struct {
21
	Site  string    `json:"site"`
22
	Repos []apiRepo `json:"repos"`
23
}
24
25
func (a *App) apiReposHandler(w http.ResponseWriter, r *http.Request) {
26
	repos, err := a.listRepos()
27
	if err != nil {
28
		a.Log.Error("list repos failed", "err", err)
29
		http.Error(w, "failed to list repos", http.StatusInternalServerError)
30
		return
31
	}
32
33
	baseURL := a.requestBaseURL(r)
34
	resp := apiReposResponse{Site: a.SiteName, Repos: make([]apiRepo, 0, len(repos))}
35
	for _, s := range repos {
36
		ar := apiRepo{
37
			Name:        s.Name,
38
			Description: s.Description,
39
			DefaultRef:  s.DefaultRef,
40
			LastCommit:  s.LastCommit,
41
			URL:         baseURL + "/" + s.Name,
42
			AtomURL:     baseURL + "/" + s.Name + "/atom.xml",
43
		}
44
		if a.CloneBaseURL != "" {
45
			ar.CloneHTTPS = a.CloneBaseURL + "/" + s.Name + ".git"
46
		}
47
		if a.CloneSSHHost != "" {
48
			ar.CloneSSH = a.CloneSSHHost + ":" + s.Name + ".git"
49
		}
50
		resp.Repos = append(resp.Repos, ar)
51
	}
52
53
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
54
	w.Header().Set("Access-Control-Allow-Origin", "*")
55
	enc := json.NewEncoder(w)
56
	enc.SetIndent("", "  ")
57
	if err := enc.Encode(resp); err != nil {
58
		a.Log.Error("api repos encode failed", "err", err)
59
	}
60
}