endpoint /routes/{route_id}/transport
This commit is contained in:
parent
1a782a70b3
commit
5cf8dd1bb1
@ -2,12 +2,13 @@
|
||||
|
||||
# В ПРОЦЕССЕ РАЗРАБОТКИ
|
||||
|
||||
# Задание
|
||||
[Задание](Task15.md)
|
||||
|
||||
## Рабочие Endpoints:
|
||||
|
||||
# Схема БД
|
||||
- `/routes` - Получить список маршрутов;
|
||||
- `/routes/{route_id}/transport` - Список транспорта, занятого на данном маршруте;
|
||||
## Схема БД
|
||||

|
||||
|
||||
# Рабочие Endpoints:
|
||||
|
||||
- `/routes` - Получить список маршрутов
|
@ -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 успешно!")
|
||||
|
||||
|
23
internal/handlers/errorresponse.go
Normal file
23
internal/handlers/errorresponse.go
Normal 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)
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user