118 lines
2.6 KiB
Go
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
|
|
}
|