Files
zineshop/controllers/roomController.go

188 lines
3.5 KiB
Go

package controllers
import (
"fmt"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"example.com/gin/test/models"
"example.com/gin/test/repositories"
)
type CRUDController interface {
Create(*gin.Context)
GetAll(*gin.Context)
GetById(*gin.Context)
Update(*gin.Context)
Delete(*gin.Context)
}
type RoomController interface {
CRUDController
GetUsers(*gin.Context)
AddUser(*gin.Context)
}
type roomController struct {}
func NewRoomController() RoomController {
return &roomController{}
}
func (rc *roomController) GetAll(c *gin.Context) {
rooms, err := repositories.Rooms.GetAll()
if err != nil {
ReplyError(c, fmt.Errorf("Could not query rooms"))
return
}
c.JSON(http.StatusOK, rooms)
}
func (rc *roomController) GetById(c *gin.Context) {
room, err := repositories.Rooms.GetById(c.Param("id"))
if err != nil {
ReplyError(c, fmt.Errorf("Could not query room: %v", err))
return
}
ReplyOK(c, room)
}
func (rc *roomController) Create(c *gin.Context) {
user, exists := c.Get("user")
if !exists {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
room, err := models.NewRoom(c)
room.Admins = append(room.Admins, user.(models.User))
if err != nil {
ReplyError(c, err)
}
_, err = repositories.Rooms.Create(room)
if err != nil {
ReplyError(c, fmt.Errorf("Room creation failed: %s", err))
return
}
//userID := user.(models.User).ID
//rc.DB.Model(&models.Room{}).Where("id = ?"), room.ID).Association("Admins").Append(&models.User{ID: userID})
//if result.Error != nil {
// ReplyError(c, fmt.Errorf("Room creation failed: %s", result.Error))
// return
//}
ReplyOK(c, "Room was created")
}
func (rc *roomController) Update(c *gin.Context) {
roomId, err := strconv.Atoi(c.Param("id"))
if err != nil {
ReplyError(c, fmt.Errorf("Room with Id '%s' does not exist", c.Param("id")))
return
}
room, err := models.NewRoom(c)
if err != nil {
ReplyError(c, err)
return
}
room.ID = uint(roomId)
_, err = repositories.Rooms.Update(room)
if err != nil {
ReplyError(c, fmt.Errorf("Room creation failed: %s", err))
return
}
ReplyOK(c, "Room was updated")
}
func (rc *roomController) Delete(c *gin.Context) {
err := repositories.Rooms.DeleteById(c.Param("id"))
if err != nil {
ReplyError(c, fmt.Errorf("Room deletion failed: %s", err))
return
}
ReplyOK(c, "Room was deleted")
}
func (rc *roomController) GetUsers(c *gin.Context) {
//only allow room admin
users, err := repositories.Rooms.GetRoomUsersById(c.Param("id"))
if err != nil {
ReplyError(c, fmt.Errorf("Could not get users for room '%s'", c.Param("id")))
return
}
var emails []string
for _, user := range users {
emails = append(emails, user.Email)
}
ReplyOK(c, emails)
}
func (rc *roomController) AddUser(c *gin.Context) {
//only allow room admin
var body struct {
Email string
}
err := c.Bind(&body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Failed to read body",
})
return
}
//lookup requested user
user, err := repositories.Users.GetByEmail(body.Email)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid user",
})
return
}
err = repositories.Rooms.AddRoomUserById(c.Param("id"), user)
if err != nil {
ReplyError(c, fmt.Errorf("Could not add user to room."))
return
}
ReplyOK(c, "Added User to Room")
}
func ReplyError(ctx *gin.Context, err error) {
ctx.JSON(http.StatusBadRequest, gin.H{ "error": err.Error() })
}
func ReplyOK(ctx *gin.Context, message any) {
ctx.JSON(http.StatusOK, message)
}