tg_user_bind.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package app
  2. import (
  3. "time"
  4. "github.com/demdxx/gocast"
  5. "github.com/gin-gonic/gin"
  6. "go_server/model/biz_modules/app"
  7. "go_server/model/common/response"
  8. "go_server/service/base"
  9. )
  10. type TgUserBindService struct {
  11. base.BizCommonService
  12. }
  13. // Find 查询用户绑定列表
  14. func (s *TgUserBindService) Find(c *gin.Context) {
  15. s.SetDbAlias("app")
  16. type request[T any] struct {
  17. base.ListRequest[T]
  18. UserId *int64 `form:"user_id" json:"user_id"`
  19. TelegramId *int64 `form:"telegram_id" json:"telegram_id"`
  20. TelegramUsername string `form:"telegram_username" json:"telegram_username"`
  21. BindStatus *int `form:"bind_status" json:"bind_status"`
  22. }
  23. req := new(request[app.TgUserBind])
  24. if err := c.BindQuery(req); err != nil {
  25. response.Resp(c, err.Error())
  26. return
  27. }
  28. db := s.DB()
  29. // 条件筛选
  30. if req.UserId != nil && *req.UserId != 0 {
  31. db = db.Where("user_id = ?", *req.UserId)
  32. }
  33. if req.TelegramId != nil && *req.TelegramId != 0 {
  34. db = db.Where("telegram_id = ?", *req.TelegramId)
  35. }
  36. if req.TelegramUsername != "" {
  37. db = db.Where("telegram_username LIKE ?", "%"+req.TelegramUsername+"%")
  38. }
  39. if req.BindStatus != nil {
  40. db = db.Where("bind_status = ?", *req.BindStatus)
  41. }
  42. // 按创建时间倒序
  43. db = db.Order("created_at DESC")
  44. resp, err := base.NewQueryBaseHandler(app.NewTgUserBind()).List(db, req)
  45. if err != nil {
  46. response.Resp(c, err.Error())
  47. return
  48. }
  49. response.Resp(c, resp)
  50. }
  51. // Get 获取用户绑定详情
  52. func (s *TgUserBindService) Get(c *gin.Context) {
  53. s.SetDbAlias("app")
  54. base.NewBaseHandler(app.NewTgUserBind()).Get(c, s.DB())
  55. }
  56. // Create 创建用户绑定
  57. func (s *TgUserBindService) Create(c *gin.Context) {
  58. s.SetDbAlias("app")
  59. type request struct {
  60. UserId interface{} `json:"userId"`
  61. TelegramId interface{} `json:"telegramId"`
  62. TelegramUsername string `json:"telegramUsername"`
  63. TelegramFirstName string `json:"telegramFirstName"`
  64. }
  65. req := new(request)
  66. if err := c.BindJSON(req); err != nil {
  67. response.Resp(c, err.Error())
  68. return
  69. }
  70. userId := gocast.ToInt64(req.UserId)
  71. telegramId := gocast.ToInt64(req.TelegramId)
  72. // 验证必填字段
  73. if userId == 0 {
  74. response.Resp(c, "平台用户ID不能为空")
  75. return
  76. }
  77. if req.TelegramUsername == "" {
  78. response.Resp(c, "Telegram用户名不能为空")
  79. return
  80. }
  81. // 检查是否已绑定
  82. var count int64
  83. s.DB().Model(&app.TgUserBind{}).Where("telegram_username = ? AND bind_status = 1", req.TelegramUsername).Count(&count)
  84. if count > 0 {
  85. response.Resp(c, "该Telegram用户名已被绑定")
  86. return
  87. }
  88. // 检查 UserId 是否已绑定
  89. s.DB().Model(&app.TgUserBind{}).Where("user_id = ? AND bind_status = 1", userId).Count(&count)
  90. if count > 0 {
  91. response.Resp(c, "该平台用户已绑定其他Telegram账号")
  92. return
  93. }
  94. now := time.Now()
  95. bind := &app.TgUserBind{
  96. UserId: userId,
  97. TelegramId: telegramId,
  98. TelegramUsername: req.TelegramUsername,
  99. TelegramFirstName: req.TelegramFirstName,
  100. BindStatus: 1,
  101. BindTime: now,
  102. CreatedAt: now.Unix(),
  103. UpdatedAt: now.Unix(),
  104. }
  105. if err := s.DB().Create(bind).Error; err != nil {
  106. response.Resp(c, err.Error())
  107. return
  108. }
  109. response.Resp(c, bind)
  110. }
  111. // Update 更新用户绑定
  112. func (s *TgUserBindService) Update(c *gin.Context) {
  113. s.SetDbAlias("app")
  114. type request struct {
  115. Id int64 `json:"id" binding:"required"`
  116. UserId interface{} `json:"userId"`
  117. TelegramId interface{} `json:"telegramId"`
  118. TelegramUsername string `json:"telegramUsername"`
  119. TelegramFirstName string `json:"telegramFirstName"`
  120. BindStatus *int `json:"bindStatus"`
  121. }
  122. req := new(request)
  123. if err := c.BindJSON(req); err != nil {
  124. response.Resp(c, err.Error())
  125. return
  126. }
  127. bind, ok := base.GetOne[app.TgUserBind](s.DB(), "id", req.Id)
  128. if !ok {
  129. response.Resp(c, "绑定记录不存在")
  130. return
  131. }
  132. userId := gocast.ToInt64(req.UserId)
  133. telegramId := gocast.ToInt64(req.TelegramId)
  134. // 更新字段
  135. updates := make(map[string]interface{})
  136. if userId != 0 {
  137. updates["user_id"] = userId
  138. }
  139. if telegramId != 0 {
  140. updates["telegram_id"] = telegramId
  141. }
  142. if req.TelegramUsername != "" {
  143. updates["telegram_username"] = req.TelegramUsername
  144. }
  145. if req.TelegramFirstName != "" {
  146. updates["telegram_first_name"] = req.TelegramFirstName
  147. }
  148. if req.BindStatus != nil {
  149. updates["bind_status"] = *req.BindStatus
  150. }
  151. updates["updated_at"] = time.Now().Unix()
  152. if err := s.DB().Model(&bind).Updates(updates).Error; err != nil {
  153. response.Resp(c, err.Error())
  154. return
  155. }
  156. response.Resp(c)
  157. }
  158. // Delete 删除用户绑定(软删除:修改状态为已解绑)
  159. func (s *TgUserBindService) Delete(c *gin.Context) {
  160. s.SetDbAlias("app")
  161. id, ok := c.GetQuery("id")
  162. if !ok {
  163. response.Resp(c, "未填写ID")
  164. return
  165. }
  166. bindId := gocast.ToInt64(id)
  167. if bindId == 0 {
  168. response.Resp(c, "ID无效")
  169. return
  170. }
  171. bind, ok := base.GetOne[app.TgUserBind](s.DB(), "id", bindId)
  172. if !ok {
  173. response.Resp(c, "绑定记录不存在")
  174. return
  175. }
  176. // 软删除:状态改为0(已解绑)
  177. updates := map[string]interface{}{
  178. "bind_status": 0,
  179. "updated_at": time.Now().Unix(),
  180. }
  181. if err := s.DB().Model(&bind).Updates(updates).Error; err != nil {
  182. response.Resp(c, err.Error())
  183. return
  184. }
  185. response.Resp(c)
  186. }