-
Notifications
You must be signed in to change notification settings - Fork 5
/
server.go
79 lines (61 loc) · 2.54 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
package httpapi
import (
"encoding/json"
"fmt"
"net/http"
"runtime/debug"
"github.com/julienschmidt/httprouter"
"github.com/talento90/go-health"
"github.com/talento90/imgart/errors"
"github.com/talento90/imgart/imgart"
"github.com/talento90/imgart/log"
)
// ServerDependencies contains all dependencies
type ServerDependencies struct {
Logger log.Logger
ImgService imgart.ImageService
ProfileService imgart.ProfileService
Health health.Health
}
func createRouter(dep *ServerDependencies) *httprouter.Router {
router := httprouter.New()
imgCtrl := newImagesController(dep.ImgService, dep.ProfileService)
effectCtrl := newEffectsController(dep.ImgService)
profileCtrl := newProfilesController(dep.ProfileService)
router.HandlerFunc("GET", "/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/api/v1/docs", http.StatusFound)
})
router.Handler("GET", "/health", dep.Health)
router.GET("/api/v1/docs/swagger.json", Spec)
router.Handler("GET", "/api/v1/docs", RedocSpec())
router.GET("/api/v1/images", loggerMiddleware(dep.Logger, responseMiddleware(imgCtrl.transformImage)))
router.GET("/api/v1/effects", loggerMiddleware(dep.Logger, responseMiddleware(effectCtrl.getAll)))
router.GET("/api/v1/effects/:id", loggerMiddleware(dep.Logger, responseMiddleware(effectCtrl.get)))
router.GET("/api/v1/profiles", loggerMiddleware(dep.Logger, responseMiddleware(profileCtrl.getAll)))
router.GET("/api/v1/profiles/:id", loggerMiddleware(dep.Logger, responseMiddleware(profileCtrl.get)))
router.DELETE("/api/v1/profiles/:id", loggerMiddleware(dep.Logger, responseMiddleware(profileCtrl.delete)))
router.PUT("/api/v1/profiles/:id", loggerMiddleware(dep.Logger, responseMiddleware(profileCtrl.update)))
router.POST("/api/v1/profiles", loggerMiddleware(dep.Logger, responseMiddleware(profileCtrl.create)))
return router
}
// NewServer creates an http server
func NewServer(config *Configuration, dep *ServerDependencies) http.Server {
router := createRouter(dep)
router.PanicHandler = func(w http.ResponseWriter, r *http.Request, panic interface{}) {
dep.Logger.Error("Panic error:", panic)
dep.Logger.Error(fmt.Sprintf("Stack trace: %s: %s", panic, debug.Stack()))
err := appError{
ErrorType: errors.Internal.String(),
Message: "Server internal error",
}
json, _ := json.Marshal(err)
w.WriteHeader(http.StatusInternalServerError)
w.Write(json)
}
return http.Server{
Addr: config.Address,
ReadTimeout: config.ReadTimeout,
WriteTimeout: config.WriteTimeout,
Handler: router,
}
}