329 lines
8.8 KiB
Go
329 lines
8.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"gauth-central/internal/models"
|
|
"gauth-central/internal/services"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type SettingsHandler struct {
|
|
settingsService *services.SettingsService
|
|
}
|
|
|
|
func NewSettingsHandler(settingsService *services.SettingsService) *SettingsHandler {
|
|
return &SettingsHandler{
|
|
settingsService: settingsService,
|
|
}
|
|
}
|
|
|
|
// ==================== CORS WHITELIST ====================
|
|
|
|
// GetAllWhitelist godoc
|
|
// @Summary Get all CORS whitelist entries
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Produce json
|
|
// @Success 200 {array} models.CorsWhitelist
|
|
// @Router /settings/cors/whitelist [get]
|
|
func (h *SettingsHandler) GetAllWhitelist(c *gin.Context) {
|
|
whitelists, err := h.settingsService.GetAllCorsWhitelist()
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch whitelist"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, whitelists)
|
|
}
|
|
|
|
// CreateWhitelist godoc
|
|
// @Summary Create CORS whitelist entry
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param whitelist body object true "Whitelist data"
|
|
// @Success 201 {object} models.CorsWhitelist
|
|
// @Router /settings/cors/whitelist [post]
|
|
func (h *SettingsHandler) CreateWhitelist(c *gin.Context) {
|
|
var input struct {
|
|
Origin string `json:"origin" binding:"required"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
email := c.GetString("email")
|
|
whitelist := &models.CorsWhitelist{
|
|
Origin: input.Origin,
|
|
Description: input.Description,
|
|
IsActive: true,
|
|
CreatedBy: email,
|
|
}
|
|
|
|
err := h.settingsService.CreateCorsWhitelist(whitelist)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create whitelist entry"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusCreated, whitelist)
|
|
}
|
|
|
|
// UpdateWhitelist godoc
|
|
// @Summary Update CORS whitelist entry
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "Whitelist ID"
|
|
// @Param whitelist body object true "Update data"
|
|
// @Success 200 {object} map[string]interface{}
|
|
// @Router /settings/cors/whitelist/{id} [put]
|
|
func (h *SettingsHandler) UpdateWhitelist(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
var input struct {
|
|
Origin *string `json:"origin"`
|
|
Description *string `json:"description"`
|
|
IsActive *bool `json:"is_active"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
updates := make(map[string]interface{})
|
|
if input.Origin != nil {
|
|
updates["origin"] = *input.Origin
|
|
}
|
|
if input.Description != nil {
|
|
updates["description"] = *input.Description
|
|
}
|
|
if input.IsActive != nil {
|
|
updates["is_active"] = *input.IsActive
|
|
}
|
|
|
|
err := h.settingsService.UpdateCorsWhitelist(id, updates)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update whitelist entry"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Whitelist updated successfully"})
|
|
}
|
|
|
|
// DeleteWhitelist godoc
|
|
// @Summary Delete CORS whitelist entry
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Param id path string true "Whitelist ID"
|
|
// @Success 200 {object} map[string]interface{}
|
|
// @Router /settings/cors/whitelist/{id} [delete]
|
|
func (h *SettingsHandler) DeleteWhitelist(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
err := h.settingsService.DeleteCorsWhitelist(id)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete whitelist entry"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Whitelist entry deleted successfully"})
|
|
}
|
|
|
|
// ==================== CORS BLACKLIST ====================
|
|
|
|
// GetAllBlacklist godoc
|
|
// @Summary Get all CORS blacklist entries
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Produce json
|
|
// @Success 200 {array} models.CorsBlacklist
|
|
// @Router /settings/cors/blacklist [get]
|
|
func (h *SettingsHandler) GetAllBlacklist(c *gin.Context) {
|
|
blacklists, err := h.settingsService.GetAllCorsBlacklist()
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch blacklist"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, blacklists)
|
|
}
|
|
|
|
// CreateBlacklist godoc
|
|
// @Summary Create CORS blacklist entry
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param blacklist body object true "Blacklist data"
|
|
// @Success 201 {object} models.CorsBlacklist
|
|
// @Router /settings/cors/blacklist [post]
|
|
func (h *SettingsHandler) CreateBlacklist(c *gin.Context) {
|
|
var input struct {
|
|
Origin string `json:"origin" binding:"required"`
|
|
Reason string `json:"reason"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
email := c.GetString("email")
|
|
blacklist := &models.CorsBlacklist{
|
|
Origin: input.Origin,
|
|
Reason: input.Reason,
|
|
IsActive: true,
|
|
CreatedBy: email,
|
|
}
|
|
|
|
err := h.settingsService.CreateCorsBlacklist(blacklist)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create blacklist entry"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusCreated, blacklist)
|
|
}
|
|
|
|
// UpdateBlacklist godoc
|
|
// @Summary Update CORS blacklist entry
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "Blacklist ID"
|
|
// @Param blacklist body object true "Update data"
|
|
// @Success 200 {object} map[string]interface{}
|
|
// @Router /settings/cors/blacklist/{id} [put]
|
|
func (h *SettingsHandler) UpdateBlacklist(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
var input struct {
|
|
Origin *string `json:"origin"`
|
|
Reason *string `json:"reason"`
|
|
IsActive *bool `json:"is_active"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
updates := make(map[string]interface{})
|
|
if input.Origin != nil {
|
|
updates["origin"] = *input.Origin
|
|
}
|
|
if input.Reason != nil {
|
|
updates["reason"] = *input.Reason
|
|
}
|
|
if input.IsActive != nil {
|
|
updates["is_active"] = *input.IsActive
|
|
}
|
|
|
|
err := h.settingsService.UpdateCorsBlacklist(id, updates)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update blacklist entry"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Blacklist updated successfully"})
|
|
}
|
|
|
|
// DeleteBlacklist godoc
|
|
// @Summary Delete CORS blacklist entry
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Param id path string true "Blacklist ID"
|
|
// @Success 200 {object} map[string]interface{}
|
|
// @Router /settings/cors/blacklist/{id} [delete]
|
|
func (h *SettingsHandler) DeleteBlacklist(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
err := h.settingsService.DeleteCorsBlacklist(id)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete blacklist entry"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Blacklist entry deleted successfully"})
|
|
}
|
|
|
|
// ==================== RATE LIMIT SETTINGS ====================
|
|
|
|
// GetAllRateLimits godoc
|
|
// @Summary Get all rate limit settings
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Produce json
|
|
// @Success 200 {array} models.RateLimitSetting
|
|
// @Router /settings/ratelimit [get]
|
|
func (h *SettingsHandler) GetAllRateLimits(c *gin.Context) {
|
|
settings, err := h.settingsService.GetAllRateLimitSettings()
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch rate limit settings"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, settings)
|
|
}
|
|
|
|
// UpdateRateLimit godoc
|
|
// @Summary Update rate limit setting
|
|
// @Tags Settings
|
|
// @Security ApiKeyAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "Setting ID"
|
|
// @Param setting body object true "Update data"
|
|
// @Success 200 {object} map[string]interface{}
|
|
// @Router /settings/ratelimit/{id} [put]
|
|
func (h *SettingsHandler) UpdateRateLimit(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
var input struct {
|
|
MaxRequests *int64 `json:"max_requests"`
|
|
WindowSeconds *int `json:"window_seconds"`
|
|
Description *string `json:"description"`
|
|
IsActive *bool `json:"is_active"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
email := c.GetString("email")
|
|
updates := make(map[string]interface{})
|
|
|
|
if input.MaxRequests != nil {
|
|
updates["max_requests"] = *input.MaxRequests
|
|
}
|
|
if input.WindowSeconds != nil {
|
|
updates["window_seconds"] = *input.WindowSeconds
|
|
}
|
|
if input.Description != nil {
|
|
updates["description"] = *input.Description
|
|
}
|
|
if input.IsActive != nil {
|
|
updates["is_active"] = *input.IsActive
|
|
}
|
|
updates["updated_by"] = email
|
|
|
|
err := h.settingsService.UpdateRateLimitSetting(id, updates)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update rate limit setting"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Rate limit setting updated successfully"})
|
|
}
|