package announcement import ( "log" "strconv" "strings" "github.com/gofiber/fiber/v2" ) type Handler struct { svc *Service } func NewHandler(svc *Service) *Handler { return &Handler{svc: svc} } func (h *Handler) GetAll(c *fiber.Ctx) error { offset := c.QueryInt("offset", 0) limit := c.QueryInt("limit", 20) if limit <= 0 || limit > 100 { limit = 20 } if offset < 0 { offset = 0 } list, err := h.svc.GetAll(offset, limit) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "공지사항을 불러오지 못했습니다"}) } return c.JSON(list) } func (h *Handler) Create(c *fiber.Ctx) error { var body struct { Title string `json:"title"` Content string `json:"content"` } if err := c.BodyParser(&body); err != nil || body.Title == "" || body.Content == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "제목과 내용을 입력해주세요"}) } if len(body.Title) > 256 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "제목은 256자 이하여야 합니다"}) } if len(body.Content) > 10000 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "내용은 10000자 이하여야 합니다"}) } a, err := h.svc.Create(body.Title, body.Content) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "공지사항 생성에 실패했습니다"}) } return c.Status(fiber.StatusCreated).JSON(a) } func (h *Handler) Update(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "유효하지 않은 공지사항 ID입니다"}) } var body struct { Title string `json:"title"` Content string `json:"content"` } if err := c.BodyParser(&body); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "잘못된 요청입니다"}) } if body.Title == "" && body.Content == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "수정할 내용을 입력해주세요"}) } if len(body.Title) > 256 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "제목은 256자 이하여야 합니다"}) } if len(body.Content) > 10000 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "내용은 10000자 이하여야 합니다"}) } a, err := h.svc.Update(uint(id), body.Title, body.Content) if err != nil { if strings.Contains(err.Error(), "찾을 수 없습니다") { return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": err.Error()}) } log.Printf("공지사항 수정 실패 (id=%d): %v", id, err) return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "서버 오류가 발생했습니다"}) } return c.JSON(a) } func (h *Handler) Delete(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "유효하지 않은 공지사항 ID입니다"}) } if err := h.svc.Delete(uint(id)); err != nil { if strings.Contains(err.Error(), "찾을 수 없습니다") { return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": err.Error()}) } return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "삭제에 실패했습니다"}) } return c.SendStatus(fiber.StatusNoContent) }