From b54a862e23027f0f8c1827eb8deaa314241676f2 Mon Sep 17 00:00:00 2001 From: Nemo D'ACREMONT Date: Sun, 1 Jun 2025 10:52:57 +0200 Subject: [PATCH] first commit --- api/api.go | 18 +++++++++++++++++ api/messages/handler.go | 44 ++++++++++++++++++++++++++++++++++++++++ api/messages/model.go | 45 +++++++++++++++++++++++++++++++++++++++++ api/users/handler.go | 1 + api/users/model.go | 7 +++++++ go.mod | 3 +++ main.go | 19 +++++++++++++++++ 7 files changed, 137 insertions(+) create mode 100644 api/api.go create mode 100644 api/messages/handler.go create mode 100644 api/messages/model.go create mode 100644 api/users/handler.go create mode 100644 api/users/model.go create mode 100644 go.mod create mode 100644 main.go diff --git a/api/api.go b/api/api.go new file mode 100644 index 0000000..018ef1d --- /dev/null +++ b/api/api.go @@ -0,0 +1,18 @@ +package api + +import ( + "net/http" + + "dacremont.xyz/learnrest/api/messages" +) + +type Api struct {} + +func NewApi () *http.ServeMux { + mux := http.NewServeMux() + + mux.Handle("/messages", messages.NewMessagesAPI()) + mux.HandleFunc("GET /hello", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("World!"))}) + + return mux +} diff --git a/api/messages/handler.go b/api/messages/handler.go new file mode 100644 index 0000000..7015af3 --- /dev/null +++ b/api/messages/handler.go @@ -0,0 +1,44 @@ +package messages + +import ( + "encoding/json" + "net/http" +) + +func getMessages(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + + err := json.NewEncoder(w).Encode(getAllMessages()) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} + +func postMessages(w http.ResponseWriter, r *http.Request) { + var payload Message + err := json.NewDecoder(r.Body).Decode(&payload) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + msg := Message{ + Author_id: payload.Author_id, + Text: payload.Text, + } + + err = insertMessage(msg) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + } +} + +func NewMessagesAPI() *http.ServeMux { + initMessages() + mux := http.NewServeMux() + + mux.HandleFunc("GET /", getMessages) + mux.HandleFunc("POST /", postMessages) + + return mux +} diff --git a/api/messages/model.go b/api/messages/model.go new file mode 100644 index 0000000..594f641 --- /dev/null +++ b/api/messages/model.go @@ -0,0 +1,45 @@ +package messages + +import "errors" + +type Message struct { + MessageId uint64 `json:"message_id"` + Author_id uint64 `json:"author_id"` + Text string `json:"text"` +} + +var messages []Message + +func initMessages() { + messages = make([]Message, 0) +} + +func insertMessage(msg Message) error { + if msg.Author_id == 0 { + return errors.New("An author_id must be specified") + } + + if msg.Text == "" { + return errors.New("The field text must not be empty") + } + + messages = append(messages, Message{ + MessageId: uint64(len(messages)), + Text: msg.Text, + Author_id: msg.Author_id, + }) + + return nil +} + +func getAllMessages() []Message { + return messages +} + +func getMessageById(id uint64) (Message, error) { + if int(id) >= len(messages) { + return Message{}, errors.New("Message doesn't exists") + } + + return messages[id], nil +} diff --git a/api/users/handler.go b/api/users/handler.go new file mode 100644 index 0000000..82abcb9 --- /dev/null +++ b/api/users/handler.go @@ -0,0 +1 @@ +package users diff --git a/api/users/model.go b/api/users/model.go new file mode 100644 index 0000000..e496447 --- /dev/null +++ b/api/users/model.go @@ -0,0 +1,7 @@ +package users + +type User struct { + Id uint64 `json:"id"` + Name string `json:"name"` +} + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..17d78c4 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module dacremont.xyz/learnrest + +go 1.24.3 diff --git a/main.go b/main.go new file mode 100644 index 0000000..0934971 --- /dev/null +++ b/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "log" + "net/http" + "dacremont.xyz/learnrest/api" +) + +func main() { + server := http.Server{ + Addr: ":8080", + Handler: api.NewApi(), + } + + err := server.ListenAndServe() + if err != nil { + log.Fatal(err) + } +}