diff --git a/db/query/provider.sql b/db/query/provider.sql new file mode 100644 index 0000000..094b264 --- /dev/null +++ b/db/query/provider.sql @@ -0,0 +1,37 @@ +-- name: GetProvider :one +SELECT * FROM providers +WHERE "ID" = $1 LIMIT 1; + +-- name: CreateProvider :one +INSERT INTO providers ( + name, + description, + category, + email, + creator, + changer +) VALUES ( + $1, $2, $3, $4, $5, $6 +) RETURNING *; + +-- name: ListProviders :many +SELECT * FROM providers +ORDER BY name +LIMIT $1 +OFFSET $2; + +-- name: UpdateProvider :one +UPDATE providers +SET + name = COALESCE(sqlc.narg(name), name), + description = COALESCE(sqlc.narg(description), description), + category = COALESCE(sqlc.narg(category), category), + email = COALESCE(sqlc.narg(email), email), + changer = $2, + changed = now() +WHERE "ID" = $1 +RETURNING *; + +-- name: DeleteProvider :exec +DELETE FROM providers +WHERE "ID" = $1; \ No newline at end of file diff --git a/db/sqlc/provider.sql.go b/db/sqlc/provider.sql.go new file mode 100644 index 0000000..3f63a3d --- /dev/null +++ b/db/sqlc/provider.sql.go @@ -0,0 +1,180 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.21.0 +// source: provider.sql + +package db + +import ( + "context" + "database/sql" +) + +const createProvider = `-- name: CreateProvider :one +INSERT INTO providers ( + name, + description, + category, + email, + creator, + changer +) VALUES ( + $1, $2, $3, $4, $5, $6 +) RETURNING "ID", name, description, category, email, creator, created, changer, changed +` + +type CreateProviderParams struct { + Name string `json:"name"` + Description string `json:"description"` + Category string `json:"category"` + Email string `json:"email"` + Creator string `json:"creator"` + Changer string `json:"changer"` +} + +func (q *Queries) CreateProvider(ctx context.Context, arg CreateProviderParams) (Provider, error) { + row := q.db.QueryRowContext(ctx, createProvider, + arg.Name, + arg.Description, + arg.Category, + arg.Email, + arg.Creator, + arg.Changer, + ) + var i Provider + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Category, + &i.Email, + &i.Creator, + &i.Created, + &i.Changer, + &i.Changed, + ) + return i, err +} + +const deleteProvider = `-- name: DeleteProvider :exec +DELETE FROM providers +WHERE "ID" = $1 +` + +func (q *Queries) DeleteProvider(ctx context.Context, id int64) error { + _, err := q.db.ExecContext(ctx, deleteProvider, id) + return err +} + +const getProvider = `-- name: GetProvider :one +SELECT "ID", name, description, category, email, creator, created, changer, changed FROM providers +WHERE "ID" = $1 LIMIT 1 +` + +func (q *Queries) GetProvider(ctx context.Context, id int64) (Provider, error) { + row := q.db.QueryRowContext(ctx, getProvider, id) + var i Provider + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Category, + &i.Email, + &i.Creator, + &i.Created, + &i.Changer, + &i.Changed, + ) + return i, err +} + +const listProviders = `-- name: ListProviders :many +SELECT "ID", name, description, category, email, creator, created, changer, changed FROM providers +ORDER BY name +LIMIT $1 +OFFSET $2 +` + +type ListProvidersParams struct { + Limit int32 `json:"limit"` + Offset int32 `json:"offset"` +} + +func (q *Queries) ListProviders(ctx context.Context, arg ListProvidersParams) ([]Provider, error) { + rows, err := q.db.QueryContext(ctx, listProviders, arg.Limit, arg.Offset) + if err != nil { + return nil, err + } + defer rows.Close() + items := []Provider{} + for rows.Next() { + var i Provider + if err := rows.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Category, + &i.Email, + &i.Creator, + &i.Created, + &i.Changer, + &i.Changed, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateProvider = `-- name: UpdateProvider :one +UPDATE providers +SET + name = COALESCE($3, name), + description = COALESCE($4, description), + category = COALESCE($5, category), + email = COALESCE($6, email), + changer = $2, + changed = now() +WHERE "ID" = $1 +RETURNING "ID", name, description, category, email, creator, created, changer, changed +` + +type UpdateProviderParams struct { + ID int64 `json:"ID"` + Changer string `json:"changer"` + Name sql.NullString `json:"name"` + Description sql.NullString `json:"description"` + Category sql.NullString `json:"category"` + Email sql.NullString `json:"email"` +} + +func (q *Queries) UpdateProvider(ctx context.Context, arg UpdateProviderParams) (Provider, error) { + row := q.db.QueryRowContext(ctx, updateProvider, + arg.ID, + arg.Changer, + arg.Name, + arg.Description, + arg.Category, + arg.Email, + ) + var i Provider + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.Category, + &i.Email, + &i.Creator, + &i.Created, + &i.Changer, + &i.Changed, + ) + return i, err +} diff --git a/db/sqlc/provider_test.go b/db/sqlc/provider_test.go new file mode 100644 index 0000000..5fa6316 --- /dev/null +++ b/db/sqlc/provider_test.go @@ -0,0 +1,114 @@ +package db + +import ( + "context" + "database/sql" + "testing" + "time" + + "github.com/itsscb/df/util" + "github.com/stretchr/testify/require" +) + +func createRandomProvider(t *testing.T) Provider { + arg := CreateProviderParams{ + Name: util.RandomUser(), + Description: util.RandomString(30), + Category: util.RandomUser(), + Email: util.RandomUser(), + Creator: util.RandomUser(), + } + + provider, err := testQueries.CreateProvider(context.Background(), arg) + require.NoError(t, err) + require.NotEmpty(t, provider) + + require.Equal(t, arg.Name, provider.Name) + require.Equal(t, arg.Description, provider.Description) + require.Equal(t, arg.Category, provider.Category) + require.Equal(t, arg.Email, provider.Email) + require.Equal(t, arg.Creator, provider.Creator) + + require.NotZero(t, provider.ID) + require.NotZero(t, provider.Created) + + return provider +} + +func TestCreateProvider(t *testing.T) { + createRandomProvider(t) +} + +func TestGetProvider(t *testing.T) { + newProvider := createRandomProvider(t) + require.NotEmpty(t, newProvider) + + provider, err := testQueries.GetProvider(context.Background(), newProvider.ID) + require.NoError(t, err) + require.NotEmpty(t, provider) + + require.Equal(t, newProvider.Name, provider.Name) + require.Equal(t, newProvider.Description, provider.Description) + require.Equal(t, newProvider.Category, provider.Category) + require.Equal(t, newProvider.Email, provider.Email) + require.Equal(t, newProvider.Created, provider.Created) + require.Equal(t, newProvider.Changer, provider.Changer) + require.Equal(t, newProvider.Changed, provider.Changed) + require.Equal(t, newProvider.Creator, provider.Creator) + + require.WithinDuration(t, newProvider.Created, provider.Created, time.Second) +} + +func TestDeleteProvider(t *testing.T) { + provider1 := createRandomProvider(t) + err := testQueries.DeleteProvider(context.Background(), provider1.ID) + require.NoError(t, err) + + provider2, err := testQueries.GetProvider(context.Background(), provider1.ID) + require.Error(t, err) + require.EqualError(t, err, sql.ErrNoRows.Error()) + require.Empty(t, provider2) +} + +func TestUpdateProvider(t *testing.T) { + provider1 := createRandomProvider(t) + require.NotEmpty(t, provider1) + + newName := util.RandomString(15) + + arg := UpdateProviderParams{ + ID: provider1.ID, + Name: sql.NullString{ + String: newName, + Valid: true, + }, + } + + provider2, err := testQueries.UpdateProvider(context.Background(), arg) + require.NoError(t, err) + require.NotEmpty(t, provider2) + + require.Equal(t, provider1.ID, provider2.ID) + require.Equal(t, provider2.Name, newName) + require.Equal(t, provider2.Description, provider1.Description) + require.NotEqual(t, provider1.Name, provider2.Name) +} + +func TestListProviders(t *testing.T) { + for i := 0; i < 10; i++ { + createRandomProvider(t) + } + + arg := ListProvidersParams{ + Limit: 5, + Offset: 5, + } + + providers, err := testQueries.ListProviders(context.Background(), arg) + require.NoError(t, err) + require.Len(t, providers, 5) + + for _, provider := range providers { + require.NotEmpty(t, provider) + } +}