Skip to content

Commit

Permalink
Add DELETE routes (#78)
Browse files Browse the repository at this point in the history
* Add delete method to user model

* Create users' delete controller

* Add delete method to story model

* Create stories' delete controller

* Add TODOs

* Update router
  • Loading branch information
RichDom2185 authored Jul 26, 2023
1 parent 4d395e9 commit 972695d
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 0 deletions.
40 changes: 40 additions & 0 deletions controller/stories/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package stories

import (
"fmt"
"net/http"
"strconv"

"github.com/go-chi/chi/v5"
"github.com/sirupsen/logrus"
"github.com/source-academy/stories-backend/controller"
"github.com/source-academy/stories-backend/internal/database"
apierrors "github.com/source-academy/stories-backend/internal/errors"
"github.com/source-academy/stories-backend/model"
storyviews "github.com/source-academy/stories-backend/view/stories"
)

func HandleDelete(w http.ResponseWriter, r *http.Request) error {
storyIDStr := chi.URLParam(r, "storyID")
storyID, err := strconv.Atoi(storyIDStr)
if err != nil {
return apierrors.ClientBadRequestError{
Message: fmt.Sprintf("Invalid storyID: %v", err),
}
}

// Get DB instance
db, err := database.GetDBFrom(r)
if err != nil {
logrus.Error(err)
return err
}

story, err := model.DeleteStory(db, storyID)
if err != nil {
logrus.Error(err)
return err
}
controller.EncodeJSONResponse(w, storyviews.SingleFrom(story))
return nil
}
40 changes: 40 additions & 0 deletions controller/users/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package users

import (
"fmt"
"net/http"
"strconv"

"github.com/go-chi/chi/v5"
"github.com/sirupsen/logrus"
"github.com/source-academy/stories-backend/controller"
"github.com/source-academy/stories-backend/internal/database"
apierrors "github.com/source-academy/stories-backend/internal/errors"
"github.com/source-academy/stories-backend/model"
userviews "github.com/source-academy/stories-backend/view/users"
)

func HandleDelete(w http.ResponseWriter, r *http.Request) error {
userIDStr := chi.URLParam(r, "userID")
userID, err := strconv.Atoi(userIDStr)
if err != nil {
return apierrors.ClientBadRequestError{
Message: fmt.Sprintf("Invalid userID: %v", err),
}
}

// Get DB instance
db, err := database.GetDBFrom(r)
if err != nil {
logrus.Error(err)
return err
}

user, err := model.DeleteUser(db, userID)
if err != nil {
logrus.Error(err)
return err
}
controller.EncodeJSONResponse(w, userviews.SingleFrom(user))
return nil
}
2 changes: 2 additions & 0 deletions internal/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,14 @@ func Setup(config *config.Config, injectMiddleWares []func(http.Handler) http.Ha
r.Get("/", handleAPIError(stories.HandleList))
r.Get("/{storyID}", handleAPIError(stories.HandleRead))
r.Put("/{storyID}", handleAPIError(stories.HandleUpdate))
r.Delete("/{storyID}", handleAPIError(stories.HandleDelete))
r.Post("/", handleAPIError(stories.HandleCreate))
})

r.Route("/users", func(r chi.Router) {
r.Get("/", handleAPIError(users.HandleList))
r.Get("/{userID}", handleAPIError(users.HandleRead))
r.Delete("/{userID}", handleAPIError(users.HandleDelete))
r.Post("/", handleAPIError(users.HandleCreate))
r.Post("/batch", handleAPIError(users.HandleBatchCreate))
})
Expand Down
15 changes: 15 additions & 0 deletions model/stories.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ func CreateStory(db *gorm.DB, story *Story) error {
}

func UpdateStory(db *gorm.DB, storyID int, newStory *Story) error {
// TODO: Possible restore functionality for soft-deleted stories?
err := db.
Transaction(func(tx *gorm.DB) error {
var originalStory Story
Expand Down Expand Up @@ -91,3 +92,17 @@ func UpdateStory(db *gorm.DB, storyID int, newStory *Story) error {

return nil
}

func DeleteStory(db *gorm.DB, storyID int) (Story, error) {
var story Story
err := db.
Scopes(preloadAssociations).
Where("id = ?", storyID).
First(&story). // store the value to be returned
Delete(&story).
Error
if err != nil {
return story, database.HandleDBError(err, "story")
}
return story, nil
}
15 changes: 15 additions & 0 deletions model/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ func GetUserByID(db *gorm.DB, id int) (User, error) {
}

func CreateUser(db *gorm.DB, user *User) error {
// TODO: If user already exists, but is soft-deleted, undelete the user
err := db.Create(user).Error
if err != nil {
return database.HandleDBError(err, "user")
Expand All @@ -47,3 +48,17 @@ func CreateUsers(db *gorm.DB, users *[]*User) (int64, error) {
}
return rowCount, nil
}

func DeleteUser(db *gorm.DB, userID int) (User, error) {
var user User
err := db.
Model(&user).
Where("id = ?", userID).
First(&user). // store the value to be returned
Delete(&user).
Error
if err != nil {
return user, database.HandleDBError(err, "user")
}
return user, nil
}

0 comments on commit 972695d

Please sign in to comment.