Skip to main content

Blog System

Concordia’s blog system provides a complete CMS for publishing articles with multi-language translations, author management, categorization, media galleries, and community engagement through comments.

Overview

The blog system is built from multiple schema files:
  • blog_posts.schema.ts - Core article structure
  • blog_authors.schema.ts - Author profiles
  • blog_categories.schema.ts - Content categorization
  • blog_translations.schema.ts - Multi-language content
  • blog_comments.schema.ts - Community discussions
  • blog_organization.schema.ts - Organization-level blogs

Blog Posts

From src/database/schemas/blog_posts.schema.ts:

Core Fields

text
required
Primary key identifier
text
required
Unique URL-friendly identifier for the post
text
required
Publication status: draft, pending_review, published, archived, rejected
text
Optional reference to organization that owns this post
timestamp
Publication date/time, set when status changes to published

Display Options

boolean
default:false
Whether to feature this post on the homepage
boolean
default:true
Whether to show this post in the main blog listing
Mark post as featured for special prominence

Content Metadata

text
Estimated reading time (e.g., “5 min”)
text
Total word count of the article
text
ISO 8601 duration format for Schema.org compatibility
text
required
Primary language code (ISO 639-1)

Community Features

boolean
default:true
Enable/disable comments on this post
text
Link to external discussion (e.g., forum thread)

Schema.org Integration

text
Content license (e.g., “CC BY-SA 4.0”)
text
Canonical URL for this article
text
Unique identifier for Schema.org structured data

Multi-Language Translations

From src/database/schemas/blog_translations.schema.ts:
text
required
Translation entry ID
text
required
Reference to parent blog post
text
required
Language code for this translation (ISO 639-1)
jsonb
required
Article title/headline in this language
jsonb
Alternative headline/subtitle
jsonb
required
Full article content as structured JSON
jsonb
required
Short excerpt or summary for listings
jsonb
SEO-optimized page title
jsonb
Meta description for search engines
jsonb
SEO keywords array
jsonb
Canonical URL for this translation
Translations are indexed by post_id and in_language for efficient multilingual queries.

Authors

From src/database/schemas/blog_authors.schema.ts:

Identity Fields

text
required
Author unique identifier
text
required
Unique URL slug for author profile page
jsonb
First name in multiple languages
jsonb
Last name in multiple languages
jsonb
required
Display name shown on articles (multilingual)
jsonb
Author biography in multiple languages
jsonb
Professional title in multiple languages

Contact & Profile

text
Unique email address for the author
text
Reference to blog_media table for avatar image
text
Direct URL to avatar image
text
Author’s personal or professional website
jsonb
Array of URLs for social media profiles (Schema.org)Example: ["https://twitter.com/author", "https://linkedin.com/in/author"]

Organization Affiliation

text
Reference to blog_organizations table
Authors can be affiliated with an organization, enabling organization blogs where multiple authors contribute under a shared brand.

Display Flags

boolean
default:false
Show author on homepage
boolean
default:true
Show author in blog listings
Feature this author prominently

SEO Fields

jsonb
SEO title for author page
jsonb
Meta description for author page
jsonb
Keywords for author page
jsonb
Canonical URL for author profile

Categories

From src/database/schemas/blog_categories.schema.ts:
text
required
Category identifier
text
required
Unique URL slug
jsonb
required
Category name in multiple languages
jsonb
Category description in multiple languages
Reference to featured image in blog_media
text
Parent category for hierarchical structure
boolean
default:false
Show category on homepage
boolean
default:true
Show category in navigation menu
boolean
default:true
Show category in blog section
Mark as featured category
Categories support hierarchy via the parentId field, allowing nested category structures.

Comments

From src/database/schemas/blog_comments.schema.ts:

Universal Comment System

text
required
Comment identifier
text
required
ID of the entity being commented on
text
required
Type of entity: blog, place, event, hike, classified
text
Parent comment ID for threaded discussions

Author Information

text
required
Commenter’s display name
text
required
Commenter’s email (for notifications, not displayed)

Content

jsonb
required
Comment text as structured JSON (supports rich formatting)
integer
default:0
Optional rating (0-5 stars) when comment is a review
text
required
Language code of the comment

Moderation

text
required
Moderation status: pending, approved, rejected
Comments default to pending status and require moderation approval before being visible.

Organization Blogs

From src/database/schemas/blog_organization.schema.ts, organizations can have their own blog channels:

Identity

text
required
Organization identifier
text
required
Organization name
text
required
Unique URL slug
jsonb
Alternative names array
jsonb
Description in multiple languages
text
Organization website
Logo URL
text
Featured image URL
jsonb
Organization slogan in multiple languages

Contact Information

text
Primary email
text
Primary phone number
jsonb
Structured address object:

News Media Organization Fields

Concordia supports Schema.org NewsMediaOrganization properties for editorial transparency:
text
Editorial standards and principles
text
How corrections are handled
text
Ethical guidelines
text
Diversity and inclusion policy
text
Ownership and funding transparency
text
Fact-checking procedures

Relationships

From blog_posts.schema.ts, posts connect to:

Authors (Many-to-Many)

Multiple authors can collaborate on a single post.

Categories (Many-to-Many)

Media (Many-to-Many)

text
required
Media usage type: cover, inline, gallery
text
Position indicator for inline or gallery media

Database Indexes

Performance optimizations from blog_posts.schema.ts:

Article Status Workflow

From concordia-specs.md (lines 748-757):

Best Practices

Multi-Language Content

  1. Always create translations for all supported languages
  2. Use JSONB fields for language-specific content
  3. Set inLanguage to match the primary content language

SEO Optimization

  1. Populate seoTitle, seoDescription, and seoKeywords for each translation
  2. Use canonical URLs to avoid duplicate content issues
  3. Set appropriate timeRequired and wordCount for Schema.org

Organization Blogs

  1. Link authors to organizations via worksForId
  2. Set organizationId on posts for organization attribution
  3. Use organization branding (logo, slogan) consistently