145 lines
3.8 KiB
Go
145 lines
3.8 KiB
Go
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)
|
|
}
|