Tasks 테이블에 external_provider, external_id 기반 UPSERT 로직을 추가하고 GetTaskByExternalRef 쿼리를 신설하여 중복 작업을 효율적으로 처리한다. 외부 참조 고유 인덱스 마이그레이션(00008)을 추가한다. Workspace slots 쿼리에서 alias를 명시하여 FOR UPDATE SKIP LOCKED 동시성 처리를 개선한다. Storage, workflow, workitempipeline의 중복 처리 로직을 일관되게 적용하고 Plane 웹훅 테스트를 보강한다.
300 lines
7.2 KiB
Go
300 lines
7.2 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.31.1
|
|
// source: tasks.sql
|
|
|
|
package db
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
)
|
|
|
|
const completeTask = `-- name: CompleteTask :one
|
|
UPDATE tasks
|
|
SET status = 'completed', result = $2, error = NULL, updated_at = now()
|
|
WHERE id::text = $1
|
|
RETURNING id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
`
|
|
|
|
type CompleteTaskParams struct {
|
|
ID string `json:"id"`
|
|
Result json.RawMessage `json:"result"`
|
|
}
|
|
|
|
func (q *Queries) CompleteTask(ctx context.Context, arg CompleteTaskParams) (Task, error) {
|
|
row := q.db.QueryRow(ctx, completeTask, arg.ID, arg.Result)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const createTask = `-- name: CreateTask :one
|
|
INSERT INTO tasks (title, source, payload, metadata, external_provider, external_id, external_url, external_metadata)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
ON CONFLICT (external_provider, external_id) WHERE external_provider IS NOT NULL AND external_id IS NOT NULL
|
|
DO UPDATE SET updated_at = tasks.updated_at
|
|
RETURNING id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
`
|
|
|
|
type CreateTaskParams struct {
|
|
Title string `json:"title"`
|
|
Source string `json:"source"`
|
|
Payload json.RawMessage `json:"payload"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
ExternalProvider *string `json:"external_provider"`
|
|
ExternalID *string `json:"external_id"`
|
|
ExternalUrl *string `json:"external_url"`
|
|
ExternalMetadata json.RawMessage `json:"external_metadata"`
|
|
}
|
|
|
|
func (q *Queries) CreateTask(ctx context.Context, arg CreateTaskParams) (Task, error) {
|
|
row := q.db.QueryRow(ctx, createTask,
|
|
arg.Title,
|
|
arg.Source,
|
|
arg.Payload,
|
|
arg.Metadata,
|
|
arg.ExternalProvider,
|
|
arg.ExternalID,
|
|
arg.ExternalUrl,
|
|
arg.ExternalMetadata,
|
|
)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const failTask = `-- name: FailTask :one
|
|
UPDATE tasks
|
|
SET status = 'failed', error = $2, updated_at = now()
|
|
WHERE id::text = $1
|
|
RETURNING id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
`
|
|
|
|
type FailTaskParams struct {
|
|
ID string `json:"id"`
|
|
Error *string `json:"error"`
|
|
}
|
|
|
|
func (q *Queries) FailTask(ctx context.Context, arg FailTaskParams) (Task, error) {
|
|
row := q.db.QueryRow(ctx, failTask, arg.ID, arg.Error)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getTask = `-- name: GetTask :one
|
|
SELECT id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
FROM tasks
|
|
WHERE id::text = $1
|
|
`
|
|
|
|
func (q *Queries) GetTask(ctx context.Context, id string) (Task, error) {
|
|
row := q.db.QueryRow(ctx, getTask, id)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getTaskByExternalRef = `-- name: GetTaskByExternalRef :one
|
|
SELECT id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
FROM tasks
|
|
WHERE external_provider = $1 AND external_id = $2
|
|
`
|
|
|
|
type GetTaskByExternalRefParams struct {
|
|
ExternalProvider *string `json:"external_provider"`
|
|
ExternalID *string `json:"external_id"`
|
|
}
|
|
|
|
func (q *Queries) GetTaskByExternalRef(ctx context.Context, arg GetTaskByExternalRefParams) (Task, error) {
|
|
row := q.db.QueryRow(ctx, getTaskByExternalRef, arg.ExternalProvider, arg.ExternalID)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const listTasks = `-- name: ListTasks :many
|
|
SELECT id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
FROM tasks
|
|
ORDER BY created_at DESC
|
|
LIMIT $1
|
|
`
|
|
|
|
func (q *Queries) ListTasks(ctx context.Context, limit int32) ([]Task, error) {
|
|
rows, err := q.db.Query(ctx, listTasks, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []Task
|
|
for rows.Next() {
|
|
var i Task
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const updateTaskMetadata = `-- name: UpdateTaskMetadata :one
|
|
UPDATE tasks
|
|
SET metadata = $2, updated_at = now()
|
|
WHERE id::text = $1
|
|
RETURNING id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
`
|
|
|
|
type UpdateTaskMetadataParams struct {
|
|
ID string `json:"id"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
}
|
|
|
|
func (q *Queries) UpdateTaskMetadata(ctx context.Context, arg UpdateTaskMetadataParams) (Task, error) {
|
|
row := q.db.QueryRow(ctx, updateTaskMetadata, arg.ID, arg.Metadata)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const updateTaskStatus = `-- name: UpdateTaskStatus :one
|
|
UPDATE tasks
|
|
SET status = $2, updated_at = now()
|
|
WHERE id::text = $1
|
|
RETURNING id, title, source, status, payload, result, error, created_at, updated_at, external_provider, external_id, external_url, external_metadata, metadata
|
|
`
|
|
|
|
type UpdateTaskStatusParams struct {
|
|
ID string `json:"id"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
func (q *Queries) UpdateTaskStatus(ctx context.Context, arg UpdateTaskStatusParams) (Task, error) {
|
|
row := q.db.QueryRow(ctx, updateTaskStatus, arg.ID, arg.Status)
|
|
var i Task
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Title,
|
|
&i.Source,
|
|
&i.Status,
|
|
&i.Payload,
|
|
&i.Result,
|
|
&i.Error,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ExternalProvider,
|
|
&i.ExternalID,
|
|
&i.ExternalUrl,
|
|
&i.ExternalMetadata,
|
|
&i.Metadata,
|
|
)
|
|
return i, err
|
|
}
|