From 922b136c7252bafd21e8759a77efc3765d88dc56 Mon Sep 17 00:00:00 2001 From: Micheal Wilkinson Date: Tue, 17 Mar 2026 23:52:24 +0000 Subject: [PATCH] Adding server module --- server/server.go | 117 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 server/server.go diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..8ccadff --- /dev/null +++ b/server/server.go @@ -0,0 +1,117 @@ +package server + +import ( + "fmt" + "net/http" + "strconv" + + "git.hrafn.xyz/aether/notes/internal/repository" +) + +type Server struct { + httpServer *http.Server + noteRepo repository.NoteRepository +} + +func GetServer(repo repository.NoteRepository) Server { + mux := http.NewServeMux() + server := Server{ + httpServer: &http.Server{Handler: mux}, + noteRepo: repo, + } + mux.HandleFunc("GET /notes", server.getNotes) + mux.HandleFunc("POST /notes", server.createNote) + mux.HandleFunc("GET /notes/{id}", server.getNoteByID) + mux.HandleFunc("PUT /notes/{id}", server.updateNoteByID) + mux.HandleFunc("DELETE /notes/{id}", server.deleteNoteByID) + return server +} + +func (s *Server) Start(addr string) error { + s.httpServer.Addr = addr + return s.httpServer.ListenAndServe() +} + +func (s *Server) Stop() error { + return s.httpServer.Close() +} + +func (s *Server) getJsonResponse(w http.ResponseWriter, data any) { + w.Header().Set("Content-Type", "application/json") + // Encode data to JSON and write to response +} + +func (s *Server) getErrorResponse(w http.ResponseWriter, err error) { + http.Error(w, err.Error(), http.StatusInternalServerError) +} + +func (s *Server) getNotes(w http.ResponseWriter, r *http.Request) { + notes, err := s.noteRepo.ListNotes(r.Context()) + if err != nil { + s.getErrorResponse(w, err) + return + } + s.getJsonResponse(w, notes) +} + +func (s *Server) createNote(w http.ResponseWriter, r *http.Request) { + note := struct { + Content string `json:"content"` + }{} + // Decode JSON body into note struct + createdNote, err := s.noteRepo.CreateNote(r.Context(), note.Content) + if err != nil { + s.getErrorResponse(w, err) + return + } + s.getJsonResponse(w, createdNote) +} + +func (s *Server) getNoteByID(w http.ResponseWriter, r *http.Request) { + ids := r.PathValue("id") + id, err := strconv.Atoi(ids) + if err != nil { + s.getErrorResponse(w, fmt.Errorf("invalid note ID: %w", err)) + return + } + note, err := s.noteRepo.GetNote(r.Context(), id) + if err != nil { + s.getErrorResponse(w, err) + return + } + s.getJsonResponse(w, note) +} + +func (s *Server) updateNoteByID(w http.ResponseWriter, r *http.Request) { + ids := r.PathValue("id") + id, err := strconv.Atoi(ids) + if err != nil { + s.getErrorResponse(w, fmt.Errorf("invalid note ID: %w", err)) + return + } + note := struct { + Content string `json:"content"` + }{} + // Decode JSON body into note struct + updatedNote, err := s.noteRepo.UpdateNote(r.Context(), id, note.Content) + if err != nil { + s.getErrorResponse(w, err) + return + } + s.getJsonResponse(w, updatedNote) +} + +func (s *Server) deleteNoteByID(w http.ResponseWriter, r *http.Request) { + ids := r.PathValue("id") + id, err := strconv.Atoi(ids) + if err != nil { + s.getErrorResponse(w, fmt.Errorf("invalid note ID: %w", err)) + return + } + err = s.noteRepo.DeleteNote(r.Context(), id) + if err != nil { + s.getErrorResponse(w, err) + return + } + w.WriteHeader(http.StatusNoContent) +}