Skip to content

Commit 4f692d1

Browse files
committed
allow app to run without a postgres
* todos can be stored in-memory
1 parent 3b24404 commit 4f692d1

File tree

5 files changed

+150
-96
lines changed

5 files changed

+150
-96
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
todo-example-app
2+
.vscode

README.md

+9-3
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@ by Emmanuel John.
66

77
## Running
88

9+
### Running with in-memory store
10+
11+
```bash
12+
go run main.go
13+
```
14+
15+
### Running with postgres
16+
917
```bash
1018
export PGUSER=<pg user> # defaults to postgres
1119
export PGPASSWORD=<pg password>
1220
export PGSSLMODE=<ssl mode> # defaults to require
13-
export PGHOST=<pg host> # defaults to localhost:6432
21+
export PGHOST=<pg host>
1422
export DBNAME=<db name> # defaults to mydb
1523
```
1624

17-
## Updating the app image
18-
This applicatio is used by various demos. Build and push an updated image any time you make a change. The image is published at [https://hub.docker.com/repository/docker/syntasso/sample-todo-app](https://hub.docker.com/repository/docker/syntasso/sample-todo-app).

go.mod

-8
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,7 @@ require (
1010

1111
require (
1212
github.com/andybalholm/brotli v1.0.4 // indirect
13-
github.com/cosmtrek/air v1.40.2 // indirect
14-
github.com/creack/pty v1.1.18 // indirect
15-
github.com/fatih/color v1.13.0 // indirect
16-
github.com/fsnotify/fsnotify v1.5.4 // indirect
17-
github.com/imdario/mergo v0.3.13 // indirect
1813
github.com/klauspost/compress v1.15.6 // indirect
19-
github.com/mattn/go-colorable v0.1.12 // indirect
20-
github.com/mattn/go-isatty v0.0.14 // indirect
21-
github.com/pelletier/go-toml v1.9.5 // indirect
2214
github.com/valyala/bytebufferpool v1.0.0 // indirect
2315
github.com/valyala/fasthttp v1.37.0 // indirect
2416
github.com/valyala/tcplisten v1.0.0 // indirect

go.sum

-17
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH
9595
github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
9696
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
9797
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
98-
github.com/cosmtrek/air v1.40.2 h1:qayzIjjQNKr4AOjRMZbxwgMTcB6bwsiNMPQUBWL+/GE=
99-
github.com/cosmtrek/air v1.40.2/go.mod h1:Urz3nl9UBvc/rntZkXRBttYWt4sBeh2NZaGcdBbkNak=
10098
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
10199
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
102-
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
103-
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
104100
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
105101
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
106102
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
@@ -117,12 +113,9 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
117113
github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
118114
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
119115
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
120-
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
121116
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
122117
github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
123118
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
124-
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
125-
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
126119
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
127120
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
128121
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -244,8 +237,6 @@ github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT
244237
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
245238
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
246239
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
247-
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
248-
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
249240
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
250241
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
251242
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -256,7 +247,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X
256247
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
257248
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
258249
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
259-
github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U=
260250
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
261251
github.com/klauspost/compress v1.15.6 h1:6D9PcO8QWu0JyaQ2zUMmu16T1T+zjjEpP91guRsvDfY=
262252
github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
@@ -276,14 +266,12 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
276266
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
277267
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
278268
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
279-
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
280269
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
281270
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
282271
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
283272
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
284273
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
285274
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
286-
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
287275
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
288276
github.com/mattn/go-slim v0.0.0-20200618151855-bde33eecb5ee/go.mod h1:ma9TUJeni8LGZMJvOwbAv/FOwiwqIMQN570LnpqCBSM=
289277
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -306,8 +294,6 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
306294
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
307295
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
308296
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
309-
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
310-
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
311297
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
312298
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
313299
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
@@ -567,9 +553,7 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc
567553
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
568554
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
569555
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
570-
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs=
571556
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
572-
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
573557
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d h1:Zu/JngovGLVi6t2J3nmAf3AoTDwuzw85YZ3b9o4yU7s=
574558
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
575559
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -804,7 +788,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
804788
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
805789
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
806790
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
807-
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
808791
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
809792
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
810793
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

main.go

+140-68
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"log"
77
"os"
8+
"slices"
9+
"strings"
810
"time"
911

1012
_ "github.com/lib/pq"
@@ -18,24 +20,148 @@ type todo struct {
1820
Item string
1921
}
2022

23+
type Todoer interface {
24+
NewTodo(*fiber.Ctx) error
25+
GetTodos(*fiber.Ctx, string) error
26+
DeleteTodo(*fiber.Ctx) error
27+
Healthcheck(c *fiber.Ctx) error
28+
Init() error
29+
}
30+
31+
type PGDB struct {
32+
DB *sql.DB
33+
}
34+
35+
func (p *PGDB) GetTodos(ctx *fiber.Ctx, version string) error {
36+
var res string
37+
var todos []string
38+
rows, err := p.DB.Query("SELECT * FROM todos")
39+
if err != nil {
40+
log.Fatalln(err)
41+
ctx.JSON("An error occurred")
42+
}
43+
defer rows.Close()
44+
45+
for rows.Next() {
46+
rows.Scan(&res)
47+
todos = append(todos, res)
48+
}
49+
50+
return ctx.Render("index", fiber.Map{
51+
"Todos": todos,
52+
"Enterprise": os.Getenv("ENTERPRISE"),
53+
"Version": version,
54+
})
55+
}
56+
57+
func (p *PGDB) NewTodo(ctx *fiber.Ctx) error {
58+
newTodo := todo{}
59+
if err := ctx.BodyParser(&newTodo); err != nil {
60+
log.Printf("An error occurred: %v", err)
61+
return ctx.SendString(err.Error())
62+
}
63+
fmt.Printf("Creating a new To Do: %q\n", newTodo)
64+
if newTodo.Item != "" {
65+
_, err := p.DB.Exec("INSERT into todos VALUES ($1)", newTodo.Item)
66+
if err != nil {
67+
log.Fatalf("An error occurred while executing query: %v", err)
68+
}
69+
}
70+
71+
return ctx.Redirect("/")
72+
}
73+
74+
func (p *PGDB) DeleteTodo(c *fiber.Ctx) error {
75+
todoToDelete := c.Query("item")
76+
p.DB.Exec("DELETE from todos WHERE item=$1", todoToDelete)
77+
fmt.Printf("Deleting To Do: %q\n", todoToDelete)
78+
return c.SendString("deleted")
79+
}
80+
81+
func (p *PGDB) Healthcheck(c *fiber.Ctx) error {
82+
err := p.DB.Ping()
83+
if err != nil {
84+
c.SendString(err.Error())
85+
}
86+
return err
87+
}
88+
89+
func (p *PGDB) Init() error {
90+
_, err := p.DB.Exec("CREATE TABLE IF NOT EXISTS todos (item text)")
91+
return err
92+
}
93+
94+
type LocalDB struct {
95+
Todos []string
96+
}
97+
98+
func (l *LocalDB) GetTodos(ctx *fiber.Ctx, version string) error {
99+
return ctx.Render("index", fiber.Map{
100+
"Todos": l.Todos,
101+
"Enterprise": os.Getenv("ENTERPRISE"),
102+
"Version": version,
103+
})
104+
}
105+
106+
func (l *LocalDB) NewTodo(ctx *fiber.Ctx) error {
107+
newTodo := todo{}
108+
if err := ctx.BodyParser(&newTodo); err != nil {
109+
log.Printf("An error occurred: %v", err)
110+
return ctx.SendString(err.Error())
111+
}
112+
fmt.Printf("Creating a new To Do: %q\n", newTodo)
113+
if newTodo.Item != "" {
114+
l.Todos = append(l.Todos, newTodo.Item)
115+
}
116+
117+
return ctx.Redirect("/")
118+
}
119+
120+
func (l *LocalDB) DeleteTodo(c *fiber.Ctx) error {
121+
todoToDelete := c.Query("item")
122+
for i, todo := range l.Todos {
123+
if strings.EqualFold(todo, todoToDelete) {
124+
l.Todos = slices.Delete(l.Todos, i, i+1)
125+
}
126+
}
127+
fmt.Printf("Deleting To Do: %q\n", todoToDelete)
128+
return c.SendString("deleted")
129+
}
130+
131+
func (p *LocalDB) Healthcheck(c *fiber.Ctx) error {
132+
return nil
133+
}
134+
135+
func (p *LocalDB) Init() error {
136+
return nil
137+
}
138+
21139
func main() {
22140
pgUser := or(or(os.Getenv("DB_USER"), os.Getenv("PGUSER")), "postgres")
23141
pgPassword := or(os.Getenv("DB_PASSWORD"), os.Getenv("PGPASSWORD"))
24-
pgHost := or(or(os.Getenv("DB_HOST"), os.Getenv("PGHOST")), "localhost:5432")
142+
pgHost := or(os.Getenv("DB_HOST"), os.Getenv("PGHOST"))
25143
pgSSLMode := or(or(os.Getenv("DB_SSL_MODE"), os.Getenv("PGSSLMODE")), "require")
26144
dbName := or(or(os.Getenv("DB_NAME"), os.Getenv("DBNAME")), "mydb")
27145

28-
connStr := fmt.Sprintf("postgresql://%s:%s@%s/%s?sslmode=%s", pgUser, pgPassword, pgHost, dbName, pgSSLMode)
29-
30146
version := os.Getenv("VERSION")
31147
fmt.Println("Version: ", version)
32148

33-
// Connect to database
34-
db, err := sql.Open("postgres", connStr)
35-
if err != nil {
36-
log.Fatal(err)
149+
var querier Todoer
150+
if pgHost != "" {
151+
// Connect to database if PGHOST is set
152+
connStr := fmt.Sprintf("postgresql://%s:%s@%s/%s?sslmode=%s", pgUser, pgPassword, pgHost, dbName, pgSSLMode)
153+
db, err := sql.Open("postgres", connStr)
154+
if err != nil {
155+
log.Fatal(err)
156+
}
157+
defer db.Close()
158+
159+
querier = &PGDB{
160+
DB: db,
161+
}
162+
} else {
163+
querier = &LocalDB{}
37164
}
38-
defer db.Close()
39165

40166
engine := html.New("./views", ".html")
41167
app := fiber.New(fiber.Config{
@@ -45,23 +171,20 @@ func main() {
45171
//checked by kubernetes to see if the pod is ready to receive traffic
46172
app.Get("/healthz", func(c *fiber.Ctx) error {
47173
fmt.Println("healthcheck")
48-
err := db.Ping()
49-
if err != nil {
50-
c.SendString(err.Error())
51-
}
174+
err := querier.Healthcheck(c)
52175
return err
53176
})
54177

55178
app.Get("/", func(c *fiber.Ctx) error {
56-
return getTodos(c, db, version)
179+
return querier.GetTodos(c, version)
57180
})
58181

59182
app.Post("/", func(c *fiber.Ctx) error {
60-
return newTodo(c, db)
183+
return querier.NewTodo(c)
61184
})
62185

63186
app.Delete("/delete", func(c *fiber.Ctx) error {
64-
return deleteTodo(c, db)
187+
return querier.DeleteTodo(c)
65188
})
66189

67190
port := or(os.Getenv("PORT"), "8080")
@@ -74,8 +197,8 @@ func main() {
74197
x := 0
75198
for {
76199
log.Println("Attempting to connect to DB")
77-
78-
if err := initDB(db); err == nil {
200+
var err error
201+
if err = querier.Init(); err == nil {
79202
break
80203
}
81204

@@ -92,57 +215,6 @@ func main() {
92215
log.Println(app.Listen(fmt.Sprintf(":%v", port)))
93216
}
94217

95-
func getTodos(c *fiber.Ctx, db *sql.DB, version string) error {
96-
var res string
97-
var todos []string
98-
rows, err := db.Query("SELECT * FROM todos")
99-
if err != nil {
100-
log.Fatalln(err)
101-
c.JSON("An error occured")
102-
}
103-
defer rows.Close()
104-
105-
for rows.Next() {
106-
rows.Scan(&res)
107-
todos = append(todos, res)
108-
}
109-
110-
return c.Render("index", fiber.Map{
111-
"Todos": todos,
112-
"Enterprise": os.Getenv("ENTERPRISE"),
113-
"Version": version,
114-
})
115-
}
116-
117-
func newTodo(c *fiber.Ctx, db *sql.DB) error {
118-
newTodo := todo{}
119-
if err := c.BodyParser(&newTodo); err != nil {
120-
log.Printf("An error occured: %v", err)
121-
return c.SendString(err.Error())
122-
}
123-
fmt.Printf("Creating a new To Do: %q\n", newTodo)
124-
if newTodo.Item != "" {
125-
_, err := db.Exec("INSERT into todos VALUES ($1)", newTodo.Item)
126-
if err != nil {
127-
log.Fatalf("An error occured while executing query: %v", err)
128-
}
129-
}
130-
131-
return c.Redirect("/")
132-
}
133-
134-
func deleteTodo(c *fiber.Ctx, db *sql.DB) error {
135-
todoToDelete := c.Query("item")
136-
db.Exec("DELETE from todos WHERE item=$1", todoToDelete)
137-
fmt.Printf("Deleting To Do: %q\n", todoToDelete)
138-
return c.SendString("deleted")
139-
}
140-
141-
func initDB(db *sql.DB) error {
142-
_, err := db.Exec("CREATE TABLE IF NOT EXISTS todos (item text)")
143-
return err
144-
}
145-
146218
func or(a string, b string) string {
147219
if a == "" {
148220
return b

0 commit comments

Comments
 (0)