// @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)) } }