Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(NOBIDS) Fix app subs queries #2639

Merged
merged 1 commit into from
Oct 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 37 additions & 4 deletions db/frontend.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,19 @@ func GetUserIdByApiKey(apiKey string) (*types.UserWithPremium, error) {
return cached.(*types.UserWithPremium), nil
}
data := &types.UserWithPremium{}
row := FrontendWriterDB.QueryRow("SELECT id, (SELECT product_id from users_app_subscriptions WHERE user_id = users.id AND active = true order by id desc limit 1) FROM users WHERE api_key = $1", apiKey)
row := FrontendWriterDB.QueryRow(`
SELECT id, (
SELECT product_id
from users_app_subscriptions
WHERE user_id = users.id AND active = true
order by CASE product_id
WHEN 'whale' THEN 1
WHEN 'goldfish' THEN 2
WHEN 'plankton' THEN 3
ELSE 4 -- For any other product_id values
END, id desc limit 1
) FROM users
WHERE api_key = $1`, apiKey)
err := row.Scan(&data.ID, &data.Product)
if err != nil {
return nil, err
Expand Down Expand Up @@ -428,16 +440,37 @@ type PremiumResult struct {

func GetUserPremiumPackage(userID uint64) (PremiumResult, error) {
var pkg PremiumResult
err := FrontendWriterDB.Get(&pkg,
"SELECT COALESCE(product_id, '') as product_id, COALESCE(store, '') as store from users_app_subscriptions WHERE user_id = $1 AND active = true order by id desc",
err := FrontendWriterDB.Get(&pkg, `
SELECT COALESCE(product_id, '') as product_id, COALESCE(store, '') as store
from users_app_subscriptions
WHERE user_id = $1 AND active = true
order by CASE product_id
WHEN 'whale' THEN 1
WHEN 'goldfish' THEN 2
WHEN 'plankton' THEN 3
ELSE 4 -- For any other product_id values
END, id desc`,
userID,
)
return pkg, err
}

func GetUserPremiumSubscription(id uint64) (types.UserPremiumSubscription, error) {
userSub := types.UserPremiumSubscription{}
err := FrontendWriterDB.Get(&userSub, "SELECT user_id, store, active, COALESCE(product_id, '') as product_id, COALESCE(reject_reason, '') as reject_reason FROM users_app_subscriptions WHERE user_id = $1 ORDER BY active desc, id desc LIMIT 1", id)
err := FrontendWriterDB.Get(&userSub, `
SELECT user_id, store, active, COALESCE(product_id, '') as product_id, COALESCE(reject_reason, '') as reject_reason
FROM users_app_subscriptions
WHERE user_id = $1
ORDER BY
active desc,
CASE product_id
WHEN 'whale' THEN 1
WHEN 'goldfish' THEN 2
WHEN 'plankton' THEN 3
ELSE 4 -- For any other product_id values
END,
id desc
LIMIT 1`, id)
return userSub, err
}

Expand Down
36 changes: 34 additions & 2 deletions handlers/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,23 @@ func LoginPost(w http.ResponseWriter, r *http.Request) {
}
}

err = db.FrontendWriterDB.Get(&user, "SELECT users.id, email, password, email_confirmed, COALESCE(product_id, '') as product_id, COALESCE(active, false) as active, COALESCE(user_group, '') AS user_group FROM users left join users_app_subscriptions on users_app_subscriptions.user_id = users.id WHERE email = $1", email)
err = db.FrontendWriterDB.Get(&user, `
WITH
latest_and_greatest_sub AS (
SELECT user_id, product_id, active, created_at FROM users_app_subscriptions
left join users on users.id = user_id
WHERE users.email = $1 AND active = true
ORDER BY CASE product_id
WHEN 'whale' THEN 1
WHEN 'goldfish' THEN 2
WHEN 'plankton' THEN 3
ELSE 4 -- For any other product_id values
END, users_app_subscriptions.created_at DESC LIMIT 1
)
SELECT users.id, email, password, email_confirmed, COALESCE(product_id, '') as product_id, COALESCE(active, false) as active, COALESCE(user_group, '') AS user_group
FROM users
left join latest_and_greatest_sub on latest_and_greatest_sub.user_id = users.id
WHERE email = $1`, email)
if err != nil {
if err != sql.ErrNoRows {
logger.Errorf("error retrieving password for user %v: %v", email, err)
Expand Down Expand Up @@ -373,7 +389,23 @@ func ResetPassword(w http.ResponseWriter, r *http.Request) {
ProductID string `db:"product_id"`
Active bool `db:"active"`
}{}
err = db.FrontendWriterDB.Get(&dbUser, "SELECT users.id, email_confirmed, email, COALESCE(product_id, '') as product_id, COALESCE(active, false) as active FROM users LEFT JOIN users_app_subscriptions on users_app_subscriptions.user_id = users.id WHERE password_reset_hash = $1", hash)
err = db.FrontendWriterDB.Get(&dbUser, `
WITH
latest_and_greatest_sub AS (
SELECT user_id, product_id, active, created_at FROM users_app_subscriptions
left join users on users.id = user_id
WHERE users.password_reset_hash = $1 AND active = true
ORDER BY CASE product_id
WHEN 'whale' THEN 1
WHEN 'goldfish' THEN 2
WHEN 'plankton' THEN 3
ELSE 4 -- For any other product_id values
END, users_app_subscriptions.created_at DESC LIMIT 1
)
SELECT users.id, email_confirmed, email, COALESCE(product_id, '') as product_id, COALESCE(active, false) as active
FROM users
left join latest_and_greatest_sub on latest_and_greatest_sub.user_id = users.id
WHERE password_reset_hash = $1`, hash)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
session.AddFlash("Error: Invalid reset link, please retry.")
Expand Down
Loading