Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
isucon committed Dec 8, 2024
1 parent 5ccbb91 commit ca586e2
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 35 deletions.
77 changes: 59 additions & 18 deletions go/app_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,15 +343,21 @@ func appPostRides(w http.ResponseWriter, r *http.Request) {
}
defer tx.Rollback()

ridesTx, err := ridesDatabase().Beginx()
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

rides := []Ride{}
if err := tx.SelectContext(ctx, &rides, `SELECT * FROM rides WHERE user_id = ?`, user.ID); err != nil {
if err := ridesTx.SelectContext(ctx, &rides, `SELECT * FROM rides WHERE user_id = ?`, user.ID); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

continuingRideCount := 0
for _, ride := range rides {
status, err := getLatestRideStatus(ctx, tx, ride.ID)
status, err := getLatestRideStatus(ctx, ridesTx, ride.ID)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
Expand All @@ -366,7 +372,7 @@ func appPostRides(w http.ResponseWriter, r *http.Request) {
return
}

if _, err := tx.ExecContext(
if _, err := ridesTx.ExecContext(
ctx,
`INSERT INTO rides (id, user_id, pickup_latitude, pickup_longitude, destination_latitude, destination_longitude)
VALUES (?, ?, ?, ?, ?, ?)`,
Expand All @@ -376,7 +382,7 @@ func appPostRides(w http.ResponseWriter, r *http.Request) {
return
}

if _, err := tx.ExecContext(
if _, err := ridesTx.ExecContext(
ctx,
`INSERT INTO ride_statuses (id, ride_id, status) VALUES (?, ?, ?)`,
ulid.Make().String(), rideID, "MATCHING",
Expand All @@ -386,7 +392,7 @@ func appPostRides(w http.ResponseWriter, r *http.Request) {
}

var rideCount int
if err := tx.GetContext(ctx, &rideCount, `SELECT COUNT(*) FROM rides WHERE user_id = ? `, user.ID); err != nil {
if err := ridesTx.GetContext(ctx, &rideCount, `SELECT COUNT(*) FROM rides WHERE user_id = ? `, user.ID); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
Expand Down Expand Up @@ -446,7 +452,7 @@ func appPostRides(w http.ResponseWriter, r *http.Request) {
}

ride := Ride{}
if err := tx.GetContext(ctx, &ride, "SELECT * FROM rides WHERE id = ?", rideID); err != nil {
if err := ridesTx.GetContext(ctx, &ride, "SELECT * FROM rides WHERE id = ?", rideID); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
Expand All @@ -461,6 +467,10 @@ func appPostRides(w http.ResponseWriter, r *http.Request) {
writeError(w, http.StatusInternalServerError, err)
return
}
if err := ridesTx.Commit(); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

writeJSON(w, http.StatusAccepted, &appPostRidesResponse{
RideID: rideID,
Expand Down Expand Up @@ -556,16 +566,23 @@ func appPostRideEvaluatation(w http.ResponseWriter, r *http.Request) {
}
defer tx.Rollback()

ridesTx, err := ridesDatabase().Beginx()
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
defer ridesTx.Rollback()

ride := &Ride{}
if err := tx.GetContext(ctx, ride, `SELECT * FROM rides WHERE id = ?`, rideID); err != nil {
if err := ridesTx.GetContext(ctx, ride, `SELECT * FROM rides WHERE id = ?`, rideID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
writeError(w, http.StatusNotFound, errors.New("ride not found"))
return
}
writeError(w, http.StatusInternalServerError, err)
return
}
status, err := getLatestRideStatus(ctx, tx, ride.ID)
status, err := getLatestRideStatus(ctx, ridesTx, ride.ID)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
Expand All @@ -576,7 +593,7 @@ func appPostRideEvaluatation(w http.ResponseWriter, r *http.Request) {
return
}

result, err := tx.ExecContext(
result, err := ridesTx.ExecContext(
ctx,
`UPDATE rides SET evaluation = ? WHERE id = ?`,
req.Evaluation, rideID)
Expand All @@ -592,7 +609,7 @@ func appPostRideEvaluatation(w http.ResponseWriter, r *http.Request) {
return
}

_, err = tx.ExecContext(
_, err = ridesTx.ExecContext(
ctx,
`INSERT INTO ride_statuses (id, ride_id, status) VALUES (?, ?, ?)`,
ulid.Make().String(), rideID, "COMPLETED")
Expand All @@ -601,7 +618,7 @@ func appPostRideEvaluatation(w http.ResponseWriter, r *http.Request) {
return
}

if err := tx.GetContext(ctx, ride, `SELECT * FROM rides WHERE id = ?`, rideID); err != nil {
if err := ridesTx.GetContext(ctx, ride, `SELECT * FROM rides WHERE id = ?`, rideID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
writeError(w, http.StatusNotFound, errors.New("ride not found"))
return
Expand Down Expand Up @@ -653,7 +670,7 @@ func appPostRideEvaluatation(w http.ResponseWriter, r *http.Request) {

if err := requestPaymentGatewayPostPayment(ctx, paymentGatewayURL, paymentToken.Token, paymentGatewayRequest, func() ([]Ride, error) {
rides := []Ride{}
if err := tx.SelectContext(ctx, &rides, `SELECT * FROM rides WHERE user_id = ? ORDER BY created_at ASC`, ride.UserID); err != nil {
if err := ridesTx.SelectContext(ctx, &rides, `SELECT * FROM rides WHERE user_id = ? ORDER BY created_at ASC`, ride.UserID); err != nil {
return nil, err
}
return rides, nil
Expand All @@ -671,6 +688,11 @@ func appPostRideEvaluatation(w http.ResponseWriter, r *http.Request) {
return
}

if err := ridesTx.Commit(); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

writeJSON(w, http.StatusOK, &appPostRideEvaluationResponse{
CompletedAt: ride.UpdatedAt.UnixMilli(),
})
Expand Down Expand Up @@ -715,8 +737,15 @@ func appGetNotification(w http.ResponseWriter, r *http.Request) {
}
defer tx.Rollback()

ridesTx, err := ridesDatabase().Beginx()
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
defer ridesTx.Rollback()

ride := &Ride{}
if err := tx.GetContext(ctx, ride, `SELECT * FROM rides WHERE user_id = ? ORDER BY created_at DESC LIMIT 1`, user.ID); err != nil {
if err := ridesTx.GetContext(ctx, ride, `SELECT * FROM rides WHERE user_id = ? ORDER BY created_at DESC LIMIT 1`, user.ID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
writeJSON(w, http.StatusOK, &appGetNotificationResponse{
RetryAfterMs: 30,
Expand All @@ -729,9 +758,9 @@ func appGetNotification(w http.ResponseWriter, r *http.Request) {

yetSentRideStatus := RideStatus{}
status := ""
if err := tx.GetContext(ctx, &yetSentRideStatus, `SELECT * FROM ride_statuses WHERE ride_id = ? AND app_sent_at IS NULL ORDER BY created_at ASC LIMIT 1`, ride.ID); err != nil {
if err := ridesTx.GetContext(ctx, &yetSentRideStatus, `SELECT * FROM ride_statuses WHERE ride_id = ? AND app_sent_at IS NULL ORDER BY created_at ASC LIMIT 1`, ride.ID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
status, err = getLatestRideStatus(ctx, tx, ride.ID)
status, err = getLatestRideStatus(ctx, ridesTx, ride.ID)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
Expand Down Expand Up @@ -792,7 +821,7 @@ func appGetNotification(w http.ResponseWriter, r *http.Request) {

if yetSentRideStatus.ID != "" {
latestRideStatusCache.Forget(ride.ID)
_, err := tx.ExecContext(ctx, `UPDATE ride_statuses SET app_sent_at = CURRENT_TIMESTAMP(6) WHERE id = ?`, yetSentRideStatus.ID)
_, err := ridesTx.ExecContext(ctx, `UPDATE ride_statuses SET app_sent_at = CURRENT_TIMESTAMP(6) WHERE id = ?`, yetSentRideStatus.ID)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
Expand All @@ -804,6 +833,11 @@ func appGetNotification(w http.ResponseWriter, r *http.Request) {
return
}

if err := ridesTx.Commit(); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

writeJSON(w, http.StatusOK, response)
}

Expand Down Expand Up @@ -934,6 +968,13 @@ func appGetNearbyChairs(w http.ResponseWriter, r *http.Request) {
}
defer tx.Rollback()

ridesTx, err := ridesDatabase().Beginx()
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
defer ridesTx.Rollback()

chairs := []Chair{}
err = tx.SelectContext(
ctx,
Expand All @@ -952,15 +993,15 @@ func appGetNearbyChairs(w http.ResponseWriter, r *http.Request) {
}

rides := []*Ride{}
if err := tx.SelectContext(ctx, &rides, `SELECT * FROM rides WHERE chair_id = ? ORDER BY created_at DESC`, chair.ID); err != nil {
if err := ridesTx.SelectContext(ctx, &rides, `SELECT * FROM rides WHERE chair_id = ? ORDER BY created_at DESC`, chair.ID); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

skip := false
for _, ride := range rides {
// 過去にライドが存在し、かつ、それが完了していない場合はスキップ
status, err := getLatestRideStatus(ctx, tx, ride.ID)
status, err := getLatestRideStatus(ctx, ridesTx, ride.ID)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
Expand Down
Loading

0 comments on commit ca586e2

Please sign in to comment.