41 lines
918 B
Go
41 lines
918 B
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"plumber/internal/store/sqlc"
|
|
)
|
|
|
|
// Vote toggles or sets a user's vote on a question (value must be 1 or -1).
|
|
func Vote(ctx context.Context, db *sql.DB, userID, questionID string, value int) error {
|
|
if value != 1 && value != -1 {
|
|
return fmt.Errorf("invalid vote")
|
|
}
|
|
tx, err := db.BeginTx(ctx, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer tx.Rollback()
|
|
|
|
q := sqlc.New(tx)
|
|
current, err := q.GetVote(ctx, sqlc.GetVoteParams{UserID: userID, QuestionID: questionID})
|
|
if err != nil && err != sql.ErrNoRows {
|
|
return err
|
|
}
|
|
if err == nil && int(current) == value {
|
|
err = q.DeleteVote(ctx, sqlc.DeleteVoteParams{UserID: userID, QuestionID: questionID})
|
|
} else {
|
|
err = q.UpsertVote(ctx, sqlc.UpsertVoteParams{
|
|
UserID: userID,
|
|
QuestionID: questionID,
|
|
Value: int32(value),
|
|
})
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return tx.Commit()
|
|
}
|