Skip to content

Commit 0ab8915

Browse files
committed
initial skeleton
1 parent a9919a6 commit 0ab8915

File tree

8 files changed

+192
-2
lines changed

8 files changed

+192
-2
lines changed

.gitignore

+7-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,10 @@
1212
*.out
1313

1414
# Dependency directories (remove the comment below to include it)
15-
# vendor/
15+
vendor/
16+
17+
# IDE
18+
.idea
19+
20+
# OS files
21+
.DS_Store

README.md

+19-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,19 @@
1-
# outbox
1+
# outbox
2+
3+
# Usage
4+
5+
Create a collection on mongodb with this fields
6+
7+
```json
8+
{
9+
"id": "fc848030-d72e-4a9c-bf61-55cafdb76454",
10+
"payload": {
11+
"id": "58452f68-705b-4b2e-8685-fc929e750588",
12+
"name": "Guilherme",
13+
"age": 27
14+
},
15+
"topic": "users",
16+
"event": "user_saved",
17+
"checked": false
18+
}
19+
```

go.mod

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
module github.com/guil95/outbox
2+
3+
go 1.19
4+
5+
require (
6+
go.mongodb.org/mongo-driver v1.10.2
7+
go.uber.org/zap v1.23.0
8+
)
9+
10+
require (
11+
github.com/golang/snappy v0.0.1 // indirect
12+
github.com/klauspost/compress v1.13.6 // indirect
13+
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
14+
github.com/pkg/errors v0.9.1 // indirect
15+
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
16+
github.com/xdg-go/scram v1.1.1 // indirect
17+
github.com/xdg-go/stringprep v1.0.3 // indirect
18+
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
19+
go.uber.org/atomic v1.7.0 // indirect
20+
go.uber.org/multierr v1.6.0 // indirect
21+
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
22+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
23+
golang.org/x/text v0.3.7 // indirect
24+
)

go.sum

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
2+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
6+
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
7+
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
8+
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
9+
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
10+
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
11+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
12+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
13+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
14+
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
15+
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
16+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
17+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
18+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
19+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
20+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
21+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
22+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
23+
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
24+
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
25+
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
26+
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
27+
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
28+
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
29+
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
30+
github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
31+
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
32+
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
33+
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
34+
go.mongodb.org/mongo-driver v1.10.2 h1:4Wk3cnqOrQCn0P92L3/mmurMxzdvWWs5J9jinAVKD+k=
35+
go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
36+
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
37+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
38+
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
39+
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
40+
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
41+
go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
42+
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
43+
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
44+
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
45+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
46+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
47+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
48+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
49+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
50+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
51+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
52+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
53+
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
54+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
55+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
56+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
57+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
58+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
59+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
60+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
61+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
62+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

model.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package outbox
2+
3+
type Model struct {
4+
ID string `json:"id" bson:"id"`
5+
Payload string `json:"payload" bson:"payload"`
6+
Topic string `json:"topic" bson:"topic"`
7+
Event string `json:"event" bson:"event"`
8+
Checked bool `json:"checked" bson:"checked"`
9+
}

mongo/mongo.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package mongo
2+
3+
import (
4+
"github.com/guil95/outbox"
5+
"go.mongodb.org/mongo-driver/mongo"
6+
)
7+
8+
type mongoStorage struct {
9+
db *mongo.Database
10+
}
11+
12+
func NewMongoStorage(db *mongo.Database) outbox.Storage {
13+
return &mongoStorage{db}
14+
}
15+
16+
func (m mongoStorage) ListAllItems() ([]outbox.Model, error) {
17+
//TODO implement me
18+
panic("implement me")
19+
}
20+
21+
func (m mongoStorage) UpdateItemToCheck(items []outbox.Model) error {
22+
//TODO implement me
23+
panic("implement me")
24+
}
25+
26+
func (m mongoStorage) DeleteCheckedItems() error {
27+
//TODO implement me
28+
panic("implement me")
29+
}

outbox.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package outbox
2+
3+
import "go.uber.org/zap"
4+
5+
type Outbox struct {
6+
storage Storage
7+
}
8+
9+
func (o *Outbox) Process() {
10+
go o.deleteCheckedItems()
11+
for {
12+
items, err := o.storage.ListAllItems()
13+
if err != nil {
14+
zap.S().Errorf("outbox: error deleting checked items %v", err)
15+
}
16+
//send to kafka
17+
o.updateItemToChecked(items)
18+
}
19+
}
20+
21+
func (o *Outbox) deleteCheckedItems() {
22+
for {
23+
err := o.storage.DeleteCheckedItems()
24+
if err != nil {
25+
zap.S().Errorf("outbox: error deleting checked items %v", err)
26+
}
27+
}
28+
}
29+
30+
func (o *Outbox) updateItemToChecked(items []Model) {
31+
err := o.storage.UpdateItemToCheck(items)
32+
if err != nil {
33+
zap.S().Errorf("outbox: error update items %v", err)
34+
}
35+
}

storage.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package outbox
2+
3+
type Storage interface {
4+
ListAllItems() ([]Model, error)
5+
UpdateItemToCheck(items []Model) error
6+
DeleteCheckedItems() error
7+
}

0 commit comments

Comments
 (0)