Task 003: add postgres schema and seed data
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import UTC, datetime
|
||||
from hashlib import sha256
|
||||
from uuid import NAMESPACE_URL, UUID, uuid5
|
||||
|
||||
from src.domain.contracts import (
|
||||
PublishingRules,
|
||||
Role,
|
||||
ScriptConfigVersionStatus,
|
||||
)
|
||||
from src.domain.schema import (
|
||||
SEEDED_ADMIN_EMAIL,
|
||||
SEEDED_EDITOR_EMAIL,
|
||||
SEEDED_TARGET_SITE_SLUG,
|
||||
)
|
||||
|
||||
|
||||
SEED_TIMESTAMP = datetime(2026, 1, 1, tzinfo=UTC)
|
||||
|
||||
|
||||
def seed_reference_data(repository: object) -> None:
|
||||
admin_id = _stable_uuid("user:admin")
|
||||
editor_id = _stable_uuid("user:editor")
|
||||
target_site_id = _stable_uuid(f"target-site:{SEEDED_TARGET_SITE_SLUG}")
|
||||
script_config_version_id = _stable_uuid(
|
||||
f"script-config-version:{SEEDED_TARGET_SITE_SLUG}:1"
|
||||
)
|
||||
|
||||
repository.users.upsert(
|
||||
user_id=admin_id,
|
||||
email=SEEDED_ADMIN_EMAIL,
|
||||
display_name="Admin User",
|
||||
role=Role.ADMIN,
|
||||
created_at=SEED_TIMESTAMP,
|
||||
updated_at=SEED_TIMESTAMP,
|
||||
)
|
||||
repository.users.upsert(
|
||||
user_id=editor_id,
|
||||
email=SEEDED_EDITOR_EMAIL,
|
||||
display_name="Editor User",
|
||||
role=Role.EDITOR,
|
||||
created_at=SEED_TIMESTAMP,
|
||||
updated_at=SEED_TIMESTAMP,
|
||||
)
|
||||
|
||||
publishing_rules = PublishingRules(
|
||||
repository_url="git@github.com:example/site.git",
|
||||
production_branch="main",
|
||||
content_format="mdx",
|
||||
content_path_template="content/articles/{slug}.mdx",
|
||||
asset_path_template="public/articles/{slug}/{filename}",
|
||||
frontmatter_mapping={
|
||||
"title": "title",
|
||||
"description": "meta_description",
|
||||
"publishedAt": "published_at",
|
||||
},
|
||||
transform_script_version_id=script_config_version_id,
|
||||
dry_run_renderer="next-mdx",
|
||||
)
|
||||
repository.target_sites.upsert(
|
||||
site_id=target_site_id,
|
||||
name="B2B SaaS Blog",
|
||||
slug=SEEDED_TARGET_SITE_SLUG,
|
||||
publishing_type="git_next",
|
||||
default_language="en",
|
||||
brand_voice="Clear, practical, evidence-led B2B editorial voice.",
|
||||
audience="B2B SaaS founders and growth teams.",
|
||||
seo_rules={
|
||||
"title_max_length": 60,
|
||||
"meta_description_max_length": 155,
|
||||
"primary_keyword_required": True,
|
||||
},
|
||||
visual_rules={
|
||||
"hero_style": "product editorial",
|
||||
"diagram_format": "mermaid",
|
||||
},
|
||||
source_rules={
|
||||
"minimum_sources": 3,
|
||||
"preferred_source_types": ["primary", "analyst", "vendor_docs"],
|
||||
},
|
||||
publishing_rules=publishing_rules,
|
||||
active_script_config_version_id=script_config_version_id,
|
||||
created_at=SEED_TIMESTAMP,
|
||||
updated_at=SEED_TIMESTAMP,
|
||||
)
|
||||
|
||||
publishing_yaml = """target: b2b_saas_blog
|
||||
repository:
|
||||
url: git@github.com:example/site.git
|
||||
branch: main
|
||||
content:
|
||||
format: mdx
|
||||
path_template: content/articles/{slug}.mdx
|
||||
assets:
|
||||
path_template: public/articles/{slug}/{filename}
|
||||
"""
|
||||
transform_script = """export function transformArticle(article) {
|
||||
return {
|
||||
frontmatter: article.frontmatter,
|
||||
body: article.body,
|
||||
assets: article.assets,
|
||||
};
|
||||
}
|
||||
"""
|
||||
repository.script_config_versions.upsert(
|
||||
version_id=script_config_version_id,
|
||||
target_site_id=target_site_id,
|
||||
version=1,
|
||||
status=ScriptConfigVersionStatus.ACTIVE,
|
||||
created_by=admin_id,
|
||||
created_at=SEED_TIMESTAMP,
|
||||
updated_at=SEED_TIMESTAMP,
|
||||
diff={"summary": "Initial Git-backed Next.js publishing configuration."},
|
||||
rollback_target_version_id=None,
|
||||
activated_at=SEED_TIMESTAMP,
|
||||
publishing_yaml=publishing_yaml,
|
||||
publishing_yaml_hash=_sha256(publishing_yaml),
|
||||
transform_script=transform_script,
|
||||
transform_script_hash=_sha256(transform_script),
|
||||
)
|
||||
|
||||
|
||||
def _stable_uuid(value: str) -> UUID:
|
||||
return uuid5(NAMESPACE_URL, f"ai-content-pipeline:{value}")
|
||||
|
||||
|
||||
def _sha256(value: str) -> str:
|
||||
return sha256(value.encode("utf-8")).hexdigest()
|
||||
Reference in New Issue
Block a user