Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add query helpers #5

Merged
merged 1 commit into from Mar 3, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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()
}