1package xrpc
2
3import (
4 _ "embed"
5 "encoding/json"
6 "log/slog"
7 "net/http"
8
9 "github.com/go-chi/chi/v5"
10
11 "tangled.sh/tangled.sh/core/api/tangled"
12 "tangled.sh/tangled.sh/core/idresolver"
13 "tangled.sh/tangled.sh/core/rbac"
14 "tangled.sh/tangled.sh/core/spindle/config"
15 "tangled.sh/tangled.sh/core/spindle/db"
16 "tangled.sh/tangled.sh/core/spindle/engine"
17 "tangled.sh/tangled.sh/core/spindle/secrets"
18 xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors"
19 "tangled.sh/tangled.sh/core/xrpc/serviceauth"
20)
21
22const ActorDid string = "ActorDid"
23
24type Xrpc struct {
25 Logger *slog.Logger
26 Db *db.DB
27 Enforcer *rbac.Enforcer
28 Engine *engine.Engine
29 Config *config.Config
30 Resolver *idresolver.Resolver
31 Vault secrets.Manager
32 ServiceAuth *serviceauth.ServiceAuth
33}
34
35func (x *Xrpc) Router() http.Handler {
36 r := chi.NewRouter()
37
38 r.With(x.ServiceAuth.VerifyServiceAuth).Post("/"+tangled.RepoAddSecretNSID, x.AddSecret)
39 r.With(x.ServiceAuth.VerifyServiceAuth).Post("/"+tangled.RepoRemoveSecretNSID, x.RemoveSecret)
40 r.With(x.ServiceAuth.VerifyServiceAuth).Get("/"+tangled.RepoListSecretsNSID, x.ListSecrets)
41
42 return r
43}
44
45// this is slightly different from http_util::write_error to follow the spec:
46//
47// the json object returned must include an "error" and a "message"
48func writeError(w http.ResponseWriter, e xrpcerr.XrpcError, status int) {
49 w.Header().Set("Content-Type", "application/json")
50 w.WriteHeader(status)
51 json.NewEncoder(w).Encode(e)
52}