diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-02-18 13:34:51 -0500 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-02-18 13:34:51 -0500 |
| commit | 8d63fd1b351cf9ffd99555b21017cc503dd1d0fe (patch) | |
| tree | e642b17c4a445006dc0e92025725ebf430f932b0 /cmd | |
| parent | 5a4d6d92e9d3c1483104f2adcc9085b64bd1871f (diff) | |
| download | xesite-8d63fd1b351cf9ffd99555b21017cc503dd1d0fe.tar.xz xesite-8d63fd1b351cf9ffd99555b21017cc503dd1d0fe.zip | |
add an external API
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/patreon-saasproxy/main.go | 22 | ||||
| -rw-r--r-- | cmd/xesite/api.go | 44 | ||||
| -rw-r--r-- | cmd/xesite/internalapi.go | 35 | ||||
| -rw-r--r-- | cmd/xesite/main.go | 6 |
4 files changed, 87 insertions, 20 deletions
diff --git a/cmd/patreon-saasproxy/main.go b/cmd/patreon-saasproxy/main.go index ef83302..6901ee3 100644 --- a/cmd/patreon-saasproxy/main.go +++ b/cmd/patreon-saasproxy/main.go @@ -3,7 +3,6 @@ package main import ( "context" "encoding/base64" - "encoding/json" "flag" "log" "log/slog" @@ -14,6 +13,7 @@ import ( "github.com/facebookgo/flagenv" _ "github.com/joho/godotenv/autoload" + "github.com/twitchtv/twirp" "golang.org/x/oauth2" "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" @@ -80,8 +80,6 @@ func main() { cts: cts, } - http.HandleFunc("/give-token", s.GiveToken) - ph := adminpb.NewPatreonServer(s) http.Handle(adminpb.PatreonPathPrefix, ph) @@ -104,7 +102,7 @@ func (s *Server) GetToken(ctx context.Context, _ *emptypb.Empty) (*adminpb.Patre token, err := s.cts.Token() if err != nil { slog.Error("token fetch failed", "err", err) - return nil, err + return nil, twirp.InternalErrorWith(err) } return &adminpb.PatreonToken{ @@ -114,19 +112,3 @@ func (s *Server) GetToken(ctx context.Context, _ *emptypb.Empty) (*adminpb.Patre Expiry: timestamppb.New(token.Expiry), }, nil } - -func (s *Server) GiveToken(w http.ResponseWriter, r *http.Request) { - token, err := s.cts.Token() - if err != nil { - slog.Error("token fetch failed", "err", err) - http.Error(w, "token fetch failed", http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - - if err := json.NewEncoder(w).Encode(token); err != nil { - slog.Error("token encode failed", "err", err) - return - } -} diff --git a/cmd/xesite/api.go b/cmd/xesite/api.go new file mode 100644 index 0000000..35bb5ae --- /dev/null +++ b/cmd/xesite/api.go @@ -0,0 +1,44 @@ +package main + +import ( + "context" + "os" + "os/exec" + "runtime" + + "github.com/twitchtv/twirp" + "google.golang.org/protobuf/types/known/emptypb" + "google.golang.org/protobuf/types/known/timestamppb" + "xeiaso.net/v4/internal/lume" + "xeiaso.net/v4/pb" +) + +type MetaServer struct { + fs *lume.FS +} + +func (ms *MetaServer) Metadata(ctx context.Context, _ *emptypb.Empty) (*pb.BuildInfo, error) { + deno, err := exec.LookPath("deno") + if err != nil { + return nil, twirp.InternalErrorf("can't find deno in $PATH: %w", err) + } + + commit, err := ms.fs.Commit() + if err != nil { + return nil, twirp.InternalErrorf("can't get commit hash: %w", err) + } + + result := &pb.BuildInfo{ + Commit: commit, + GoVersion: runtime.Version(), + DenoVersion: deno, + XesiteVersion: os.Args[0], + BuildTime: timestamppb.New(ms.fs.BuildTime()), + } + + if *devel { + result.XesiteVersion = "devel" + } + + return result, nil +} diff --git a/cmd/xesite/internalapi.go b/cmd/xesite/internalapi.go index 7d1ebcb..99516fc 100644 --- a/cmd/xesite/internalapi.go +++ b/cmd/xesite/internalapi.go @@ -6,9 +6,17 @@ import ( "log" "net" "net/http" + "os" + "os/exec" "path/filepath" + "runtime" + "github.com/twitchtv/twirp" + "google.golang.org/protobuf/types/known/emptypb" + "google.golang.org/protobuf/types/known/timestamppb" + "xeiaso.net/v4/internal/adminpb" "xeiaso.net/v4/internal/lume" + "xeiaso.net/v4/pb" ) func internalAPI(fs *lume.FS) { @@ -26,6 +34,8 @@ func internalAPI(fs *lume.FS) { http.ServeFile(w, r, filepath.Join(*dataDir, "site.zip")) }) + mux.Handle(adminpb.AdminPathPrefix, adminpb.NewAdminServer(&AdminAPI{fs: fs})) + ln, err := net.Listen("tcp", ":80") if err != nil { log.Fatal(err) @@ -33,3 +43,28 @@ func internalAPI(fs *lume.FS) { http.Serve(ln, mux) } + +type AdminAPI struct { + fs *lume.FS +} + +func (aa *AdminAPI) Rebuild(ctx context.Context, _ *emptypb.Empty) (*pb.BuildInfo, error) { + deno, err := exec.LookPath("deno") + if err != nil { + return nil, twirp.InternalErrorf("can't find deno in $PATH: %w", err) + } + + result := &pb.BuildInfo{ + GoVersion: runtime.Version(), + DenoVersion: deno, + XesiteVersion: os.Args[0], + } + + if err := aa.fs.Update(ctx); err != nil { + return nil, twirp.InternalErrorWith(err) + } + + result.BuildTime = timestamppb.Now() + + return result, nil +} diff --git a/cmd/xesite/main.go b/cmd/xesite/main.go index 4635a71..a70ddc7 100644 --- a/cmd/xesite/main.go +++ b/cmd/xesite/main.go @@ -13,8 +13,10 @@ import ( "github.com/donatj/hmacsig" "github.com/facebookgo/flagenv" _ "github.com/joho/godotenv/autoload" + "github.com/twitchtv/twirp" "xeiaso.net/v4/internal" "xeiaso.net/v4/internal/lume" + "xeiaso.net/v4/pb" ) var ( @@ -77,6 +79,10 @@ func main() { mux := http.NewServeMux() mux.Handle("/", http.FileServer(http.FS(fs))) + mux.Handle("/api/defs/", http.StripPrefix("/api/defs/", http.FileServer(http.FS(pb.Proto)))) + + ms := pb.NewMetaServer(&MetaServer{fs}, twirp.WithServerPathPrefix("/api")) + mux.Handle(ms.PathPrefix(), ms) mux.HandleFunc("/blog.atom", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/blog.rss", http.StatusMovedPermanently) |
