This repository has no description
2.2 kB
73 lines
1package xrpc
2
3import (
4 "database/sql"
5 "encoding/json"
6 "errors"
7 "log/slog"
8 "net/http"
9
10 "github.com/bluesky-social/indigo/atproto/atclient"
11 "github.com/go-chi/chi/v5"
12 "tangled.org/core/api/tangled"
13 "tangled.org/core/idresolver"
14 "tangled.org/core/knotmirror/config"
15 "tangled.org/core/knotmirror/knotstream"
16 "tangled.org/core/log"
17)
18
19type Xrpc struct {
20 cfg *config.Config
21 db *sql.DB
22 resolver *idresolver.Resolver
23 ks *knotstream.KnotStream
24 logger *slog.Logger
25}
26
27func New(logger *slog.Logger, cfg *config.Config, db *sql.DB, resolver *idresolver.Resolver, ks *knotstream.KnotStream) *Xrpc {
28 return &Xrpc{
29 cfg,
30 db,
31 resolver,
32 ks,
33 log.SubLogger(logger, "xrpc"),
34 }
35}
36
37func (x *Xrpc) Router() http.Handler {
38 r := chi.NewRouter()
39
40 r.Get("/"+tangled.GitTempGetArchiveNSID, x.GetArchive)
41 r.Get("/"+tangled.GitTempGetBlobNSID, x.GetBlob)
42 r.Get("/"+tangled.GitTempGetBranchNSID, x.GetBranch)
43 // r.Get("/"+tangled.GitTempGetCommitNSID, x.GetCommit) // todo
44 // r.Get("/"+tangled.GitTempGetDiffNSID, x.GetDiff) // todo
45 // r.Get("/"+tangled.GitTempGetEntityNSID, x.GetEntity) // todo
46 // r.Get("/"+tangled.GitTempGetHeadNSID, x.GetHead) // todo
47 r.Get("/"+tangled.GitTempGetTagNSID, x.GetTag) // using types.Response
48 r.Get("/"+tangled.GitTempGetTreeNSID, x.GetTree)
49 r.Get("/"+tangled.GitTempListBranchesNSID, x.ListBranches) // wip, unknown output
50 r.Get("/"+tangled.GitTempListCommitsNSID, x.ListCommits)
51 r.Get("/"+tangled.GitTempListLanguagesNSID, x.ListLanguages)
52 r.Get("/"+tangled.GitTempListTagsNSID, x.ListTags)
53 r.Post("/"+tangled.SyncRequestCrawlNSID, x.RequestCrawl)
54
55 return r
56}
57
58func writeJson(w http.ResponseWriter, status int, response any) error {
59 w.Header().Set("Content-Type", "application/json")
60 w.WriteHeader(status)
61 if err := json.NewEncoder(w).Encode(response); err != nil {
62 return err
63 }
64 return nil
65}
66
67func writeErr(w http.ResponseWriter, err error) error {
68 var apiErr *atclient.APIError
69 if errors.As(err, &apiErr) {
70 return writeJson(w, apiErr.StatusCode, atclient.ErrorBody{Name: apiErr.Name, Message: apiErr.Message})
71 }
72 return writeJson(w, http.StatusInternalServerError, atclient.ErrorBody{Name: "InternalServerError", Message: "internal server error"})
73}