data_loader.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package data_loader
  2. import (
  3. "os"
  4. "path/filepath"
  5. "git.sxidc.com/go-tools/utils/fileutils"
  6. "git.sxidc.com/go-tools/utils/strutils"
  7. "github.com/pkg/errors"
  8. "gopkg.in/yaml.v3"
  9. )
  10. var dataLoaderInstance *DataLoader
  11. func GetDataLoader() *DataLoader {
  12. return dataLoaderInstance
  13. }
  14. func Init() {
  15. dataDir := os.Getenv("DATA_LOADER_DATA_DIR")
  16. if strutils.IsStringEmpty(dataDir) {
  17. panic("DATA_LOADER_DATA_DIR环境变量未设置")
  18. }
  19. dataDirAbs, err := filepath.Abs(dataDir)
  20. if err != nil {
  21. panic(err)
  22. }
  23. if !fileutils.PathExists(dataDirAbs) {
  24. panic("数据目录不存在")
  25. }
  26. tenantsDataFilePath := filepath.Join(dataDirAbs, "tenants.yaml")
  27. if !fileutils.PathExists(tenantsDataFilePath) {
  28. panic("租户数据不存在")
  29. }
  30. usersDataFilePath := filepath.Join(dataDirAbs, "users.yaml")
  31. if !fileutils.PathExists(usersDataFilePath) {
  32. panic("用户数据不存在")
  33. }
  34. rolesDataFilePath := filepath.Join(dataDirAbs, "roles.yaml")
  35. if !fileutils.PathExists(rolesDataFilePath) {
  36. panic("角色数据不存在")
  37. }
  38. d, err := LoadData(tenantsDataFilePath, usersDataFilePath, rolesDataFilePath)
  39. if err != nil {
  40. panic(err)
  41. }
  42. dataLoaderInstance = d
  43. }
  44. type Tenant struct {
  45. ID string `yaml:"id"`
  46. Name string `yaml:"name"`
  47. }
  48. type User struct {
  49. ID string `yaml:"id"`
  50. UserName string `yaml:"username"`
  51. Password string `yaml:"password"`
  52. RoleIDs []string `yaml:"role_ids"`
  53. CurrentTenantID string `yaml:"current_tenant_id"`
  54. }
  55. type Role struct {
  56. ID string `yaml:"id"`
  57. Name string `yaml:"name"`
  58. Permissions []Permission `yaml:"permissions"`
  59. }
  60. type Permission struct {
  61. Resource string `yaml:"resource"`
  62. Action string `yaml:"action"`
  63. }
  64. type DataLoader struct {
  65. Tenants []Tenant `yaml:"tenants"`
  66. Users []User `yaml:"users"`
  67. Roles []Role `yaml:"roles"`
  68. }
  69. func LoadData(tenantsDataFilePath string, usersDataFilePath string, rolesDataFilePath string) (*DataLoader, error) {
  70. dataLoader := new(DataLoader)
  71. tenantsData, err := os.ReadFile(tenantsDataFilePath)
  72. if err != nil {
  73. return nil, err
  74. }
  75. err = yaml.Unmarshal(tenantsData, &dataLoader.Tenants)
  76. if err != nil {
  77. return nil, err
  78. }
  79. usersData, err := os.ReadFile(usersDataFilePath)
  80. if err != nil {
  81. return nil, err
  82. }
  83. err = yaml.Unmarshal(usersData, &dataLoader.Users)
  84. if err != nil {
  85. return nil, err
  86. }
  87. rolesData, err := os.ReadFile(rolesDataFilePath)
  88. if err != nil {
  89. return nil, err
  90. }
  91. err = yaml.Unmarshal(rolesData, &dataLoader.Roles)
  92. if err != nil {
  93. return nil, err
  94. }
  95. return dataLoader, nil
  96. }
  97. func (d *DataLoader) GetUserByUserNameAndPassword(userName string, password string) (User, error) {
  98. for _, user := range d.Users {
  99. if user.UserName == userName && user.Password == password {
  100. return user, nil
  101. }
  102. }
  103. return User{}, errors.New("用户名或密码错误")
  104. }
  105. func (d *DataLoader) GetUserByID(userID string) (User, error) {
  106. for _, user := range d.Users {
  107. if user.ID == userID {
  108. return user, nil
  109. }
  110. }
  111. return User{}, errors.New("用户不存在")
  112. }
  113. func (d *DataLoader) GetTenantByID(tenantID string) (Tenant, error) {
  114. for _, tenant := range d.Tenants {
  115. if tenant.ID == tenantID {
  116. return tenant, nil
  117. }
  118. }
  119. return Tenant{}, nil
  120. }
  121. func (d *DataLoader) GetRolesByIDs(roleIDs []string) ([]Role, error) {
  122. roles := make([]Role, 0)
  123. if roleIDs == nil || len(roleIDs) == 0 {
  124. return roles, nil
  125. }
  126. for _, roleID := range roleIDs {
  127. for _, role := range d.Roles {
  128. if role.ID == roleID {
  129. roles = append(roles, role)
  130. }
  131. }
  132. }
  133. return roles, nil
  134. }