modified: begushiybashkir/bbvue/src/router/index.js

modified:   begushiybashkir/bbvue/src/views/Login.vue
	new file:   begushiybashkir/bbvue/src/views/Logout.vue
	modified:   begushiybashkir/bbvue/src/views/News.vue
	modified:   begushiybashkir/bbvue/src/views/Profile.vue
	modified:   serv_nginx/api_bb/cmd/main.go
	modified:   serv_nginx/api_bb/go.mod
	modified:   serv_nginx/api_bb/go.sum
	new file:   serv_nginx/api_bb/internal/app/app.go
	new file:   serv_nginx/api_bb/internal/database/database.go
	new file:   serv_nginx/api_bb/internal/database/migrate.go
	new file:   serv_nginx/api_bb/internal/handlers/news_handler.go
	new file:   serv_nginx/api_bb/internal/models/news.go
	new file:   serv_nginx/api_bb/internal/repository/comment_repository.go
	new file:   serv_nginx/api_bb/internal/repository/news_repository.go
	modified:   serv_nginx/api_bb/internal/routes/routes.go
	new file:   serv_nginx/api_bb/internal/service/news_service.go
	modified:   serv_nginx/api_bb/pkg/utils/utils.go
save router paths to login  logout profile from upsunction commit
This commit is contained in:
2025-10-12 21:38:50 +05:00
parent 12f805f9e1
commit 6bb475acb2
18 changed files with 1424 additions and 309 deletions
+17 -104
View File
@@ -2,29 +2,22 @@
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"api_bb/internal/app"
"api_bb/internal/config"
"api_bb/pkg/logger"
"go.uber.org/zap"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"api_bb/internal/config"
"api_bb/internal/models"
"api_bb/internal/routes"
"api_bb/pkg/logger"
)
func main() {
// Загрузка конфигурации
cfg := config.Load()
// Инициализация логгера
if err := logger.Init(
os.Getenv("LOG_LEVEL"),
@@ -35,58 +28,13 @@ func main() {
}
defer logger.Sync()
zapLogger := logger.Get()
// Логируем начало работы
logger.LogApplicationStart(os.Getenv("REST_API_VERSION"), os.Getenv("ENVIRONMENT"), "")
// Логирование попытки подключения к БД
zapLogger.Info("attempting to connect to database",
zap.String("host", extractHostFromDSN(cfg.DatabaseURL)), // функция для извлечения хоста из DSN
zap.String("database", extractDBNameFromDSN(cfg.DatabaseURL)), // функция для извлечения имени БД
)
// Подключение к базе данных
db, err := gorm.Open(postgres.Open(cfg.DatabaseURL), &gorm.Config{})
if err != nil {
zapLogger.Fatal("failed to connect to database",
zap.Error(err),
zap.String("database_url", maskPassword(cfg.DatabaseURL)), // маскируем пароль в логах
)
}
// Логирование успешного подключения к БД
zapLogger.Info("successfully connected to database",
zap.String("host", extractHostFromDSN(cfg.DatabaseURL)),
zap.String("database", extractDBNameFromDSN(cfg.DatabaseURL)),
)
// Проверка соединения с БД
sqlDB, err := db.DB()
if err != nil {
zapLogger.Fatal("failed to get database instance", zap.Error(err))
}
if err := sqlDB.Ping(); err != nil {
zapLogger.Fatal("database ping failed", zap.Error(err))
}
zapLogger.Info("database ping successful")
// Автомиграция
zapLogger.Info("starting database migration")
if err := db.AutoMigrate(&models.User{}); err != nil {
zapLogger.Fatal("database migration failed", zap.Error(err))
}
zapLogger.Info("database migration completed successfully")
// Настройка роутера
router := routes.SetupRouter(db, cfg)
// Настройка HTTP сервера
server := &http.Server{
Addr: ":" + cfg.Port,
Handler: router,
// Создание и инициализация приложения
application := app.NewApp(cfg)
if err := application.Initialize(); err != nil {
logger.Get().Fatal("failed to initialize application", zap.Error(err))
}
// Канал для graceful shutdown
@@ -96,56 +44,21 @@ func main() {
// Запуск сервера в горутине
go func() {
zapLogger.Info("starting HTTP server", zap.String("port", cfg.Port))
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
zapLogger.Fatal("failed to start server", zap.Error(err))
if err := application.Start(); err != nil {
logger.Get().Fatal("failed to start server", zap.Error(err))
}
done <- true
}()
// Ожидание сигнала shutdown
<-quit
zapLogger.Info("shutdown signal received")
logger.Get().Info("shutdown signal received")
// Логирование закрытия соединения с БД
zapLogger.Info("closing database connection")
if err := sqlDB.Close(); err != nil {
zapLogger.Error("failed to close database connection", zap.Error(err))
} else {
zapLogger.Info("database connection closed successfully")
}
// Graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
server.SetKeepAlivesEnabled(false)
if err := server.Shutdown(ctx); err != nil {
zapLogger.Fatal("could not gracefully shutdown the server", zap.Error(err))
// Graceful shutdown приложения
if err := application.Shutdown(); err != nil {
logger.Get().Fatal("could not gracefully shutdown the application", zap.Error(err))
}
logger.LogApplicationShutdown("graceful shutdown")
close(done)
}
// Вспомогательные функции для работы с DSN
// extractHostFromDSN извлекает хост из DSN строки
func extractHostFromDSN(dsn string) string {
// Простая реализация - в продакшене лучше использовать парсер DSN
// Для postgres DSN формата: "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
// Можно использовать более сложный парсер или регулярные выражения
return dsn // Заглушка - нужно реализовать парсинг DSN
}
// extractDBNameFromDSN извлекает имя базы данных из DSN строки
func extractDBNameFromDSN(dsn string) string {
// Аналогично extractHostFromDSN - нужно реализовать парсинг
return dsn // Заглушка - нужно реализовать парсинг DSN
}
// maskPassword маскирует пароль в DSN строке для безопасного логирования
func maskPassword(dsn string) string {
// Простая реализация - заменяет пароль на ***
// В продакшене нужно использовать более надежный метод
return dsn // Заглушка - нужно реализовать маскирование пароля
<-done
}