ETCD后台服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
3.7 KiB

3 years ago
  1. package models
  2. import (
  3. "time"
  4. "github.com/jinzhu/gorm"
  5. )
  6. const (
  7. ReadOnly = iota
  8. ReadWrite
  9. )
  10. // RoleEtcdServersModel 角色权限表
  11. type RoleEtcdServersModel struct {
  12. Id int32 `gorm:"column:id;primary_key" json:"id"` //
  13. EtcdServerId int32 `gorm:"column:etcd_server_id" json:"etcd_server_id"` // etcd服务id
  14. Type int32 `gorm:"column:type" json:"type"` // 0读 1写
  15. RoleId int32 `gorm:"column:role_id" json:"role_id"` // 角色id
  16. CreatedAt JSONTime `gorm:"column:created_at" json:"created_at"` // 添加时间
  17. UpdatedAt JSONTime `gorm:"column:updated_at" json:"updated_at"` // 更新时间
  18. }
  19. // TableName 获取表名
  20. func (RoleEtcdServersModel) TableName() string {
  21. return gorm.DefaultTableNameHandler(nil, "role_etcd_servers")
  22. }
  23. // FirstByRoleIdAndEtcdServerIdAndType 根据role_id、etcd_server_id和type查询一条数据
  24. func (m *RoleEtcdServersModel) FirstByRoleIdAndEtcdServerIdAndType(roleId, etcdServerId, typ int32) (err error) {
  25. err = client.Table(m.TableName()).Where("role_id = ? and etcd_server_id = ? and type >= ?", roleId, etcdServerId, typ).First(m).Error
  26. return
  27. }
  28. // UpByEtcdId 根据etcd_id更新角色
  29. func (m *RoleEtcdServersModel) UpByEtcdId(list []*AllByEtcdIdData) (err error) {
  30. tx := client.Begin()
  31. defer func() {
  32. if err != nil {
  33. tx.Rollback()
  34. } else {
  35. tx.Commit()
  36. }
  37. }()
  38. // 先删除再插入
  39. err = tx.Table(m.TableName()).Where("etcd_server_id = ?", list[0].EtcdServerId).Delete(m).Error
  40. if err != nil {
  41. return
  42. }
  43. now := JSONTime(time.Now())
  44. for _, v := range list {
  45. typ := -1
  46. if v.Write == 1 {
  47. typ = 1
  48. } else if v.Read == 1 {
  49. typ = 0
  50. }
  51. one := &RoleEtcdServersModel{
  52. EtcdServerId: v.EtcdServerId,
  53. Type: int32(typ),
  54. RoleId: v.RoleId,
  55. CreatedAt: now,
  56. UpdatedAt: now,
  57. }
  58. err = tx.Create(one).Error
  59. if err != nil {
  60. return
  61. }
  62. }
  63. return
  64. }
  65. type AllByEtcdIdData struct {
  66. EtcdServerId int32 `gorm:"column:etcd_server_id" json:"etcd_server_id"` // etcd服务id
  67. RoleId int32 `gorm:"column:role_id" json:"role_id"` // 角色id
  68. Name string `gorm:"column:name" json:"name"`
  69. Type int32 `gorm:"column:type" json:"type"`
  70. Read int32 `gorm:"column:read" json:"read"`
  71. Write int32 `gorm:"column:write" json:"write"`
  72. }
  73. // AllByEtcdId 查询etcd服务权限配置列表
  74. func (m *RoleEtcdServersModel) AllByEtcdId(etcdId int32) (list []*AllByEtcdIdData, err error) {
  75. err = client.Table(m.TableName()+" as re").Select("r.name, re.type, re.etcd_server_id, re.role_id").
  76. Joins(" join "+new(RolesModel).TableName()+" as r on r.id = re.role_id").
  77. Where("etcd_server_id = ?", etcdId).
  78. Scan(&list).Error
  79. if err == nil {
  80. for _, v := range list {
  81. if v.Type == 1 {
  82. v.Write = 1
  83. v.Read = 1
  84. } else if v.Type == 0 {
  85. v.Write = 0
  86. v.Read = 1
  87. } else {
  88. v.Write = 0
  89. v.Read = 0
  90. }
  91. }
  92. }
  93. rList, _err := new(RolesModel).All()
  94. if _err != nil {
  95. err = _err
  96. return
  97. }
  98. if len(rList) > len(list) {
  99. for _, v := range rList {
  100. exist := false
  101. for _, v1 := range list {
  102. if v1.RoleId == v.Id {
  103. exist = true
  104. }
  105. }
  106. if exist == false {
  107. list = append(list, &AllByEtcdIdData{
  108. EtcdServerId: etcdId,
  109. RoleId: v.Id,
  110. Name: v.Name,
  111. Type: -1,
  112. Read: 0,
  113. Write: 0,
  114. })
  115. }
  116. }
  117. }
  118. return
  119. }
  120. // Save 保存角色信息
  121. func (m *RoleEtcdServersModel) Save() (err error) {
  122. err = client.Table(m.TableName()).Create(m).Error
  123. return
  124. }
  125. // DelByEtcdId 删除
  126. func (m *RoleEtcdServersModel) DelByEtcdId(etcdId int32) (err error) {
  127. err = client.Table(m.TableName()).Where("etcd_server_id = ?", etcdId).Delete(m).Error
  128. return
  129. }