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/xesite | |
| 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/xesite')
| -rw-r--r-- | cmd/xesite/api.go | 44 | ||||
| -rw-r--r-- | cmd/xesite/internalapi.go | 35 | ||||
| -rw-r--r-- | cmd/xesite/main.go | 6 |
3 files changed, 85 insertions, 0 deletions
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) |
