package controllers import ( "time" "server/models" beego "github.com/beego/beego/v2/server/web" ) type ApiReminderController struct { beego.Controller } // AckReminder GET /api/schedule/reminder/ack // 邮件/Bark 客户端访问此接口进行提醒确认 func (c *ApiReminderController) AckReminder() { token := c.GetString("token") if token == "" { c.Ctx.Output.SetStatus(400) _ = c.Ctx.Output.Body([]byte("Invalid request: missing token")) return } var reminder models.PlatformScheduleReminder err := models.Orm.QueryTable(new(models.PlatformScheduleReminder)). Filter("ack_token", token). Filter("is_deleted", 0). One(&reminder) if err != nil { c.Ctx.Output.SetStatus(404) _ = c.Ctx.Output.Body([]byte("Error: reminder task not found or token has expired")) return } if reminder.AckStatus == 1 { // 已经确认过了,直接显示已确认成功的 HTML c.Ctx.Output.Header("Content-Type", "text/html; charset=utf-8") _ = c.Ctx.Output.Body([]byte(` 确认收到提醒

提示

该日程提醒在此之前已确认过了。

无需重复点击,感谢您的使用!

`)) return } // 更新确认状态为已确认,置 remind_status 为已结束(2) now := time.Now() reminder.AckStatus = 1 reminder.AckTime = &now reminder.RemindStatus = 2 reminder.UpdateTime = now _, err = models.Orm.Update(&reminder, "AckStatus", "AckTime", "RemindStatus", "UpdateTime") if err != nil { c.Ctx.Output.SetStatus(500) _ = c.Ctx.Output.Body([]byte("Database error, please try again later")) return } // 统一关闭该日程下的所有其他待提醒/提醒中渠道,防止重复打扰 _, _ = models.Orm.QueryTable(new(models.PlatformScheduleReminder)). Filter("ScheduleID", reminder.ScheduleID). Filter("RemindStatus__in", 0, 1). Update(map[string]interface{}{ "RemindStatus": int8(2), "UpdateTime": now, }) // 成功确认 c.Ctx.Output.Header("Content-Type", "text/html; charset=utf-8") _ = c.Ctx.Output.Body([]byte(` 确认成功

确认成功

您已成功确认收到该日程提醒!

系统已停止向您重复推送,感谢您的配合。

`)) }