66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"render231011/internal/thestore"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type Server struct {
|
|
store *thestore.Store
|
|
oplog *Oplog
|
|
}
|
|
|
|
func NewServer() Server {
|
|
return Server{
|
|
store: thestore.NewStore(),
|
|
oplog: NewOplog(),
|
|
}
|
|
}
|
|
|
|
func (server Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
// todo middleware: rate limit
|
|
// todo middleware: timeout requests
|
|
// todo: replace with an actual router
|
|
if strings.HasPrefix(r.URL.Path, "/event") && r.Method == http.MethodPost {
|
|
server.servePostEvent(w, r)
|
|
} else if r.URL.Path == "/events" && r.Method == http.MethodGet {
|
|
server.serveGetEvents(w, r)
|
|
}
|
|
}
|
|
|
|
func (server Server) servePostEvent(w http.ResponseWriter, r *http.Request) {
|
|
var newEvent thestore.Event
|
|
if err := json.NewDecoder(r.Body).Decode(&newEvent); err != nil {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
// todo error msg pls
|
|
return
|
|
}
|
|
|
|
// todo check if action==updated service-id already exists
|
|
server.store.Push(newEvent)
|
|
log.Printf("ingested event %+v", newEvent)
|
|
|
|
// todo store the op log
|
|
server.oplog.Push(newEvent)
|
|
}
|
|
|
|
func (server Server) serveGetEvents(w http.ResponseWriter, r *http.Request) {
|
|
// todo my circular queue magic
|
|
sinceString := r.URL.Query().Get("since")
|
|
sinceInt, err := strconv.ParseInt(sinceString, 10, 64)
|
|
if err != nil {
|
|
// todo emit helpful err message
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
return nil
|
|
}
|
|
since := time.Unix(sinceInt, 0)
|
|
|
|
result := server.oplog.Since(since)
|
|
json.NewEncoder(w).Encode(result)
|
|
}
|