msg_repo.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package repositories
  2. import (
  3. "fmt"
  4. "time"
  5. "xorm.io/xorm"
  6. "xps/datamodels"
  7. "xps/viewmodels"
  8. )
  9. type MsgRepo struct {
  10. engine *xorm.Engine
  11. }
  12. func NewMsgRepo(engine *xorm.Engine) *MsgRepo {
  13. return &MsgRepo{
  14. engine: engine,
  15. }
  16. }
  17. func (d *MsgRepo) GetPage(m map[string]interface{}) (*viewmodels.PageResult, error) {
  18. limit := m["limit"].(int)
  19. page := m["page"].(int)
  20. sqlSelect := ` SELECT M.oc_id,
  21. M.msg_id,
  22. M.msg_fr_id,
  23. A.account_name AS msg_fr_name,
  24. A.account_real_name AS msg_fr_real_name,
  25. A.account_avatar AS msg_fr_avatar,
  26. M.msg_to_group,
  27. M.msg_cc,
  28. M.msg_to,
  29. M.msg_content,
  30. M.msg_detail,
  31. M.msg_cat_id,
  32. MC.msg_cat_title,
  33. MC.is_link,
  34. MC.msg_cat_link,
  35. MC.msg_cat_link_params,
  36. M.msg_params,
  37. MC.is_detailed,
  38. M.status,
  39. M.msg_time `
  40. sqlFrom := ` FROM msg AS M
  41. LEFT JOIN account AS A ON (M.oc_id = A.oc_id AND M.msg_fr_id = A.account_id)
  42. LEFT JOIN msg_to AS B ON (M.oc_id = B.oc_id AND M.msg_id = B.msg_id AND B.msg_to_id=#{msgToCc, jdbcType=BIGINT})
  43. LEFT JOIN msg_cc AS C ON (M.oc_id = C.oc_id AND M.msg_id = C.msg_id AND C.msg_cc_id=#{msgToCc, jdbcType=BIGINT})
  44. LEFT JOIN msg_cat AS MC ON (MC.msg_cat_id = M.msg_cat_id) `
  45. sqlWhere := ` WHERE A.deleted_flag = 0 `
  46. if ocId, ok := m["ocId"]; ok {
  47. sqlWhere += fmt.Sprintf(" AND M.oc_id = %d", ocId)
  48. }
  49. if msgFrId, ok := m["msgFrId"]; ok {
  50. sqlWhere += fmt.Sprintf(" AND M.msg_fr_id = %d ", msgFrId)
  51. }
  52. if msgToCc, ok := m["msgToCc"]; ok {
  53. sqlWhere += `
  54. AND (
  55. EXISTS (
  56. SELECT 1 FROM msg_to TT
  57. WHERE M.oc_id = TT.oc_id AND M.msg_id = TT.msg_id AND TT.msg_to_id = ` + fmt.Sprintf("%d", msgToCc)
  58. sqlWhere += `
  59. ) OR
  60. EXISTS (
  61. SELECT 1 FROM msg_cc CC
  62. WHERE M.oc_id = CC.oc_id AND M.msg_id = CC.msg_id AND CC.msg_cc_id = ` + fmt.Sprintf("%d", msgToCc)
  63. sqlWhere += `
  64. )
  65. ) `
  66. }
  67. sqlCount := ` SELECT COUNT(*) `
  68. total, err1 := d.engine.SQL(sqlCount + sqlFrom + sqlWhere).Count(new(datamodels.Msg))
  69. if err1 != nil {
  70. return nil, err1
  71. }
  72. sqlOrderBy := " BY M.created_at DESC "
  73. pageStart := (page - 1) * limit
  74. sqlLimit := fmt.Sprintf(" LIMIT %d OFFSET %d ", limit, pageStart)
  75. datalist := make([]datamodels.Msg, 0)
  76. err2 := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy + sqlLimit).Find(&datalist)
  77. if err2 != nil {
  78. return nil, err2
  79. }
  80. pageResult := &viewmodels.PageResult{}
  81. pageResult.Data = datalist
  82. pageResult.Total = total
  83. pageResult.PageSize = limit
  84. pageResult.Page = page
  85. return pageResult, nil
  86. }
  87. func (d *MsgRepo) GetList(m map[string]interface{}) ([]viewmodels.MsgInfo, error) {
  88. sqlSelect := ` SELECT M.oc_id,
  89. M.msg_id,
  90. M.msg_fr_id,
  91. A.account_name AS msg_fr_name,
  92. A.account_real_name AS msg_fr_real_name,
  93. A.account_avatar AS msg_fr_avatar,
  94. M.msg_to_group,
  95. M.msg_cc,
  96. M.msg_to,
  97. M.msg_content,
  98. M.msg_detail,
  99. M.msg_cat_id,
  100. MC.msg_cat_title,
  101. MC.is_link,
  102. MC.msg_cat_link,
  103. MC.msg_cat_link_params,
  104. M.msg_params,
  105. MC.is_detailed,
  106. M.status,
  107. M.msg_time `
  108. sqlFrom := ` FROM msg AS M
  109. LEFT JOIN account AS A ON (M.oc_id = A.oc_id AND M.msg_fr_id = A.account_id)
  110. LEFT JOIN msg_to AS B ON (M.oc_id = B.oc_id AND M.msg_id = B.msg_id AND B.msg_to_id=#{msgToCc, jdbcType=BIGINT})
  111. LEFT JOIN msg_cc AS C ON (M.oc_id = C.oc_id AND M.msg_id = C.msg_id AND C.msg_cc_id=#{msgToCc, jdbcType=BIGINT})
  112. LEFT JOIN msg_cat AS MC ON (MC.msg_cat_id = M.msg_cat_id) `
  113. sqlWhere := ` WHERE A.deleted_flag = 0 `
  114. if ocId, ok := m["ocId"]; ok {
  115. sqlWhere += fmt.Sprintf(" AND M.oc_id = %d", ocId)
  116. }
  117. if msgFrId, ok := m["msgFrId"]; ok {
  118. sqlWhere += fmt.Sprintf(" AND M.msg_fr_id = %d ", msgFrId)
  119. }
  120. if msgToCc, ok := m["msgToCc"]; ok {
  121. sqlWhere += `
  122. AND (
  123. EXISTS (
  124. SELECT 1 FROM msg_to TT
  125. WHERE M.oc_id = TT.oc_id AND M.msg_id = TT.msg_id AND TT.msg_to_id = ` + fmt.Sprintf("%d", msgToCc)
  126. sqlWhere += `
  127. ) OR
  128. EXISTS (
  129. SELECT 1 FROM msg_cc CC
  130. WHERE M.oc_id = CC.oc_id AND M.msg_id = CC.msg_id AND CC.msg_cc_id = ` + fmt.Sprintf("%d", msgToCc)
  131. sqlWhere += `
  132. )
  133. ) `
  134. }
  135. sqlOrderBy := " ORDER BY M.created_at DESC "
  136. datalist := make([]viewmodels.MsgInfo, 0)
  137. err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy).Find(&datalist)
  138. if err != nil {
  139. return nil, err
  140. } else {
  141. return datalist, nil
  142. }
  143. }
  144. func (d *MsgRepo) GetById(ocId, msgId int64) (*viewmodels.MsgInfo, error) {
  145. sqlSelect := ` SELECT M.oc_id,
  146. M.msg_id,
  147. M.msg_fr_id,
  148. A.account_name AS msg_fr_name,
  149. A.account_real_name AS msg_fr_real_name,
  150. A.account_avatar AS msg_fr_avatar,
  151. M.msg_to_group,
  152. M.msg_cc,
  153. M.msg_to,
  154. M.msg_content,
  155. M.msg_detail,
  156. M.msg_cat_id,
  157. MC.msg_cat_title,
  158. MC.is_link,
  159. MC.msg_cat_link,
  160. MC.msg_cat_link_params,
  161. M.msg_params,
  162. MC.is_detailed,
  163. M.status,
  164. M.msg_time `
  165. sqlFrom := ` FROM msg AS M
  166. LEFT JOIN account AS A ON (M.oc_id = A.oc_id AND M.msg_fr_id = A.account_id)
  167. LEFT JOIN msg_to AS B ON (M.oc_id = B.oc_id AND M.msg_id = B.msg_id AND B.msg_to_id=#{msgToCc, jdbcType=BIGINT})
  168. LEFT JOIN msg_cc AS C ON (M.oc_id = C.oc_id AND M.msg_id = C.msg_id AND C.msg_cc_id=#{msgToCc, jdbcType=BIGINT})
  169. LEFT JOIN msg_cat AS MC ON (MC.msg_cat_id = M.msg_cat_id) `
  170. sqlWhere := ` WHERE A.deleted_flag = 0 `
  171. sqlWhere += fmt.Sprintf(" AND A.oc_id = %d ", ocId)
  172. sqlWhere += fmt.Sprintf(" AND A.msg_id = %d ", msgId)
  173. data := &viewmodels.MsgInfo{}
  174. has, err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere).Get(data)
  175. if !has || err != nil {
  176. return nil, err
  177. } else {
  178. return data, nil
  179. }
  180. }
  181. func (d *MsgRepo) Create(data *datamodels.Msg) error {
  182. data.CreatedAt = time.Now()
  183. _, err := d.engine.Insert(data)
  184. return err
  185. }
  186. func (d *MsgRepo) Update(data *datamodels.Msg) error {
  187. msgCatId := data.MsgId
  188. data.UpdatedAt = time.Now()
  189. _, err := d.engine.Where("msg_cat_id = ?", msgCatId).Update(data)
  190. return err
  191. }
  192. func (d *MsgRepo) Delete(m map[string]interface{}) error {
  193. ocId := m["ocId"].(int64)
  194. msgId := m["msgId"].(int64)
  195. deletedBy := m["deletedBy"].(int64)
  196. data := &datamodels.Msg{}
  197. data.DeletedFlag = 1
  198. data.DeletedBy = deletedBy
  199. data.DeletedAt = time.Now()
  200. _, err := d.engine.
  201. Where("oc_id = ?", ocId).
  202. Where("msg_id = ?", msgId).
  203. Update(data)
  204. return err
  205. }
  206. func (d *MsgRepo) GetUnReadCount(ocId, msgToCc int64) int {
  207. return 0
  208. }