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; */