package handlers import ( "net/http" "github.com/gin-gonic/gin" "mengyastore-backend/internal/storage" ) type MaintenancePayload struct { Maintenance bool `json:"maintenance"` Reason string `json:"reason"` } // SetMaintenance 设置站点维护模式。 // @Summary 设置全站维护模式 // @Description 打开维护后前台可展示原因文案;需管理令牌。请求体含 `maintenance` 布尔与可选 `reason`。 // @Tags 管理端-站点 // @Accept json // @Produce json // @Security AdminToken // @Param body body MaintenancePayload true "maintenance 与 reason" // @Success 200 {object} SwaggerMaintenanceWrap // @Failure 400 {object} SwaggerErrorBody // @Failure 401 {object} SwaggerErrorBody // @Failure 500 {object} SwaggerErrorBody // @Router /api/admin/site/maintenance [post] func (h *AdminHandler) SetMaintenance(c *gin.Context) { if !h.requireAdmin(c) { return } var payload MaintenancePayload if err := c.ShouldBindJSON(&payload); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数有误"}) return } if err := h.siteStore.SetMaintenance(payload.Maintenance, payload.Reason); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{ "data": gin.H{ "maintenance": payload.Maintenance, "reason": payload.Reason, }, }) } // GetSMTPConfig 获取 SMTP 配置(密码脱敏)。 // @Summary 获取发信 SMTP 配置(脱敏) // @Description 返回当前站点发件配置;密码字段以占位符脱敏显示,不会返回明文。 // @Tags 管理端-站点 // @Produce json // @Security AdminToken // @Success 200 {object} SwaggerSMTPWrap // @Failure 401 {object} SwaggerErrorBody // @Failure 500 {object} SwaggerErrorBody // @Router /api/admin/site/smtp [get] func (h *AdminHandler) GetSMTPConfig(c *gin.Context) { if !h.requireAdmin(c) { return } cfg, err := h.siteStore.GetSMTPConfig() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } // 响应中对密码脱敏处理 masked := cfg if masked.Password != "" { masked.Password = "••••••••" } c.JSON(http.StatusOK, gin.H{"data": masked}) } // SetSMTPConfig 保存 SMTP 配置。 // @Summary 保存发信 SMTP 配置 // @Description 写入 SMTP 主机、端口、账号等;若密码仍为脱敏占位符则保留库中已有密码(实现细节见服务逻辑)。 // @Tags 管理端-站点 // @Accept json // @Produce json // @Security AdminToken // @Param body body storage.SMTPConfig true "SMTP 连接与发件人信息" // @Success 200 {object} SwaggerStringOKBody // @Failure 400 {object} SwaggerErrorBody // @Failure 401 {object} SwaggerErrorBody // @Failure 500 {object} SwaggerErrorBody // @Router /api/admin/site/smtp [post] func (h *AdminHandler) SetSMTPConfig(c *gin.Context) { if !h.requireAdmin(c) { return } var payload storage.SMTPConfig if err := c.ShouldBindJSON(&payload); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数有误"}) return } // 若密码为脱敏占位符,则保留数据库中原有的密码 if payload.Password == "••••••••" { existing, _ := h.siteStore.GetSMTPConfig() payload.Password = existing.Password } if err := h.siteStore.SetSMTPConfig(payload); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"data": "ok"}) }