-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
108 lines (85 loc) · 3.36 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import (
"context"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/datarohit/gopher-social-backend/database"
_ "github.com/datarohit/gopher-social-backend/docs"
"github.com/datarohit/gopher-social-backend/helpers"
"github.com/datarohit/gopher-social-backend/middlewares"
"github.com/datarohit/gopher-social-backend/routes"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
)
var (
SERVER_MODE = helpers.GetEnv("SERVER_MODE", "release")
SERVER_PORT = helpers.GetEnv("SERVER_PORT", ":8080")
)
// @title Gopher Social API
// @version 1.0
// @description This is the API for Gopher Social, a social media platform for Gophers.
// @contact.name Rohit Vilas Ingole
// @contact.email [email protected]
// @license.name MIT License
// @license.url https://github.com/DataRohit/Gopher-Social-Backend/blob/master/license
// @host localhost:8080
// @BasePath /api/v1
// @securityDefinitions.basic BasicAuth
// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
// @externalDocs.description OpenAPI
// @externalDocs.url https://swagger.io/resources/open-api/
func main() {
gin.SetMode(SERVER_MODE)
logger := helpers.NewLogger()
database.InitRedis(logger)
defer database.CloseRedis(logger)
database.InitPostgres(logger)
defer database.ClosePostgres(logger)
router := gin.New()
router.Use(middlewares.RequestIDMiddleware())
router.Use(middlewares.RealIPMiddleware())
router.Use(middlewares.LoggerMiddleware(logger))
router.Use(middlewares.RecovererMiddleware(logger))
router.Use(middlewares.CORSMiddleware())
router.Use(middlewares.TimeoutMiddleware(10 * time.Second))
router.Use(middlewares.RateLimiterMiddleware(database.RedisClient, 120, time.Minute, logger))
apiv1 := router.Group("/api/v1")
routes.HealthRoutes(apiv1)
routes.AuthRoutes(apiv1, database.PostgresDB, logger)
routes.ProfileRoutes(apiv1, database.PostgresDB, logger)
routes.FollowRoutes(apiv1, database.PostgresDB, logger)
routes.PostRoutes(apiv1, database.PostgresDB, logger)
routes.PostLikeRoutes(apiv1, database.PostgresDB, logger)
routes.CommentRoutes(apiv1, database.PostgresDB, logger)
routes.CommentLikeRoutes(apiv1, database.PostgresDB, logger)
routes.FeedRoutes(apiv1, database.PostgresDB, logger)
routes.ActionRoutes(apiv1, database.PostgresDB, logger)
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
server := &http.Server{
Addr: SERVER_PORT,
Handler: router,
}
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.WithFields(logrus.Fields{"error": err}).Error("Server Failed to Start!")
}
}()
logger.WithFields(logrus.Fields{"mode": SERVER_MODE, "port": SERVER_PORT}).Info("Server Started Successfully!")
<-quit
logger.WithFields(logrus.Fields{"signal": "SIGINT"}).Info("Shutdown Signal Received, Exiting Gracefully...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
logger.WithFields(logrus.Fields{"error": err}).Error("Server Forced to Shutdown!")
}
logger.WithFields(logrus.Fields{"mode": SERVER_MODE}).Info("Server Shutdown Successfully!")
}