85 lines
2.9 KiB
Go
85 lines
2.9 KiB
Go
// @title Effective Mobile Test Go API
|
||
// @version 1.0
|
||
// @description API для агрегации онлайн-подписок пользователей.
|
||
// @BasePath /
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"fmt"
|
||
"log"
|
||
"net/http"
|
||
|
||
_ "effective_mobile_test_go_api/docs"
|
||
"effective_mobile_test_go_api/internal/config"
|
||
"effective_mobile_test_go_api/internal/handler"
|
||
"effective_mobile_test_go_api/internal/repo"
|
||
"effective_mobile_test_go_api/internal/service"
|
||
|
||
"github.com/gorilla/mux"
|
||
_ "github.com/lib/pq"
|
||
"go.uber.org/zap"
|
||
|
||
"github.com/golang-migrate/migrate/v4"
|
||
"github.com/golang-migrate/migrate/v4/database/postgres"
|
||
_ "github.com/golang-migrate/migrate/v4/source/file"
|
||
|
||
httpSwagger "github.com/swaggo/http-swagger"
|
||
)
|
||
|
||
func runMigrations(db *sql.DB) error {
|
||
driver, err := postgres.WithInstance(db, &postgres.Config{})
|
||
if err != nil {
|
||
return err
|
||
}
|
||
m, err := migrate.NewWithDatabaseInstance("file://migrations", "postgres", driver)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = m.Up()
|
||
if err != nil && err != migrate.ErrNoChange {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func main() {
|
||
logConfig := zap.NewProductionConfig()
|
||
logger, err := logConfig.Build()
|
||
if err != nil {
|
||
log.Fatalf("Не удалось инициализировать zap logger: %v", err)
|
||
}
|
||
defer logger.Sync()
|
||
cfg := config.LoadConfig()
|
||
dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", cfg.DBHost, cfg.DBPort, cfg.DBUser, cfg.DBPassword, cfg.DBName)
|
||
db, err := sql.Open("postgres", dsn)
|
||
if err != nil {
|
||
logger.Fatal("Не удалось подключится к СУБД", zap.Error(err))
|
||
}
|
||
defer db.Close()
|
||
err = db.PingContext(context.Background())
|
||
if err != nil {
|
||
logger.Fatal("Недоступна СУБД", zap.Error(err))
|
||
}
|
||
err = runMigrations(db)
|
||
if err != nil {
|
||
logger.Fatal("Миграция не выполнена", zap.Error(err))
|
||
}
|
||
subRepo := repo.NewSubscriptionRepo(db)
|
||
subService := service.NewSubscriptionService(subRepo)
|
||
h := handler.NewHandler(logger, subService)
|
||
r := mux.NewRouter()
|
||
r.HandleFunc("/subscriptions", h.CreateSubscription).Methods("POST")
|
||
r.HandleFunc("/subscriptions/{id}", h.GetSubscription).Methods("GET")
|
||
r.HandleFunc("/subscriptions/{id}", h.UpdateSubscription).Methods("PUT")
|
||
r.HandleFunc("/subscriptions/{id}", h.DeleteSubscription).Methods("DELETE")
|
||
r.HandleFunc("/subscriptions", h.ListSubscriptions).Methods("GET")
|
||
r.HandleFunc("/subscriptions/sum", h.SumSubscriptions).Methods("GET")
|
||
r.PathPrefix("/swagger/").Handler(httpSwagger.WrapHandler)
|
||
logger.Info("Запущен сервер...", zap.String("port", cfg.ServerPort))
|
||
if err := http.ListenAndServe(":"+cfg.ServerPort, r); err != nil {
|
||
logger.Fatal("Ошибка запуска сервера", zap.Error(err))
|
||
}
|
||
}
|