From 905cd8099848a9050188a15ad3bd568aeba7cbe2 Mon Sep 17 00:00:00 2001 From: wtks <30363887+wtks@users.noreply.github.com> Date: Sat, 30 Nov 2024 19:45:05 +0900 Subject: [PATCH 1/2] =?UTF-8?q?appGetRides=E3=81=AEfare=E3=81=AE=E5=80=A4?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/go/app_handlers.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/webapp/go/app_handlers.go b/webapp/go/app_handlers.go index 11fb2f33..20882df0 100644 --- a/webapp/go/app_handlers.go +++ b/webapp/go/app_handlers.go @@ -183,8 +183,15 @@ type getAppRidesResponseItemChair struct { func appGetRides(w http.ResponseWriter, r *http.Request) { user := r.Context().Value("user").(*User) + tx, err := db.Beginx() + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + defer tx.Rollback() + rides := []Ride{} - if err := db.Select( + if err := tx.Select( &rides, `SELECT * FROM rides WHERE user_id = ? ORDER BY created_at DESC`, user.ID, @@ -195,7 +202,7 @@ func appGetRides(w http.ResponseWriter, r *http.Request) { items := []getAppRidesResponseItem{} for _, ride := range rides { - status, err := getLatestRideStatus(db, ride.ID) + status, err := getLatestRideStatus(tx, ride.ID) if err != nil { writeError(w, http.StatusInternalServerError, err) return @@ -204,11 +211,17 @@ func appGetRides(w http.ResponseWriter, r *http.Request) { continue } + fare, err := calculateDiscountedFare(tx, user.ID, &ride, ride.PickupLatitude, ride.PickupLongitude, ride.DestinationLatitude, ride.DestinationLongitude) + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + item := getAppRidesResponseItem{ ID: ride.ID, PickupCoordinate: Coordinate{Latitude: ride.PickupLatitude, Longitude: ride.PickupLongitude}, DestinationCoordinate: Coordinate{Latitude: ride.DestinationLatitude, Longitude: ride.DestinationLongitude}, - Fare: calculateSale(ride), + Fare: fare, Evaluation: *ride.Evaluation, RequestedAt: ride.CreatedAt.UnixMilli(), CompletedAt: ride.UpdatedAt.UnixMilli(), @@ -217,7 +230,7 @@ func appGetRides(w http.ResponseWriter, r *http.Request) { item.Chair = getAppRidesResponseItemChair{} chair := &Chair{} - if err := db.Get(chair, `SELECT * FROM chairs WHERE id = ?`, ride.ChairID); err != nil { + if err := tx.Get(chair, `SELECT * FROM chairs WHERE id = ?`, ride.ChairID); err != nil { writeError(w, http.StatusInternalServerError, err) return } @@ -226,7 +239,7 @@ func appGetRides(w http.ResponseWriter, r *http.Request) { item.Chair.Model = chair.Model owner := &Owner{} - if err := db.Get(owner, `SELECT * FROM owners WHERE id = ?`, chair.OwnerID); err != nil { + if err := tx.Get(owner, `SELECT * FROM owners WHERE id = ?`, chair.OwnerID); err != nil { writeError(w, http.StatusInternalServerError, err) return } @@ -235,6 +248,11 @@ func appGetRides(w http.ResponseWriter, r *http.Request) { items = append(items, item) } + if err := tx.Commit(); err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + writeJSON(w, http.StatusOK, &getAppRidesResponse{ Rides: items, }) From 05d8703e1a760ba86941020083684ba9ad8868d5 Mon Sep 17 00:00:00 2001 From: wtks <30363887+wtks@users.noreply.github.com> Date: Sat, 30 Nov 2024 19:45:47 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=83=99=E3=83=B3=E3=83=81=E3=83=9E?= =?UTF-8?q?=E3=83=BC=E3=82=AB=E3=83=BC=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01JDK5EFNGT8ZHMTQXQ4BNH8NQ/rides.json | 2 +- .../01JDM0N9W89PK57C7XEVGD5C80/rides.json | 2 +- bench/benchmarker/world/user.go | 34 ++++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/bench/benchmarker/scenario/data/user/01JDK5EFNGT8ZHMTQXQ4BNH8NQ/rides.json b/bench/benchmarker/scenario/data/user/01JDK5EFNGT8ZHMTQXQ4BNH8NQ/rides.json index 3c9f9862..539f75da 100644 --- a/bench/benchmarker/scenario/data/user/01JDK5EFNGT8ZHMTQXQ4BNH8NQ/rides.json +++ b/bench/benchmarker/scenario/data/user/01JDK5EFNGT8ZHMTQXQ4BNH8NQ/rides.json @@ -79,7 +79,7 @@ "name": "SG-S120-47", "model": "ストリームギア S1" }, - "fare": 4000, + "fare": 2500, "evaluation": 4, "requested_at": 1732568969000, "completed_at": 1732571012000 diff --git a/bench/benchmarker/scenario/data/user/01JDM0N9W89PK57C7XEVGD5C80/rides.json b/bench/benchmarker/scenario/data/user/01JDM0N9W89PK57C7XEVGD5C80/rides.json index 881fbb16..2b370450 100644 --- a/bench/benchmarker/scenario/data/user/01JDM0N9W89PK57C7XEVGD5C80/rides.json +++ b/bench/benchmarker/scenario/data/user/01JDM0N9W89PK57C7XEVGD5C80/rides.json @@ -79,7 +79,7 @@ "name": "IC-LX38-6303", "model": "インペリアルクラフト LUXE" }, - "fare": 1800, + "fare": 500, "evaluation": 5, "requested_at": 1732617529000, "completed_at": 1732618912000 diff --git a/bench/benchmarker/world/user.go b/bench/benchmarker/world/user.go index a4f11031..513d62d4 100644 --- a/bench/benchmarker/world/user.go +++ b/bench/benchmarker/world/user.go @@ -10,6 +10,7 @@ import ( "time" "github.com/isucon/isucon14/bench/internal/concurrent" + "github.com/samber/lo" ) type UserState int @@ -205,7 +206,7 @@ func (u *User) Tick(ctx *Context) error { // 過去のリクエストを確認する err := u.CheckRequestHistory(ctx) if err != nil { - return err + return WrapCodeError(ErrorCodeFailedToCheckRequestHistory, err) } // リクエストを作成する @@ -232,11 +233,36 @@ func (u *User) Deactivate() { } func (u *User) CheckRequestHistory(ctx *Context) error { - _, err := u.Client.GetRequests(ctx) + res, err := u.Client.GetRequests(ctx) if err != nil { - return WrapCodeError(ErrorCodeFailedToCheckRequestHistory, err) + return err + } + if len(res.Requests) != len(u.RequestHistory) { + return fmt.Errorf("ライドの数が想定数と一致していません: expected=%d, got=%d", len(u.RequestHistory), len(res.Requests)) + } + + historyMap := lo.KeyBy(u.RequestHistory, func(r *Request) string { return r.ServerID }) + for _, req := range res.Requests { + expected, ok := historyMap[req.ID] + if !ok { + return fmt.Errorf("想定されないライドが含まれています: id=%s", req.ID) + } + if !req.DestinationCoordinate.Equals(expected.DestinationPoint) || !req.PickupCoordinate.Equals(expected.PickupPoint) { + return fmt.Errorf("ライドの座標情報が正しくありません: id=%s", req.ID) + } + if req.Fare != expected.Fare() { + return fmt.Errorf("ライドの運賃が正しくありません: id=%s", req.ID) + } + if req.Evaluation != expected.CalculateEvaluation().Score() { + return fmt.Errorf("ライドの評価が正しくありません: id=%s", req.ID) + } + if req.Chair.ID != expected.Chair.ServerID || req.Chair.Name != expected.Chair.RegisteredData.Name || req.Chair.Model != expected.Chair.Model.Name || req.Chair.Owner != expected.Chair.Owner.RegisteredData.Name { + return fmt.Errorf("ライドの椅子の情報が正しくありません: id=%s", req.ID) + } + if !req.CompletedAt.Equal(expected.ServerCompletedAt) { + return fmt.Errorf("ライドの完了日時が正しくありません: id=%s", req.ID) + } } - // TODO: ここでvalidationも行う? return nil }