forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package xrpc
2
3import (
4 "encoding/json"
5 "log/slog"
6 "net/http"
7
8 "tangled.sh/tangled.sh/core/api/tangled"
9 "tangled.sh/tangled.sh/core/idresolver"
10 "tangled.sh/tangled.sh/core/jetstream"
11 "tangled.sh/tangled.sh/core/knotserver/config"
12 "tangled.sh/tangled.sh/core/knotserver/db"
13 "tangled.sh/tangled.sh/core/notifier"
14 "tangled.sh/tangled.sh/core/rbac"
15 xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors"
16 "tangled.sh/tangled.sh/core/xrpc/serviceauth"
17
18 "github.com/go-chi/chi/v5"
19)
20
21type Xrpc struct {
22 Config *config.Config
23 Db *db.DB
24 Ingester *jetstream.JetstreamClient
25 Enforcer *rbac.Enforcer
26 Logger *slog.Logger
27 Notifier *notifier.Notifier
28 Resolver *idresolver.Resolver
29 ServiceAuth *serviceauth.ServiceAuth
30}
31
32func (x *Xrpc) Router() http.Handler {
33 r := chi.NewRouter()
34
35 r.Group(func(r chi.Router) {
36 r.Use(x.ServiceAuth.VerifyServiceAuth)
37
38 r.Post("/"+tangled.RepoSetDefaultBranchNSID, x.SetDefaultBranch)
39 r.Post("/"+tangled.RepoCreateNSID, x.CreateRepo)
40 r.Post("/"+tangled.RepoDeleteNSID, x.DeleteRepo)
41 r.Post("/"+tangled.RepoForkStatusNSID, x.ForkStatus)
42 r.Post("/"+tangled.RepoForkSyncNSID, x.ForkSync)
43 r.Post("/"+tangled.RepoHiddenRefNSID, x.HiddenRef)
44 r.Post("/"+tangled.RepoMergeNSID, x.Merge)
45 })
46
47 // merge check is an open endpoint
48 //
49 // TODO: should we constrain this more?
50 // - we can calculate on PR submit/resubmit/gitRefUpdate etc.
51 // - use ETags on clients to keep requests to a minimum
52 r.Post("/"+tangled.RepoMergeCheckNSID, x.MergeCheck)
53 return r
54}
55
56func writeError(w http.ResponseWriter, e xrpcerr.XrpcError, status int) {
57 w.Header().Set("Content-Type", "application/json")
58 w.WriteHeader(status)
59 json.NewEncoder(w).Encode(e)
60}