wx_safe_change.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package wechat
  2. import (
  3. "context"
  4. "wechat-api/ent"
  5. "wechat-api/ent/agent"
  6. "wechat-api/ent/contact"
  7. "wechat-api/ent/label"
  8. "wechat-api/ent/labelrelationship"
  9. "wechat-api/ent/wx"
  10. )
  11. type WxSafeChange struct {
  12. Ctx context.Context
  13. Tx *ent.Tx
  14. WxId string
  15. OrganizationId uint64
  16. }
  17. func (w *WxSafeChange) KeepAllSafe() error {
  18. err := w.BlockListSafe()
  19. if err != nil {
  20. return err
  21. }
  22. err = w.AgentSafe()
  23. if err != nil {
  24. return err
  25. }
  26. err = w.LabelSafe()
  27. if err != nil {
  28. return err
  29. }
  30. return nil
  31. }
  32. func (w *WxSafeChange) BlockListSafe() error {
  33. wxinfo, err := w.Tx.Wx.Query().
  34. Where(
  35. wx.Wxid(w.WxId),
  36. ).
  37. Only(w.Ctx)
  38. if err != nil {
  39. if ent.IsNotFound(err) {
  40. return nil
  41. }
  42. return err
  43. }
  44. bl := []string{}
  45. if wxinfo == nil {
  46. return nil
  47. }
  48. for _, l := range wxinfo.BlockList {
  49. if l != "" && l != "ALL" {
  50. bl = append(bl, l)
  51. }
  52. }
  53. for _, l := range wxinfo.GroupBlockList {
  54. if l != "" && l != "ALL" {
  55. bl = append(bl, l)
  56. }
  57. }
  58. for _, l := range wxinfo.AllowList {
  59. if l != "" && l != "ALL" {
  60. bl = append(bl, l)
  61. }
  62. }
  63. for _, l := range wxinfo.GroupAllowList {
  64. if l != "" && l != "ALL" {
  65. bl = append(bl, l)
  66. }
  67. }
  68. contactList, err := w.Tx.Contact.Query().
  69. Where(
  70. contact.WxWxidNEQ(w.WxId),
  71. contact.WxidIn(bl...),
  72. ).All(w.Ctx)
  73. if err != nil && !ent.IsNotFound(err) {
  74. return err
  75. }
  76. if contactList != nil {
  77. _, err = w.Tx.Wx.UpdateOneID(wxinfo.ID).
  78. SetBlockList([]string{}).
  79. SetGroupBlockList([]string{}).
  80. SetAllowList([]string{"ALL"}).
  81. SetGroupAllowList([]string{"ALL"}).
  82. Save(w.Ctx)
  83. if err != nil {
  84. return err
  85. }
  86. }
  87. return nil
  88. }
  89. func (w *WxSafeChange) AgentSafe() error {
  90. wxinfo, err := w.Tx.Wx.Query().
  91. Where(
  92. wx.Wxid(w.WxId),
  93. wx.HasAgentWith(
  94. agent.DeletedAtIsNil(),
  95. agent.OrganizationIDNEQ(w.OrganizationId),
  96. ),
  97. ).
  98. WithAgent().
  99. Only(w.Ctx)
  100. if err != nil {
  101. if ent.IsNotFound(err) {
  102. return nil
  103. }
  104. return err
  105. }
  106. if wxinfo != nil && wxinfo.Edges.Agent != nil {
  107. _, err = w.Tx.Wx.UpdateOneID(wxinfo.ID).
  108. SetAgentID(0).
  109. Save(w.Ctx)
  110. if err != nil {
  111. return err
  112. }
  113. }
  114. return nil
  115. }
  116. func (w *WxSafeChange) LabelSafe() error {
  117. // 获取现有联系人的所有标签名称
  118. contactLabelNames, err := w.Tx.Label.Query().
  119. Where(
  120. label.DeletedAtIsNil(),
  121. label.HasLabelRelationshipsWith(
  122. labelrelationship.DeletedAtIsNil(),
  123. labelrelationship.HasContactsWith(
  124. contact.WxWxidEQ(w.WxId),
  125. ),
  126. ),
  127. ).
  128. Select(label.FieldName).
  129. Strings(w.Ctx)
  130. if err != nil {
  131. if ent.IsNotFound(err) {
  132. return nil
  133. }
  134. return err
  135. }
  136. newLabelNames, err := w.Tx.Label.Query().
  137. Where(
  138. label.DeletedAtIsNil(),
  139. label.OrganizationIDEQ(w.OrganizationId),
  140. label.NameNotIn(contactLabelNames...),
  141. ).
  142. Select(label.FieldName).
  143. Strings(w.Ctx)
  144. if err != nil && !ent.IsNotFound(err) {
  145. return err
  146. }
  147. if newLabelNames == nil && len(newLabelNames) > 0 {
  148. // 创建新标签
  149. for _, labelName := range newLabelNames {
  150. _, err = w.Tx.Label.Create().
  151. SetName(labelName).
  152. SetOrganizationID(w.OrganizationId).
  153. Save(w.Ctx)
  154. if err != nil {
  155. return err
  156. }
  157. }
  158. }
  159. // 建立新的标签 id 映射关系
  160. orgLabels, err := w.Tx.Label.Query().
  161. Where(
  162. label.DeletedAtIsNil(),
  163. label.OrganizationIDEQ(w.OrganizationId),
  164. label.NameIn(contactLabelNames...),
  165. ).
  166. Select(label.FieldID, label.FieldName).
  167. All(w.Ctx)
  168. if err != nil {
  169. return err
  170. }
  171. labelSet := make(map[string]uint64)
  172. for _, l := range orgLabels {
  173. labelSet[l.Name] = l.ID
  174. }
  175. // 建立新的标签关系
  176. labelRelationships, err := w.Tx.LabelRelationship.Query().
  177. Where(
  178. labelrelationship.DeletedAtIsNil(),
  179. labelrelationship.HasContactsWith(
  180. contact.WxWxidEQ(w.WxId),
  181. ),
  182. ).WithLabels().WithContacts().All(w.Ctx)
  183. if err != nil {
  184. return err
  185. }
  186. for _, relationship := range labelRelationships {
  187. _, err = w.Tx.LabelRelationship.Create().
  188. SetLabelID(labelSet[relationship.Edges.Labels.Name]).
  189. SetContactID(relationship.Edges.Contacts.ID).
  190. Save(w.Ctx)
  191. if err != nil {
  192. return err
  193. }
  194. }
  195. // 删除旧的标签关系
  196. _, err = w.Tx.LabelRelationship.Delete().
  197. Where(
  198. labelrelationship.DeletedAtIsNil(),
  199. labelrelationship.HasLabelsWith(
  200. label.OrganizationIDNEQ(w.OrganizationId)),
  201. labelrelationship.HasContactsWith(
  202. contact.WxWxidEQ(w.WxId),
  203. ),
  204. ).Exec(w.Ctx)
  205. if err != nil {
  206. return err
  207. }
  208. return nil
  209. }