mirror of
https://github.com/Dvorinka/Primora.git
synced 2026-10-28 07:41:23 +00:00
Migration 00016: function_id on scheduled_jobs/inbound_hooks, event_pattern on functions, 'event' in the run-trigger enum. - Jobs deliver to a function instead of HTTP when function_id is set; the run's status_code mirrors the process exit code. Clearing the field returns the job to URL delivery. - Inbound hooks gain mode "function" — received body becomes stdin payload, acked immediately, run recorded async. - event_pattern (document.*, *, exact type) fires the function detached on matching publishEvent — never blocks realtime/webhook fan-out. - One executeFunction path serves manual/schedule/hook/event; run rows record the trigger source. - Backend image now ships bun 1.3.14 so Functions work under compose. Dashboard: job target picker, hook function mode, event-pattern field. Verified live: job run → success (status_code 0), hook POST → run, document.created → event run with correct payload. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
456 lines
11 KiB
Go
456 lines
11 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.29.0
|
|
// source: jobs.sql
|
|
|
|
package db
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const createScheduledJob = `-- name: CreateScheduledJob :one
|
|
INSERT INTO core.scheduled_jobs (
|
|
project_id,
|
|
name,
|
|
schedule,
|
|
url,
|
|
secret,
|
|
payload,
|
|
enabled,
|
|
next_run_at,
|
|
created_by_user_id,
|
|
function_id
|
|
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
|
|
RETURNING id, project_id, name, schedule, url, secret, payload, enabled, last_run_at, last_status, next_run_at, created_by_user_id, created_at, updated_at, function_id
|
|
`
|
|
|
|
type CreateScheduledJobParams struct {
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
Name string `json:"name"`
|
|
Schedule string `json:"schedule"`
|
|
Url string `json:"url"`
|
|
Secret []byte `json:"secret"`
|
|
Payload []byte `json:"payload"`
|
|
Enabled bool `json:"enabled"`
|
|
NextRunAt pgtype.Timestamptz `json:"next_run_at"`
|
|
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
|
|
FunctionID pgtype.UUID `json:"function_id"`
|
|
}
|
|
|
|
func (q *Queries) CreateScheduledJob(ctx context.Context, arg CreateScheduledJobParams) (CoreScheduledJob, error) {
|
|
row := q.db.QueryRow(ctx, createScheduledJob,
|
|
arg.ProjectID,
|
|
arg.Name,
|
|
arg.Schedule,
|
|
arg.Url,
|
|
arg.Secret,
|
|
arg.Payload,
|
|
arg.Enabled,
|
|
arg.NextRunAt,
|
|
arg.CreatedByUserID,
|
|
arg.FunctionID,
|
|
)
|
|
var i CoreScheduledJob
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.ProjectID,
|
|
&i.Name,
|
|
&i.Schedule,
|
|
&i.Url,
|
|
&i.Secret,
|
|
&i.Payload,
|
|
&i.Enabled,
|
|
&i.LastRunAt,
|
|
&i.LastStatus,
|
|
&i.NextRunAt,
|
|
&i.CreatedByUserID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.FunctionID,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const deleteScheduledJob = `-- name: DeleteScheduledJob :one
|
|
DELETE FROM core.scheduled_jobs
|
|
WHERE id = $1
|
|
AND project_id = $2
|
|
RETURNING id
|
|
`
|
|
|
|
type DeleteScheduledJobParams struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
}
|
|
|
|
func (q *Queries) DeleteScheduledJob(ctx context.Context, arg DeleteScheduledJobParams) (uuid.UUID, error) {
|
|
row := q.db.QueryRow(ctx, deleteScheduledJob, arg.ID, arg.ProjectID)
|
|
var id uuid.UUID
|
|
err := row.Scan(&id)
|
|
return id, err
|
|
}
|
|
|
|
const finishScheduledJobRun = `-- name: FinishScheduledJobRun :one
|
|
UPDATE core.scheduled_job_runs
|
|
SET status = $2,
|
|
status_code = $3,
|
|
error = $4,
|
|
duration_ms = $5,
|
|
finished_at = NOW()
|
|
WHERE id = $1
|
|
RETURNING id, job_id, status, triggered_by, status_code, error, duration_ms, created_at, finished_at
|
|
`
|
|
|
|
type FinishScheduledJobRunParams struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Status string `json:"status"`
|
|
StatusCode *int32 `json:"status_code"`
|
|
Error string `json:"error"`
|
|
DurationMs *int32 `json:"duration_ms"`
|
|
}
|
|
|
|
func (q *Queries) FinishScheduledJobRun(ctx context.Context, arg FinishScheduledJobRunParams) (CoreScheduledJobRun, error) {
|
|
row := q.db.QueryRow(ctx, finishScheduledJobRun,
|
|
arg.ID,
|
|
arg.Status,
|
|
arg.StatusCode,
|
|
arg.Error,
|
|
arg.DurationMs,
|
|
)
|
|
var i CoreScheduledJobRun
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.JobID,
|
|
&i.Status,
|
|
&i.TriggeredBy,
|
|
&i.StatusCode,
|
|
&i.Error,
|
|
&i.DurationMs,
|
|
&i.CreatedAt,
|
|
&i.FinishedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getScheduledJobByID = `-- name: GetScheduledJobByID :one
|
|
SELECT id, project_id, name, schedule, url, secret, payload, enabled, last_run_at, last_status, next_run_at, created_by_user_id, created_at, updated_at, function_id FROM core.scheduled_jobs
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) GetScheduledJobByID(ctx context.Context, id uuid.UUID) (CoreScheduledJob, error) {
|
|
row := q.db.QueryRow(ctx, getScheduledJobByID, id)
|
|
var i CoreScheduledJob
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.ProjectID,
|
|
&i.Name,
|
|
&i.Schedule,
|
|
&i.Url,
|
|
&i.Secret,
|
|
&i.Payload,
|
|
&i.Enabled,
|
|
&i.LastRunAt,
|
|
&i.LastStatus,
|
|
&i.NextRunAt,
|
|
&i.CreatedByUserID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.FunctionID,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const insertScheduledJobRun = `-- name: InsertScheduledJobRun :one
|
|
INSERT INTO core.scheduled_job_runs (job_id, triggered_by)
|
|
VALUES ($1, $2)
|
|
RETURNING id, job_id, status, triggered_by, status_code, error, duration_ms, created_at, finished_at
|
|
`
|
|
|
|
type InsertScheduledJobRunParams struct {
|
|
JobID uuid.UUID `json:"job_id"`
|
|
TriggeredBy string `json:"triggered_by"`
|
|
}
|
|
|
|
func (q *Queries) InsertScheduledJobRun(ctx context.Context, arg InsertScheduledJobRunParams) (CoreScheduledJobRun, error) {
|
|
row := q.db.QueryRow(ctx, insertScheduledJobRun, arg.JobID, arg.TriggeredBy)
|
|
var i CoreScheduledJobRun
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.JobID,
|
|
&i.Status,
|
|
&i.TriggeredBy,
|
|
&i.StatusCode,
|
|
&i.Error,
|
|
&i.DurationMs,
|
|
&i.CreatedAt,
|
|
&i.FinishedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const listDueScheduledJobs = `-- name: ListDueScheduledJobs :many
|
|
SELECT id, project_id, name, schedule, url, secret, payload, enabled, last_run_at, last_status, next_run_at, created_by_user_id, created_at, updated_at, function_id FROM core.scheduled_jobs
|
|
WHERE enabled
|
|
AND next_run_at IS NOT NULL
|
|
AND next_run_at <= $1
|
|
`
|
|
|
|
func (q *Queries) ListDueScheduledJobs(ctx context.Context, nextRunAt pgtype.Timestamptz) ([]CoreScheduledJob, error) {
|
|
rows, err := q.db.Query(ctx, listDueScheduledJobs, nextRunAt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []CoreScheduledJob
|
|
for rows.Next() {
|
|
var i CoreScheduledJob
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.ProjectID,
|
|
&i.Name,
|
|
&i.Schedule,
|
|
&i.Url,
|
|
&i.Secret,
|
|
&i.Payload,
|
|
&i.Enabled,
|
|
&i.LastRunAt,
|
|
&i.LastStatus,
|
|
&i.NextRunAt,
|
|
&i.CreatedByUserID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.FunctionID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listScheduledJobRuns = `-- name: ListScheduledJobRuns :many
|
|
SELECT id, job_id, status, triggered_by, status_code, error, duration_ms, created_at, finished_at FROM core.scheduled_job_runs
|
|
WHERE job_id = $1
|
|
ORDER BY created_at DESC
|
|
LIMIT $2
|
|
`
|
|
|
|
type ListScheduledJobRunsParams struct {
|
|
JobID uuid.UUID `json:"job_id"`
|
|
Limit int32 `json:"limit"`
|
|
}
|
|
|
|
func (q *Queries) ListScheduledJobRuns(ctx context.Context, arg ListScheduledJobRunsParams) ([]CoreScheduledJobRun, error) {
|
|
rows, err := q.db.Query(ctx, listScheduledJobRuns, arg.JobID, arg.Limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []CoreScheduledJobRun
|
|
for rows.Next() {
|
|
var i CoreScheduledJobRun
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.JobID,
|
|
&i.Status,
|
|
&i.TriggeredBy,
|
|
&i.StatusCode,
|
|
&i.Error,
|
|
&i.DurationMs,
|
|
&i.CreatedAt,
|
|
&i.FinishedAt,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listScheduledJobs = `-- name: ListScheduledJobs :many
|
|
SELECT id, project_id, name, schedule, url, secret, payload, enabled, last_run_at, last_status, next_run_at, created_by_user_id, created_at, updated_at, function_id FROM core.scheduled_jobs
|
|
WHERE project_id = $1
|
|
ORDER BY created_at ASC
|
|
`
|
|
|
|
func (q *Queries) ListScheduledJobs(ctx context.Context, projectID uuid.UUID) ([]CoreScheduledJob, error) {
|
|
rows, err := q.db.Query(ctx, listScheduledJobs, projectID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []CoreScheduledJob
|
|
for rows.Next() {
|
|
var i CoreScheduledJob
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.ProjectID,
|
|
&i.Name,
|
|
&i.Schedule,
|
|
&i.Url,
|
|
&i.Secret,
|
|
&i.Payload,
|
|
&i.Enabled,
|
|
&i.LastRunAt,
|
|
&i.LastStatus,
|
|
&i.NextRunAt,
|
|
&i.CreatedByUserID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.FunctionID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const markScheduledJobRan = `-- name: MarkScheduledJobRan :one
|
|
UPDATE core.scheduled_jobs
|
|
SET last_run_at = $2,
|
|
last_status = $3,
|
|
next_run_at = $4,
|
|
updated_at = NOW()
|
|
WHERE id = $1
|
|
RETURNING id, project_id, name, schedule, url, secret, payload, enabled, last_run_at, last_status, next_run_at, created_by_user_id, created_at, updated_at, function_id
|
|
`
|
|
|
|
type MarkScheduledJobRanParams struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LastRunAt pgtype.Timestamptz `json:"last_run_at"`
|
|
LastStatus string `json:"last_status"`
|
|
NextRunAt pgtype.Timestamptz `json:"next_run_at"`
|
|
}
|
|
|
|
func (q *Queries) MarkScheduledJobRan(ctx context.Context, arg MarkScheduledJobRanParams) (CoreScheduledJob, error) {
|
|
row := q.db.QueryRow(ctx, markScheduledJobRan,
|
|
arg.ID,
|
|
arg.LastRunAt,
|
|
arg.LastStatus,
|
|
arg.NextRunAt,
|
|
)
|
|
var i CoreScheduledJob
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.ProjectID,
|
|
&i.Name,
|
|
&i.Schedule,
|
|
&i.Url,
|
|
&i.Secret,
|
|
&i.Payload,
|
|
&i.Enabled,
|
|
&i.LastRunAt,
|
|
&i.LastStatus,
|
|
&i.NextRunAt,
|
|
&i.CreatedByUserID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.FunctionID,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const pruneScheduledJobRuns = `-- name: PruneScheduledJobRuns :exec
|
|
DELETE FROM core.scheduled_job_runs r
|
|
WHERE r.job_id = $1
|
|
AND r.id NOT IN (
|
|
SELECT k.id FROM core.scheduled_job_runs k
|
|
WHERE k.job_id = $1
|
|
ORDER BY k.created_at DESC
|
|
LIMIT $2
|
|
)
|
|
`
|
|
|
|
type PruneScheduledJobRunsParams struct {
|
|
JobID uuid.UUID `json:"job_id"`
|
|
Limit int32 `json:"limit"`
|
|
}
|
|
|
|
func (q *Queries) PruneScheduledJobRuns(ctx context.Context, arg PruneScheduledJobRunsParams) error {
|
|
_, err := q.db.Exec(ctx, pruneScheduledJobRuns, arg.JobID, arg.Limit)
|
|
return err
|
|
}
|
|
|
|
const updateScheduledJob = `-- name: UpdateScheduledJob :one
|
|
UPDATE core.scheduled_jobs
|
|
SET name = $3,
|
|
schedule = $4,
|
|
url = $5,
|
|
enabled = $6,
|
|
next_run_at = $7,
|
|
secret = CASE WHEN $8::boolean THEN $9 ELSE secret END,
|
|
payload = CASE WHEN $10::boolean THEN $11 ELSE payload END,
|
|
function_id = CASE WHEN $12::boolean THEN $13 ELSE function_id END,
|
|
updated_at = NOW()
|
|
WHERE id = $1
|
|
AND project_id = $2
|
|
RETURNING id, project_id, name, schedule, url, secret, payload, enabled, last_run_at, last_status, next_run_at, created_by_user_id, created_at, updated_at, function_id
|
|
`
|
|
|
|
type UpdateScheduledJobParams struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
Name string `json:"name"`
|
|
Schedule string `json:"schedule"`
|
|
Url string `json:"url"`
|
|
Enabled bool `json:"enabled"`
|
|
NextRunAt pgtype.Timestamptz `json:"next_run_at"`
|
|
Column8 bool `json:"column_8"`
|
|
Secret []byte `json:"secret"`
|
|
Column10 bool `json:"column_10"`
|
|
Payload []byte `json:"payload"`
|
|
Column12 bool `json:"column_12"`
|
|
FunctionID pgtype.UUID `json:"function_id"`
|
|
}
|
|
|
|
func (q *Queries) UpdateScheduledJob(ctx context.Context, arg UpdateScheduledJobParams) (CoreScheduledJob, error) {
|
|
row := q.db.QueryRow(ctx, updateScheduledJob,
|
|
arg.ID,
|
|
arg.ProjectID,
|
|
arg.Name,
|
|
arg.Schedule,
|
|
arg.Url,
|
|
arg.Enabled,
|
|
arg.NextRunAt,
|
|
arg.Column8,
|
|
arg.Secret,
|
|
arg.Column10,
|
|
arg.Payload,
|
|
arg.Column12,
|
|
arg.FunctionID,
|
|
)
|
|
var i CoreScheduledJob
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.ProjectID,
|
|
&i.Name,
|
|
&i.Schedule,
|
|
&i.Url,
|
|
&i.Secret,
|
|
&i.Payload,
|
|
&i.Enabled,
|
|
&i.LastRunAt,
|
|
&i.LastStatus,
|
|
&i.NextRunAt,
|
|
&i.CreatedByUserID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.FunctionID,
|
|
)
|
|
return i, err
|
|
}
|