You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.8 KiB
Go
158 lines
4.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"grace/database"
|
|
"grace/repositories"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type CollectionHandler struct {
|
|
Repository *repositories.CollectionRepository
|
|
BookRepository *repositories.BookRepository
|
|
CollectionBookRepo *repositories.CollectionBookRepository
|
|
}
|
|
|
|
// ...
|
|
|
|
func (h *CollectionHandler) GetCollection(c *fiber.Ctx) error {
|
|
id, err := strconv.Atoi(c.Params("id"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid collection ID"})
|
|
}
|
|
|
|
collection, err := h.Repository.FindByID(uint(id))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Collection not found"})
|
|
}
|
|
|
|
return c.JSON(collection)
|
|
}
|
|
|
|
func (h *CollectionHandler) CreateCollection(c *fiber.Ctx) error {
|
|
var collection database.Collection
|
|
if err := c.BodyParser(&collection); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
|
|
}
|
|
|
|
if err := h.Repository.Create(&collection); err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to create collection"})
|
|
}
|
|
|
|
return c.JSON(collection)
|
|
}
|
|
|
|
func (h *CollectionHandler) UpdateCollection(c *fiber.Ctx) error {
|
|
id, err := strconv.Atoi(c.Params("id"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid collection ID"})
|
|
}
|
|
|
|
collection, err := h.Repository.FindByID(uint(id))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Collection not found"})
|
|
}
|
|
|
|
if err := c.BodyParser(&collection); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
|
|
}
|
|
|
|
if err := h.Repository.Update(collection); err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to update collection"})
|
|
}
|
|
|
|
return c.JSON(collection)
|
|
}
|
|
|
|
func (h *CollectionHandler) DeleteCollection(c *fiber.Ctx) error {
|
|
id, err := strconv.Atoi(c.Params("id"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid collection ID"})
|
|
}
|
|
|
|
collection, err := h.Repository.FindByID(uint(id))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Collection not found"})
|
|
}
|
|
|
|
if err := h.Repository.Delete(collection); err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to delete collection"})
|
|
}
|
|
|
|
return c.SendStatus(fiber.StatusNoContent)
|
|
}
|
|
|
|
func (h *CollectionHandler) GetCollectionBooks(c *fiber.Ctx) error {
|
|
id, err := strconv.Atoi(c.Params("id"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid collection ID"})
|
|
}
|
|
|
|
collection, err := h.Repository.FindByID(uint(id))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Collection not found"})
|
|
}
|
|
|
|
return c.JSON(collection.Books)
|
|
}
|
|
|
|
func (h *CollectionHandler) AddBookToCollection(c *fiber.Ctx) error {
|
|
collectionID, err := strconv.Atoi(c.Params("id"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid collection ID"})
|
|
}
|
|
|
|
var bookIDPayload struct {
|
|
BookID uint `json:"bookId"`
|
|
}
|
|
if err := c.BodyParser(&bookIDPayload); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
|
|
}
|
|
|
|
book, err := h.BookRepository.FindByID(bookIDPayload.BookID)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Book not found"})
|
|
}
|
|
|
|
collection, err := h.Repository.FindByID(uint(collectionID))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Collection not found"})
|
|
}
|
|
|
|
if err := h.CollectionBookRepo.AddBookToCollection(book, collection); err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to add book to collection"})
|
|
}
|
|
|
|
return c.SendStatus(fiber.StatusAccepted)
|
|
}
|
|
|
|
func (h *CollectionHandler) RemoveBookFromCollection(c *fiber.Ctx) error {
|
|
collectionID, err := strconv.Atoi(c.Params("id"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid collection ID"})
|
|
}
|
|
|
|
bookID, err := strconv.Atoi(c.Params("bookId"))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid book ID"})
|
|
}
|
|
|
|
collection, err := h.Repository.FindByID(uint(collectionID))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Collection not found"})
|
|
}
|
|
|
|
book, err := h.BookRepository.FindByID(uint(bookID))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Book not found"})
|
|
}
|
|
|
|
if err := h.CollectionBookRepo.RemoveBookFromCollection(book, collection); err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to remove book from collection"})
|
|
}
|
|
|
|
return c.SendStatus(fiber.StatusNoContent)
|
|
}
|