package handlers import ( "aggios-app/backend/internal/api/middleware" "aggios-app/backend/internal/domain" "aggios-app/backend/internal/repository" "encoding/json" "net/http" "github.com/google/uuid" "github.com/gorilla/mux" ) type DocumentHandler struct { repo *repository.DocumentRepository } func NewDocumentHandler(repo *repository.DocumentRepository) *DocumentHandler { return &DocumentHandler{repo: repo} } func (h *DocumentHandler) Create(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) userID, _ := r.Context().Value(middleware.UserIDKey).(string) var doc domain.Document if err := json.NewDecoder(r.Body).Decode(&doc); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } doc.ID = uuid.New() doc.TenantID, _ = uuid.Parse(tenantID) doc.CreatedBy, _ = uuid.Parse(userID) doc.LastUpdatedBy, _ = uuid.Parse(userID) if doc.Status == "" { doc.Status = "draft" } if err := h.repo.Create(&doc); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(doc) } func (h *DocumentHandler) List(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) docs, err := h.repo.GetByTenant(tenantID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(docs) } func (h *DocumentHandler) Get(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) id := mux.Vars(r)["id"] doc, err := h.repo.GetByID(id, tenantID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if doc == nil { http.Error(w, "document not found", http.StatusNotFound) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(doc) } func (h *DocumentHandler) Update(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) userID, _ := r.Context().Value(middleware.UserIDKey).(string) id := mux.Vars(r)["id"] var doc domain.Document if err := json.NewDecoder(r.Body).Decode(&doc); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } doc.ID, _ = uuid.Parse(id) doc.TenantID, _ = uuid.Parse(tenantID) doc.LastUpdatedBy, _ = uuid.Parse(userID) if err := h.repo.Update(&doc); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(doc) } func (h *DocumentHandler) Delete(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) id := mux.Vars(r)["id"] if err := h.repo.Delete(id, tenantID); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } func (h *DocumentHandler) GetSubpages(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) parentID := mux.Vars(r)["id"] docs, err := h.repo.GetSubpages(parentID, tenantID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(docs) } func (h *DocumentHandler) GetActivities(w http.ResponseWriter, r *http.Request) { tenantID, _ := r.Context().Value(middleware.TenantIDKey).(string) id := mux.Vars(r)["id"] activities, err := h.repo.GetActivities(id, tenantID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(activities) }