aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-02-18 13:34:51 -0500
committerXe Iaso <me@xeiaso.net>2024-02-18 13:34:51 -0500
commit8d63fd1b351cf9ffd99555b21017cc503dd1d0fe (patch)
treee642b17c4a445006dc0e92025725ebf430f932b0 /cmd
parent5a4d6d92e9d3c1483104f2adcc9085b64bd1871f (diff)
downloadxesite-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.go22
-rw-r--r--cmd/xesite/api.go44
-rw-r--r--cmd/xesite/internalapi.go35
-rw-r--r--cmd/xesite/main.go6
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)