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.
137 lines
3.5 KiB
137 lines
3.5 KiB
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"golang.org/x/sync/errgroup"
|
|
|
|
"git.aiterp.net/lucifer/lucifer/models"
|
|
)
|
|
|
|
type groupRepository struct{}
|
|
|
|
// GroupRepository is a sqlite datbase repository for the Group model.
|
|
var GroupRepository = &groupRepository{}
|
|
|
|
func (r *groupRepository) FindByID(ctx context.Context, id int) (models.Group, error) {
|
|
group := models.Group{}
|
|
err := db.GetContext(ctx, &group, "SELECT * FROM 'group' WHERE id=?", id)
|
|
if err != nil {
|
|
return models.Group{}, err
|
|
}
|
|
|
|
err = db.SelectContext(ctx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
|
|
if err != nil {
|
|
return models.Group{}, err
|
|
}
|
|
|
|
return group, err
|
|
}
|
|
|
|
func (r *groupRepository) FindByLight(ctx context.Context, light models.Light) (models.Group, error) {
|
|
const query = `
|
|
SELECT g.id, g.name FROM 'light' l
|
|
JOIN 'group' g ON g.id = l.group_id
|
|
WHERE l.id = ?
|
|
`
|
|
|
|
group := models.Group{}
|
|
err := db.GetContext(ctx, &group, query, light.ID)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
return models.Group{}, err
|
|
}
|
|
|
|
err = db.SelectContext(ctx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
return models.Group{}, err
|
|
}
|
|
|
|
return group, nil
|
|
}
|
|
|
|
func (r *groupRepository) List(ctx context.Context) ([]models.Group, error) {
|
|
groups := make([]models.Group, 0, 16)
|
|
err := db.SelectContext(ctx, &groups, "SELECT * FROM group")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
eg, egCtx := errgroup.WithContext(ctx)
|
|
for i := range groups {
|
|
group := &groups[i]
|
|
|
|
eg.Go(func() error {
|
|
return db.SelectContext(egCtx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
|
|
})
|
|
}
|
|
|
|
err = eg.Wait()
|
|
if err != nil && err != sql.ErrNoRows {
|
|
return nil, err
|
|
}
|
|
|
|
return groups, nil
|
|
}
|
|
|
|
func (r *groupRepository) ListByUser(ctx context.Context, user models.User) ([]models.Group, error) {
|
|
const query = `
|
|
SELECT g.id, g.name FROM group_permission AS p
|
|
JOIN 'group' AS g ON p.group_id=g.id
|
|
WHERE p.user_id=? AND p.read=true;
|
|
`
|
|
|
|
groups := make([]models.Group, 0, 16)
|
|
err := db.SelectContext(ctx, &groups, query, user.ID)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
return nil, err
|
|
}
|
|
|
|
eg, egCtx := errgroup.WithContext(ctx)
|
|
for i := range groups {
|
|
group := &groups[i]
|
|
|
|
eg.Go(func() error {
|
|
err := db.SelectContext(egCtx, &group.Permissions, "SELECT * FROM group_permission WHERE group_id=?", group.ID)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
}
|
|
|
|
err = eg.Wait()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return groups, nil
|
|
}
|
|
|
|
func (r *groupRepository) Insert(ctx context.Context, group models.Group) (models.Group, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (r *groupRepository) Update(ctx context.Context, group models.Group) error {
|
|
_, err := db.NamedExecContext(ctx, "UPDATE group SET name=:name WHERE id=:id", group)
|
|
return err
|
|
}
|
|
|
|
func (r *groupRepository) UpdatePermissions(ctx context.Context, permission models.GroupPermission) error {
|
|
_, 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)
|
|
return err
|
|
}
|
|
|
|
func (r *groupRepository) Remove(ctx context.Context, group models.Group) error {
|
|
_, err := db.NamedExecContext(ctx, "DELETE FROM group WHERE id=:id LIMIT 1", group)
|
|
return err
|
|
}
|
|
|
|
/*
|
|
|
|
SELECT g.id, g.name FROM group_permission AS p
|
|
JOIN 'group' AS g ON p.group_id=g.id
|
|
WHERE p.user_id=? AND p.read=true;
|
|
|
|
*/
|