/route endpoint

This commit is contained in:
Dmitriy Bondarenko 2025-03-27 20:47:43 +00:00
parent 28be1400c7
commit a9b47d49e2
14 changed files with 151 additions and 10 deletions

View File

@ -1,5 +1,5 @@
# Этап сборки
FROM docker.io/library/golang:latest AS builder
FROM docker.io/library/golang:1.22.2 AS builder
# Рабочая директория
WORKDIR /build

View File

@ -1,13 +1,60 @@
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"os"
"truck-company/internal/handlers"
"truck-company/internal/repository"
"truck-company/internal/usecase"
"github.com/gorilla/mux"
"github.com/joho/godotenv"
)
func main() {
r := mux.NewRouter()
// Загружаем переменные из .env
err := godotenv.Load()
if err != nil {
log.Fatal("Ошибка загрузки .env файла")
}
http.ListenAndServe(":8080", r)
// Читаем переменные
dbHost := os.Getenv("DB_HOST")
dbPort := os.Getenv("DB_PORT")
dbUser := os.Getenv("POSTGRES_USER")
dbPassword := os.Getenv("POSTGRES_PASSWORD")
dbName := os.Getenv("POSTGRES_DB")
sslMode := os.Getenv("DB_SSLMODE")
// Формируем строку подключения
dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s",
dbHost, dbPort, dbUser, dbPassword, dbName, sslMode)
db, err := sql.Open("postgres", dsn)
if err != nil {
log.Fatal("Ошибка подключения к БД:", err)
}
defer db.Close()
// Проверяем соединение
err = db.Ping()
if err != nil {
log.Fatal("БД не отвечает:", err)
}
log.Println("Подключение к PostgreSQL успешно!")
repo := repository.NewAppRepo(db)
usecase := usecase.NewUseCase(*repo)
r := mux.NewRouter()
h := handlers.NewTruckCompanyHandler(usecase)
h.RegisterRoutes(r)
// Запуск сервера
log.Println("Server running on :8080")
log.Fatal(http.ListenAndServe(":8080", r))
}

2
go.mod
View File

@ -3,3 +3,5 @@ module truck-company
go 1.22.2
require github.com/gorilla/mux v1.8.1
require github.com/joho/godotenv v1.5.1

2
go.sum
View File

@ -1,2 +1,4 @@
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=

View File

@ -0,0 +1 @@
package domain

View File

@ -1,4 +1,4 @@
package main
package domain
// Transport представляет конкретное транспортное средство
type Transport struct {

View File

@ -1,21 +1,40 @@
package handlers
import (
"encoding/json"
"net/http"
"truck-company/internal/usecase"
"github.com/gorilla/mux"
)
type TruckCompanyHandler struct {
uc *usecase.UseCase
}
func NewTruckCompanyHandler() *TruckCompanyHandler {
return &TruckCompanyHandler{}
func NewTruckCompanyHandler(u *usecase.UseCase) *TruckCompanyHandler {
return &TruckCompanyHandler{
uc: u,
}
}
func (h *TruckCompanyHandler) RegisterRoutes(router *mux.Router) {
func (h *TruckCompanyHandler) RegisterRoutes(r *mux.Router) {
// router.HandleFunc("/routes").Methods(http.MethodGet)
// router.HandleFunc("").Methods(http.MethodGet)
router.HandleFunc("/", http.NotFound)
r.HandleFunc("/routes", h.GetRoutes).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")
//404 для всех остальных
r.HandleFunc("/", http.NotFound)
}
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)
return
}
json.NewEncoder(w).Encode(routes)
}

View File

@ -0,0 +1,11 @@
package repository
import (
domain "truck-company/internal/domain"
)
type RepositoryInterface interface {
GetAllRoutes() ([]domain.Route, error)
GetTransportByRoute(routeID int64) ([]domain.Transport, error)
GetShipmentCosts() ([]domain.Shipment, error)
}

View File

@ -0,0 +1,39 @@
package repository
import (
"database/sql"
"errors"
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
}

View File

@ -0,0 +1,20 @@
package usecase
import (
"truck-company/internal/domain"
"truck-company/internal/repository"
)
type UseCase struct {
AppRepo repository.AppRepo
}
func NewUseCase(r repository.AppRepo) *UseCase {
return &UseCase{
AppRepo: r,
}
}
func (u *UseCase) GetAllRoutes() ([]domain.Route, error) {
return u.AppRepo.GetAllRoutes()
}