diff --git a/repository.go b/repository.go index b83f664..07e0818 100644 --- a/repository.go +++ b/repository.go @@ -15,8 +15,8 @@ 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 @@ -24,8 +24,8 @@ type WebhookRepository interface { // 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 @@ -33,7 +33,7 @@ type DeliveryRepository interface { // 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 } diff --git a/repository/delivery.go b/repository/delivery.go index db91ce9..7aee5e9 100644 --- a/repository/delivery.go +++ b/repository/delivery.go @@ -2,7 +2,6 @@ package repository import ( "github.com/allisson/postmand" - "github.com/huandu/go-sqlbuilder" "github.com/jmoiron/sqlx" ) @@ -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 } diff --git a/repository/delivery_attempt.go b/repository/delivery_attempt.go index 83e994a..ef6ed35 100644 --- a/repository/delivery_attempt.go +++ b/repository/delivery_attempt.go @@ -2,7 +2,6 @@ package repository import ( "github.com/allisson/postmand" - "github.com/huandu/go-sqlbuilder" "github.com/jmoiron/sqlx" ) @@ -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 } diff --git a/repository/delivery_attempt_test.go b/repository/delivery_attempt_test.go index 2cc829a..1b48885 100644 --- a/repository/delivery_attempt_test.go +++ b/repository/delivery_attempt_test.go @@ -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) }) @@ -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) diff --git a/repository/delivery_test.go b/repository/delivery_test.go index 423d372..1fe9964 100644 --- a/repository/delivery_test.go +++ b/repository/delivery_test.go @@ -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) }) @@ -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) }) @@ -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) }) @@ -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) diff --git a/repository/query.go b/repository/query.go new file mode 100644 index 0000000..ec151cd --- /dev/null +++ b/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() +} diff --git a/repository/webhook.go b/repository/webhook.go index 32eb206..1773423 100644 --- a/repository/webhook.go +++ b/repository/webhook.go @@ -2,7 +2,6 @@ package repository import ( "github.com/allisson/postmand" - "github.com/huandu/go-sqlbuilder" "github.com/jmoiron/sqlx" ) @@ -12,91 +11,32 @@ type Webhook struct { } // Get returns postmand.Webhook by options filter. -func (w Webhook) Get(getOptions *postmand.RepositoryGetOptions) (*postmand.Webhook, error) { +func (w Webhook) Get(getOptions postmand.RepositoryGetOptions) (*postmand.Webhook, error) { webhook := postmand.Webhook{} - sb := sqlbuilder.PostgreSQL.NewSelectBuilder() - sb.Select("*").From("webhooks") - for key, value := range getOptions.Filters { - sb.Where(sb.Equal(key, value)) - } - sql, args := sb.Build() + sql, args := getQuery("webhooks", getOptions) err := w.db.Get(&webhook, sql, args...) return &webhook, err } // List returns a slice of postmand.Webhook by options filter. -func (w Webhook) List(listOptions *postmand.RepositoryListOptions) ([]*postmand.Webhook, error) { +func (w Webhook) List(listOptions postmand.RepositoryListOptions) ([]*postmand.Webhook, error) { webhooks := []*postmand.Webhook{} - sb := sqlbuilder.PostgreSQL.NewSelectBuilder() - sb.Select("*").From("webhooks").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("webhooks", listOptions) err := w.db.Select(&webhooks, sql, args...) return webhooks, err } // Create postmand.Webhook on database. func (w Webhook) Create(webhook *postmand.Webhook) error { - sqlStatement := ` - INSERT INTO webhooks ( - "id", - "name", - "url", - "content_type", - "valid_status_codes", - "secret_token", - "active", - "max_delivery_attempts", - "delivery_attempt_timeout", - "retry_min_backoff", - "retry_max_backoff", - "created_at", - "updated_at" - ) - VALUES ( - :id, - :name, - :url, - :content_type, - :valid_status_codes, - :secret_token, - :active, - :max_delivery_attempts, - :delivery_attempt_timeout, - :retry_min_backoff, - :retry_max_backoff, - :created_at, - :updated_at - ) - ` - _, err := w.db.NamedExec(sqlStatement, webhook) + sql, args := insertQuery("webhooks", webhook) + _, err := w.db.Exec(sql, args...) return err } // Update postmand.Webhook on database. func (w Webhook) Update(webhook *postmand.Webhook) error { - sqlStatement := ` - UPDATE webhooks - SET name = :name, - url = :url, - content_type = :content_type, - valid_status_codes = :valid_status_codes, - secret_token = :secret_token, - active = :active, - max_delivery_attempts = :max_delivery_attempts, - delivery_attempt_timeout = :delivery_attempt_timeout, - retry_min_backoff = :retry_min_backoff, - retry_max_backoff = :retry_max_backoff, - created_at = :created_at, - updated_at = :updated_at - WHERE id = :id - ` - _, err := w.db.NamedExec(sqlStatement, webhook) + sql, args := updateQuery("webhooks", webhook) + _, err := w.db.Exec(sql, args...) return err } diff --git a/repository/webhook_test.go b/repository/webhook_test.go index 1512c57..4b3ca2a 100644 --- a/repository/webhook_test.go +++ b/repository/webhook_test.go @@ -47,7 +47,7 @@ func TestTransaction(t *testing.T) { assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": webhook.ID}} - webhookFromRepository, err := th.webhookRepository.Get(&options) + webhookFromRepository, err := th.webhookRepository.Get(options) assert.Nil(t, err) assert.Equal(t, pq.Int32Array{200, 201, 204}, webhookFromRepository.ValidStatusCodes) }) @@ -64,7 +64,7 @@ func TestTransaction(t *testing.T) { assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": webhook.ID}} - _, err = th.webhookRepository.Get(&options) + _, err = th.webhookRepository.Get(options) assert.Equal(t, sql.ErrNoRows, err) }) @@ -77,7 +77,7 @@ func TestTransaction(t *testing.T) { assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": webhook.ID}} - webhookFromRepository, err := th.webhookRepository.Get(&options) + webhookFromRepository, err := th.webhookRepository.Get(options) assert.Nil(t, err) assert.Equal(t, webhook.ID, webhookFromRepository.ID) }) @@ -95,7 +95,7 @@ func TestTransaction(t *testing.T) { assert.Nil(t, err) options := postmand.RepositoryListOptions{Limit: 1, Offset: 1, OrderBy: "created_at DESC"} - webhooks, err := th.webhookRepository.List(&options) + webhooks, err := th.webhookRepository.List(options) assert.Nil(t, err) assert.Len(t, webhooks, 1) assert.Equal(t, webhook2.ID, webhooks[0].ID)