From eb862be55d9193cf52e6f67861d9789a496ea7d7 Mon Sep 17 00:00:00 2001 From: Pau Costa Date: Sun, 7 Jul 2024 14:25:47 +0200 Subject: [PATCH] feat: add update event route --- functional-test/events.http | 15 ++++++++++++++- models/event.go | 24 +++++++++++++++++++++++ routes/events.routes.go | 38 +++++++++++++++++++++++++++++++++++++ routes/routes.go | 1 + 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/functional-test/events.http b/functional-test/events.http index d419006..9bf2bc3 100644 --- a/functional-test/events.http +++ b/functional-test/events.http @@ -17,4 +17,17 @@ content-type: application/json GET http://localhost:8080/events/1 ### Get a non existing event GET http://localhost:8080/events/10000 -### \ No newline at end of file +### + + +### Update an existing event +PUT http://localhost:8080/events/1 +content-type: application/json + +{ + "name": "My test event", + "description": "this is a event I created for testing", + "location": "test QUACK location", + "dateTime": "2025-01-01T13:40:00.000Z", + "UserId": 0 +} \ No newline at end of file diff --git a/models/event.go b/models/event.go index 13ab0ac..ab8a2b8 100644 --- a/models/event.go +++ b/models/event.go @@ -1,6 +1,7 @@ package models import ( + "database/sql" "fmt" "time" "udemy_httpserver/db" @@ -39,6 +40,29 @@ func (e *Event) Save() error { return err } +func (e *Event) Update() error { + query := ` + UPDATE events SET + name = $1, description = $2, location = $3, dateTime = $4, user_id = $5 + WHERE id = $6 + ` + statement, err := db.Conn.Prepare(query) + if err != nil { + fmt.Println("Something went wrong trying to prepare statement", err) + return err + } + defer func(statement *sql.Stmt) { + err := statement.Close() + if err != nil { + fmt.Println("Something went wrong trying to close statement", err) + return + } + }(statement) + _, err = statement.Exec(e.Name, e.Description, e.Location, e.DateTime, e.UserID, e.ID) + + return err +} + func GetAllEvents() ([]Event, error) { // TODO: implement paging selectQuery := `SELECT * FROM events` diff --git a/routes/events.routes.go b/routes/events.routes.go index 4759400..8912ee6 100644 --- a/routes/events.routes.go +++ b/routes/events.routes.go @@ -51,3 +51,41 @@ func getSingleEvent(c *gin.Context) { } c.JSON(http.StatusOK, *candidateEvent) } + +func updateEvent(c *gin.Context) { + // First we try to parse the json body into a struct + var event models.Event + err := c.ShouldBindJSON(&event) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + // We try to find the event by id + eventID, err := strconv.ParseInt(c.Param("id"), 10, 64) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + // If we get a db error, we return a 500 error + candidateEvent, err := models.FindEventById(int(eventID)) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + // If the event is not found, we return a 404 + if candidateEvent == nil { + c.JSON(http.StatusNotFound, gin.H{"error": "event not found"}) + return + } + // If the event is found, we update it + event.ID = candidateEvent.ID + if event.UserID == 0 { + event.UserID = candidateEvent.UserID + } + err = event.Update() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, event) +} diff --git a/routes/routes.go b/routes/routes.go index 34b2a4a..7a629ba 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -6,4 +6,5 @@ func RegisterRoutes(router *gin.Engine) { router.POST("/events", postEvent) router.GET("/events", getEvents) router.GET("/events/:id", getSingleEvent) + router.PUT("/events/:id", updateEvent) }