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

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) {
res, err := db.NamedExecContext(ctx, "INSERT INTO `group` (name) VALUES(:name)", group)
if err != nil {
return models.Group{}, err
}
id, err := res.LastInsertId()
if err != nil {
return models.Group{}, err
}
group.ID = int(id)
return group, nil
}
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", 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;
*/