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

|

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