package main import ( "database/sql" "fmt" "log" "os" "git.vakhrushev.me/av/transcriber/internal/controller/http" "git.vakhrushev.me/av/transcriber/internal/repo/sqlite" "github.com/doug-martin/goqu/v9" _ "github.com/doug-martin/goqu/v9/dialect/sqlite3" "github.com/gin-gonic/gin" "github.com/joho/godotenv" _ "github.com/mattn/go-sqlite3" "github.com/pressly/goose/v3" ) func main() { // Загружаем переменные окружения из .env файла if err := godotenv.Load(); err != nil { log.Println("Warning: .env file not found, using system environment variables") } // Создаем директории если они не существуют if err := os.MkdirAll("data/files", 0755); err != nil { log.Fatal("Failed to create data/files directory:", err) } db, err := sql.Open("sqlite3", "data/transcriber.db") if err != nil { log.Fatalf("failed to open database: %v", err) } defer db.Close() if err := db.Ping(); err != nil { log.Fatalf("failed to ping database: %v", err) } gq := goqu.New("sqlite3", db) // Запускаем миграции if err := RunMigrations(db, "migrations"); err != nil { log.Fatal("Failed to run migrations:", err) } fileRepo := sqlite.NewFileRepository(db, gq) jobRepo := sqlite.NewTranscriptJobRepository(db, gq) // Инициализируем обработчики transcribeHandler := http.NewTranscribeHandler(jobRepo, fileRepo) // Создаем Gin роутер r := gin.Default() // Настраиваем роуты api := r.Group("/api") { api.POST("/transcribe/audio", transcribeHandler.CreateTranscribeJob) api.GET("/transcribe/:id", transcribeHandler.GetTranscribeJobStatus) api.POST("/transcribe/convert", transcribeHandler.RunConversionJob) api.POST("/transcribe/upload", transcribeHandler.RunUploadJob) api.POST("/transcribe/recognize", transcribeHandler.RunRecognitionJob) api.POST("/transcribe/check", transcribeHandler.RunRecognitionCheckJob) } // Добавляем middleware для обработки больших файлов r.MaxMultipartMemory = 32 << 20 // 32 MiB // Добавляем базовый роут для проверки работоспособности r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{ "status": "ok", "message": "Transcriber service is running", }) }) log.Println("Starting server on :8080") if err := r.Run(":8080"); err != nil { log.Fatal("Failed to start server:", err) } } func RunMigrations(db *sql.DB, migrationsDir string) error { if err := goose.SetDialect("sqlite3"); err != nil { return fmt.Errorf("failed to set goose dialect: %w", err) } if err := goose.Up(db, migrationsDir); err != nil { return fmt.Errorf("failed to run migrations: %w", err) } log.Println("Migrations completed successfully") return nil }