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() }