aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/server/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/server.go')
-rw-r--r--pkg/server/server.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/pkg/server/server.go b/pkg/server/server.go
new file mode 100644
index 0000000..8b66e62
--- /dev/null
+++ b/pkg/server/server.go
@@ -0,0 +1,67 @@
+package server
+
+import (
+ "bytes"
+ "io"
+ "log/slog"
+ "net/http"
+ "strings"
+
+ "github.com/jpappel/atlas/pkg/data"
+ "github.com/jpappel/atlas/pkg/index"
+ "github.com/jpappel/atlas/pkg/query"
+)
+
+func info(w http.ResponseWriter, r *http.Request) {
+ w.Write([]byte(`
+ <h1>Atlas Server</h1>
+ <p>This is the experimental atlas server!
+ Try POSTing a query to <pre>/search</pre></p>
+ `))
+}
+
+func New(db *data.Query) *http.ServeMux {
+ mux := http.NewServeMux()
+
+ mux.HandleFunc("/", info)
+ mux.HandleFunc("/search", func(w http.ResponseWriter, r *http.Request) {
+ b := &strings.Builder{}
+ if _, err := io.Copy(b, r.Body); err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ w.Write([]byte("Error processing request"))
+ slog.Error("Error reading request body", slog.String("err", err.Error()))
+ return
+ }
+ artifact, err := query.Compile(b.String(), 0, 1)
+ if err != nil {
+ w.WriteHeader(http.StatusBadRequest)
+ w.Write([]byte(err.Error()))
+ slog.Error("Error compiling query", slog.String("err", err.Error()))
+ return
+ }
+
+ pathDocs, err := db.Execute(artifact)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ w.Write([]byte("Error executing query"))
+ slog.Error("Error executing query", slog.String("err", err.Error()))
+ return
+ }
+ docs := make([]*index.Document, 0, len(pathDocs))
+ for _, doc := range pathDocs {
+ docs = append(docs, doc)
+ }
+
+ var buf bytes.Buffer
+ _, err = query.JsonOutput{}.OutputTo(&buf, docs)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ w.Write([]byte("Error while writing output"))
+ slog.Error("Error writing json output", slog.String("err", err.Error()))
+ }
+
+ io.Copy(w, &buf)
+ })
+
+ return mux
+}