This repository has been archived by the owner on Oct 20, 2020. It is now read-only.
/
routers.go
131 lines (112 loc) · 2.93 KB
/
routers.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
/*
* ExCommerce
*
* ExCommerce is an example commerce system.
*
* API version: beta
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
*/
package openapi
import (
"encoding/json"
"io/ioutil"
"net/http"
"os"
"strconv"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
)
// A Route defines the parameters for an api endpoint
type Route struct {
Name string
Method string
Path string
HandlerFunc http.HandlerFunc
}
// Routes are a collection of defined api endpoints
type Routes []Route
// Router defines the required methods for retrieving api routes
type Router interface {
Routes() Routes
}
// NewRouter creates a new router for any number of api routers
func NewRouter(routers ...Router) *mux.Router {
router := mux.NewRouter().StrictSlash(true)
for _, api := range routers {
for _, route := range api.Routes() {
router.
Methods(route.Method).
Path(route.Path).
Name(route.Name).
Handler(route.HandlerFunc)
}
}
handlers.LoggingHandler(os.Stdout, router)
return router
}
func invalidInput(message, details string, w http.ResponseWriter) {
status := http.StatusBadRequest // 400
err := EncodeJSONResponse(map[string]string{
"message": message,
"details": details,
}, &status, w)
if err != nil {
panic(err)
}
}
func invalidJSON(jsonErr error, w http.ResponseWriter) {
invalidInput("Invalid JSON in request body.", jsonErr.Error(), w)
}
func failValidation(message, pointer string, w http.ResponseWriter) {
status := http.StatusUnprocessableEntity // 422
err := EncodeJSONResponse(MalformedInputError{
Message: message,
Pointer: pointer,
}, &status, w)
if err != nil {
panic(err)
}
}
func unexpectedError(_ error, w http.ResponseWriter) {
status := http.StatusInternalServerError // 500
err := EncodeJSONResponse(map[string]string{
"message": "Unexpected error.",
}, &status, w)
if err != nil {
panic(err)
}
}
// EncodeJSONResponse uses the json encoder to write an interface to the http response with an optional status code
func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
if status != nil {
w.WriteHeader(*status)
} else {
w.WriteHeader(http.StatusOK)
}
return json.NewEncoder(w).Encode(i)
}
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
r.ParseForm()
formFile, _, err := r.FormFile(key)
if err != nil {
return nil, err
}
defer formFile.Close()
file, err := ioutil.TempFile("tmp", key)
if err != nil {
return nil, err
}
defer file.Close()
fileBytes, err := ioutil.ReadAll(formFile)
if err != nil {
return nil, err
}
file.Write(fileBytes)
return file, nil
}
// parseIntParameter parses a sting parameter to an int64
func parseIntParameter(param string) (int64, error) {
return strconv.ParseInt(param, 10, 64)
}