Skip to content

Commit

Permalink
Merge pull request #13 from grvcoelho/deliveries
Browse files Browse the repository at this point in the history
database: add deliveries
  • Loading branch information
grvcoelho authored Nov 6, 2017
2 parents f8bd946 + 0b25df7 commit 408e39b
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 3 deletions.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,5 @@
| Attribute | Type | Description |
| --------- | ---- | ----------- |
| `status` | *String* | The status of the delivery. One of: `success`, `failed`, `processing` |
| `latency` | *JSON* | The time between the delivery and the response from the client |
| `response_status_code` | *String* | The HTTP status code the client respond with |
| `response_headers` | *JSON* | The HTTP headers the client respond with |
| `latency` | *Integer* | The time between the delivery and the response from the client |
| `status_code` | *String* | The HTTP status code the client respond with |
2 changes: 2 additions & 0 deletions migrations/1509740079_delivery_schema.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DROP TYPE "deliveries_status";
DROP TABLE IF EXISTS deliveries CASCADE;
15 changes: 15 additions & 0 deletions migrations/1509740079_delivery_schema.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
CREATE TYPE "deliveries_status" AS ENUM (
'processing',
'failed',
'success'
);

CREATE TABLE IF NOT EXISTS deliveries (
id varchar(255) PRIMARY KEY,
message_id varchar(255) references messages(id) NOT NULL,
status "deliveries_status" DEFAULT 'processing'::"deliveries_status" NOT NULL,
latency integer,
status_code varchar(255),
created_at date NOT NULL,
updated_at date NOT NULL
);
28 changes: 28 additions & 0 deletions pkg/database/db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,32 @@ func TestDatabase(t *testing.T) {
assert.True(t, ok)
assert.Equal(t, m1.ID, m2.ID)
})

t.Run("DeliveryStore", func(t *testing.T) {
db, _ := NewDatabase(&cfg.Database{
Address: "postgres://postgres:postgres@database/webhulk?sslmode=disable",
})

webhookStore, _ := NewWebhookStore(db)
messageStore, _ := NewMessageStore(db)
deliveryStore, err := NewDeliveryStore(db)
assert.NoError(t, err)

w1, _ := NewWebhook("events", "https://receiver.com", true)
w1, _ = webhookStore.Store(w1)

m1, _ := NewMessage(w1.ID, []byte(`{"event":"status_changed"}`))
m1, _ = messageStore.Store(m1)

d1, err := NewDelivery(m1.ID)
assert.NoError(t, err)
assert.Equal(t, d1.Status, "processing")

_, err = deliveryStore.Store(d1)
assert.NoError(t, err, "Should store a delivery")

d2, ok := deliveryStore.Retrieve(d1.ID)
assert.True(t, ok)
assert.Equal(t, d1.ID, d2.ID)
})
}
17 changes: 17 additions & 0 deletions pkg/database/delivery.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package database

type Delivery struct {
*Model
MessageID string `db:"message_id"`
Status string `db:"status"`
Latency int `db:"latency"`
StatusCode string `db:"status_code"`
}

func NewDelivery(messageID string) (*Delivery, error) {
return &Delivery{
Model: NewModel("del"),
MessageID: messageID,
Status: "processing",
}, nil
}
62 changes: 62 additions & 0 deletions pkg/database/delivery_store.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package database

import (
"sync"

"github.com/jmoiron/sqlx"
)

type DeliveryStore struct {
db *sqlx.DB
mutex sync.RWMutex
}

func NewDeliveryStore(db *sqlx.DB) (*DeliveryStore, error) {
return &DeliveryStore{
db: db,
mutex: sync.RWMutex{},
}, nil
}

func (s *DeliveryStore) Store(d *Delivery) (*Delivery, error) {
s.mutex.Lock()
defer s.mutex.Unlock()

query := `
INSERT INTO deliveries
(id, status, latency, status_code, message_id, created_at, updated_at)
VALUES
(:id, :status, :latency, :status_code, :message_id, :created_at, :updated_at)
`

_, err := s.db.NamedExec(query, d)

if err != nil {
return nil, err
}

return d, nil
}

func (s *DeliveryStore) Retrieve(id string) (*Delivery, bool) {
s.mutex.Lock()
defer s.mutex.Unlock()

d := &Delivery{}

query := `
SELECT
id, status, latency, status_code, message_id, created_at, updated_at
FROM deliveries
WHERE
id = $1
`

err := s.db.Get(d, query, id)

if err != nil {
return nil, false
}

return d, true
}

0 comments on commit 408e39b

Please sign in to comment.