/
s4ze
/
api-lab4
Обзор
Документация
Войти
/
s4ze
/
api-lab4
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
cmd/api/main.go
116 строк
4 KB
s4ze
Immigratiom
10 дек 2025, 11:20
10 дек 2025, 11:20
b292c79
Код
Авторство
О чём код?
package main import ( _ "lab1/docs" "lab1/internal/config" "lab1/internal/database" "lab1/internal/handlers" v1 "lab1/internal/handlers/v1" v2 "lab1/internal/handlers/v2" "lab1/internal/middleware" "lab1/internal/repository" "lab1/pkg/idempotency" "lab1/pkg/ratelimiter" "log" "time" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) // @title Task Management API // @version 1.0 // @description API для управления задачами с поддержкой версионирования // @termsOfService http://swagger.io/terms/ // @contact.name API Support // @contact.email support@taskmanager.com // @license.name MIT // @license.url https://opensource.org/licenses/MIT // @host localhost:8000 // @BasePath /api // @securityDefinitions.apikey BearerAuth // @in header // @name Authorization // @description JWT токен авторизации в формате: "Bearer {token}" func main() { cfg := config.Load() db, err := database.InitDB(cfg.DBPath) if err != nil { log.Fatal("Failed to initialize database:", err) } defer db.Close() userRepo := repository.NewUserRepository(db) taskRepo := repository.NewTaskRepository(db) apiKeyRepo := repository.NewApiKeyRepository(db, 16) authHandler := handlers.NewAuthHandler(userRepo, apiKeyRepo, cfg.JWTKey) usersHandler := handlers.NewUserHandler(userRepo) taskHandlerV1 := v1.NewTaskHandlerV1(taskRepo) taskHandlerV2 := v2.NewTaskHandlerV2(taskRepo) internalHandler := handlers.NewInternalHandler(userRepo, taskRepo, time.Now(), db) rateLimiter := ratelimiter.New(5, 20*time.Second) idempotencyStore := idempotency.NewStore() r := gin.Default() r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) r.POST("/api/test", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Test endpoint is working"}) }) public := r.Group("/api") public.Use(rateLimiter.Middleware()) { public.POST("/register", authHandler.Register) public.POST("/login", authHandler.Login) } protected := r.Group("/api") protected.Use(rateLimiter.Middleware()) protected.Use(middleware.JWTAuthMiddleware(cfg.JWTKey)) { protected.GET("/profile", usersHandler.GetProfile) protected.GET("/users/:id", usersHandler.GetUser) protected.GET("/key", authHandler.GenerateKey) } v1Group := r.Group("/api/v1") v1Group.Use(rateLimiter.Middleware()) v1Group.Use(middleware.JWTAuthMiddleware(cfg.JWTKey)) { v1Group.GET("/tasks", taskHandlerV1.GetTasks) v1Group.POST("/tasks", idempotencyStore.Middleware(), taskHandlerV1.CreateTask) v1Group.PUT("/tasks/:id", taskHandlerV1.UpdateTask) v1Group.DELETE("/tasks/:id", taskHandlerV1.DeleteTask) } v2Group := r.Group("/api/v2") v2Group.Use(rateLimiter.Middleware()) v2Group.Use(middleware.JWTAuthMiddleware(cfg.JWTKey)) { v2Group.GET("/tasks", taskHandlerV2.GetTasks) v2Group.GET("/tasks/:id", taskHandlerV2.GetTaskByID) v2Group.POST("/tasks", idempotencyStore.Middleware(), taskHandlerV2.CreateTask) v2Group.PUT("/tasks/:id", taskHandlerV2.UpdateTask) v2Group.DELETE("/tasks/:id", taskHandlerV2.DeleteTask) } // Внутренние API - только для сервисного общения internal := r.Group("/internal") internal.Use(middleware.APIKeyAdminAuthMiddleware(apiKeyRepo)) { internal.GET("/stats", internalHandler.GetStats) internal.GET("/health", internalHandler.HealthCheck) } log.Printf("Server starting on %s", cfg.Port) if err := r.Run(cfg.Port); err != nil { log.Fatal("Failed to start server:", err) } log.Printf("Swagger Docs available at http://localhost%v/swagger/index.html", cfg.Port) }