forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package pipelines
2
3import (
4 "log/slog"
5 "net/http"
6
7 "tangled.sh/tangled.sh/core/appview/config"
8 "tangled.sh/tangled.sh/core/appview/db"
9 "tangled.sh/tangled.sh/core/appview/idresolver"
10 "tangled.sh/tangled.sh/core/appview/oauth"
11 "tangled.sh/tangled.sh/core/appview/pages"
12 "tangled.sh/tangled.sh/core/appview/reporesolver"
13 "tangled.sh/tangled.sh/core/eventconsumer"
14 "tangled.sh/tangled.sh/core/log"
15 "tangled.sh/tangled.sh/core/rbac"
16
17 "github.com/go-chi/chi/v5"
18 "github.com/posthog/posthog-go"
19)
20
21type Pipelines struct {
22 repoResolver *reporesolver.RepoResolver
23 idResolver *idresolver.Resolver
24 config *config.Config
25 oauth *oauth.OAuth
26 pages *pages.Pages
27 spindlestream *eventconsumer.Consumer
28 db *db.DB
29 enforcer *rbac.Enforcer
30 posthog posthog.Client
31 Logger *slog.Logger
32}
33
34func New(
35 oauth *oauth.OAuth,
36 repoResolver *reporesolver.RepoResolver,
37 pages *pages.Pages,
38 spindlestream *eventconsumer.Consumer,
39 idResolver *idresolver.Resolver,
40 db *db.DB,
41 config *config.Config,
42 posthog posthog.Client,
43 enforcer *rbac.Enforcer,
44) *Pipelines {
45 logger := log.New("pipelines")
46
47 return &Pipelines{oauth: oauth,
48 repoResolver: repoResolver,
49 pages: pages,
50 idResolver: idResolver,
51 config: config,
52 spindlestream: spindlestream,
53 db: db,
54 posthog: posthog,
55 enforcer: enforcer,
56 Logger: logger,
57 }
58}
59
60func (p *Pipelines) Index(w http.ResponseWriter, r *http.Request) {
61 user := p.oauth.GetUser(r)
62 l := p.Logger.With("handler", "Index")
63
64 f, err := p.repoResolver.Resolve(r)
65 if err != nil {
66 l.Error("failed to get repo and knot", "err", err)
67 return
68 }
69
70 repoInfo := f.RepoInfo(user)
71
72 ps, err := db.GetPipelineStatuses(
73 p.db,
74 db.FilterEq("repo_owner", repoInfo.OwnerDid),
75 db.FilterEq("repo_name", repoInfo.Name),
76 db.FilterEq("knot", repoInfo.Knot),
77 )
78 if err != nil {
79 l.Error("failed to query db", "err", err)
80 return
81 }
82
83 p.pages.Pipelines(w, pages.PipelinesParams{
84 LoggedInUser: user,
85 RepoInfo: repoInfo,
86 Pipelines: ps,
87 })
88}
89
90func (p *Pipelines) Workflow(w http.ResponseWriter, r *http.Request) {
91 user := p.oauth.GetUser(r)
92 l := p.Logger.With("handler", "Workflow")
93
94 f, err := p.repoResolver.Resolve(r)
95 if err != nil {
96 l.Error("failed to get repo and knot", "err", err)
97 return
98 }
99
100 repoInfo := f.RepoInfo(user)
101
102 pipelineId := chi.URLParam(r, "pipeline")
103 if pipelineId == "" {
104 l.Error("empty pipeline ID")
105 return
106 }
107
108 workflow := chi.URLParam(r, "workflow")
109 if pipelineId == "" {
110 l.Error("empty workflow name")
111 return
112 }
113
114 ps, err := db.GetPipelineStatuses(
115 p.db,
116 db.FilterEq("repo_owner", repoInfo.OwnerDid),
117 db.FilterEq("repo_name", repoInfo.Name),
118 db.FilterEq("knot", repoInfo.Knot),
119 db.FilterEq("id", pipelineId),
120 )
121 if err != nil {
122 l.Error("failed to query db", "err", err)
123 return
124 }
125
126 if len(ps) != 1 {
127 l.Error("invalid number of pipelines", "len", len(ps))
128 return
129 }
130
131 singlePipeline := ps[0]
132
133 p.pages.Workflow(w, pages.WorkflowParams{
134 LoggedInUser: user,
135 RepoInfo: repoInfo,
136 Pipeline: singlePipeline,
137 Workflow: workflow,
138 })
139}