@@ -8,17 +8,17 @@ import (
8
8
"os"
9
9
"strings"
10
10
11
+ "github.com/digitalocean-apps/sample-with-database/pkg/model"
12
+ "github.com/digitalocean-apps/sample-with-database/pkg/storer"
11
13
"github.com/gofrs/uuid"
12
14
"github.com/gorilla/mux"
13
- "github.com/jinzhu/gorm"
14
15
"github.com/pkg/errors"
15
- "github.com/xo/dburl"
16
16
17
17
_ "github.com/jinzhu/gorm/dialects/postgres"
18
18
)
19
19
20
20
const (
21
- defaultPort = "80 "
21
+ defaultPort = "8080 "
22
22
defaultDatabaseURL = "postgresql://postgres:[email protected] :5432/notes/?sslmode=disable"
23
23
24
24
startupMessage = `[38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;54;48;5;39m [38;5;54;48;5;39m [38;5;54;48;5;39m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [38;5;1;48;5;16m [0m
@@ -39,34 +39,17 @@ const (
39
39
[0m`
40
40
)
41
41
42
- // Note represents a single note.
43
- type Note struct {
44
- gorm.Model
45
- Uuid string
46
- Body string
47
- }
48
-
49
- func initialMigration (db * gorm.DB ) {
50
- db .AutoMigrate (& Note {})
51
- }
52
-
53
42
func main () {
54
43
// Parse connection config.
55
44
databaseURL := os .Getenv ("DATABASE_URL" )
56
45
if databaseURL == "" {
57
46
databaseURL = defaultDatabaseURL
58
47
}
59
- dbURL , err := dburl .Parse (databaseURL )
60
- requireNoError (err , "parsing DATABASE_URL" )
61
-
62
- // Open a DB connection.
63
- dbPassword , _ := dbURL .User .Password ()
64
- dbName := strings .Trim (dbURL .Path , "/" )
65
- connectionString := fmt .Sprintf ("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s" , dbURL .Hostname (), dbURL .Port (), dbURL .User .Username (), dbName , dbPassword , dbURL .Query ().Get ("sslmode" ))
66
- db , err := gorm .Open ("postgres" , connectionString )
48
+ caCert := os .Getenv ("CA_CERT" )
49
+
50
+ db , err := storer .NewStorer (databaseURL , caCert )
67
51
requireNoError (err , "connecting to database" )
68
52
defer db .Close ()
69
- initialMigration (db )
70
53
71
54
// Initialize the listening port.
72
55
port := os .Getenv ("PORT" )
@@ -89,10 +72,10 @@ func main() {
89
72
fmt .Printf ("==> Server listening at %s 🚀\n " , bindAddr )
90
73
91
74
err = http .ListenAndServe (fmt .Sprintf (":%s" , port ), r )
92
- requireNoError (err , "connecting to database " )
75
+ requireNoError (err , "starting server " )
93
76
}
94
77
95
- func notesHandler (db * gorm. DB ) func (w http.ResponseWriter , r * http.Request ) {
78
+ func notesHandler (db storer. Storer ) func (w http.ResponseWriter , r * http.Request ) {
96
79
return func (w http.ResponseWriter , r * http.Request ) {
97
80
if r .Method == http .MethodPost {
98
81
var body string
@@ -117,13 +100,14 @@ func notesHandler(db *gorm.DB) func(w http.ResponseWriter, r *http.Request) {
117
100
return
118
101
}
119
102
120
- err = db .Create (& Note {
121
- Uuid : noteUUID .String (),
103
+ err = db .Create (& model. Note {
104
+ UUID : noteUUID .String (),
122
105
Body : body ,
123
- }). Error
106
+ })
124
107
if ! requireNoErrorInHandler (w , err , "creating note in db" ) {
125
108
return
126
109
}
110
+
127
111
log .Printf ("POST %s %s\n " , noteUUID .String (), body )
128
112
129
113
w .WriteHeader (http .StatusOK )
@@ -136,7 +120,7 @@ func notesHandler(db *gorm.DB) func(w http.ResponseWriter, r *http.Request) {
136
120
}
137
121
}
138
122
139
- func noteHandler (db * gorm. DB ) func (w http.ResponseWriter , r * http.Request ) {
123
+ func noteHandler (db storer. Storer ) func (w http.ResponseWriter , r * http.Request ) {
140
124
return func (w http.ResponseWriter , r * http.Request ) {
141
125
vars := mux .Vars (r )
142
126
noteID := vars ["note_id" ]
@@ -147,9 +131,8 @@ func noteHandler(db *gorm.DB) func(w http.ResponseWriter, r *http.Request) {
147
131
return
148
132
}
149
133
150
- var note Note
151
- err := db .Where ("uuid = ?" , noteID ).Take (& note ).Error
152
- if gorm .IsRecordNotFoundError (err ) {
134
+ note , err := db .Get (noteID )
135
+ if errors .Is (err , storer .ErrNotFound ) {
153
136
w .WriteHeader (http .StatusNotFound )
154
137
return
155
138
}
0 commit comments