/route endpoint
This commit is contained in:
parent
28be1400c7
commit
a9b47d49e2
@ -1,5 +1,5 @@
|
||||
# Этап сборки
|
||||
FROM docker.io/library/golang:latest AS builder
|
||||
FROM docker.io/library/golang:1.22.2 AS builder
|
||||
|
||||
# Рабочая директория
|
||||
WORKDIR /build
|
||||
|
@ -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
2
go.mod
@ -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
2
go.sum
@ -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=
|
||||
|
1
internal/domain/domain.go
Normal file
1
internal/domain/domain.go
Normal file
@ -0,0 +1 @@
|
||||
package domain
|
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package domain
|
||||
|
||||
// Transport представляет конкретное транспортное средство
|
||||
type Transport struct {
|
@ -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)
|
||||
}
|
||||
|
11
internal/repository/interface.go
Normal file
11
internal/repository/interface.go
Normal 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)
|
||||
}
|
39
internal/repository/postgres.go
Normal file
39
internal/repository/postgres.go
Normal 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
|
||||
}
|
20
internal/usecase/usecase.go
Normal file
20
internal/usecase/usecase.go
Normal 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()
|
||||
}
|
Loading…
Reference in New Issue
Block a user