Skip to content

Commit

Permalink
convert non-search store methods to sqlc (#3414)
Browse files Browse the repository at this point in the history
  • Loading branch information
mastercactapus authored Nov 6, 2023
1 parent 8922f6c commit 309fd55
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 98 deletions.
103 changes: 103 additions & 0 deletions gadb/queries.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion graphql2/graphqlapp/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ func (s *Service) Notices(ctx context.Context, raw *service.Service) ([]notice.N
}

func (s *Service) Labels(ctx context.Context, raw *service.Service) ([]label.Label, error) {
return s.LabelStore.FindAllByService(ctx, raw.ID)
return s.LabelStore.FindAllByService(ctx, s.DB, raw.ID)
}

func (s *Service) EscalationPolicy(ctx context.Context, raw *service.Service) (*escalation.Policy, error) {
Expand Down
27 changes: 27 additions & 0 deletions label/queries.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-- name: LabelUniqueKeys :many
SELECT DISTINCT
key
FROM
labels;

-- name: LabelFindAllByTarget :many
SELECT
key,
value
FROM
labels
WHERE
tgt_service_id = $1;

-- name: LabelDeleteKeyByTarget :exec
DELETE FROM labels
WHERE key = $1
AND tgt_service_id = $2;

-- name: LabelSetByTarget :exec
INSERT INTO labels(key, value, tgt_service_id)
VALUES ($1, $2, $3)
ON CONFLICT (key, tgt_service_id)
DO UPDATE SET
value = $2;

131 changes: 34 additions & 97 deletions label/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package label
import (
"context"
"database/sql"
"fmt"

"github.com/google/uuid"
"github.com/target/goalert/assignment"
"github.com/target/goalert/gadb"
"github.com/target/goalert/permission"
"github.com/target/goalert/util"
"github.com/target/goalert/validation/validate"

"github.com/pkg/errors"
Expand All @@ -15,46 +17,14 @@ import (
// Store allows the lookup and management of Labels.
type Store struct {
db *sql.DB

upsert *sql.Stmt
delete *sql.Stmt
findAllByService *sql.Stmt
uniqueKeys *sql.Stmt
}

// NewStore will Set a DB backend from a sql.DB. An error will be returned if statements fail to prepare.
func NewStore(ctx context.Context, db *sql.DB) (*Store, error) {
p := &util.Prepare{DB: db, Ctx: ctx}
return &Store{
db: db,
upsert: p.P(`
INSERT INTO labels (tgt_service_id, key, value)
VALUES ($1, $2, $3)
ON CONFLICT (key, tgt_service_id) DO UPDATE
SET value = $3
`),
delete: p.P(`
DELETE FROM labels
WHERE tgt_service_id = $1
AND key = $2
`),
findAllByService: p.P(`
SELECT key, value
FROM labels
WHERE tgt_service_id = $1
ORDER BY key ASC
`),
uniqueKeys: p.P(`
SELECT DISTINCT (key)
FROM labels
ORDER BY key ASC
`),
}, p.Err
}
func NewStore(ctx context.Context, db *sql.DB) (*Store, error) { return &Store{db: db}, nil }

// SetTx will set a label for the service. It can be used to set the key-value pair for the label,
// delete a label or update the value given the label's key.
func (s *Store) SetTx(ctx context.Context, tx *sql.Tx, label *Label) error {
func (s *Store) SetTx(ctx context.Context, db gadb.DBTX, label *Label) error {
err := permission.LimitCheckAny(ctx, permission.System, permission.User)
if err != nil {
return err
Expand All @@ -65,98 +35,65 @@ func (s *Store) SetTx(ctx context.Context, tx *sql.Tx, label *Label) error {
return err
}

if n.Value == "" {
// Delete Operation
stmt := s.delete
if tx != nil {
stmt = tx.StmtContext(ctx, stmt)
if n.Value == "" { // delete if value is empty
err = gadb.New(db).LabelDeleteKeyByTarget(ctx, gadb.LabelDeleteKeyByTargetParams{
Key: label.Key,
TgtServiceID: uuid.MustParse(label.Target.TargetID()),
})
if err != nil {
return fmt.Errorf("delete label: %w", err)
}

_, err = stmt.ExecContext(ctx, n.Target.TargetID(), n.Key)
return errors.Wrap(err, "delete label")
return nil
}

stmt := s.upsert
if tx != nil {
stmt = tx.StmtContext(ctx, stmt)
}

_, err = stmt.ExecContext(ctx, n.Target.TargetID(), n.Key, n.Value)
err = gadb.New(db).LabelSetByTarget(ctx, gadb.LabelSetByTargetParams{
Key: label.Key,
Value: label.Value,
TgtServiceID: uuid.MustParse(label.Target.TargetID()),
})
if err != nil {
return errors.Wrap(err, "set label")
return fmt.Errorf("set label: %w", err)
}

return nil
}

// FindAllByService finds all labels for a particular service. It returns all key-value pairs.
func (s *Store) FindAllByService(ctx context.Context, serviceID string) ([]Label, error) {
func (s *Store) FindAllByService(ctx context.Context, db gadb.DBTX, serviceID string) ([]Label, error) {
err := permission.LimitCheckAny(ctx, permission.System, permission.User)
if err != nil {
return nil, err
}

err = validate.UUID("ServiceID", serviceID)
svc, err := validate.ParseUUID("ServiceID", serviceID)
if err != nil {
return nil, err
}
rows, err := s.findAllByService.QueryContext(ctx, serviceID)

rows, err := gadb.New(db).LabelFindAllByTarget(ctx, svc)
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
}
if err != nil {
return nil, err
return nil, fmt.Errorf("find all labels by service: %w", err)
}
defer rows.Close()

var labels []Label
var l Label

for rows.Next() {
err = rows.Scan(
&l.Key,
&l.Value,
)
if err != nil {
return nil, errors.Wrap(err, "scan row")
}

l.Target = assignment.ServiceTarget(serviceID)

labels = append(labels, l)
labels := make([]Label, len(rows))
for i, l := range rows {
labels[i].Key = l.Key
labels[i].Value = l.Value
labels[i].Target = assignment.ServiceTarget(serviceID)
}

return labels, nil
}

func (s *Store) UniqueKeysTx(ctx context.Context, tx *sql.Tx) ([]string, error) {
func (s *Store) UniqueKeysTx(ctx context.Context, db gadb.DBTX) ([]string, error) {
err := permission.LimitCheckAny(ctx, permission.System, permission.User)
if err != nil {
return nil, err
}

stmt := s.uniqueKeys
if tx != nil {
stmt = tx.StmtContext(ctx, stmt)
}

rows, err := stmt.QueryContext(ctx)
if err != nil {
return nil, err
}
defer rows.Close()

var keys []string

for rows.Next() {
var k string
err = rows.Scan(&k)
if err != nil {
return nil, errors.Wrap(err, "scan row")
}

keys = append(keys, k)
}
return keys, nil
}

func (s *Store) UniqueKeys(ctx context.Context) ([]string, error) {
return s.UniqueKeysTx(ctx, nil)
return gadb.New(db).LabelUniqueKeys(ctx)
}
1 change: 1 addition & 0 deletions sqlc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ sql:
- apikey/queries.sql
- override/queries.sql
- schedule/queries.sql
- label/queries.sql
engine: postgresql
gen:
go:
Expand Down

0 comments on commit 309fd55

Please sign in to comment.