diff --git a/render-2023-10-11/cmd/cache-service/main.go b/render-2023-10-11/cmd/cache-service/main.go new file mode 100644 index 0000000..3dfb5ef --- /dev/null +++ b/render-2023-10-11/cmd/cache-service/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" +) + +func main() { + port := flag.Int("p", 8080, "port to listen on") + flag.Parse() + + server := NewServer() + + addr := fmt.Sprintf(":%d", *port) // check port >0 // accept IP for mvp security + // add signal catching for clean shutdown via context and httpServer or the like + log.Printf("listening on %s", addr) + if err := http.ListenAndServe(addr, server); err != nil { + panic(err) + } +} diff --git a/render-2023-10-11/cmd/cache-service/server.go b/render-2023-10-11/cmd/cache-service/server.go new file mode 100644 index 0000000..45942b1 --- /dev/null +++ b/render-2023-10-11/cmd/cache-service/server.go @@ -0,0 +1,47 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" + "render231011/internal/thestore" + "strings" +) + +type Server struct { + store *thestore.Store +} + +func NewServer() Server { + return Server{ + store: thestore.NewStore(), + } +} + +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) +} + +func (server Server) serveGetEvents(w http.ResponseWriter, r *http.Request) { + // todo my circular queue magic +}