Adding server module
This commit is contained in:
117
server/server.go
Normal file
117
server/server.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user