This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / knotmirror / xrpc / xrpc.go
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}