Skip to content

Commit

Permalink
feat: Add query helpers (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
allisson committed Mar 3, 2021
1 parent ea04c82 commit 7f45d2b
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 182 deletions.
12 changes: 6 additions & 6 deletions repository.go
Expand Up @@ -15,25 +15,25 @@ type RepositoryListOptions struct {

// WebhookRepository is the interface that will be used to iterate with the Webhook data.
type WebhookRepository interface {
Get(getOptions *RepositoryGetOptions) (*Webhook, error)
List(listOptions *RepositoryListOptions) ([]*Webhook, error)
Get(getOptions RepositoryGetOptions) (*Webhook, error)
List(listOptions RepositoryListOptions) ([]*Webhook, error)
Create(webhook *Webhook) error
Update(webhook *Webhook) error
Delete(id ID) error
}

// DeliveryRepository is the interface that will be used to iterate with the Delivery data.
type DeliveryRepository interface {
Get(getOptions *RepositoryGetOptions) (*Delivery, error)
List(listOptions *RepositoryListOptions) ([]*Delivery, error)
Get(getOptions RepositoryGetOptions) (*Delivery, error)
List(listOptions RepositoryListOptions) ([]*Delivery, error)
Create(delivery *Delivery) error
Update(delivery *Delivery) error
Delete(id ID) error
}

// DeliveryAttemptRepository is the interface that will be used to iterate with the DeliveryAttempt data.
type DeliveryAttemptRepository interface {
Get(getOptions *RepositoryGetOptions) (*DeliveryAttempt, error)
List(listOptions *RepositoryListOptions) ([]*DeliveryAttempt, error)
Get(getOptions RepositoryGetOptions) (*DeliveryAttempt, error)
List(listOptions RepositoryListOptions) ([]*DeliveryAttempt, error)
Create(deliveryAttempt *DeliveryAttempt) error
}
61 changes: 8 additions & 53 deletions repository/delivery.go
Expand Up @@ -2,7 +2,6 @@ package repository

import (
"github.com/allisson/postmand"
"github.com/huandu/go-sqlbuilder"
"github.com/jmoiron/sqlx"
)

Expand All @@ -12,76 +11,32 @@ type Delivery struct {
}

// Get returns postmand.Delivery by options filter.
func (d Delivery) Get(getOptions *postmand.RepositoryGetOptions) (*postmand.Delivery, error) {
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()
sql, args := getQuery("deliveries", getOptions)
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) {
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()
sql, args := listQuery("deliveries", listOptions)
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)
sql, args := insertQuery("deliveries", delivery)
_, err := d.db.Exec(sql, args...)
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)
sql, args := updateQuery("deliveries", delivery)
_, err := d.db.Exec(sql, args...)
return err
}

Expand Down
51 changes: 6 additions & 45 deletions repository/delivery_attempt.go
Expand Up @@ -2,7 +2,6 @@ package repository

import (
"github.com/allisson/postmand"
"github.com/huandu/go-sqlbuilder"
"github.com/jmoiron/sqlx"
)

Expand All @@ -12,63 +11,25 @@ type DeliveryAttempt struct {
}

// Get returns postmand.DeliveryAttempt by options filter.
func (d DeliveryAttempt) Get(getOptions *postmand.RepositoryGetOptions) (*postmand.DeliveryAttempt, error) {
func (d DeliveryAttempt) Get(getOptions postmand.RepositoryGetOptions) (*postmand.DeliveryAttempt, error) {
deliveryAttempt := postmand.DeliveryAttempt{}
sb := sqlbuilder.PostgreSQL.NewSelectBuilder()
sb.Select("*").From("delivery_attempts")
for key, value := range getOptions.Filters {
sb.Where(sb.Equal(key, value))
}
sql, args := sb.Build()
sql, args := getQuery("delivery_attempts", getOptions)
err := d.db.Get(&deliveryAttempt, sql, args...)
return &deliveryAttempt, err
}

// List returns a slice of postmand.DeliveryAttempt by options filter.
func (d DeliveryAttempt) List(listOptions *postmand.RepositoryListOptions) ([]*postmand.DeliveryAttempt, error) {
func (d DeliveryAttempt) List(listOptions postmand.RepositoryListOptions) ([]*postmand.DeliveryAttempt, error) {
deliveryAttempts := []*postmand.DeliveryAttempt{}
sb := sqlbuilder.PostgreSQL.NewSelectBuilder()
sb.Select("*").From("delivery_attempts").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()
sql, args := listQuery("delivery_attempts", listOptions)
err := d.db.Select(&deliveryAttempts, sql, args...)
return deliveryAttempts, err
}

// Create postmand.DeliveryAttempt on database.
func (d DeliveryAttempt) Create(deliveryAttempt *postmand.DeliveryAttempt) error {
sqlStatement := `
INSERT INTO delivery_attempts (
"id",
"webhook_id",
"delivery_id",
"response_headers",
"response_body",
"response_status_code",
"execution_duration",
"success",
"error",
"created_at"
)
VALUES (
:id,
:webhook_id,
:delivery_id,
:response_headers,
:response_body,
:response_status_code,
:execution_duration,
:success,
:error,
:created_at
)
`
_, err := d.db.NamedExec(sqlStatement, deliveryAttempt)
sql, args := insertQuery("delivery_attempts", deliveryAttempt)
_, err := d.db.Exec(sql, args...)
return err
}

Expand Down
4 changes: 2 additions & 2 deletions repository/delivery_attempt_test.go
Expand Up @@ -61,7 +61,7 @@ func TestDeliveryAttempt(t *testing.T) {
assert.Nil(t, err)

options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": deliveryAttempt.ID}}
deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(&options)
deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(options)
assert.Nil(t, err)
assert.Equal(t, deliveryAttempt.ID, deliveryAttemptFromRepository.ID)
})
Expand Down Expand Up @@ -92,7 +92,7 @@ func TestDeliveryAttempt(t *testing.T) {
assert.Nil(t, err)

options := postmand.RepositoryListOptions{Limit: 1, Offset: 1, OrderBy: "created_at DESC"}
deliveryAttempts, err := th.deliveryAttemptRepository.List(&options)
deliveryAttempts, err := th.deliveryAttemptRepository.List(options)
assert.Nil(t, err)
assert.Len(t, deliveryAttempts, 1)
assert.Equal(t, deliveryAttempt2.ID, deliveryAttempts[0].ID)
Expand Down
8 changes: 4 additions & 4 deletions repository/delivery_test.go
Expand Up @@ -53,7 +53,7 @@ func TestDelivery(t *testing.T) {
assert.Nil(t, err)

options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}}
deliveryFromRepository, err := th.deliveryRepository.Get(&options)
deliveryFromRepository, err := th.deliveryRepository.Get(options)
assert.Nil(t, err)
assert.Equal(t, postmand.DeliveryStatusDoing, deliveryFromRepository.Status)
})
Expand All @@ -75,7 +75,7 @@ func TestDelivery(t *testing.T) {
assert.Nil(t, err)

options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}}
_, err = th.deliveryRepository.Get(&options)
_, err = th.deliveryRepository.Get(options)
assert.Equal(t, sql.ErrNoRows, err)
})

Expand All @@ -93,7 +93,7 @@ func TestDelivery(t *testing.T) {
assert.Nil(t, err)

options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}}
deliveryFromRepository, err := th.deliveryRepository.Get(&options)
deliveryFromRepository, err := th.deliveryRepository.Get(options)
assert.Nil(t, err)
assert.Equal(t, delivery.ID, deliveryFromRepository.ID)
})
Expand All @@ -117,7 +117,7 @@ func TestDelivery(t *testing.T) {
assert.Nil(t, err)

options := postmand.RepositoryListOptions{Limit: 1, Offset: 1, OrderBy: "created_at DESC"}
deliveries, err := th.deliveryRepository.List(&options)
deliveries, err := th.deliveryRepository.List(options)
assert.Nil(t, err)
assert.Len(t, deliveries, 1)
assert.Equal(t, delivery2.ID, deliveries[0].ID)
Expand Down
39 changes: 39 additions & 0 deletions repository/query.go
@@ -0,0 +1,39 @@
package repository

import (
"github.com/allisson/postmand"
"github.com/huandu/go-sqlbuilder"
)

func getQuery(tableName string, getOptions postmand.RepositoryGetOptions) (string, []interface{}) {
sb := sqlbuilder.PostgreSQL.NewSelectBuilder()
sb.Select("*").From(tableName)
for key, value := range getOptions.Filters {
sb.Where(sb.Equal(key, value))
}
return sb.Build()
}

func listQuery(tableName string, listOptions postmand.RepositoryListOptions) (string, []interface{}) {
sb := sqlbuilder.PostgreSQL.NewSelectBuilder()
sb.Select("*").From(tableName).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)
}
return sb.Build()
}

func insertQuery(tableName string, structValue interface{}) (string, []interface{}) {
theStruct := sqlbuilder.NewStruct(structValue).For(sqlbuilder.PostgreSQL)
ib := theStruct.InsertInto(tableName, structValue)
return ib.Build()
}

func updateQuery(tableName string, structValue interface{}) (string, []interface{}) {
theStruct := sqlbuilder.NewStruct(structValue).For(sqlbuilder.PostgreSQL)
ib := theStruct.Update(tableName, structValue)
return ib.Build()
}

0 comments on commit 7f45d2b

Please sign in to comment.