Monorepo for Tangled
1package repo
2
3import (
4 "encoding/json"
5 "fmt"
6 "net/http"
7
8 "tangled.org/core/api/tangled"
9 "tangled.org/core/appview/oauth"
10 "tangled.org/core/appview/pages"
11 xrpcclient "tangled.org/core/appview/xrpcclient"
12 "tangled.org/core/types"
13
14 indigoxrpc "github.com/bluesky-social/indigo/xrpc"
15)
16
17func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) {
18 l := rp.logger.With("handler", "RepoBranches")
19 f, err := rp.repoResolver.Resolve(r)
20 if err != nil {
21 l.Error("failed to get repo and knot", "err", err)
22 return
23 }
24 scheme := "http"
25 if !rp.config.Core.Dev {
26 scheme = "https"
27 }
28 host := fmt.Sprintf("%s://%s", scheme, f.Knot)
29 xrpcc := &indigoxrpc.Client{
30 Host: host,
31 }
32 xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, f.RepoIdentifier())
33 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
34 l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
35 rp.pages.Error503(w)
36 return
37 }
38 var result types.RepoBranchesResponse
39 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
40 l.Error("failed to decode XRPC response", "err", err)
41 rp.pages.Error503(w)
42 return
43 }
44 sortBranches(result.Branches)
45 user := rp.oauth.GetMultiAccountUser(r)
46 rp.pages.RepoBranches(w, pages.RepoBranchesParams{
47 LoggedInUser: user,
48 RepoInfo: rp.repoResolver.GetRepoInfo(r, user),
49 RepoBranchesResponse: result,
50 })
51}
52
53func (rp *Repo) DeleteBranch(w http.ResponseWriter, r *http.Request) {
54 l := rp.logger.With("handler", "DeleteBranch")
55 f, err := rp.repoResolver.Resolve(r)
56 if err != nil {
57 l.Error("failed to get repo and knot", "err", err)
58 return
59 }
60 noticeId := "delete-branch-error"
61 fail := func(msg string, err error) {
62 l.Error(msg, "err", err)
63 rp.pages.Notice(w, noticeId, msg)
64 }
65 branch := r.FormValue("branch")
66 if branch == "" {
67 fail("No branch provided.", nil)
68 return
69 }
70 client, err := rp.oauth.ServiceClient(
71 r,
72 oauth.WithService(f.Knot),
73 oauth.WithLxm(tangled.RepoDeleteBranchNSID),
74 oauth.WithDev(rp.config.Core.Dev),
75 )
76 if err != nil {
77 fail("Failed to connect to knotserver", nil)
78 return
79 }
80 err = tangled.RepoDeleteBranch(
81 r.Context(),
82 client,
83 &tangled.RepoDeleteBranch_Input{
84 Branch: branch,
85 Repo: f.RepoAt().String(),
86 },
87 )
88 if err := xrpcclient.HandleXrpcErr(err); err != nil {
89 fail(fmt.Sprintf("Failed to delete branch: %s", err), err)
90 return
91 }
92 l.Error("deleted branch from knot", "branch", branch, "repo", f.RepoAt())
93 rp.pages.HxRefresh(w)
94}