Auth2Account.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Package models .
  2. package models
  3. import (
  4. "errors"
  5. "github.com/mindoc-org/mindoc/utils/auth2"
  6. "time"
  7. "github.com/beego/beego/v2/client/orm"
  8. "github.com/beego/beego/v2/core/logs"
  9. "github.com/mindoc-org/mindoc/conf"
  10. )
  11. var (
  12. _ Auth2Account = (*WorkWeixinAccount)(nil)
  13. _ Auth2Account = (*DingTalkAccount)(nil)
  14. )
  15. type Auth2Account interface {
  16. ExistedMember(id string) (*Member, error)
  17. AddBind(o orm.Ormer, userInfo auth2.UserInfo, member *Member) error
  18. }
  19. func NewWorkWeixinAccount() *WorkWeixinAccount {
  20. return &WorkWeixinAccount{}
  21. }
  22. type WorkWeixinAccount struct {
  23. MemberId int `orm:"column(member_id);type(int);default(-1);index" json:"member_id"`
  24. UserDbId int `orm:"pk;auto;unique;column(user_db_id)" json:"user_db_id"`
  25. WorkWeixin_UserId string `orm:"size(100);unique;column(workweixin_user_id)" json:"workweixin_user_id"`
  26. // WorkWeixin_Name string `orm:"size(255);column(workweixin_name)" json:"workweixin_name"`
  27. // WorkWeixin_Phone string `orm:"size(25);column(workweixin_phone)" json:"workweixin_phone"`
  28. // WorkWeixin_Email string `orm:"size(255);column(workweixin_email)" json:"workweixin_email"`
  29. // WorkWeixin_Status int `orm:"type(int);column(status)" json:"status"`
  30. // WorkWeixin_Avatar string `orm:"size(1024);column(avatar)" json:"avatar"`
  31. CreateTime time.Time `orm:"type(datetime);column(create_time);auto_now_add" json:"create_time"`
  32. CreateAt int `orm:"type(int);column(create_at)" json:"create_at"`
  33. LastLoginTime time.Time `orm:"type(datetime);column(last_login_time);null" json:"last_login_time"`
  34. }
  35. // TableName 获取对应数据库表名.
  36. func (m *WorkWeixinAccount) TableName() string {
  37. return "workweixin_accounts"
  38. }
  39. // TableEngine 获取数据使用的引擎.
  40. func (m *WorkWeixinAccount) TableEngine() string {
  41. return "INNODB"
  42. }
  43. func (m *WorkWeixinAccount) TableNameWithPrefix() string {
  44. return conf.GetDatabasePrefix() + m.TableName()
  45. }
  46. func (m *WorkWeixinAccount) ExistedMember(workweixin_user_id string) (*Member, error) {
  47. o := orm.NewOrm()
  48. account := NewWorkWeixinAccount()
  49. member := NewMember()
  50. err := o.QueryTable(m.TableNameWithPrefix()).Filter("workweixin_user_id", workweixin_user_id).One(account)
  51. if err != nil {
  52. return member, err
  53. }
  54. member, err = member.Find(account.MemberId)
  55. if err != nil {
  56. return member, err
  57. }
  58. if member.Status != 0 {
  59. return member, errors.New("receive_account_disabled")
  60. }
  61. return member, nil
  62. }
  63. // AddBind 添加一个用户.
  64. func (m *WorkWeixinAccount) AddBind(o orm.Ormer, userInfo auth2.UserInfo, member *Member) error {
  65. tmpM := NewWorkWeixinAccount()
  66. err := o.QueryTable(m.TableNameWithPrefix()).Filter("workweixin_user_id", userInfo.UserId).One(tmpM)
  67. if err == nil {
  68. tmpM.MemberId = member.MemberId
  69. _, err = o.Update(tmpM)
  70. if err != nil {
  71. logs.Error("保存用户数据到数据时失败 =>", err)
  72. return errors.New("用户信息绑定失败, 数据库错误")
  73. }
  74. return nil
  75. }
  76. m.MemberId = member.MemberId
  77. m.WorkWeixin_UserId = userInfo.UserId
  78. if c, err := o.QueryTable(m.TableNameWithPrefix()).Filter("member_id", m.MemberId).Count(); err == nil && c > 0 {
  79. return errors.New("已绑定,不可重复绑定")
  80. }
  81. _, err = o.Insert(m)
  82. if err != nil {
  83. logs.Error("保存用户数据到数据时失败 =>", err)
  84. return errors.New("用户信息绑定失败, 数据库错误")
  85. }
  86. return nil
  87. }
  88. func NewDingTalkAccount() *DingTalkAccount {
  89. return &DingTalkAccount{}
  90. }
  91. type DingTalkAccount struct {
  92. MemberId int `orm:"column(member_id);type(int);default(-1);index" json:"member_id"`
  93. UserDbId int `orm:"pk;auto;unique;column(user_db_id)" json:"user_db_id"`
  94. Dingtalk_UserId string `orm:"size(100);unique;column(dingtalk_user_id)" json:"dingtalk_user_id"`
  95. CreateTime time.Time `orm:"type(datetime);column(create_time);auto_now_add" json:"create_time"`
  96. CreateAt int `orm:"type(int);column(create_at)" json:"create_at"`
  97. LastLoginTime time.Time `orm:"type(datetime);column(last_login_time);null" json:"last_login_time"`
  98. }
  99. // TableName 获取对应数据库表名.
  100. func (m *DingTalkAccount) TableName() string {
  101. return "dingtalk_accounts"
  102. }
  103. // TableEngine 获取数据使用的引擎.
  104. func (m *DingTalkAccount) TableEngine() string {
  105. return "INNODB"
  106. }
  107. func (m *DingTalkAccount) TableNameWithPrefix() string {
  108. return conf.GetDatabasePrefix() + m.TableName()
  109. }
  110. func (m *DingTalkAccount) ExistedMember(userid string) (*Member, error) {
  111. o := orm.NewOrm()
  112. account := NewDingTalkAccount()
  113. member := NewMember()
  114. err := o.QueryTable(m.TableNameWithPrefix()).Filter("dingtalk_user_id", userid).One(account)
  115. if err != nil {
  116. return member, err
  117. }
  118. member, err = member.Find(account.MemberId)
  119. if err != nil {
  120. return member, err
  121. }
  122. if member.Status != 0 {
  123. return member, errors.New("receive_account_disabled")
  124. }
  125. return member, nil
  126. }
  127. // AddBind 添加一个用户.
  128. func (m *DingTalkAccount) AddBind(o orm.Ormer, userInfo auth2.UserInfo, member *Member) error {
  129. tmpM := NewDingTalkAccount()
  130. err := o.QueryTable(m.TableNameWithPrefix()).Filter("dingtalk_user_id", userInfo.UserId).One(tmpM)
  131. if err == nil {
  132. tmpM.MemberId = member.MemberId
  133. _, err = o.Update(tmpM)
  134. if err != nil {
  135. logs.Error("保存用户数据到数据时失败 =>", err)
  136. return errors.New("用户信息绑定失败, 数据库错误")
  137. }
  138. return nil
  139. }
  140. m.Dingtalk_UserId = userInfo.UserId
  141. m.MemberId = member.MemberId
  142. if c, err := o.QueryTable(m.TableNameWithPrefix()).Filter("member_id", m.MemberId).Count(); err == nil && c > 0 {
  143. return errors.New("已绑定,不可重复绑定")
  144. }
  145. _, err = o.Insert(m)
  146. if err != nil {
  147. logs.Error("保存用户数据到数据时失败 =>", err)
  148. return errors.New("用户信息绑定失败, 数据库错误")
  149. }
  150. return nil
  151. }