2026-04-01 00:58:42 +08:00
|
|
|
// Code generated by sqlc. DO NOT EDIT.
|
|
|
|
|
// versions:
|
|
|
|
|
// sqlc v1.30.0
|
|
|
|
|
// source: article.sql
|
|
|
|
|
|
|
|
|
|
package generated
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
|
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const countArticles = `-- name: CountArticles :one
|
|
|
|
|
SELECT COUNT(*)
|
|
|
|
|
FROM articles a
|
|
|
|
|
LEFT JOIN article_versions av ON av.id = a.current_version_id
|
|
|
|
|
WHERE a.tenant_id = $1
|
|
|
|
|
AND a.deleted_at IS NULL
|
|
|
|
|
AND ($2::text IS NULL OR a.generate_status = $2)
|
|
|
|
|
AND ($3::text IS NULL OR a.publish_status = $3)
|
|
|
|
|
AND ($4::text IS NULL OR a.source_type = $4)
|
|
|
|
|
AND ($5::bigint IS NULL OR a.template_id = $5)
|
|
|
|
|
AND ($6::text IS NULL OR av.title ILIKE '%' || $6 || '%')
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type CountArticlesParams struct {
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
GenerateStatus pgtype.Text `json:"generate_status"`
|
|
|
|
|
PublishStatus pgtype.Text `json:"publish_status"`
|
|
|
|
|
SourceType pgtype.Text `json:"source_type"`
|
|
|
|
|
TemplateID pgtype.Int8 `json:"template_id"`
|
|
|
|
|
Keyword pgtype.Text `json:"keyword"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) CountArticles(ctx context.Context, arg CountArticlesParams) (int64, error) {
|
|
|
|
|
row := q.db.QueryRow(ctx, countArticles,
|
|
|
|
|
arg.TenantID,
|
|
|
|
|
arg.GenerateStatus,
|
|
|
|
|
arg.PublishStatus,
|
|
|
|
|
arg.SourceType,
|
|
|
|
|
arg.TemplateID,
|
|
|
|
|
arg.Keyword,
|
|
|
|
|
)
|
|
|
|
|
var count int64
|
|
|
|
|
err := row.Scan(&count)
|
|
|
|
|
return count, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const createArticle = `-- name: CreateArticle :one
|
2026-04-17 14:51:54 +08:00
|
|
|
INSERT INTO articles (tenant_id, source_type, template_id, kol_prompt_id, generate_status, publish_status)
|
|
|
|
|
VALUES ($1, $2, $3, $4, 'pending', 'unpublished')
|
2026-04-01 00:58:42 +08:00
|
|
|
RETURNING id
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type CreateArticleParams struct {
|
2026-04-17 14:51:54 +08:00
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
SourceType string `json:"source_type"`
|
|
|
|
|
TemplateID pgtype.Int8 `json:"template_id"`
|
|
|
|
|
KolPromptID pgtype.Int8 `json:"kol_prompt_id"`
|
2026-04-01 00:58:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) CreateArticle(ctx context.Context, arg CreateArticleParams) (int64, error) {
|
2026-04-17 14:51:54 +08:00
|
|
|
row := q.db.QueryRow(ctx, createArticle,
|
|
|
|
|
arg.TenantID,
|
|
|
|
|
arg.SourceType,
|
|
|
|
|
arg.TemplateID,
|
|
|
|
|
arg.KolPromptID,
|
|
|
|
|
)
|
2026-04-01 00:58:42 +08:00
|
|
|
var id int64
|
|
|
|
|
err := row.Scan(&id)
|
|
|
|
|
return id, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const createArticleVersion = `-- name: CreateArticleVersion :one
|
|
|
|
|
INSERT INTO article_versions (article_id, version_no, title, html_content, markdown_content, word_count, source_label)
|
|
|
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
|
|
|
RETURNING id
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type CreateArticleVersionParams struct {
|
|
|
|
|
ArticleID int64 `json:"article_id"`
|
|
|
|
|
VersionNo int32 `json:"version_no"`
|
|
|
|
|
Title pgtype.Text `json:"title"`
|
|
|
|
|
HtmlContent pgtype.Text `json:"html_content"`
|
|
|
|
|
MarkdownContent pgtype.Text `json:"markdown_content"`
|
|
|
|
|
WordCount int32 `json:"word_count"`
|
|
|
|
|
SourceLabel pgtype.Text `json:"source_label"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) CreateArticleVersion(ctx context.Context, arg CreateArticleVersionParams) (int64, error) {
|
|
|
|
|
row := q.db.QueryRow(ctx, createArticleVersion,
|
|
|
|
|
arg.ArticleID,
|
|
|
|
|
arg.VersionNo,
|
|
|
|
|
arg.Title,
|
|
|
|
|
arg.HtmlContent,
|
|
|
|
|
arg.MarkdownContent,
|
|
|
|
|
arg.WordCount,
|
|
|
|
|
arg.SourceLabel,
|
|
|
|
|
)
|
|
|
|
|
var id int64
|
|
|
|
|
err := row.Scan(&id)
|
|
|
|
|
return id, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getArticleByID = `-- name: GetArticleByID :one
|
|
|
|
|
SELECT a.id, a.tenant_id, a.source_type, a.template_id, a.current_version_id,
|
|
|
|
|
a.generate_status, a.publish_status, a.created_at, a.updated_at,
|
|
|
|
|
av.title, av.html_content, av.markdown_content, av.word_count, av.source_label, av.version_no,
|
|
|
|
|
t.template_name
|
|
|
|
|
FROM articles a
|
|
|
|
|
LEFT JOIN article_versions av ON av.id = a.current_version_id
|
|
|
|
|
LEFT JOIN article_templates t ON t.id = a.template_id
|
|
|
|
|
WHERE a.id = $1 AND a.tenant_id = $2 AND a.deleted_at IS NULL
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type GetArticleByIDParams struct {
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type GetArticleByIDRow struct {
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
SourceType string `json:"source_type"`
|
|
|
|
|
TemplateID pgtype.Int8 `json:"template_id"`
|
|
|
|
|
CurrentVersionID pgtype.Int8 `json:"current_version_id"`
|
|
|
|
|
GenerateStatus string `json:"generate_status"`
|
|
|
|
|
PublishStatus string `json:"publish_status"`
|
|
|
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
|
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
|
|
|
Title pgtype.Text `json:"title"`
|
|
|
|
|
HtmlContent pgtype.Text `json:"html_content"`
|
|
|
|
|
MarkdownContent pgtype.Text `json:"markdown_content"`
|
|
|
|
|
WordCount pgtype.Int4 `json:"word_count"`
|
|
|
|
|
SourceLabel pgtype.Text `json:"source_label"`
|
|
|
|
|
VersionNo pgtype.Int4 `json:"version_no"`
|
|
|
|
|
TemplateName pgtype.Text `json:"template_name"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) GetArticleByID(ctx context.Context, arg GetArticleByIDParams) (GetArticleByIDRow, error) {
|
|
|
|
|
row := q.db.QueryRow(ctx, getArticleByID, arg.ID, arg.TenantID)
|
|
|
|
|
var i GetArticleByIDRow
|
|
|
|
|
err := row.Scan(
|
|
|
|
|
&i.ID,
|
|
|
|
|
&i.TenantID,
|
|
|
|
|
&i.SourceType,
|
|
|
|
|
&i.TemplateID,
|
|
|
|
|
&i.CurrentVersionID,
|
|
|
|
|
&i.GenerateStatus,
|
|
|
|
|
&i.PublishStatus,
|
|
|
|
|
&i.CreatedAt,
|
|
|
|
|
&i.UpdatedAt,
|
|
|
|
|
&i.Title,
|
|
|
|
|
&i.HtmlContent,
|
|
|
|
|
&i.MarkdownContent,
|
|
|
|
|
&i.WordCount,
|
|
|
|
|
&i.SourceLabel,
|
|
|
|
|
&i.VersionNo,
|
|
|
|
|
&i.TemplateName,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getArticleVersions = `-- name: GetArticleVersions :many
|
|
|
|
|
SELECT id, article_id, version_no, title, word_count, source_label, created_at
|
|
|
|
|
FROM article_versions
|
|
|
|
|
WHERE article_id = $1
|
|
|
|
|
ORDER BY version_no DESC
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type GetArticleVersionsRow struct {
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
ArticleID int64 `json:"article_id"`
|
|
|
|
|
VersionNo int32 `json:"version_no"`
|
|
|
|
|
Title pgtype.Text `json:"title"`
|
|
|
|
|
WordCount int32 `json:"word_count"`
|
|
|
|
|
SourceLabel pgtype.Text `json:"source_label"`
|
|
|
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) GetArticleVersions(ctx context.Context, articleID int64) ([]GetArticleVersionsRow, error) {
|
|
|
|
|
rows, err := q.db.Query(ctx, getArticleVersions, articleID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
var items []GetArticleVersionsRow
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
var i GetArticleVersionsRow
|
|
|
|
|
if err := rows.Scan(
|
|
|
|
|
&i.ID,
|
|
|
|
|
&i.ArticleID,
|
|
|
|
|
&i.VersionNo,
|
|
|
|
|
&i.Title,
|
|
|
|
|
&i.WordCount,
|
|
|
|
|
&i.SourceLabel,
|
|
|
|
|
&i.CreatedAt,
|
|
|
|
|
); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
items = append(items, i)
|
|
|
|
|
}
|
|
|
|
|
if err := rows.Err(); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const listArticles = `-- name: ListArticles :many
|
2026-04-17 15:19:11 +08:00
|
|
|
SELECT a.id, a.tenant_id, a.source_type, a.template_id, a.kol_prompt_id,
|
2026-04-01 00:58:42 +08:00
|
|
|
a.generate_status, a.publish_status, a.created_at, a.updated_at,
|
|
|
|
|
av.title, av.word_count, av.source_label,
|
|
|
|
|
t.template_name
|
|
|
|
|
FROM articles a
|
|
|
|
|
LEFT JOIN article_versions av ON av.id = a.current_version_id
|
|
|
|
|
LEFT JOIN article_templates t ON t.id = a.template_id
|
|
|
|
|
WHERE a.tenant_id = $1
|
|
|
|
|
AND a.deleted_at IS NULL
|
|
|
|
|
AND ($2::text IS NULL OR a.generate_status = $2)
|
|
|
|
|
AND ($3::text IS NULL OR a.publish_status = $3)
|
|
|
|
|
AND ($4::text IS NULL OR a.source_type = $4)
|
|
|
|
|
AND ($5::bigint IS NULL OR a.template_id = $5)
|
|
|
|
|
AND ($6::text IS NULL OR av.title ILIKE '%' || $6 || '%')
|
|
|
|
|
ORDER BY a.created_at DESC
|
|
|
|
|
LIMIT $8 OFFSET $7
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type ListArticlesParams struct {
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
GenerateStatus pgtype.Text `json:"generate_status"`
|
|
|
|
|
PublishStatus pgtype.Text `json:"publish_status"`
|
|
|
|
|
SourceType pgtype.Text `json:"source_type"`
|
|
|
|
|
TemplateID pgtype.Int8 `json:"template_id"`
|
|
|
|
|
Keyword pgtype.Text `json:"keyword"`
|
|
|
|
|
PageOffset int32 `json:"page_offset"`
|
|
|
|
|
PageSize int32 `json:"page_size"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ListArticlesRow struct {
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
SourceType string `json:"source_type"`
|
|
|
|
|
TemplateID pgtype.Int8 `json:"template_id"`
|
2026-04-17 15:19:11 +08:00
|
|
|
KolPromptID pgtype.Int8 `json:"kol_prompt_id"`
|
2026-04-01 00:58:42 +08:00
|
|
|
GenerateStatus string `json:"generate_status"`
|
|
|
|
|
PublishStatus string `json:"publish_status"`
|
|
|
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
|
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
|
|
|
Title pgtype.Text `json:"title"`
|
|
|
|
|
WordCount pgtype.Int4 `json:"word_count"`
|
|
|
|
|
SourceLabel pgtype.Text `json:"source_label"`
|
|
|
|
|
TemplateName pgtype.Text `json:"template_name"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) ListArticles(ctx context.Context, arg ListArticlesParams) ([]ListArticlesRow, error) {
|
|
|
|
|
rows, err := q.db.Query(ctx, listArticles,
|
|
|
|
|
arg.TenantID,
|
|
|
|
|
arg.GenerateStatus,
|
|
|
|
|
arg.PublishStatus,
|
|
|
|
|
arg.SourceType,
|
|
|
|
|
arg.TemplateID,
|
|
|
|
|
arg.Keyword,
|
|
|
|
|
arg.PageOffset,
|
|
|
|
|
arg.PageSize,
|
|
|
|
|
)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
var items []ListArticlesRow
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
var i ListArticlesRow
|
|
|
|
|
if err := rows.Scan(
|
|
|
|
|
&i.ID,
|
|
|
|
|
&i.TenantID,
|
|
|
|
|
&i.SourceType,
|
|
|
|
|
&i.TemplateID,
|
2026-04-17 15:19:11 +08:00
|
|
|
&i.KolPromptID,
|
2026-04-01 00:58:42 +08:00
|
|
|
&i.GenerateStatus,
|
|
|
|
|
&i.PublishStatus,
|
|
|
|
|
&i.CreatedAt,
|
|
|
|
|
&i.UpdatedAt,
|
|
|
|
|
&i.Title,
|
|
|
|
|
&i.WordCount,
|
|
|
|
|
&i.SourceLabel,
|
|
|
|
|
&i.TemplateName,
|
|
|
|
|
); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
items = append(items, i)
|
|
|
|
|
}
|
|
|
|
|
if err := rows.Err(); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const softDeleteArticle = `-- name: SoftDeleteArticle :exec
|
|
|
|
|
UPDATE articles SET deleted_at = NOW(), updated_at = NOW()
|
|
|
|
|
WHERE id = $1 AND tenant_id = $2 AND deleted_at IS NULL
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type SoftDeleteArticleParams struct {
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) SoftDeleteArticle(ctx context.Context, arg SoftDeleteArticleParams) error {
|
|
|
|
|
_, err := q.db.Exec(ctx, softDeleteArticle, arg.ID, arg.TenantID)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const updateArticleCurrentVersion = `-- name: UpdateArticleCurrentVersion :exec
|
|
|
|
|
UPDATE articles SET current_version_id = $1, updated_at = NOW()
|
|
|
|
|
WHERE id = $2 AND tenant_id = $3
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type UpdateArticleCurrentVersionParams struct {
|
|
|
|
|
VersionID pgtype.Int8 `json:"version_id"`
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) UpdateArticleCurrentVersion(ctx context.Context, arg UpdateArticleCurrentVersionParams) error {
|
|
|
|
|
_, err := q.db.Exec(ctx, updateArticleCurrentVersion, arg.VersionID, arg.ID, arg.TenantID)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const updateArticleGenerateStatus = `-- name: UpdateArticleGenerateStatus :exec
|
|
|
|
|
UPDATE articles SET generate_status = $1, updated_at = NOW()
|
|
|
|
|
WHERE id = $2 AND tenant_id = $3
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type UpdateArticleGenerateStatusParams struct {
|
|
|
|
|
Status string `json:"status"`
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
TenantID int64 `json:"tenant_id"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Queries) UpdateArticleGenerateStatus(ctx context.Context, arg UpdateArticleGenerateStatusParams) error {
|
|
|
|
|
_, err := q.db.Exec(ctx, updateArticleGenerateStatus, arg.Status, arg.ID, arg.TenantID)
|
|
|
|
|
return err
|
|
|
|
|
}
|