endpoint /routes/{route_id}/transport

This commit is contained in:
Dmitriy Bondarenko 2025-03-27 22:08:46 +00:00
parent 1a782a70b3
commit 5cf8dd1bb1
6 changed files with 84 additions and 12 deletions

View File

@ -2,12 +2,13 @@
# В ПРОЦЕССЕ РАЗРАБОТКИ # В ПРОЦЕССЕ РАЗРАБОТКИ
# Задание
[Задание](Task15.md) [Задание](Task15.md)
## Рабочие Endpoints:
# Схема БД - `/routes` - Получить список маршрутов;
- `/routes/{route_id}/transport` - Список транспорта, занятого на данном маршруте;
## Схема БД
![Схема БД](docs/Diagram.png) ![Схема БД](docs/Diagram.png)
# Рабочие Endpoints:
- `/routes` - Получить список маршрутов

View File

@ -15,11 +15,6 @@ import (
) )
func main() { func main() {
// Загружаем переменные из .env
// err := godotenv.Load()
// if err != nil {
// log.Fatal("Ошибка загрузки .env файла")
// }
// Читаем переменные // Читаем переменные
dbHost := os.Getenv("DB_HOST") dbHost := os.Getenv("DB_HOST")
@ -43,7 +38,7 @@ func main() {
err = db.Ping() err = db.Ping()
if err != nil { if err != nil {
log.Fatal("БД не отвечает:", err, dsn) log.Fatal("БД не отвечает:", err)
} }
log.Println("Подключение к PostgreSQL успешно!") log.Println("Подключение к PostgreSQL успешно!")

View File

@ -0,0 +1,23 @@
package handlers
import (
"encoding/json"
"net/http"
)
type ErrorResponse struct {
Code int `json:"code"`
Message string `json:"message"`
Error string `json:"error"`
}
func sendErrorResponse(w http.ResponseWriter, code int, message string, err string) {
response := ErrorResponse{
Code: code,
Message: message,
Error: err,
}
w.WriteHeader(response.Code)
json.NewEncoder(w).Encode(response)
}

View File

@ -3,6 +3,7 @@ package handlers
import ( import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"strconv"
"truck-company/internal/usecase" "truck-company/internal/usecase"
"github.com/gorilla/mux" "github.com/gorilla/mux"
@ -21,7 +22,7 @@ func NewTruckCompanyHandler(u *usecase.UseCase) *TruckCompanyHandler {
func (h *TruckCompanyHandler) RegisterRoutes(r *mux.Router) { func (h *TruckCompanyHandler) RegisterRoutes(r *mux.Router) {
r.HandleFunc("/routes", h.GetRoutes).Methods("GET") r.HandleFunc("/routes", h.GetRoutes).Methods("GET")
// r.HandleFunc("/routes/{route_id}/transport", h.GetTransportByRoute).Methods("GET") r.HandleFunc("/routes/{route_id}/transport", h.GetTransportByRoute).Methods("GET")
// r.HandleFunc("/routes/{route_id}/transport-types", h.GetTransportTypesByRoute).Methods("GET") // r.HandleFunc("/routes/{route_id}/transport-types", h.GetTransportTypesByRoute).Methods("GET")
// r.HandleFunc("/shipments/cost", h.GetShipmentCost).Methods("GET") // r.HandleFunc("/shipments/cost", h.GetShipmentCost).Methods("GET")
// r.HandleFunc("/routes/{route_id}/cargo-turnover", h.GetCargoTurnoverByRoute).Methods("GET") // r.HandleFunc("/routes/{route_id}/cargo-turnover", h.GetCargoTurnoverByRoute).Methods("GET")
@ -31,10 +32,35 @@ func (h *TruckCompanyHandler) RegisterRoutes(r *mux.Router) {
} }
func (h *TruckCompanyHandler) GetRoutes(w http.ResponseWriter, r *http.Request) { func (h *TruckCompanyHandler) GetRoutes(w http.ResponseWriter, r *http.Request) {
routes, err := h.uc.GetAllRoutes() routes, err := h.uc.GetAllRoutes()
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) sendErrorResponse(w, http.StatusInternalServerError, "", err.Error())
return return
} }
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(routes) json.NewEncoder(w).Encode(routes)
} }
func (h *TruckCompanyHandler) GetTransportByRoute(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
routeID, err := strconv.ParseInt(vars["route_id"], 10, 64)
if err != nil {
sendErrorResponse(w, http.StatusBadRequest, "Invalid route ID", err.Error())
return
}
transport, err := h.uc.GetTransportByRoute(routeID)
if err != nil {
sendErrorResponse(w, http.StatusInternalServerError, "", err.Error())
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(transport)
}

View File

@ -37,3 +37,26 @@ func (r *AppRepo) GetAllRoutes() ([]domain.Route, error) {
} }
return routes, nil return routes, nil
} }
func (t *AppRepo) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
rows, err := t.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
}

View File

@ -18,3 +18,7 @@ func NewUseCase(r repository.AppRepo) *UseCase {
func (u *UseCase) GetAllRoutes() ([]domain.Route, error) { func (u *UseCase) GetAllRoutes() ([]domain.Route, error) {
return u.AppRepo.GetAllRoutes() return u.AppRepo.GetAllRoutes()
} }
func (u *UseCase) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
return u.AppRepo.GetTransportByRoute(routeID)
}