Updated subscriptions
This commit is contained in:
@@ -140,3 +140,33 @@ func (m *AlertRuleModel) Remove(ctx context.Context, id int) (bool, error) {
|
||||
}
|
||||
return tag.RowsAffected() > 0, nil
|
||||
}
|
||||
|
||||
// DisableAllForUser sets enabled = false on every alert rule owned by addresses of userID.
|
||||
func (m *AlertRuleModel) DisableAllForUser(ctx context.Context, userID string) (int64, error) {
|
||||
tag, err := m.pool.Exec(ctx,
|
||||
`UPDATE alert_rules ar
|
||||
SET enabled = FALSE
|
||||
FROM addresses a
|
||||
WHERE ar.address_id = a.id AND a.user_id = $1`,
|
||||
userID,
|
||||
)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return tag.RowsAffected(), nil
|
||||
}
|
||||
|
||||
// EnableAllForUser sets enabled = true on every alert rule owned by addresses of userID.
|
||||
func (m *AlertRuleModel) EnableAllForUser(ctx context.Context, userID string) (int64, error) {
|
||||
tag, err := m.pool.Exec(ctx,
|
||||
`UPDATE alert_rules ar
|
||||
SET enabled = TRUE
|
||||
FROM addresses a
|
||||
WHERE ar.address_id = a.id AND a.user_id = $1`,
|
||||
userID,
|
||||
)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return tag.RowsAffected(), nil
|
||||
}
|
||||
|
||||
@@ -130,6 +130,46 @@ func (m *UserModel) GetByID(ctx context.Context, id string) (*domain.User, error
|
||||
return scanUser(row)
|
||||
}
|
||||
|
||||
// GetByStripeCustomerID loads a user by their Stripe Customer ID if set.
|
||||
func (m *UserModel) GetByStripeCustomerID(ctx context.Context, stripeCustomerID string) (*domain.User, error) {
|
||||
row := m.pool.QueryRow(ctx,
|
||||
`SELECT `+userColumns+` FROM users WHERE stripe_customer_id = $1`,
|
||||
stripeCustomerID,
|
||||
)
|
||||
return scanUser(row)
|
||||
}
|
||||
|
||||
// ListPaidUsersWithoutActiveSubscription finds paid-tier rows whose Stripe
|
||||
// subscription is not active or trialing. Used by the periodic billing sweep.
|
||||
func (m *UserModel) ListPaidUsersWithoutActiveSubscription(ctx context.Context) ([]domain.User, error) {
|
||||
rows, err := m.pool.Query(ctx,
|
||||
`SELECT `+userColumns+` FROM users
|
||||
WHERE subscription_tier IN ('premium', 'pro')
|
||||
AND subscription_status NOT IN ('active', 'trialing')
|
||||
AND COALESCE(trim(firebase_uid), '') <> ''`,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
out := []domain.User{}
|
||||
for rows.Next() {
|
||||
var u domain.User
|
||||
rowErr := rows.Scan(
|
||||
&u.ID, &u.FirebaseUID, &u.Email, &u.DisplayName,
|
||||
&u.StripeCustomerID, &u.StripeSubscriptionID, &u.SubscriptionStatus,
|
||||
&u.SubscriptionTier, &u.SubscriptionCreatedAt, &u.CreatedAt, &u.UpdatedAt,
|
||||
)
|
||||
if rowErr != nil {
|
||||
return nil, rowErr
|
||||
}
|
||||
out = append(out, u)
|
||||
}
|
||||
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
func (m *UserModel) UpdateStripeCustomer(ctx context.Context, userID, stripeCustomerID string) error {
|
||||
_, err := m.pool.Exec(ctx,
|
||||
`UPDATE users SET stripe_customer_id = $2, updated_at = NOW() WHERE id = $1`,
|
||||
|
||||
Reference in New Issue
Block a user