forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
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 repo := fmt.Sprintf("%s/%s", f.Did, f.Name)
33 xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
34 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
35 l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
36 rp.pages.Error503(w)
37 return
38 }
39 var result types.RepoBranchesResponse
40 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
41 l.Error("failed to decode XRPC response", "err", err)
42 rp.pages.Error503(w)
43 return
44 }
45 sortBranches(result.Branches)
46 user := rp.oauth.GetUser(r)
47 rp.pages.RepoBranches(w, pages.RepoBranchesParams{
48 LoggedInUser: user,
49 RepoInfo: rp.repoResolver.GetRepoInfo(r, user),
50 RepoBranchesResponse: result,
51 })
52}
53
54func (rp *Repo) DeleteBranch(w http.ResponseWriter, r *http.Request) {
55 l := rp.logger.With("handler", "DeleteBranch")
56 f, err := rp.repoResolver.Resolve(r)
57 if err != nil {
58 l.Error("failed to get repo and knot", "err", err)
59 return
60 }
61 noticeId := "delete-branch-error"
62 fail := func(msg string, err error) {
63 l.Error(msg, "err", err)
64 rp.pages.Notice(w, noticeId, msg)
65 }
66 branch := r.FormValue("branch")
67 if branch == "" {
68 fail("No branch provided.", nil)
69 return
70 }
71 client, err := rp.oauth.ServiceClient(
72 r,
73 oauth.WithService(f.Knot),
74 oauth.WithLxm(tangled.RepoDeleteBranchNSID),
75 oauth.WithDev(rp.config.Core.Dev),
76 )
77 if err != nil {
78 fail("Failed to connect to knotserver", nil)
79 return
80 }
81 err = tangled.RepoDeleteBranch(
82 r.Context(),
83 client,
84 &tangled.RepoDeleteBranch_Input{
85 Branch: branch,
86 Repo: f.RepoAt().String(),
87 },
88 )
89 if err := xrpcclient.HandleXrpcErr(err); err != nil {
90 fail(fmt.Sprintf("Failed to delete branch: %s", err), err)
91 return
92 }
93 l.Error("deleted branch from knot", "branch", branch, "repo", f.RepoAt())
94 rp.pages.HxRefresh(w)
95}