package tenant import ( "context" "database/sql" "time" ) func (q *Queries) UpsertMember(ctx context.Context, m *Member) error { _, err := q.db.ExecContext(ctx, `INSERT INTO members (user_id, email, name, tier, status, expires_at, synced_at) VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP) ON CONFLICT(user_id) DO UPDATE SET email = excluded.email, name = excluded.name, tier = excluded.tier, status = excluded.status, expires_at = excluded.expires_at, synced_at = CURRENT_TIMESTAMP`, m.UserID, m.Email, nullStr(m.Name), m.Tier, m.Status, timeToStr(m.ExpiresAt)) return err } func (q *Queries) GetMember(ctx context.Context, userID string) (*Member, error) { row := q.db.QueryRowContext(ctx, `SELECT user_id, email, name, tier, status, expires_at, synced_at FROM members WHERE user_id = ?`, userID) m, err := scanMember(row) if err == sql.ErrNoRows { return nil, err } if err != nil { return nil, err } return &m, nil } func (q *Queries) IsMember(ctx context.Context, userID string) bool { var count int64 err := q.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM members WHERE user_id = ? AND status = 'active' AND (expires_at IS NULL OR expires_at > datetime('now'))`, userID).Scan(&count) return err == nil && count > 0 } func (q *Queries) DeleteMember(ctx context.Context, userID string) error { _, err := q.db.ExecContext(ctx, `DELETE FROM members WHERE user_id = ?`, userID) return err } func scanMember(s scanner) (Member, error) { var m Member var name, expiresAt, syncedAt sql.NullString err := s.Scan(&m.UserID, &m.Email, &name, &m.Tier, &m.Status, &expiresAt, &syncedAt) if err != nil { return m, err } m.Name = name.String m.SyncedAt = parseTime(syncedAt.String) if expiresAt.Valid { if t, err := time.Parse(time.RFC3339, expiresAt.String); err == nil { m.ExpiresAt = &t } } return m, nil }