Skip to content

Commit 11ee0d1

Browse files
committed
heroku related changes
1 parent ae2af44 commit 11ee0d1

File tree

13 files changed

+82
-22
lines changed

13 files changed

+82
-22
lines changed

Makefile

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
.PHONY: start
22
start:
33
docker-compose -f deployments/docker-compose.yaml up --build todo-backend
4-
5-
.PHONY: specs
6-
specs:
7-
docker-compose -f deployments/docker-compose.yaml up todo-backend-specs

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# todo-backend
22

33
This is an example implementation for [Todo-Backend](https://www.todobackend.com) with [Go kit](https://github.com/go-kit/kit) and PostgreSQL.
4+
An instance is available at [Heroku](https://todo-backend-gokit-postgresql.herokuapp.com/todos).
45

56
Requirements
67
====

build/package/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o todo-backend ./cmd/todo-backend/main.go
77

88
FROM scratch
99
COPY --from=builder /todo-backend/todo-backend /
10-
CMD ["/todo-backend"]
10+
ENTRYPOINT ["/todo-backend"]

cmd/todo-backend/main.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import (
88
"syscall"
99

1010
"github.com/go-kit/kit/log"
11+
"github.com/jasonlvhit/gocron"
1112
"github.com/ormanli/todo-backend/internal/app"
1213
)
1314

1415
func main() {
15-
logger := log.NewLogfmtLogger(os.Stderr)
16+
logger := log.NewLogfmtLogger(os.Stdout)
1617
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
1718
logger = log.With(logger, "caller", log.DefaultCaller)
1819

@@ -29,6 +30,7 @@ func main() {
2930

3031
s := app.NewService(r, config)
3132
s = app.LoggingMiddleware(logger)(s)
33+
initializeCron(s)
3234

3335
h := app.MakeHTTPHandler(s, log.With(logger, "component", "HTTP"))
3436

@@ -41,8 +43,13 @@ func main() {
4143

4244
go func() {
4345
logger.Log("transport", "HTTP", "addr", config.ServerPort)
44-
errs <- http.ListenAndServe(config.ServerPort, h)
46+
errs <- http.ListenAndServe(fmt.Sprintf(":%s", config.ServerPort), h)
4547
}()
4648

4749
logger.Log("exit", <-errs)
4850
}
51+
52+
func initializeCron(s app.Service) {
53+
gocron.Every(1).Day().DoSafely(s.Clear)
54+
gocron.Start()
55+
}

deployments/docker-compose.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,3 @@ services:
2424
- POSTGRES_DB=todo
2525
- POSTGRES_USER=todo
2626
- POSTGRES_PASSWORD=todo
27-
todo-backend-specs:
28-
image: "nicolasmartin58/todobackend-specs"
29-
environment:
30-
- URL=todo-backend:8080/todos
31-
depends_on:
32-
- todo-backend

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/go-logfmt/logfmt v0.5.0 // indirect
88
github.com/go-stack/stack v1.8.0 // indirect
99
github.com/gorilla/mux v1.7.3
10+
github.com/jasonlvhit/gocron v0.0.0-20191228163020-98b59b546dee
1011
github.com/jinzhu/gorm v1.9.12
1112
github.com/kelseyhightower/envconfig v1.4.0
1213
)

go.sum

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
2+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
24
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
35
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
46
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
7+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
58
github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
69
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
710
github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
811
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
12+
github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
913
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
1014
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
1115
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
@@ -15,6 +19,9 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V
1519
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
1620
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
1721
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
22+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
23+
github.com/jasonlvhit/gocron v0.0.0-20191228163020-98b59b546dee h1:vIYpscVc1753m7svyoDldyaEi2MDa7808yh3hMXVZjg=
24+
github.com/jasonlvhit/gocron v0.0.0-20191228163020-98b59b546dee/go.mod h1:1nXLkt6gXojCECs34KL3+LlZ3gTpZlkPUA8ejW3WeP0=
1825
github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q=
1926
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
2027
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
@@ -27,14 +34,32 @@ github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4=
2734
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
2835
github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw=
2936
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
37+
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
38+
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
39+
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
40+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
41+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
42+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
43+
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
44+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
3045
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
3146
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
3247
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
3348
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
3449
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
50+
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
3551
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
52+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
53+
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
3654
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
3755
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3856
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
3957
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
4058
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
59+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
60+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
61+
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
62+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
63+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
64+
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
65+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

internal/app/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package app
33
import "github.com/kelseyhightower/envconfig"
44

55
type Config struct {
6-
ServerPort string `default:":8080"`
6+
ServerPort string `envconfig:"port" default:"8080"`
77
DatabaseHost string `default:"localhost"`
88
DatabasePort string `default:"54321"`
99
DatabaseUsername string `default:"todo"`

internal/app/endpoints.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
)
88

99
type Endpoints struct {
10+
AliveEndpoint endpoint.Endpoint
1011
GetTodosEndpoint endpoint.Endpoint
1112
GetTodoEndpoint endpoint.Endpoint
1213
PostTodoEndpoint endpoint.Endpoint
@@ -17,6 +18,7 @@ type Endpoints struct {
1718

1819
func MakeServerEndpoints(s Service) Endpoints {
1920
return Endpoints{
21+
AliveEndpoint: MakeAliveEndpoint(s),
2022
PostTodoEndpoint: MakePostTodoEndpoint(s),
2123
GetTodoEndpoint: MakeGetTodoEndpoint(s),
2224
GetTodosEndpoint: MakeGetTodosEndpoint(s),
@@ -26,6 +28,12 @@ func MakeServerEndpoints(s Service) Endpoints {
2628
}
2729
}
2830

31+
func MakeAliveEndpoint(_ Service) endpoint.Endpoint {
32+
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
33+
return map[string]string{"status": "OK"}, nil
34+
}
35+
}
36+
2937
func MakePostTodoEndpoint(s Service) endpoint.Endpoint {
3038
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
3139
req := request.(postTodoRequest)

internal/app/middlewares.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@ type loggingMiddleware struct {
2323
logger log.Logger
2424
}
2525

26+
func (mw loggingMiddleware) Clear() (err error) {
27+
defer func(begin time.Time) {
28+
mw.logger.Log("method", "Clear", "took", time.Since(begin), "err", err)
29+
}(time.Now())
30+
return mw.next.Clear()
31+
}
32+
2633
func (mw loggingMiddleware) InsertTodo(ctx context.Context, t Todo) (t2 Todo, err error) {
2734
defer func(begin time.Time) {
28-
mw.logger.Log("method", "PostTodo", "took", time.Since(begin), "err", err)
35+
mw.logger.Log("method", "InsertTodo", "took", time.Since(begin), "err", err)
2936
}(time.Now())
3037
return mw.next.InsertTodo(ctx, t)
3138
}
@@ -39,7 +46,7 @@ func (mw loggingMiddleware) GetTodo(ctx context.Context, id int) (t Todo, err er
3946

4047
func (mw loggingMiddleware) UpdateTodo(ctx context.Context, id int, t Todo) (t2 Todo, err error) {
4148
defer func(begin time.Time) {
42-
mw.logger.Log("method", "PatchTodo", "id", id, "took", time.Since(begin), "err", err)
49+
mw.logger.Log("method", "UpdateTodo", "id", id, "took", time.Since(begin), "err", err)
4350
}(time.Now())
4451
return mw.next.UpdateTodo(ctx, id, t)
4552
}

0 commit comments

Comments
 (0)