Manager: convert worker tag queries to sqlc

Ref: #104305
This commit is contained in:
Sybren A. Stüvel 2024-09-18 15:48:42 +02:00
parent 35313477a0
commit 4bd6dc64b0
5 changed files with 382 additions and 95 deletions

View File

@ -179,14 +179,14 @@ func (db *DB) StoreAuthoredJob(ctx context.Context, authoredJob job_compilers.Au
} }
if authoredJob.WorkerTagUUID != "" { if authoredJob.WorkerTagUUID != "" {
dbTag, err := qtx.queries.FetchWorkerTagByUUID(ctx, authoredJob.WorkerTagUUID) workerTag, err := qtx.queries.FetchWorkerTagByUUID(ctx, authoredJob.WorkerTagUUID)
switch { switch {
case errors.Is(err, sql.ErrNoRows): case errors.Is(err, sql.ErrNoRows):
return fmt.Errorf("no worker tag %q found", authoredJob.WorkerTagUUID) return fmt.Errorf("no worker tag %q found", authoredJob.WorkerTagUUID)
case err != nil: case err != nil:
return fmt.Errorf("could not find worker tag %q: %w", authoredJob.WorkerTagUUID, err) return fmt.Errorf("could not find worker tag %q: %w", authoredJob.WorkerTagUUID, err)
} }
params.WorkerTagID = sql.NullInt64{Int64: dbTag.WorkerTag.ID, Valid: true} params.WorkerTagID = sql.NullInt64{Int64: workerTag.ID, Valid: true}
} }
log.Debug(). log.Debug().
@ -358,7 +358,7 @@ func (db *DB) FetchJob(ctx context.Context, jobUUID string) (*Job, error) {
} }
if sqlcJob.WorkerTagID.Valid { if sqlcJob.WorkerTagID.Valid {
workerTag, err := fetchWorkerTagByID(db.gormDB, uint(sqlcJob.WorkerTagID.Int64)) workerTag, err := fetchWorkerTagByID(ctx, queries, sqlcJob.WorkerTagID.Int64)
switch { switch {
case errors.Is(err, sql.ErrNoRows): case errors.Is(err, sql.ErrNoRows):
return nil, ErrWorkerTagNotFound return nil, ErrWorkerTagNotFound
@ -387,7 +387,7 @@ func (db *DB) FetchJobs(ctx context.Context) ([]*Job, error) {
} }
if sqlcJob.WorkerTagID.Valid { if sqlcJob.WorkerTagID.Valid {
workerTag, err := fetchWorkerTagByID(db.gormDB, uint(sqlcJob.WorkerTagID.Int64)) workerTag, err := fetchWorkerTagByID(ctx, queries, sqlcJob.WorkerTagID.Int64)
switch { switch {
case errors.Is(err, sql.ErrNoRows): case errors.Is(err, sql.ErrNoRows):
return nil, ErrWorkerTagNotFound return nil, ErrWorkerTagNotFound

View File

@ -33,10 +33,15 @@ INSERT INTO workers (
) )
RETURNING id; RETURNING id;
-- name: AddWorkerTagMembership :exec -- name: WorkerAddTagMembership :exec
INSERT INTO worker_tag_membership (worker_tag_id, worker_id) INSERT INTO worker_tag_membership (worker_tag_id, worker_id)
VALUES (@worker_tag_id, @worker_id); VALUES (@worker_tag_id, @worker_id);
-- name: WorkerRemoveTagMemberships :exec
DELETE
FROM worker_tag_membership
WHERE worker_id=@worker_id;
-- name: FetchWorkers :many -- name: FetchWorkers :many
SELECT sqlc.embed(workers) FROM workers SELECT sqlc.embed(workers) FROM workers
WHERE deleted_at IS NULL; WHERE deleted_at IS NULL;
@ -53,18 +58,61 @@ SELECT * FROM workers WHERE workers.uuid = @uuid;
-- FetchWorkerUnconditional ignores soft-deletion status and just returns the worker. -- FetchWorkerUnconditional ignores soft-deletion status and just returns the worker.
SELECT * FROM workers WHERE workers.id = @worker_id; SELECT * FROM workers WHERE workers.id = @worker_id;
-- name: FetchWorkerTags :many -- name: FetchTagsOfWorker :many
SELECT worker_tags.* SELECT worker_tags.*
FROM worker_tags FROM worker_tags
LEFT JOIN worker_tag_membership m ON (m.worker_tag_id = worker_tags.id) LEFT JOIN worker_tag_membership m ON (m.worker_tag_id = worker_tags.id)
LEFT JOIN workers on (m.worker_id = workers.id) LEFT JOIN workers on (m.worker_id = workers.id)
WHERE workers.uuid = @uuid; WHERE workers.uuid = @uuid;
-- name: FetchWorkerTags :many
SELECT *
FROM worker_tags;
-- name: FetchWorkerTagByUUID :one -- name: FetchWorkerTagByUUID :one
SELECT sqlc.embed(worker_tags) SELECT *
FROM worker_tags FROM worker_tags
WHERE worker_tags.uuid = @uuid; WHERE worker_tags.uuid = @uuid;
-- name: FetchWorkerTagsByUUIDs :many
SELECT *
FROM worker_tags
WHERE uuid in (sqlc.slice('uuids'));
-- name: FetchWorkerTagByID :one
SELECT *
FROM worker_tags
WHERE id=@worker_tag_id;
-- name: SaveWorkerTag :exec
UPDATE worker_tags
SET
updated_at=@updated_at,
uuid=@uuid,
name=@name,
description=@description
WHERE id=@worker_tag_id;
-- name: DeleteWorkerTag :execrows
DELETE FROM worker_tags
WHERE uuid=@uuid;
-- name: CreateWorkerTag :execlastid
INSERT INTO worker_tags (
created_at,
uuid,
name,
description
) VALUES (
@created_at,
@uuid,
@name,
@description
);
-- name: CountWorkerTags :one
SELECT count(id) as count FROM worker_tags;
-- name: SoftDeleteWorker :execrows -- name: SoftDeleteWorker :execrows
UPDATE workers SET deleted_at=@deleted_at UPDATE workers SET deleted_at=@deleted_at
WHERE uuid=@uuid; WHERE uuid=@uuid;

View File

@ -8,22 +8,19 @@ package sqlc
import ( import (
"context" "context"
"database/sql" "database/sql"
"strings"
"time" "time"
) )
const addWorkerTagMembership = `-- name: AddWorkerTagMembership :exec const countWorkerTags = `-- name: CountWorkerTags :one
INSERT INTO worker_tag_membership (worker_tag_id, worker_id) SELECT count(id) as count FROM worker_tags
VALUES (?1, ?2)
` `
type AddWorkerTagMembershipParams struct { func (q *Queries) CountWorkerTags(ctx context.Context) (int64, error) {
WorkerTagID int64 row := q.db.QueryRowContext(ctx, countWorkerTags)
WorkerID int64 var count int64
} err := row.Scan(&count)
return count, err
func (q *Queries) AddWorkerTagMembership(ctx context.Context, arg AddWorkerTagMembershipParams) error {
_, err := q.db.ExecContext(ctx, addWorkerTagMembership, arg.WorkerTagID, arg.WorkerID)
return err
} }
const createWorker = `-- name: CreateWorker :one const createWorker = `-- name: CreateWorker :one
@ -100,6 +97,91 @@ func (q *Queries) CreateWorker(ctx context.Context, arg CreateWorkerParams) (int
return id, err return id, err
} }
const createWorkerTag = `-- name: CreateWorkerTag :execlastid
INSERT INTO worker_tags (
created_at,
uuid,
name,
description
) VALUES (
?1,
?2,
?3,
?4
)
`
type CreateWorkerTagParams struct {
CreatedAt time.Time
UUID string
Name string
Description string
}
func (q *Queries) CreateWorkerTag(ctx context.Context, arg CreateWorkerTagParams) (int64, error) {
result, err := q.db.ExecContext(ctx, createWorkerTag,
arg.CreatedAt,
arg.UUID,
arg.Name,
arg.Description,
)
if err != nil {
return 0, err
}
return result.LastInsertId()
}
const deleteWorkerTag = `-- name: DeleteWorkerTag :execrows
DELETE FROM worker_tags
WHERE uuid=?1
`
func (q *Queries) DeleteWorkerTag(ctx context.Context, uuid string) (int64, error) {
result, err := q.db.ExecContext(ctx, deleteWorkerTag, uuid)
if err != nil {
return 0, err
}
return result.RowsAffected()
}
const fetchTagsOfWorker = `-- name: FetchTagsOfWorker :many
SELECT worker_tags.id, worker_tags.created_at, worker_tags.updated_at, worker_tags.uuid, worker_tags.name, worker_tags.description
FROM worker_tags
LEFT JOIN worker_tag_membership m ON (m.worker_tag_id = worker_tags.id)
LEFT JOIN workers on (m.worker_id = workers.id)
WHERE workers.uuid = ?1
`
func (q *Queries) FetchTagsOfWorker(ctx context.Context, uuid string) ([]WorkerTag, error) {
rows, err := q.db.QueryContext(ctx, fetchTagsOfWorker, uuid)
if err != nil {
return nil, err
}
defer rows.Close()
var items []WorkerTag
for rows.Next() {
var i WorkerTag
if err := rows.Scan(
&i.ID,
&i.CreatedAt,
&i.UpdatedAt,
&i.UUID,
&i.Name,
&i.Description,
); 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 fetchWorker = `-- name: FetchWorker :one const fetchWorker = `-- name: FetchWorker :one
SELECT id, created_at, updated_at, uuid, secret, name, address, platform, software, status, last_seen_at, status_requested, lazy_status_request, supported_task_types, deleted_at, can_restart FROM workers WHERE workers.uuid = ?1 and deleted_at is NULL SELECT id, created_at, updated_at, uuid, secret, name, address, platform, software, status, last_seen_at, status_requested, lazy_status_request, supported_task_types, deleted_at, can_restart FROM workers WHERE workers.uuid = ?1 and deleted_at is NULL
` `
@ -129,40 +211,99 @@ func (q *Queries) FetchWorker(ctx context.Context, uuid string) (Worker, error)
return i, err return i, err
} }
const fetchWorkerTagByID = `-- name: FetchWorkerTagByID :one
SELECT id, created_at, updated_at, uuid, name, description
FROM worker_tags
WHERE id=?1
`
func (q *Queries) FetchWorkerTagByID(ctx context.Context, workerTagID int64) (WorkerTag, error) {
row := q.db.QueryRowContext(ctx, fetchWorkerTagByID, workerTagID)
var i WorkerTag
err := row.Scan(
&i.ID,
&i.CreatedAt,
&i.UpdatedAt,
&i.UUID,
&i.Name,
&i.Description,
)
return i, err
}
const fetchWorkerTagByUUID = `-- name: FetchWorkerTagByUUID :one const fetchWorkerTagByUUID = `-- name: FetchWorkerTagByUUID :one
SELECT worker_tags.id, worker_tags.created_at, worker_tags.updated_at, worker_tags.uuid, worker_tags.name, worker_tags.description SELECT id, created_at, updated_at, uuid, name, description
FROM worker_tags FROM worker_tags
WHERE worker_tags.uuid = ?1 WHERE worker_tags.uuid = ?1
` `
type FetchWorkerTagByUUIDRow struct { func (q *Queries) FetchWorkerTagByUUID(ctx context.Context, uuid string) (WorkerTag, error) {
WorkerTag WorkerTag
}
func (q *Queries) FetchWorkerTagByUUID(ctx context.Context, uuid string) (FetchWorkerTagByUUIDRow, error) {
row := q.db.QueryRowContext(ctx, fetchWorkerTagByUUID, uuid) row := q.db.QueryRowContext(ctx, fetchWorkerTagByUUID, uuid)
var i FetchWorkerTagByUUIDRow var i WorkerTag
err := row.Scan( err := row.Scan(
&i.WorkerTag.ID, &i.ID,
&i.WorkerTag.CreatedAt, &i.CreatedAt,
&i.WorkerTag.UpdatedAt, &i.UpdatedAt,
&i.WorkerTag.UUID, &i.UUID,
&i.WorkerTag.Name, &i.Name,
&i.WorkerTag.Description, &i.Description,
) )
return i, err return i, err
} }
const fetchWorkerTags = `-- name: FetchWorkerTags :many const fetchWorkerTags = `-- name: FetchWorkerTags :many
SELECT worker_tags.id, worker_tags.created_at, worker_tags.updated_at, worker_tags.uuid, worker_tags.name, worker_tags.description SELECT id, created_at, updated_at, uuid, name, description
FROM worker_tags FROM worker_tags
LEFT JOIN worker_tag_membership m ON (m.worker_tag_id = worker_tags.id)
LEFT JOIN workers on (m.worker_id = workers.id)
WHERE workers.uuid = ?1
` `
func (q *Queries) FetchWorkerTags(ctx context.Context, uuid string) ([]WorkerTag, error) { func (q *Queries) FetchWorkerTags(ctx context.Context) ([]WorkerTag, error) {
rows, err := q.db.QueryContext(ctx, fetchWorkerTags, uuid) rows, err := q.db.QueryContext(ctx, fetchWorkerTags)
if err != nil {
return nil, err
}
defer rows.Close()
var items []WorkerTag
for rows.Next() {
var i WorkerTag
if err := rows.Scan(
&i.ID,
&i.CreatedAt,
&i.UpdatedAt,
&i.UUID,
&i.Name,
&i.Description,
); 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 fetchWorkerTagsByUUIDs = `-- name: FetchWorkerTagsByUUIDs :many
SELECT id, created_at, updated_at, uuid, name, description
FROM worker_tags
WHERE uuid in (/*SLICE:uuids*/?)
`
func (q *Queries) FetchWorkerTagsByUUIDs(ctx context.Context, uuids []string) ([]WorkerTag, error) {
query := fetchWorkerTagsByUUIDs
var queryParams []interface{}
if len(uuids) > 0 {
for _, v := range uuids {
queryParams = append(queryParams, v)
}
query = strings.Replace(query, "/*SLICE:uuids*/?", strings.Repeat(",?", len(uuids))[1:], 1)
} else {
query = strings.Replace(query, "/*SLICE:uuids*/?", "NULL", 1)
}
rows, err := q.db.QueryContext(ctx, query, queryParams...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -381,6 +522,35 @@ func (q *Queries) SaveWorkerStatus(ctx context.Context, arg SaveWorkerStatusPara
return err return err
} }
const saveWorkerTag = `-- name: SaveWorkerTag :exec
UPDATE worker_tags
SET
updated_at=?1,
uuid=?2,
name=?3,
description=?4
WHERE id=?5
`
type SaveWorkerTagParams struct {
UpdatedAt sql.NullTime
UUID string
Name string
Description string
WorkerTagID int64
}
func (q *Queries) SaveWorkerTag(ctx context.Context, arg SaveWorkerTagParams) error {
_, err := q.db.ExecContext(ctx, saveWorkerTag,
arg.UpdatedAt,
arg.UUID,
arg.Name,
arg.Description,
arg.WorkerTagID,
)
return err
}
const softDeleteWorker = `-- name: SoftDeleteWorker :execrows const softDeleteWorker = `-- name: SoftDeleteWorker :execrows
UPDATE workers SET deleted_at=?1 UPDATE workers SET deleted_at=?1
WHERE uuid=?2 WHERE uuid=?2
@ -433,6 +603,32 @@ func (q *Queries) SummarizeWorkerStatuses(ctx context.Context) ([]SummarizeWorke
return items, nil return items, nil
} }
const workerAddTagMembership = `-- name: WorkerAddTagMembership :exec
INSERT INTO worker_tag_membership (worker_tag_id, worker_id)
VALUES (?1, ?2)
`
type WorkerAddTagMembershipParams struct {
WorkerTagID int64
WorkerID int64
}
func (q *Queries) WorkerAddTagMembership(ctx context.Context, arg WorkerAddTagMembershipParams) error {
_, err := q.db.ExecContext(ctx, workerAddTagMembership, arg.WorkerTagID, arg.WorkerID)
return err
}
const workerRemoveTagMemberships = `-- name: WorkerRemoveTagMemberships :exec
DELETE
FROM worker_tag_membership
WHERE worker_id=?1
`
func (q *Queries) WorkerRemoveTagMemberships(ctx context.Context, workerID int64) error {
_, err := q.db.ExecContext(ctx, workerRemoveTagMemberships, workerID)
return err
}
const workerSeen = `-- name: WorkerSeen :exec const workerSeen = `-- name: WorkerSeen :exec
UPDATE workers SET UPDATE workers SET
updated_at=?1, updated_at=?1,

View File

@ -6,7 +6,7 @@ import (
"context" "context"
"fmt" "fmt"
"gorm.io/gorm" "projects.blender.org/studio/flamenco/internal/manager/persistence/sqlc"
) )
type WorkerTag struct { type WorkerTag struct {
@ -20,51 +20,69 @@ type WorkerTag struct {
} }
func (db *DB) CreateWorkerTag(ctx context.Context, wc *WorkerTag) error { func (db *DB) CreateWorkerTag(ctx context.Context, wc *WorkerTag) error {
if err := db.gormDB.WithContext(ctx).Create(wc).Error; err != nil { queries := db.queries()
now := db.gormDB.NowFunc()
dbID, err := queries.CreateWorkerTag(ctx, sqlc.CreateWorkerTagParams{
CreatedAt: now,
UUID: wc.UUID,
Name: wc.Name,
Description: wc.Description,
})
if err != nil {
return fmt.Errorf("creating new worker tag: %w", err) return fmt.Errorf("creating new worker tag: %w", err)
} }
wc.ID = uint(dbID)
wc.CreatedAt = now
return nil return nil
} }
// HasWorkerTags returns whether there are any tags defined at all. // HasWorkerTags returns whether there are any tags defined at all.
func (db *DB) HasWorkerTags(ctx context.Context) (bool, error) { func (db *DB) HasWorkerTags(ctx context.Context) (bool, error) {
var count int64 queries := db.queries()
tx := db.gormDB.WithContext(ctx).
Model(&WorkerTag{}). count, err := queries.CountWorkerTags(ctx)
Count(&count) if err != nil {
if err := tx.Error; err != nil {
return false, workerTagError(err, "counting worker tags") return false, workerTagError(err, "counting worker tags")
} }
return count > 0, nil return count > 0, nil
} }
func (db *DB) FetchWorkerTag(ctx context.Context, uuid string) (*WorkerTag, error) { func (db *DB) FetchWorkerTag(ctx context.Context, uuid string) (*WorkerTag, error) {
tx := db.gormDB.WithContext(ctx) queries := db.queries()
return fetchWorkerTag(tx, uuid)
workerTag, err := queries.FetchWorkerTagByUUID(ctx, uuid)
if err != nil {
return nil, workerTagError(err, "fetching worker tag")
} }
// fetchWorkerTag fetches the worker tag using the given database instance. return convertSqlcWorkerTag(workerTag), nil
func fetchWorkerTag(gormDB *gorm.DB, uuid string) (*WorkerTag, error) {
w := WorkerTag{}
tx := gormDB.First(&w, "uuid = ?", uuid)
if tx.Error != nil {
return nil, workerTagError(tx.Error, "fetching worker tag")
}
return &w, nil
} }
// fetchWorkerTagByID fetches the worker tag using the given database instance. // fetchWorkerTagByID fetches the worker tag using the given database instance.
func fetchWorkerTagByID(gormDB *gorm.DB, id uint) (*WorkerTag, error) { func fetchWorkerTagByID(ctx context.Context, queries *sqlc.Queries, id int64) (*WorkerTag, error) {
w := WorkerTag{} workerTag, err := queries.FetchWorkerTagByID(ctx, id)
tx := gormDB.First(&w, "id = ?", id) if err != nil {
if tx.Error != nil { return nil, workerTagError(err, "fetching worker tag")
return nil, workerTagError(tx.Error, "fetching worker tag")
} }
return &w, nil
return convertSqlcWorkerTag(workerTag), nil
} }
func (db *DB) SaveWorkerTag(ctx context.Context, tag *WorkerTag) error { func (db *DB) SaveWorkerTag(ctx context.Context, tag *WorkerTag) error {
if err := db.gormDB.WithContext(ctx).Save(tag).Error; err != nil { queries := db.queries()
err := queries.SaveWorkerTag(ctx, sqlc.SaveWorkerTagParams{
UpdatedAt: db.now(),
UUID: tag.UUID,
Name: tag.Name,
Description: tag.Description,
WorkerTagID: int64(tag.ID),
})
if err != nil {
return workerTagError(err, "saving worker tag") return workerTagError(err, "saving worker tag")
} }
return nil return nil
@ -81,51 +99,77 @@ func (db *DB) DeleteWorkerTag(ctx context.Context, uuid string) error {
return ErrDeletingWithoutFK return ErrDeletingWithoutFK
} }
tx := db.gormDB.WithContext(ctx). queries := db.queries()
Where("uuid = ?", uuid).
Delete(&WorkerTag{}) rowsUpdated, err := queries.DeleteWorkerTag(ctx, uuid)
if tx.Error != nil { switch {
return workerTagError(tx.Error, "deleting worker tag") case err != nil:
} return workerTagError(err, "deleting worker tag")
if tx.RowsAffected == 0 { case rowsUpdated == 0:
return ErrWorkerTagNotFound return ErrWorkerTagNotFound
} }
return nil return nil
} }
func (db *DB) FetchWorkerTags(ctx context.Context) ([]*WorkerTag, error) { func (db *DB) FetchWorkerTags(ctx context.Context) ([]*WorkerTag, error) {
tags := make([]*WorkerTag, 0) queries := db.queries()
tx := db.gormDB.WithContext(ctx).Model(&WorkerTag{}).Scan(&tags)
if tx.Error != nil { tags, err := queries.FetchWorkerTags(ctx)
return nil, workerTagError(tx.Error, "fetching all worker tags") if err != nil {
} return nil, workerTagError(err, "fetching all worker tags")
return tags, nil
} }
func (db *DB) fetchWorkerTagsWithUUID(ctx context.Context, tagUUIDs []string) ([]*WorkerTag, error) { gormTags := make([]*WorkerTag, len(tags))
tags := make([]*WorkerTag, 0) for index, tag := range tags {
tx := db.gormDB.WithContext(ctx). gormTags[index] = convertSqlcWorkerTag(tag)
Model(&WorkerTag{}).
Where("uuid in ?", tagUUIDs).
Scan(&tags)
if tx.Error != nil {
return nil, workerTagError(tx.Error, "fetching all worker tags")
} }
return tags, nil return gormTags, nil
}
func (db *DB) fetchWorkerTagsWithUUID(
ctx context.Context,
queries *sqlc.Queries,
tagUUIDs []string,
) ([]*WorkerTag, error) {
tags, err := queries.FetchWorkerTagsByUUIDs(ctx, tagUUIDs)
if err != nil {
return nil, workerTagError(err, "fetching all worker tags")
}
gormTags := make([]*WorkerTag, len(tags))
for index, tag := range tags {
gormTags[index] = convertSqlcWorkerTag(tag)
}
return gormTags, nil
} }
func (db *DB) WorkerSetTags(ctx context.Context, worker *Worker, tagUUIDs []string) error { func (db *DB) WorkerSetTags(ctx context.Context, worker *Worker, tagUUIDs []string) error {
tags, err := db.fetchWorkerTagsWithUUID(ctx, tagUUIDs) qtx, err := db.queriesWithTX()
if err != nil {
return err
}
defer qtx.rollback()
tags, err := db.fetchWorkerTagsWithUUID(ctx, qtx.queries, tagUUIDs)
if err != nil { if err != nil {
return workerTagError(err, "fetching worker tags") return workerTagError(err, "fetching worker tags")
} }
err = db.gormDB.WithContext(ctx). err = qtx.queries.WorkerRemoveTagMemberships(ctx, int64(worker.ID))
Model(worker).
Association("Tags").
Replace(tags)
if err != nil { if err != nil {
return workerTagError(err, "updating worker tags") return workerTagError(err, "un-assigning existing worker tags")
} }
return nil
for _, tag := range tags {
err = qtx.queries.WorkerAddTagMembership(ctx, sqlc.WorkerAddTagMembershipParams{
WorkerID: int64(worker.ID),
WorkerTagID: int64(tag.ID),
})
if err != nil {
return workerTagError(err, "assigning worker tags")
}
}
return qtx.commit()
} }

View File

@ -101,7 +101,7 @@ func (db *DB) CreateWorker(ctx context.Context, w *Worker) error {
// TODO: remove the create-with-tags functionality to a higher-level function. // TODO: remove the create-with-tags functionality to a higher-level function.
// This code is just here to make this function work like the GORM code did. // This code is just here to make this function work like the GORM code did.
for _, tag := range w.Tags { for _, tag := range w.Tags {
err := queries.AddWorkerTagMembership(ctx, sqlc.AddWorkerTagMembershipParams{ err := queries.WorkerAddTagMembership(ctx, sqlc.WorkerAddTagMembershipParams{
WorkerTagID: int64(tag.ID), WorkerTagID: int64(tag.ID),
WorkerID: workerID, WorkerID: workerID,
}) })
@ -122,7 +122,7 @@ func (db *DB) FetchWorker(ctx context.Context, uuid string) (*Worker, error) {
} }
// TODO: remove this code, and let the caller fetch the tags when interested in them. // TODO: remove this code, and let the caller fetch the tags when interested in them.
workerTags, err := queries.FetchWorkerTags(ctx, uuid) workerTags, err := queries.FetchTagsOfWorker(ctx, uuid)
if err != nil { if err != nil {
return nil, workerTagError(err, "fetching tags of worker %s", uuid) return nil, workerTagError(err, "fetching tags of worker %s", uuid)
} }
@ -130,8 +130,7 @@ func (db *DB) FetchWorker(ctx context.Context, uuid string) (*Worker, error) {
convertedWorker := convertSqlcWorker(worker) convertedWorker := convertSqlcWorker(worker)
convertedWorker.Tags = make([]*WorkerTag, len(workerTags)) convertedWorker.Tags = make([]*WorkerTag, len(workerTags))
for index := range workerTags { for index := range workerTags {
convertedTag := convertSqlcWorkerTag(workerTags[index]) convertedWorker.Tags[index] = convertSqlcWorkerTag(workerTags[index])
convertedWorker.Tags[index] = &convertedTag
} }
return &convertedWorker, nil return &convertedWorker, nil
@ -338,8 +337,8 @@ func convertSqlcWorker(worker sqlc.Worker) Worker {
// the model expected by the rest of the code. This is mostly in place to aid in // the model expected by the rest of the code. This is mostly in place to aid in
// the GORM to SQLC migration. It is intended that eventually the rest of the // the GORM to SQLC migration. It is intended that eventually the rest of the
// code will use the same SQLC-generated model. // code will use the same SQLC-generated model.
func convertSqlcWorkerTag(tag sqlc.WorkerTag) WorkerTag { func convertSqlcWorkerTag(tag sqlc.WorkerTag) *WorkerTag {
return WorkerTag{ return &WorkerTag{
Model: Model{ Model: Model{
ID: uint(tag.ID), ID: uint(tag.ID),
CreatedAt: tag.CreatedAt, CreatedAt: tag.CreatedAt,