-
Notifications
You must be signed in to change notification settings - Fork 5
/
main.go
124 lines (108 loc) · 3.24 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// SPDX-FileCopyrightText: 2022 Risk.Ident GmbH <[email protected]>
//
// SPDX-License-Identifier: GPL-3.0-or-later
//
// 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 <http://www.gnu.org/licenses/>.
package main
import (
"context"
"errors"
"net/http"
"os"
"time"
"github.com/RiskIdent/gocrud/pkg/database"
"github.com/RiskIdent/gocrud/pkg/model"
"github.com/alecthomas/kong"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
var cli struct {
BindAddress string `default:"0.0.0.0:8080" help:"Address to serve API on" env:"GOCRUD_BIND_ADDRESS"`
MongoURI string `default:"mongodb://localhost:27017" help:"MongoDB URI to use" env:"GOCRUD_MONGO_URI"`
MongoDB string `default:"gocrud" help:"MongoDB database to use" env:"GOCRUD_MONGO_DB"`
}
func main() {
kong.Parse(&cli)
initLogger()
if err := mainE(); err != nil {
log.Error().Err(err).Msg("Failed execution.")
os.Exit(1)
}
}
func mainE() error {
db, err := database.ConnectMongoDB(context.Background(), cli.MongoURI, cli.MongoDB)
if err != nil {
return err
}
defer db.Close()
gin.DefaultErrorWriter = log.Logger
gin.DefaultWriter = log.Logger
router := gin.New()
router.Use(
gin.LoggerWithConfig(gin.LoggerConfig{
SkipPaths: []string{"/"},
}),
gin.Recovery(),
)
router.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "Hello from gocrud :)"})
})
v1 := router.Group("/v1")
{
v1.POST("/pet", func(c *gin.Context) {
ctx, cancel := context.WithTimeout(c.Request.Context(), 5*time.Second)
defer cancel()
var pet model.NewPet
if err := c.ShouldBindJSON(&pet); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
id, err := db.CreatePet(ctx, pet)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
log.Info().Str("id", id).Msg("Created new pet.")
c.JSON(http.StatusOK, gin.H{"id": id})
})
v1.GET("/pet/:id", func(c *gin.Context) {
ctx, cancel := context.WithTimeout(c.Request.Context(), 5*time.Second)
defer cancel()
id := c.Param("id")
pet, err := db.GetPet(ctx, id)
if errors.Is(err, database.ErrNotFound) {
c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
return
}
if errors.Is(err, database.ErrBadRequest) {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, pet)
})
}
return router.Run(cli.BindAddress)
}
func initLogger() error {
log.Logger = log.Output(zerolog.ConsoleWriter{
Out: os.Stderr,
TimeFormat: "Jan-02 15:04",
})
return nil
}