package main import ( "context" "atlas9.dev/c/core" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" ) type SqliteMemberStore struct { db dbi.DBI } var _ iam.MemberStore = (*SqliteMemberStore)(nil) func NewSqliteMemberStore(db dbi.DBI) *SqliteMemberStore { return &SqliteMemberStore{db: db} } func (s *SqliteMemberStore) Add(ctx context.Context, groupID core.ID, userID core.ID) error { _, err := s.db.Exec(ctx, ` INSERT INTO group_members (group_id, user_id) VALUES ($1, $2) ON CONFLICT (group_id, user_id) DO NOTHING `, groupID, userID) return err } func (s *SqliteMemberStore) Remove(ctx context.Context, groupID core.ID, userID core.ID) error { _, err := s.db.Exec(ctx, ` DELETE FROM group_members WHERE group_id = $1 AND user_id = $2 `, groupID, userID) return err } func (s *SqliteMemberStore) ListMembers(ctx context.Context, groupID core.ID, page core.PageReq) (core.Page[core.ID], error) { return dbi.Paginate[core.ID](ctx, s.db, page, ` SELECT user_id FROM group_members WHERE group_id = $1 AND user_id > $cursor ORDER BY user_id LIMIT $limit `, groupID) } func (s *SqliteMemberStore) ListGroups(ctx context.Context, userID core.ID, page core.PageReq) (core.Page[core.ID], error) { return dbi.Paginate[core.ID](ctx, s.db, page, ` SELECT group_id FROM group_members WHERE user_id = $1 AND group_id > $cursor ORDER BY group_id LIMIT $limit `, userID) }