internal/httpd/feed.go

4e7f0573d0c35b2ec41de44f17f8fe45d3cd2408
gitbay/internal/httpd/feed.go history · blame · raw

89 lines · 2092 bytes

 1package httpd
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"strings"
 7
 8	"gitbay.org/gitbay/internal/store"
 9)
10
11// feedLine is one activity entry, already phrased and linked.
12type feedLine struct {
13	Actor string
14	Verb  string // "opened issue", "merged"
15	Ref   string // "#12", "!35", "v0.4.0"
16	Repo  string
17	URL   string
18	When  string
19}
20
21// feedLines turns stored events into readable lines. An unknown kind
22// still shows: the feed says what happened even for events added later.
23func feedLines(events []store.FeedEvent) []feedLine {
24	out := make([]feedLine, 0, len(events))
25	for _, e := range events {
26		var d struct {
27			Number int64  `json:"number"`
28			Job    string `json:"job"`
29			Tag    string `json:"tag"`
30		}
31		json.Unmarshal([]byte(e.Data), &d)
32
33		l := feedLine{Actor: e.Actor, Repo: e.RepoPath, When: e.CreatedAt}
34		if l.Actor == "" {
35			l.Actor = "gitbay"
36		}
37		kind, rest, _ := strings.Cut(e.Kind, ".")
38		switch kind {
39		case "issue":
40			l.Verb, l.Ref = issueVerb(rest), fmt.Sprintf("#%d", d.Number)
41			l.URL = fmt.Sprintf("/%s/issues/%d", e.RepoPath, d.Number)
42		case "mr":
43			l.Verb, l.Ref = mrVerb(rest), fmt.Sprintf("!%d", d.Number)
44			l.URL = fmt.Sprintf("/%s/mrs/%d", e.RepoPath, d.Number)
45		case "build":
46			l.Verb, l.Ref = "build "+rest, d.Job
47			l.URL = fmt.Sprintf("/%s/builds/%d", e.RepoPath, d.Number)
48		case "release":
49			l.Verb, l.Ref = "released", d.Tag
50			l.URL = fmt.Sprintf("/%s/releases", e.RepoPath)
51		case "repo":
52			l.Verb = "repository " + rest
53			l.URL = "/" + e.RepoPath
54		default:
55			l.Verb = e.Kind
56			l.URL = "/" + e.RepoPath
57		}
58		out = append(out, l)
59	}
60	return out
61}
62
63func issueVerb(s string) string {
64	switch s {
65	case "created":
66		return "opened issue"
67	case "closed":
68		return "closed issue"
69	case "reopened":
70		return "reopened issue"
71	case "commented":
72		return "commented on"
73	}
74	return "issue " + s
75}
76
77func mrVerb(s string) string {
78	switch s {
79	case "created":
80		return "opened merge request"
81	case "merged":
82		return "merged"
83	case "commented":
84		return "commented on"
85	case "closed":
86		return "closed merge request"
87	}
88	return "merge request " + s
89}