Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
266 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
DROP TABLE IF EXISTS deliveries; | ||
DROP TABLE IF EXISTS webhooks; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
package repository | ||
|
||
import ( | ||
"github.com/allisson/postmand" | ||
"github.com/huandu/go-sqlbuilder" | ||
"github.com/jmoiron/sqlx" | ||
) | ||
|
||
// Delivery implements postmand.DeliveryRepository interface. | ||
type Delivery struct { | ||
db *sqlx.DB | ||
} | ||
|
||
// Get returns postmand.Delivery by options filter. | ||
func (d Delivery) Get(getOptions *postmand.RepositoryGetOptions) (*postmand.Delivery, error) { | ||
delivery := postmand.Delivery{} | ||
sb := sqlbuilder.PostgreSQL.NewSelectBuilder() | ||
sb.Select("*").From("deliveries") | ||
for key, value := range getOptions.Filters { | ||
sb.Where(sb.Equal(key, value)) | ||
} | ||
sql, args := sb.Build() | ||
err := d.db.Get(&delivery, sql, args...) | ||
return &delivery, err | ||
} | ||
|
||
// List returns a slice of postmand.Delivery by options filter. | ||
func (d Delivery) List(listOptions *postmand.RepositoryListOptions) ([]*postmand.Delivery, error) { | ||
deliveries := []*postmand.Delivery{} | ||
sb := sqlbuilder.PostgreSQL.NewSelectBuilder() | ||
sb.Select("*").From("deliveries").Limit(listOptions.Limit).Offset(listOptions.Offset) | ||
for key, value := range listOptions.Filters { | ||
sb.Where(sb.Equal(key, value)) | ||
} | ||
if listOptions.OrderBy != "" { | ||
sb.OrderBy(listOptions.OrderBy) | ||
} | ||
sql, args := sb.Build() | ||
err := d.db.Select(&deliveries, sql, args...) | ||
return deliveries, err | ||
} | ||
|
||
// Create postmand.Delivery on database. | ||
func (d Delivery) Create(delivery *postmand.Delivery) error { | ||
sqlStatement := ` | ||
INSERT INTO deliveries ( | ||
"id", | ||
"webhook_id", | ||
"payload", | ||
"scheduled_at", | ||
"delivery_attempts", | ||
"status", | ||
"created_at", | ||
"updated_at" | ||
) | ||
VALUES ( | ||
:id, | ||
:webhook_id, | ||
:payload, | ||
:scheduled_at, | ||
:delivery_attempts, | ||
:status, | ||
:created_at, | ||
:updated_at | ||
) | ||
` | ||
_, err := d.db.NamedExec(sqlStatement, delivery) | ||
return err | ||
} | ||
|
||
// Update postmand.Delivery on database. | ||
func (d Delivery) Update(delivery *postmand.Delivery) error { | ||
sqlStatement := ` | ||
UPDATE deliveries | ||
SET webhook_id = :webhook_id, | ||
payload = :payload, | ||
scheduled_at = :scheduled_at, | ||
delivery_attempts = :delivery_attempts, | ||
status = :status, | ||
created_at = :created_at, | ||
updated_at = :updated_at | ||
WHERE id = :id | ||
` | ||
_, err := d.db.NamedExec(sqlStatement, delivery) | ||
return err | ||
} | ||
|
||
// Delete postmand.Delivery on database. | ||
func (d Delivery) Delete(id postmand.ID) error { | ||
sqlStatement := ` | ||
DELETE FROM deliveries WHERE id = $1 | ||
` | ||
_, err := d.db.Exec(sqlStatement, id) | ||
return err | ||
} | ||
|
||
// NewDelivery returns postmand.Delivery with db connection. | ||
func NewDelivery(db *sqlx.DB) *Delivery { | ||
return &Delivery{db: db} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
package repository | ||
|
||
import ( | ||
"database/sql" | ||
"testing" | ||
"time" | ||
|
||
"github.com/allisson/postmand" | ||
"github.com/google/uuid" | ||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func makeDelivery() *postmand.Delivery { | ||
return &postmand.Delivery{ | ||
ID: uuid.New(), | ||
Payload: `{"success": true}`, | ||
ScheduledAt: time.Now().UTC(), | ||
DeliveryAttempts: 0, | ||
Status: postmand.DeliveryStatusTodo, | ||
} | ||
} | ||
|
||
func TestDelivery(t *testing.T) { | ||
t.Run("Create delivery", func(t *testing.T) { | ||
th := newTestHelper() | ||
defer th.db.Close() | ||
|
||
webhook := makeWebhook() | ||
err := th.webhookRepository.Create(webhook) | ||
assert.Nil(t, err) | ||
|
||
delivery := makeDelivery() | ||
delivery.WebhookID = webhook.ID | ||
err = th.deliveryRepository.Create(delivery) | ||
assert.Nil(t, err) | ||
}) | ||
|
||
t.Run("Update delivery", func(t *testing.T) { | ||
th := newTestHelper() | ||
defer th.db.Close() | ||
|
||
webhook := makeWebhook() | ||
err := th.webhookRepository.Create(webhook) | ||
assert.Nil(t, err) | ||
|
||
delivery := makeDelivery() | ||
delivery.WebhookID = webhook.ID | ||
err = th.deliveryRepository.Create(delivery) | ||
assert.Nil(t, err) | ||
|
||
delivery.Status = postmand.DeliveryStatusDoing | ||
err = th.deliveryRepository.Update(delivery) | ||
assert.Nil(t, err) | ||
|
||
options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} | ||
deliveryFromRepository, err := th.deliveryRepository.Get(&options) | ||
assert.Nil(t, err) | ||
assert.Equal(t, postmand.DeliveryStatusDoing, deliveryFromRepository.Status) | ||
}) | ||
|
||
t.Run("Delete delivery", func(t *testing.T) { | ||
th := newTestHelper() | ||
defer th.db.Close() | ||
|
||
webhook := makeWebhook() | ||
err := th.webhookRepository.Create(webhook) | ||
assert.Nil(t, err) | ||
|
||
delivery := makeDelivery() | ||
delivery.WebhookID = webhook.ID | ||
err = th.deliveryRepository.Create(delivery) | ||
assert.Nil(t, err) | ||
|
||
err = th.deliveryRepository.Delete(delivery.ID) | ||
assert.Nil(t, err) | ||
|
||
options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} | ||
_, err = th.deliveryRepository.Get(&options) | ||
assert.Equal(t, sql.ErrNoRows, err) | ||
}) | ||
|
||
t.Run("Get delivery", func(t *testing.T) { | ||
th := newTestHelper() | ||
defer th.db.Close() | ||
|
||
webhook := makeWebhook() | ||
err := th.webhookRepository.Create(webhook) | ||
assert.Nil(t, err) | ||
|
||
delivery := makeDelivery() | ||
delivery.WebhookID = webhook.ID | ||
err = th.deliveryRepository.Create(delivery) | ||
assert.Nil(t, err) | ||
|
||
options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} | ||
deliveryFromRepository, err := th.deliveryRepository.Get(&options) | ||
assert.Nil(t, err) | ||
assert.Equal(t, delivery.ID, deliveryFromRepository.ID) | ||
}) | ||
|
||
t.Run("List deliveries", func(t *testing.T) { | ||
th := newTestHelper() | ||
defer th.db.Close() | ||
|
||
webhook := makeWebhook() | ||
err := th.webhookRepository.Create(webhook) | ||
assert.Nil(t, err) | ||
|
||
delivery1 := makeDelivery() | ||
delivery1.WebhookID = webhook.ID | ||
err = th.deliveryRepository.Create(delivery1) | ||
assert.Nil(t, err) | ||
|
||
delivery2 := makeDelivery() | ||
delivery2.WebhookID = webhook.ID | ||
err = th.deliveryRepository.Create(delivery2) | ||
assert.Nil(t, err) | ||
|
||
options := postmand.RepositoryListOptions{Limit: 1, Offset: 1, OrderBy: "created_at DESC"} | ||
deliveries, err := th.deliveryRepository.List(&options) | ||
assert.Nil(t, err) | ||
assert.Len(t, deliveries, 1) | ||
assert.Equal(t, delivery2.ID, deliveries[0].ID) | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters