The main server, and probably only repository in this org.
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.

148 lines
3.7 KiB

  1. package sqlite
  2. import (
  3. "context"
  4. "database/sql"
  5. "golang.org/x/sync/errgroup"
  6. "git.aiterp.net/lucifer/lucifer/models"
  7. )
  8. type groupRepository struct{}
  9. // GroupRepository is a sqlite datbase repository for the Group model.
  10. var GroupRepository = &groupRepository{}
  11. func (r *groupRepository) FindByID(ctx context.Context, id int) (models.Group, error) {
  12. group := models.Group{}
  13. err := db.GetContext(ctx, &group, "SELECT * FROM 'group' WHERE id=?", id)
  14. if err != nil {
  15. return models.Group{}, err
  16. }
  17. err = db.SelectContext(ctx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
  18. if err != nil {
  19. return models.Group{}, err
  20. }
  21. return group, err
  22. }
  23. func (r *groupRepository) FindByLight(ctx context.Context, light models.Light) (models.Group, error) {
  24. const query = `
  25. SELECT g.id, g.name FROM 'light' l
  26. JOIN 'group' g ON g.id = l.group_id
  27. WHERE l.id = ?
  28. `
  29. group := models.Group{}
  30. err := db.GetContext(ctx, &group, query, light.ID)
  31. if err != nil && err != sql.ErrNoRows {
  32. return models.Group{}, err
  33. }
  34. err = db.SelectContext(ctx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
  35. if err != nil && err != sql.ErrNoRows {
  36. return models.Group{}, err
  37. }
  38. return group, nil
  39. }
  40. func (r *groupRepository) List(ctx context.Context) ([]models.Group, error) {
  41. groups := make([]models.Group, 0, 16)
  42. err := db.SelectContext(ctx, &groups, "SELECT * FROM `group`")
  43. if err != nil {
  44. return nil, err
  45. }
  46. eg, egCtx := errgroup.WithContext(ctx)
  47. for i := range groups {
  48. group := &groups[i]
  49. eg.Go(func() error {
  50. return db.SelectContext(egCtx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
  51. })
  52. }
  53. err = eg.Wait()
  54. if err != nil && err != sql.ErrNoRows {
  55. return nil, err
  56. }
  57. return groups, nil
  58. }
  59. func (r *groupRepository) ListByUser(ctx context.Context, user models.User) ([]models.Group, error) {
  60. const query = `
  61. SELECT g.id, g.name FROM group_permission AS p
  62. JOIN 'group' AS g ON p.group_id=g.id
  63. WHERE p.user_id=? AND p.read=true;
  64. `
  65. groups := make([]models.Group, 0, 16)
  66. err := db.SelectContext(ctx, &groups, query, user.ID)
  67. if err != nil && err != sql.ErrNoRows {
  68. return nil, err
  69. }
  70. eg, egCtx := errgroup.WithContext(ctx)
  71. for i := range groups {
  72. group := &groups[i]
  73. eg.Go(func() error {
  74. err := db.SelectContext(egCtx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
  75. if err != nil && err != sql.ErrNoRows {
  76. return err
  77. }
  78. return nil
  79. })
  80. }
  81. err = eg.Wait()
  82. if err != nil {
  83. return nil, err
  84. }
  85. return groups, nil
  86. }
  87. func (r *groupRepository) Insert(ctx context.Context, group models.Group) (models.Group, error) {
  88. res, err := db.NamedExecContext(ctx, "INSERT INTO `group` (name) VALUES(:name)", group)
  89. if err != nil {
  90. return models.Group{}, err
  91. }
  92. id, err := res.LastInsertId()
  93. if err != nil {
  94. return models.Group{}, err
  95. }
  96. group.ID = int(id)
  97. return group, nil
  98. }
  99. func (r *groupRepository) Update(ctx context.Context, group models.Group) error {
  100. _, err := db.NamedExecContext(ctx, "UPDATE `group` SET name=:name WHERE id=:id", group)
  101. return err
  102. }
  103. func (r *groupRepository) UpdatePermissions(ctx context.Context, permission models.GroupPermission) error {
  104. _, err := db.NamedExecContext(ctx, "REPLACE INTO group_permission(group_id, user_id, read, write, 'create', 'delete', manage) VALUES (:group_id, :user_id, :read, :write, :create, :delete, :manage)", permission)
  105. return err
  106. }
  107. func (r *groupRepository) Remove(ctx context.Context, group models.Group) error {
  108. _, err := db.NamedExecContext(ctx, "DELETE FROM `group` WHERE id=:id", group)
  109. return err
  110. }
  111. /*
  112. SELECT g.id, g.name FROM group_permission AS p
  113. JOIN 'group' AS g ON p.group_id=g.id
  114. WHERE p.user_id=? AND p.read=true;
  115. */