turash/bugulma/backend/internal/handler/organization_admin_handler.go

167 lines
5.1 KiB
Go

package handler
import (
"net/http"
"bugulma/backend/internal/domain"
"bugulma/backend/internal/service"
"github.com/gin-gonic/gin"
)
// OrganizationAdminHandler handles admin-specific organization operations
type OrganizationAdminHandler struct {
orgHandler *OrganizationHandler
verificationService *service.VerificationService
}
func NewOrganizationAdminHandler(orgHandler *OrganizationHandler, verificationService *service.VerificationService) *OrganizationAdminHandler {
return &OrganizationAdminHandler{
orgHandler: orgHandler,
verificationService: verificationService,
}
}
// GetVerificationQueue returns organizations pending verification (admin only)
// @Summary Get verification queue
// @Tags admin
// @Produce json
// @Param status query string false "Filter by status"
// @Param dataType query string false "Filter by data type"
// @Param organizationId query string false "Filter by organization ID"
// @Success 200 {object} map[string]interface{}
// @Router /api/v1/admin/organizations/verification-queue [get]
func (h *OrganizationAdminHandler) GetVerificationQueue(c *gin.Context) {
filters := service.VerificationQueueFilters{}
if statusStr := c.Query("status"); statusStr != "" {
status := domain.VerificationStatus(statusStr)
filters.Status = &status
}
if dataType := c.Query("dataType"); dataType != "" {
filters.DataType = &dataType
}
if orgID := c.Query("organizationId"); orgID != "" {
filters.OrganizationID = &orgID
}
queue, err := h.verificationService.GetVerificationQueue(c.Request.Context(), filters)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"queue": queue})
}
// VerifyOrganization verifies an organization (admin only)
// @Summary Verify organization
// @Tags admin
// @Accept json
// @Produce json
// @Param id path string true "Organization ID"
// @Param request body VerifyOrganizationRequest true "Verification request"
// @Success 200 {object} map[string]string
// @Router /api/v1/admin/organizations/:id/verify [post]
func (h *OrganizationAdminHandler) VerifyOrganization(c *gin.Context) {
orgID := c.Param("id")
var req VerifyOrganizationRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
userID, _ := c.Get("user_id")
verifiedBy := userID.(string)
if err := h.verificationService.VerifyOrganization(c.Request.Context(), orgID, verifiedBy, req.Notes); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Organization verified"})
}
type VerifyOrganizationRequest struct {
Notes string `json:"notes"`
}
// RejectVerification rejects an organization verification (admin only)
// @Summary Reject verification
// @Tags admin
// @Accept json
// @Produce json
// @Param id path string true "Organization ID"
// @Param request body RejectVerificationRequest true "Rejection request"
// @Success 200 {object} map[string]string
// @Router /api/v1/admin/organizations/:id/reject [post]
func (h *OrganizationAdminHandler) RejectVerification(c *gin.Context) {
orgID := c.Param("id")
var req RejectVerificationRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := h.verificationService.RejectVerification(c.Request.Context(), orgID, req.Reason, req.Notes); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Verification rejected"})
}
type RejectVerificationRequest struct {
Reason string `json:"reason" binding:"required"`
Notes string `json:"notes"`
}
// BulkVerify verifies multiple organizations (admin only)
// @Summary Bulk verify organizations
// @Tags admin
// @Accept json
// @Produce json
// @Param request body BulkVerifyRequest true "Bulk verify request"
// @Success 200 {object} map[string]string
// @Router /api/v1/admin/organizations/bulk-verify [post]
func (h *OrganizationAdminHandler) BulkVerify(c *gin.Context) {
var req BulkVerifyRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
userID, _ := c.Get("user_id")
verifiedBy := userID.(string)
if err := h.verificationService.BulkVerify(c.Request.Context(), req.OrganizationIDs, verifiedBy); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Organizations verified"})
}
type BulkVerifyRequest struct {
OrganizationIDs []string `json:"organizationIds" binding:"required"`
}
// GetOrganizationStats returns organization statistics (admin only)
// @Summary Get organization statistics
// @Tags admin
// @Produce json
// @Success 200 {object} map[string]interface{}
// @Router /api/v1/admin/organizations/stats [get]
func (h *OrganizationAdminHandler) GetOrganizationStats(c *gin.Context) {
// TODO: Implement organization statistics
c.JSON(http.StatusOK, gin.H{
"total": 0,
"verified": 0,
"pending": 0,
"unverified": 0,
"new_this_month": 0,
})
}