// Copyright (c) 2025 Nikolai Papin // // This file is part of Easywish // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See // the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // @title Easywish client API // @version 1.0 // @description Easy and feature-rich wishlist. // @license.name GPL-3.0 // @BasePath /api/ // @Schemes http // @securityDefinitions.apikey JWT // @in header // @name Authorization package main import ( "context" "fmt" "net/http" "time" "github.com/gin-gonic/gin" "go.uber.org/fx" "go.uber.org/zap" "easywish/config" docs "easywish/docs" "easywish/internal/controllers" "easywish/internal/database" "easywish/internal/logger" "easywish/internal/routes" "easywish/internal/services" "easywish/internal/validation" swaggerfiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) func main() { if _, err := config.Load(); err != nil { panic(err) } fx.New( fx.Provide( logger.NewLogger, logger.NewSyncLogger, gin.Default, ), database.Module, services.Module, validation.Module, controllers.Module, routes.Module, fx.Invoke(func(lc fx.Lifecycle, router *gin.Engine, syncLogger *logger.SyncLogger) { // Swagger docs.SwaggerInfo.Schemes = []string{"http"} router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler)) // Gin server := &http.Server{ Addr: fmt.Sprintf(":%s", config.GetConfig().Port), Handler: router, } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { go func() { if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { syncLogger.Fatal("Server failed", zap.Error(err)) } }() return nil }, OnStop: func(ctx context.Context) error { shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(shutdownCtx); err != nil { syncLogger.Error("Server shutdown error", zap.Error(err)) } if err := syncLogger.Close(); err != nil { syncLogger.Error("Logger sync error", zap.Error(err)) } return nil }, }) }), ).Run() }