receipt_indexer/backend/internal/storage/sql-groups.go
Ethan Wellenreiter 064faeadca Adding UserGroups struct to handle the list of groups a user is in
Signed-off-by: Ethan Wellenreiter <ewellenreiter@gmail.com>
2025-05-07 00:00:30 -04:00

118 lines
2.6 KiB
Go

package storage
import (
"context"
"database/sql"
)
type SQLGroupsStore struct {
db *sql.DB
}
func (s *SQLGroupsStore) getByID(ctx context.Context, id int64) (*Group, error) {
query := `SELECT id, name, owner FROM groups WHERE id = $1`
group := &Group{}
err := s.db.QueryRowContext(ctx, query, id).Scan(&group.ID, &group.Name, &group.Owner)
if err != nil {
return nil, err
}
query = `SELECT userid, moderator FROM groupMembership WHERE groupid = $1`
rows, err := s.db.QueryContext(ctx, query, id)
if err != nil {
return nil, err
}
for rows.Next() {
var userid int64
var moderator bool
err := rows.Scan(&userid, &moderator)
if err != nil {
return nil, err
}
if moderator {
group.Moderators = append(group.Moderators, userid)
} else {
group.Users = append(group.Users, userid)
}
}
return group, nil
}
func (s *SQLGroupsStore) GetByID(ctx context.Context, id int64) (*Group, error) {
ctx, cancel := context.WithTimeout(ctx, QueryTimeoutDuration)
defer cancel()
return s.getByID(ctx, id)
}
func (s *SQLGroupsStore) GetUserGroups(ctx context.Context, userID int64) (*UserGroups, error) {
// Implement logic to retrieve user's groups from the database
usergroups := &UserGroups{
UserID: userID,
}
ctx, cancel := context.WithTimeout(ctx, QueryTimeoutDuration)
defer cancel()
query := `SELECT groupid from groupMembership WHERE userid = $1`
rows, err := s.db.QueryContext(ctx, query, userID)
if err != nil {
return nil, err
}
for rows.Next() {
var groupid int64
err := rows.Scan(&groupid)
if err != nil {
return nil, err
}
usergroups.GroupIDs = append(usergroups.GroupIDs, groupid)
}
return usergroups, nil
}
// func (s *SQLGroupsStore) GetUsersInGroup(ctx context.Context, groupId int64) ([]*User, error) {
// // Implement logic to retrieve users in a group from the database
// }
func (s *SQLGroupsStore) Create(ctx context.Context, group *Group) error {
query := `INSERT INTO groups (name, owner) VALUES ($1, $2) RETURNING id`
ctx, cancel := context.WithTimeout(ctx, QueryTimeoutDuration)
defer cancel()
err := s.db.QueryRowContext(ctx, query, group.Name, group.Owner).Scan(&group.ID)
if err != nil {
return err
}
return nil
}
func (s *SQLGroupsStore) Delete(ctx context.Context, id int64) error {
query := `DELETE FROM groups WHERE id = $1`
ctx, cancel := context.WithTimeout(ctx, QueryTimeoutDuration)
defer cancel()
res, err := s.db.ExecContext(ctx, query, id)
if err != nil {
return err
}
rows, err := res.RowsAffected()
if err != nil {
return err
}
if rows == 0 {
return ErrNotFound
}
return nil
}