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}