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)
## Рабочие Endpoints:
# Схема БД
- `/routes` - Получить список маршрутов;
- `/routes/{route_id}/transport` - Список транспорта, занятого на данном маршруте;
## Схема БД
![Схема БД](docs/Diagram.png)
# Рабочие Endpoints:
- `/routes` - Получить список маршрутов

View File

@ -15,11 +15,6 @@ import (
)
func main() {
// Загружаем переменные из .env
// err := godotenv.Load()
// if err != nil {
// log.Fatal("Ошибка загрузки .env файла")
// }
// Читаем переменные
dbHost := os.Getenv("DB_HOST")
@ -43,7 +38,7 @@ func main() {
err = db.Ping()
if err != nil {
log.Fatal("БД не отвечает:", err, dsn)
log.Fatal("БД не отвечает:", err)
}
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 (
"encoding/json"
"net/http"
"strconv"
"truck-company/internal/usecase"
"github.com/gorilla/mux"
@ -21,7 +22,7 @@ func NewTruckCompanyHandler(u *usecase.UseCase) *TruckCompanyHandler {
func (h *TruckCompanyHandler) RegisterRoutes(r *mux.Router) {
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("/shipments/cost", h.GetShipmentCost).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) {
routes, err := h.uc.GetAllRoutes()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
sendErrorResponse(w, http.StatusInternalServerError, "", err.Error())
return
}
w.WriteHeader(http.StatusOK)
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
}
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) {
return u.AppRepo.GetAllRoutes()
}
func (u *UseCase) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
return u.AppRepo.GetTransportByRoute(routeID)
}