This repository has been archived by the owner on Sep 11, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.go
134 lines (119 loc) · 3.57 KB
/
server.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package starter
import (
"net"
"net/http"
"strconv"
"time"
"github.com/cyberhck/pushy"
"github.com/fossapps/starter/config"
"github.com/fossapps/starter/db"
"github.com/fossapps/starter/jwt"
"github.com/fossapps/starter/logger"
"github.com/fossapps/starter/middleware"
"github.com/fossapps/starter/redis"
"github.com/globalsign/mgo"
"github.com/gorilla/handlers"
"gopkg.in/matryer/respond.v1"
)
// Server is a global struct which holds implementation of different things application depends on.
// One can think of this as dependency container
type Server struct {
Logger logger.Client
Db db.DB
Redis redis.Client
Pushy pushy.IPushyClient
ReqHelper RequestHelper
Jwt jwt.Manager
}
// SimpleResponse is used when our handler wants to responds with simple boolean type information, like success, or fail
type SimpleResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
}
// Init actually starts listening and server on a port
func Init() {
allowedHeaders := handlers.AllowedHeaders([]string{"X-Requested-With", "Access-Control-Request-Headers", "Origin", "authorization"})
allowedOrigins := handlers.AllowedOrigins([]string{"*"})
allowedMethods := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"})
server := createServer()
defer server.cleanup()
router := middleware.DevMw(1000)(NewRouter(server))
port := strconv.Itoa(config.GetAPIPort())
server.Logger.Info("Attempting to listen on port " + port)
err := http.
ListenAndServe(":"+port, handlers.CORS(allowedHeaders, allowedOrigins, allowedMethods)(router))
if err != nil {
server.Logger.Fatal(err)
panic(err)
}
}
// ErrorResponse util method to indicate failure
func (s *Server) ErrorResponse(w http.ResponseWriter, r *http.Request, statusCode int, message string) {
respond.With(w, r, statusCode, SimpleResponse{
Success: false,
Message: message,
})
return
}
// SuccessResponse util method to indicate success
func (s *Server) SuccessResponse(w http.ResponseWriter, r *http.Request, statusCode int, message string) {
respond.With(w, r, statusCode, SimpleResponse{
Success: true,
Message: message,
})
}
func createServer() Server {
session := getMongo()
dbLayer := db.GetDbImplementation(session)
requestHelper := requestHelper{}
jwtManager := jwt.Client{
Config: jwt.Config{
Secret: config.GetApplicationConfig().JWTSecret,
Expiry: config.GetApplicationConfig().JWTExpiryTime,
},
}
return Server{
Logger: logger.GetClient(config.GetLogLevel()),
Db: dbLayer,
Redis: *getRedis(),
Pushy: getPushy(),
ReqHelper: requestHelper,
Jwt: jwtManager,
}
}
func getMongo() *mgo.Session {
mongo, err := mgo.Dial(config.GetMongoConfig().Connection)
if err != nil {
panic(err)
}
return mongo
}
func getRedis() *redis.Client {
client, err := redis.NewClient()
if err != nil {
panic(err)
}
return &client
}
func getPushy() pushy.IPushyClient {
sdk := pushy.Create(config.GetPushyToken(), pushy.GetDefaultAPIEndpoint())
sdk.SetHTTPClient(pushy.GetDefaultHTTPClient(5 * time.Second))
return sdk
}
func (s *Server) cleanup() {
s.Redis.Close()
}
// requestHelper simple requestHelper implementation
type requestHelper struct{}
// GetIPAddress util method to get IP address from request
func (requestHelper) GetIPAddress(r *http.Request) string {
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return ""
}
return ip
}
// RequestHelper interface to implement to satisfy as a Request Helper for this application
type RequestHelper interface {
GetIPAddress(r *http.Request) string
}