All checks were successful
build-and-push / build (push) Successful in 33s
- CalendarEvent.Participants(JSON 이메일 배열), patch 시 JSON 변환 - 목록은 전 구성원 공유(이미) → 프론트가 소유자 OR 참여자로 필터/표시 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
package httpapi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"spin/internal/models"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
"gorm.io/datatypes"
|
|
)
|
|
|
|
// 개인 캘린더 — 각자 본인 이벤트만 보고 관리(분류: 프로젝트/기타/개인 + 색).
|
|
|
|
// handleListEvents returns ALL members' events (회사 공유 캘린더) so the UI can
|
|
// filter by member checkboxes. Editing/deleting stays owner-only.
|
|
func (s *Server) handleListEvents(w http.ResponseWriter, r *http.Request) {
|
|
var out []models.CalendarEvent
|
|
s.db.Order("start asc").Find(&out)
|
|
writeJSON(w, http.StatusOK, out)
|
|
}
|
|
|
|
func (s *Server) handleCreateEvent(w http.ResponseWriter, r *http.Request) {
|
|
var e models.CalendarEvent
|
|
if err := decodeJSON(r, &e); err != nil {
|
|
writeError(w, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
e.ID = ""
|
|
e.OwnerEmail = s.email(r)
|
|
s.db.Create(&e)
|
|
writeJSON(w, http.StatusCreated, e)
|
|
}
|
|
|
|
func (s *Server) handlePatchEvent(w http.ResponseWriter, r *http.Request) {
|
|
var e models.CalendarEvent
|
|
if err := s.db.First(&e, "id = ?", chi.URLParam(r, "eId")).Error; err != nil {
|
|
writeError(w, http.StatusNotFound, "일정을 찾을 수 없습니다")
|
|
return
|
|
}
|
|
if !s.owns(r, e.OwnerEmail) {
|
|
writeError(w, http.StatusForbidden, "본인 일정만 수정할 수 있습니다")
|
|
return
|
|
}
|
|
var patch map[string]interface{}
|
|
if err := decodeJSON(r, &patch); err != nil {
|
|
writeError(w, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
delete(patch, "id")
|
|
delete(patch, "ownerEmail")
|
|
if v, ok := patch["participants"]; ok {
|
|
if b, err := json.Marshal(v); err == nil {
|
|
patch["participants"] = datatypes.JSON(b)
|
|
}
|
|
}
|
|
s.db.Model(&e).Updates(snakeKeys(patch))
|
|
s.db.First(&e, "id = ?", e.ID)
|
|
writeJSON(w, http.StatusOK, e)
|
|
}
|
|
|
|
func (s *Server) handleDeleteEvent(w http.ResponseWriter, r *http.Request) {
|
|
var e models.CalendarEvent
|
|
if err := s.db.First(&e, "id = ?", chi.URLParam(r, "eId")).Error; err != nil {
|
|
writeError(w, http.StatusNotFound, "일정을 찾을 수 없습니다")
|
|
return
|
|
}
|
|
if !s.owns(r, e.OwnerEmail) {
|
|
writeError(w, http.StatusForbidden, "본인 일정만 삭제할 수 있습니다")
|
|
return
|
|
}
|
|
s.db.Delete(&models.CalendarEvent{}, "id = ?", e.ID)
|
|
writeJSON(w, http.StatusOK, map[string]bool{"ok": true})
|
|
}
|