package repository import ( "database/sql" "errors" "log" domain "truck-company/internal/domain" ) type AppRepo struct { db *sql.DB } func NewAppRepo(db *sql.DB) *AppRepo { return &AppRepo{ db: db, } } func (r *AppRepo) GetAllRoutes() ([]domain.Route, error) { if r.db == nil { return nil, errors.New("Ошибка подключения к бд. *db == nil") } rows, err := r.db.Query("SELECT id, name, price FROM route") if err != nil { return nil, err } defer rows.Close() var routes []domain.Route for rows.Next() { var route domain.Route if err := rows.Scan(&route.ID, &route.Name, &route.Price); err != nil { return nil, err } routes = append(routes, route) } return routes, nil } func (r *AppRepo) GetTransportByRoute(routeID int64) ([]domain.Transport, error) { if r.db == nil { return nil, errors.New("Ошибка подключения к бд. *db == nil") } rows, err := r.db.Query(` SELECT t.id, t.model, t.capacity, tt.name FROM transport t JOIN shipment s ON t.id = s.transport_id JOIN transport_type tt ON t.type_id = tt.id WHERE s.route_id = $1`, routeID) if err != nil { return nil, err } defer rows.Close() var transports []domain.Transport for rows.Next() { var transport domain.Transport if err := rows.Scan(&transport.ID, &transport.Model, &transport.Capacity, &transport.Type); err != nil { return nil, err } transports = append(transports, transport) } return transports, nil } func (r *AppRepo) GetCargoCost(cargoID int64) (float64, error) { if r.db == nil { return 0, errors.New("Ошибка подключения к бд. *db == nil") } var finalCost float64 query := ` SELECT SUM( CASE WHEN cl.is_regular THEN s.cost * 0.95 -- 5% скидка постоянным клиентам ELSE s.cost END) AS final_cost FROM shipment s JOIN client cl ON s.client_id = cl.id JOIN route r ON s.route_id = r.id JOIN cargo c ON s.cargo_id = c.id WHERE c.id = $1 GROUP BY c.id; ` err := r.db.QueryRow(query, cargoID).Scan(&finalCost) if err != nil { log.Println("Ошибка при получении стоимости перевозки:", err) return 0, err } return finalCost, nil }