mirror of
https://github.com/SamyRai/turash.git
synced 2025-12-26 23:01:33 +00:00
167 lines
5.1 KiB
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,
|
|
})
|
|
}
|