Files
old-svijetlastrana/data/datamysql/ride.go
2018-04-25 13:16:36 +02:00

827 lines
27 KiB
Go

package datamysql
import (
"database/sql"
"fmt"
"time"
"bitbucket.org/nemt/nemt-portal-api/domain/entity"
"bitbucket.org/nemt/nemt-portal-api/infra/errors"
"github.com/go-sql-driver/mysql"
uuid "github.com/satori/go.uuid"
)
// rideRepo maps methods to database
type rideRepo struct {
conn executor
}
func newRideRepo(conn executor) *rideRepo {
return &rideRepo{
conn: conn,
}
}
func (c *rideRepo) getQuery() string {
const query = `SELECT
a.ride_id,
a.ride_uuid,
b.user_id,
b.user_uuid,
b.name,
b.member,
c.ride_status_id,
c.ride_status,
c.key ride_status_key,
d.ride_type_id,
d.value ride_type,
d.key ride_type_key,
a.notes,
e.first_name,
e.last_name,
e.image_url,
e.phone_number,
e.internal_user_id,
IFNULL(f.name, '') driver_name,
IFNULL(f.phone_number, '') driver_phone_number,
IFNULL(f.image_url, '') driver_image_url,
IFNULL(f.rating, '') driver_rating,
IFNULL(g.color, '') vehicle_color,
IFNULL(g.image_url, '') vehicle_image_url,
IFNULL(g.license_plate, '') vehicle_license_plate,
IFNULL(g.license_plate_state, '') vehicle_license_state,
IFNULL(g.make, '') vehicle_make,
IFNULL(g.model, '') vehicle_model,
IFNULL(g.year, 0) vehicle_year,
h.origin_name,
h.origin_address,
h.origin_lat,
h.origin_lng,
h.destination_name,
h.destination_address,
h.destination_lat,
h.destination_lng,
IFNULL(h.route_kml, '') route_kml,
IFNULL(h.distance, 0) distance,
IFNULL(h.duration, 0) duration,
IFNULL(h.eta, 0) eta,
a.pickup_time,
a.visit_date,
a.visit_time,
a.ride_internal_id,
a.visit_id,
i.visit_uuid,
IFNULL(i.pickup_id, '') visit_pickup_id,
IFNULL(i.pickup_address_id, 0) pickup_address_id,
IFNULL(i.address_id, 0) address_id,
IFNULL(i.provider_id, 0) provider_id,
IFNULL(o.provider_uuid, '') provider_uuid,
IFNULL(o.provider_internal_id, '') provider_internal_id,
IFNULL(o.provider_muk_id, '') provider_muk_id,
IFNULL(o.provider_name, '') provider_name,
-- i.pickup_name visit_pickup_name,
-- i.pickup_address visit_pickup_address,
-- i.pickup_lat visit_pickup_lat,
-- i.pickup_lng visit_pickup_lng,
-- IFNULL(i.destination_id, '') visit_destination_id,
-- i.destination_name visit_destination_name,
-- i.destination_address visit_destination_address,
-- i.destination_lat visit_destination_lat,
-- i.destination_lng visit_destination_lng,
IFNULL(i.visit_external_id, '') visit_external_id,
i.created_user_id,
j.user_uuid created_user_uuid,
j.name created_name,
IFNULL(k.phone_number, '') created_user_phone_number,
IFNULL(k.email, '') created_user_email,
IFNULL(l.phone_number, '') user_phone_number,
IFNULL(l.email, '') user_email,
a.create_date,
a.update_date,
m.trip_type_id,
m.trip_type_key,
m.trip_type,
n.trip_type_id visit_trip_type_id,
n.trip_type_key visit_trip_type_key,
n.trip_type visit_trip_type_key,
i.return_date
FROM tab_ride a
INNER JOIN tab_user b
ON a.user_id = b.user_id
INNER JOIN tab_ride_status c
ON c.ride_status_id = a.ride_status_id
INNER JOIN tab_ride_type d
ON d.ride_type_id = a.ride_type_id
INNER JOIN tab_ride_passenger e
ON e.ride_id = a.ride_id
LEFT JOIN tab_ride_driver f
ON f.ride_id = a.ride_id
LEFT JOIN tab_ride_vehicle g
ON g.ride_id = a.ride_id
INNER JOIN tab_ride_route h
ON h.ride_id = a.ride_id
INNER JOIN tab_visit i
ON i.visit_id = a.visit_id
INNER JOIN tab_user j
ON j.user_id = i.created_user_id
INNER JOIN tab_login k
ON k.user_id = j.user_id
INNER JOIN tab_login l
ON l.user_id = a.user_id
INNER JOIN tab_trip_type m
ON m.trip_type_id = a.trip_type_id
INNER JOIN tab_trip_type n
ON n.trip_type_id = i.trip_type_id
INNER JOIN tab_provider o
ON i.provider_id = o.provider_id `
return query
}
func (c *rideRepo) getProfileQuery(user entity.User) (query string, where string, err error) {
if len(user.Profiles) > 0 {
for _, p := range user.Profiles {
switch p.Key {
case "AD", "BCBSIAD", "BDCAD", "PLANAD":
return
case "SP", "SPT":
switch p.Organization.Type.Key {
case "techsupport", "bcbsi", "bcbsa", "plan":
return
case "provider":
query = `INNER JOIN viw_visit_provider o ON a.ride_id = o.ride_id`
where = fmt.Sprintf(` AND (o.organization_uuid = '%s' OR o.parent_organization_uuid = '%s') `, p.Organization.UUID, p.Organization.UUID)
return
}
}
}
if query == "" && where == "" {
return "", "", fmt.Errorf("Invalid Query")
} else {
return
}
} else {
return "", "", fmt.Errorf("User has no profile to search")
}
}
func (c *rideRepo) Update(hook entity.WebhookResponse, user entity.User) (retVal entity.Ride, err error) {
oldRide, err := c.GetByUUID(hook.Ride.UUID, user)
if err != nil {
return retVal, err
}
retVal, err = c.updateHeader(hook.Ride)
if err != nil {
return retVal, err
}
retVal, err = c.updateLocation(hook.Ride)
if err != nil {
return retVal, err
}
// retVal, err = c.updatePassenger(hook.Ride)
// if err != nil {
// return retVal, err
// }
if oldRide.Driver.Name != "" {
retVal, err = c.updateDriver(hook.Ride)
} else {
retVal, err = c.saveDriver(hook.Ride)
}
if err != nil {
return retVal, err
}
if oldRide.Vehicle.LicensePlate != "" {
retVal, err = c.updateVehicle(hook.Ride)
} else {
retVal, err = c.saveVehicle(hook.Ride)
}
if err != nil {
return retVal, err
}
go func() {
err := c.saveHistory(hook)
if err != nil {
fmt.Println("Error to save history: " + err.Error())
}
}()
return retVal, nil
}
func (c *rideRepo) updateVehicle(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = `UPDATE tab_ride_vehicle
SET
color = ?,
image_url = ?,
license_plate = ?,
license_plate_state = ?,
make = ?,
model = ?,
year = ?
WHERE ride_id = ?;`
)
retVal = ride
_, err = c.conn.Exec(query, ride.Vehicle.Color, ride.Vehicle.ImageURL, ride.Vehicle.LicensePlate, ride.Vehicle.LicensePlateState, ride.Vehicle.Make, ride.Vehicle.Model, ride.Vehicle.Year, ride.ID)
if err != nil {
return retVal, err
}
return retVal, nil
}
func (c *rideRepo) updateDriver(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = `UPDATE tab_ride_driver
SET
name = ?,
image_url = ?,
phone_number = ?,
rating = ?
WHERE ride_id = ?;`
)
retVal = ride
_, err = c.conn.Exec(query, ride.Driver.Name, ride.Driver.ImageURL, ride.Driver.PhoneNumber, ride.Driver.Rating, ride.ID)
if err != nil {
return retVal, err
}
return retVal, nil
}
func (c *rideRepo) updatePassenger(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = `UPDATE tab_ride_passenger
SET
first_name = ?,
last_name = ?,
image_url = ?,
phone_number = ?,
internal_user_id = ?
WHERE ride_id = ?;`
)
retVal = ride
_, err = c.conn.Exec(query, ride.Passenger.FirstName, ride.Passenger.LastName, ride.Passenger.ImageURL, ride.Passenger.PhoneNumber, ride.Passenger.InternalID, ride.ID)
if err != nil {
return retVal, err
}
return retVal, nil
}
func (c *rideRepo) updateLocation(ride entity.Ride) (retVal entity.Ride, err error) {
query := `UPDATE tab_ride_route
SET
origin_address = ?,
origin_lat = ?,
origin_lng = ?,
destination_address = ?,
destination_lat = ?,
destination_lng = ?,
route_kml = ?,
distance = ?,
duration = ?,
eta = ?`
where := ` WHERE ride_id = ?;`
retVal = ride
params := make([]interface{}, 0)
params = append(params, ride.Route.Origin.Address, ride.Route.Origin.Latitude, ride.Route.Origin.Longitude, ride.Route.Destination.Address, ride.Route.Destination.Latitude, ride.Route.Destination.Longitude, ride.Route.RouteKML, ride.Route.Distance, ride.Route.Duration, ride.Route.ETA)
if retVal.Route.Origin.Name != "" {
query += " , origin_name = ? "
params = append(params, ride.Route.Origin.Name)
}
if retVal.Route.Destination.Name != "" {
query += " , destination_name = ? "
params = append(params, ride.Route.Destination.Name)
}
params = append(params, ride.ID)
_, err = c.conn.Exec(query+where, params...)
if err != nil {
return retVal, err
}
return retVal, nil
}
func (c *rideRepo) updateHeader(ride entity.Ride) (retVal entity.Ride, err error) {
const (
statusQuery = "SELECT ride_status_id FROM tab_ride_status WHERE `key` = ?"
query = `UPDATE tab_ride
SET
ride_status_id = ?,
ride_type_id = ?,
ride_internal_id = ?,
request_date = ?,
request_ms = ?,
generate_date = ?,
generate_ms = ?,
route_kml = ?,
notes = ?,
primetime_percentage = ?,
pickup_time = ?,
visit_date = ?,
visit_time = ?,
visit_id = ?
WHERE ride_uuid = ?;`
)
row := c.conn.QueryRow(statusQuery, ride.Status.Key)
err = row.Scan(&ride.Status.ID)
if err != nil {
fmt.Println("Error to get status")
return retVal, err
}
retVal = ride
_, err = c.conn.Exec(query, ride.Status.ID, ride.Type.ID, ride.InternalID, ride.RequestDate, ride.RequestMiliseconds, ride.GenerateDate, ride.GenerateMiliseconds, ride.Route.RouteKML, ride.Note, ride.PrimetimePercentage, ride.PickupTime, ride.VisitDate, ride.VisitTime, ride.Visit.ID, ride.UUID)
if err != nil {
return retVal, err
}
return ride, nil
}
func (c *rideRepo) Save(ride entity.Ride) (retVal entity.Ride, err error) {
retVal, err = c.saveHeader(ride)
if err != nil {
fmt.Println("Error to save header")
return retVal, err
}
retVal, err = c.saveLocation(retVal)
if err != nil {
fmt.Println("Error to save location")
return retVal, err
}
retVal, err = c.savePassenger(retVal)
if err != nil {
fmt.Println("Error to save passenger")
return retVal, err
}
retVal, err = c.saveDriver(retVal)
if err != nil {
fmt.Println("Error to save driver")
return retVal, err
}
retVal, err = c.saveVehicle(retVal)
if err != nil {
fmt.Println("Error to save vehicle")
return retVal, err
}
go func() {
hook := entity.WebhookResponse{
Ride: retVal,
}
err = c.saveHistory(hook)
if err != nil {
fmt.Println("Error to save history: ", err.Error())
}
}()
return retVal, err
}
func (c *rideRepo) saveHistory(hook entity.WebhookResponse) error {
rideHistoryID, err := c.saveHistoryHeader(hook)
if err != nil {
fmt.Println("Error to save header history")
return err
}
if err = c.saveLocationHistory(rideHistoryID, hook.Ride.Route); err != nil {
fmt.Println("Error to save location history")
return err
}
if err = c.savePassengerHistory(rideHistoryID, hook.Ride.Passenger); err != nil {
fmt.Println("Error to save passenger history")
return err
}
if err = c.saveDriverHistory(rideHistoryID, hook.Ride.Driver); err != nil {
fmt.Println("Error to save driver history")
return err
}
if err = c.saveVehicleHistory(rideHistoryID, hook.Ride.Vehicle); err != nil {
fmt.Println("Error to save vehicle history")
return err
}
return nil
}
func (c *rideRepo) saveVehicleHistory(rideHistoryID int64, vehicle entity.RideVehicle) error {
const (
query = "INSERT INTO tab_ride_vehicle_history(ride_history_id,color,image_url,license_plate,license_plate_state,make,model,`year`) VALUES(?,?,?,?,?,?,?,?);"
)
if vehicle.Make != "" && vehicle.Model != "" && vehicle.Color != "" && vehicle.Year > 0 {
_, err := c.conn.Exec(query, rideHistoryID, vehicle.Color, vehicle.ImageURL, vehicle.LicensePlate, vehicle.LicensePlateState, vehicle.Make, vehicle.Model, vehicle.Year)
if err != nil {
return err
}
}
return nil
}
func (c *rideRepo) saveDriverHistory(rideHistoryID int64, driver entity.RideDriver) error {
const (
query = "INSERT INTO tab_ride_driver_history(ride_history_id,name,image_url,phone_number,rating) VALUES(?,?,?,?,?);"
)
if driver.Name != "" && driver.PhoneNumber != "" {
_, err := c.conn.Exec(query, rideHistoryID, driver.Name, driver.ImageURL, driver.PhoneNumber, driver.Rating)
if err != nil {
return err
}
}
return nil
}
func (c *rideRepo) savePassengerHistory(rideHistoryID int64, passenger entity.RidePassenger) error {
const (
query = "INSERT INTO tab_ride_passenger_history(ride_history_id,first_name,last_name,image_url,phone_number,internal_user_id) VALUES(?,?,?,?,?,?)"
)
_, err := c.conn.Exec(query, rideHistoryID, passenger.FirstName, passenger.LastName, "", passenger.PhoneNumber, passenger.InternalID)
if err != nil {
return err
}
return nil
}
func (c *rideRepo) saveLocationHistory(rideHistoryID int64, route entity.RideRoute) error {
const (
query = `INSERT INTO tab_ride_route_history(ride_history_id,origin_name,origin_address,origin_lat,origin_lng,destination_name,destination_address,destination_lat,destination_lng,route_kml,distance,duration,eta)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?);`
)
if route.Origin.Latitude != 0 && route.Origin.Longitude != 0 && route.Destination.Latitude != 0 && route.Destination.Longitude != 0 {
_, err := c.conn.Exec(query, rideHistoryID, route.Origin.Name, route.Origin.Address, route.Origin.Latitude, route.Origin.Longitude, route.Destination.Name, route.Destination.Address, route.Destination.Latitude, route.Destination.Longitude, route.RouteKML, route.Distance, route.Duration, route.ETA)
if err != nil {
return err
}
}
return nil
}
func (c *rideRepo) saveHistoryHeader(hook entity.WebhookResponse) (int64, error) {
const (
query = `INSERT INTO tab_ride_history(ride_history_uuid,ride_id,event_id,href,occurred_at,event_type,ride_internal_id,ride_status_id,ride_type_id,request_date,request_ms,generate_date,generate_ms,route_kml,notes, primetime_percentage, pickup_time, visit_date, visit_time, visit_id)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);`
)
UUID, _ := uuid.NewV4()
sUUID := UUID.String()
if hook.OccurredAt.IsZero() {
hook.OccurredAt = time.Now()
}
results, err := c.conn.Exec(query, sUUID, hook.Ride.ID, hook.EventID, hook.HREF, hook.OccurredAt, hook.EventType, hook.Ride.InternalID, hook.Ride.Status.ID, hook.Ride.Type.ID, hook.Ride.RequestDate, hook.Ride.RequestMiliseconds, hook.Ride.GenerateDate, hook.Ride.GenerateMiliseconds, hook.Ride.Route.RouteKML, hook.Ride.Note, hook.Ride.PrimetimePercentage, hook.Ride.PickupTime, hook.Ride.VisitDate, hook.Ride.VisitTime, hook.Ride.Visit.ID)
if err != nil {
return 0, err
}
return results.LastInsertId()
}
func (c *rideRepo) saveHeader(ride entity.Ride) (retVal entity.Ride, err error) {
const (
dataQuery = `SELECT
a.user_id user_id,
a.name,
a.member,
b.ride_status_id,
b.ride_status,
c.ride_type_id,
c.value ride_type,
d.user_id created_user_id,
d.name created_name,
IFNULL(d.member, '') created_member,
e.trip_type_id,
e.trip_type_key,
e.trip_type
FROM tab_user a,
tab_ride_status b,
tab_ride_type c,
tab_user d,
tab_trip_type e
WHERE
a.user_uuid = ?
AND b.key = ?
AND c.key = ?
AND d.user_uuid = ?
AND e.trip_type_key = ?;`
query = `INSERT INTO tab_ride(ride_uuid, user_id, ride_status_id, ride_type_id, ride_internal_id, request_date, request_ms, generate_date, generate_ms, notes, primetime_percentage, pickup_time, visit_date, visit_time, visit_id, created_user_id, trip_type_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`
)
retVal = ride
UUID, _ := uuid.NewV4()
retVal.UUID = UUID.String()
if retVal.Status.Key == "" {
retVal.Status.Key = "accepted"
}
if retVal.Type.Key == "" {
retVal.Type.Key = "lyft"
}
row := c.conn.QueryRow(dataQuery, retVal.User.UUID, retVal.Status.Key, retVal.Type.Key, retVal.CreatedUser.UUID, retVal.TripType.Key)
if err = row.Scan(&retVal.User.ID, &retVal.User.Name, &retVal.User.Member, &retVal.Status.ID, &retVal.Status.Value, &retVal.Type.ID, &retVal.Type.Value, &retVal.CreatedUser.ID, &retVal.CreatedUser.Name, &retVal.CreatedUser.Member, &retVal.TripType.ID, &retVal.TripType.Key, &retVal.TripType.Value); err != nil {
fmt.Println("Error to get base data: ", err.Error())
return retVal, err
}
results, err := c.conn.Exec(query, retVal.UUID, retVal.User.ID, retVal.Status.ID, retVal.Type.ID, retVal.InternalID, retVal.RequestDate, retVal.RequestMiliseconds, retVal.GenerateDate, retVal.GenerateMiliseconds, retVal.Note, retVal.PrimetimePercentage, retVal.PickupTime, retVal.VisitDate, retVal.VisitTime, retVal.Visit.ID, retVal.CreatedUser.ID, retVal.TripType.ID)
if err != nil {
fmt.Println("Error: ", err.Error())
return retVal, err
}
var ID int64
ID, err = results.LastInsertId()
if err != nil {
fmt.Println("Error Getting the ID: ", err.Error())
return retVal, err
}
retVal.ID = ID
return retVal, nil
}
func (c *rideRepo) saveLocation(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = `INSERT INTO tab_ride_route(ride_id,origin_name,origin_address,origin_lat,origin_lng,destination_name,destination_address,destination_lat,destination_lng,route_kml,distance,duration,eta)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);`
)
retVal = ride
results, err := c.conn.Exec(query, retVal.ID, retVal.Route.Origin.Name, retVal.Route.Origin.Address, retVal.Route.Origin.Latitude, retVal.Route.Origin.Longitude, retVal.Route.Destination.Name, retVal.Route.Destination.Address, retVal.Route.Destination.Latitude, retVal.Route.Destination.Longitude, retVal.Route.RouteKML, retVal.Route.Distance, retVal.Route.Duration, retVal.Route.ETA)
if err != nil {
return retVal, err
}
var ID int64
ID, err = results.LastInsertId()
if err != nil {
fmt.Println("Error Getting the ID: ", err.Error())
return retVal, err
}
retVal.Route.ID = ID
return retVal, nil
}
func (c *rideRepo) savePassenger(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = `INSERT INTO tab_ride_passenger(ride_id,first_name,last_name,image_url,phone_number,internal_user_id)
VALUES(?,?,?,?,?,?);`
)
retVal = ride
results, err := c.conn.Exec(query, retVal.ID, ride.Passenger.FirstName, ride.Passenger.LastName, ride.Passenger.ImageURL, ride.Passenger.PhoneNumber, ride.Passenger.InternalID)
if err != nil {
return retVal, err
}
var ID int64
ID, err = results.LastInsertId()
if err != nil {
fmt.Println("Error Getting the ID: ", err.Error())
return retVal, err
}
retVal.Passenger.ID = ID
return retVal, nil
}
func (c *rideRepo) saveDriver(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = "INSERT INTO tab_ride_driver(ride_id,`name`,image_url,phone_number,rating) VALUES(?,?,?,?,?);"
)
retVal = ride
if retVal.Driver.Name != "" && retVal.Driver.PhoneNumber != "" {
results, err := c.conn.Exec(query, retVal.ID, ride.Driver.Name, ride.Driver.ImageURL, ride.Driver.PhoneNumber, ride.Driver.Rating)
if err != nil {
return retVal, err
}
var ID int64
ID, err = results.LastInsertId()
if err != nil {
fmt.Println("Error Getting the ID: ", err.Error())
return retVal, err
}
retVal.Driver.ID = ID
}
return retVal, nil
}
func (c *rideRepo) saveVehicle(ride entity.Ride) (retVal entity.Ride, err error) {
const (
query = "INSERT INTO tab_ride_vehicle(ride_id,color,image_url,license_plate,license_plate_state,make,model,`year`) VALUES(?,?,?,?,?,?,?,?);"
)
retVal = ride
if retVal.Vehicle.Color != "" && retVal.Vehicle.LicensePlate != "" && retVal.Vehicle.Make != "" && retVal.Vehicle.Model != "" && retVal.Vehicle.Year > 0 {
results, err := c.conn.Exec(query, retVal.ID, ride.Vehicle.Color, ride.Vehicle.ImageURL, ride.Vehicle.LicensePlate, ride.Vehicle.LicensePlateState, ride.Vehicle.Make, ride.Vehicle.Model, ride.Vehicle.Year)
if err != nil {
return retVal, err
}
var ID int64
ID, err = results.LastInsertId()
if err != nil {
fmt.Println("Error Getting the ID: ", err.Error())
return retVal, err
}
retVal.Vehicle.ID = ID
}
return retVal, nil
}
func (c *rideRepo) GetByUUID(uuid string, user entity.User) (entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return entity.Ride{}, err
}
query = c.getQuery() + query + " WHERE a.ride_uuid = ? " + where
return c.parseEntity(c.conn.QueryRow(query, uuid))
}
func (c *rideRepo) GetByID(id int64, user entity.User) (entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return entity.Ride{}, err
}
query = c.getQuery() + query + " WHERE a.ride_id = ? " + where
return c.parseEntity(c.conn.QueryRow(query, id))
}
func (c *rideRepo) GetByUUIDAndUserUUID(UUID string, userUUID string) (entity.Ride, error) {
return c.parseEntity(c.conn.QueryRow(c.getQuery()+" WHERE a.ride_uuid = ? AND b.user_uuid = ?", UUID, userUUID))
}
func (c *rideRepo) GetLastRideByPhoneNumber(phoneNumber string) (entity.Ride, error) {
query := c.getQuery() + ` WHERE c.ride_status IN ('accepted', 'arrived', 'scheduled', 'pending')
AND l.phone_number = ?
ORDER BY a.create_date DESC
LIMIT 1;`
return c.parseEntity(c.conn.QueryRow(query, phoneNumber))
}
func (c *rideRepo) GetLastRideByDriversNumber(phoneNumber string) (entity.Ride, error) {
query := c.getQuery() + ` WHERE c.ride_status IN ('accepted', 'arrived', 'scheduled', 'pending')
AND IFNULL(f.phone_number, '') = ?
ORDER BY a.create_date DESC
LIMIT 1;`
return c.parseEntity(c.conn.QueryRow(query, phoneNumber))
}
func (c *rideRepo) GetByInternalID(internalID string) (entity.Ride, error) {
return c.parseEntity(c.conn.QueryRow(c.getQuery()+" WHERE a.ride_internal_id = ?", internalID))
}
func (c *rideRepo) GetByInternalPassengerID(internalPassengerID string) (entity.Ride, error) {
return c.parseEntity(c.conn.QueryRow(c.getQuery()+" WHERE e.internal_user_id = ?", internalPassengerID))
}
func (c *rideRepo) GetByUserID(userID int64, user entity.User) ([]entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return nil, err
}
query = c.getQuery() + query + " WHERE b.user_id = ? " + where
return c.parseSet(c.conn.Query(query, userID))
}
func (c *rideRepo) GetByUserUUID(userUUID string, user entity.User) ([]entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return nil, err
}
query = c.getQuery() + query + " WHERE b.user_uuid = ? " + where
return c.parseSet(c.conn.Query(query, userUUID))
}
func (c *rideRepo) GetByVisitUUID(visitUUID string, user entity.User) ([]entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return nil, err
}
query = c.getQuery() + query + " WHERE b.user_id = ? " + where
return c.parseSet(c.conn.Query(query, visitUUID))
}
func (c *rideRepo) GetByVisitUUIDAndTripType(visitUUID string, tripTypeKey string, user entity.User) (entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return entity.Ride{}, err
}
query = c.getQuery() + query + " WHERE i.visit_uuid = ? AND m.trip_type_key = ? " + where
return c.parseEntity(c.conn.QueryRow(query, visitUUID, tripTypeKey))
}
func (c *rideRepo) parseSet(rows *sql.Rows, err error) ([]entity.Ride, error) {
if err != nil {
return nil, errors.Wrap(err)
}
result := make([]entity.Ride, 0)
for rows.Next() {
entity, err := c.parseEntity(rows)
if err != nil {
return nil, errors.Wrap(err)
}
result = append(result, entity)
}
return result, nil
}
func (c *rideRepo) parseEntity(row scanner) (r entity.Ride, err error) {
var returnDate mysql.NullTime
err = row.Scan(&r.ID, &r.UUID, &r.User.ID, &r.User.UUID, &r.User.Name, &r.User.Member, &r.Status.ID, &r.Status.Value, &r.Status.Key, &r.Type.ID, &r.Type.Value, &r.Type.Key, &r.Note, &r.Passenger.FirstName, &r.Passenger.LastName, &r.Passenger.ImageURL, &r.Passenger.PhoneNumber, &r.Passenger.InternalID, &r.Driver.Name, &r.Driver.PhoneNumber, &r.Driver.ImageURL, &r.Driver.Rating, &r.Vehicle.Color, &r.Vehicle.ImageURL, &r.Vehicle.LicensePlate, &r.Vehicle.LicensePlateState, &r.Vehicle.Make, &r.Vehicle.Model, &r.Vehicle.Year, &r.Route.Origin.Name, &r.Route.Origin.Address, &r.Route.Origin.Latitude, &r.Route.Origin.Longitude, &r.Route.Destination.Name, &r.Route.Destination.Address, &r.Route.Destination.Latitude, &r.Route.Destination.Longitude, &r.Route.RouteKML, &r.Route.Distance, &r.Route.Duration, &r.Route.ETA, &r.PickupTime, &r.VisitDate, &r.VisitTime, &r.InternalID, &r.Visit.ID, &r.Visit.UUID, &r.Visit.Pickup.ID, &r.Visit.PickupAddressID, &r.Visit.DestinationAddressID, &r.Visit.Provider.ProviderID, &r.Visit.Provider.ProviderUUID, &r.Visit.Provider.InternalID, &r.Visit.Provider.MukID, &r.Visit.Provider.Name, &r.Visit.ExternalID, &r.Visit.CreatedUser.ID, &r.Visit.CreatedUser.UUID, &r.Visit.CreatedUser.Name, &r.Visit.CreatedUser.PhoneNumber, &r.Visit.CreatedUser.Email, &r.User.PhoneNumber, &r.User.Email, &r.Created, &r.Updated, &r.TripType.ID, &r.TripType.Key, &r.TripType.Value, &r.Visit.TripType.ID, &r.Visit.TripType.Key, &r.Visit.TripType.Value, &returnDate)
if err != nil {
return r, errors.Wrap(err)
}
r.CreatedUser = r.Visit.CreatedUser
if returnDate.Valid {
r.Visit.ReturnDate = &returnDate.Time
}
return r, nil
}
func (c *rideRepo) UpdateStatus(rideUUID string, status string) error {
const (
statusQuery = "SELECT ride_status_id FROM tab_ride_status WHERE `key` = ?"
query = "UPDATE tab_ride SET ride_status_id = ? WHERE ride_uuid = ?"
)
var rideStatusID int64
row := c.conn.QueryRow(statusQuery, status)
err := row.Scan(&rideStatusID)
if err != nil {
return err
}
_, err = c.conn.Exec(query, rideStatusID, rideUUID)
if err != nil {
return err
}
return nil
}
func (c *rideRepo) GetAll(user entity.User) ([]entity.Ride, error) {
query, where, err := c.getProfileQuery(user)
if err != nil {
return nil, err
}
query = c.getQuery() + query + " WHERE 1 = 1 AND b.active = 1 " + where
return c.parseSet(c.conn.Query(query))
}