Skip to main content

Structuring a Resource-Aware Content & Feedback Engine

· 2 min read
JavaScript Dev

Overview

Once data is live, platforms become conversations. In this post, I’ll explain how I created a resource-aware content and feedback engine where users can:

  • Read and write multilingual content
  • Rate political entities (parties, leaders, governments)
  • Comment on historical events and scandals
  • Attach feedback directly to any model in the system

The system is powered by polymorphic content linking, a unified comment engine, and approval metrics.


Design Goals

  • ✅ Support comments, ratings, reactions, and editorial content
  • ✅ Link all feedback and content to any resource (party, leader, election, etc.)
  • ✅ Make everything bilingual
  • ✅ Avoid duplicating logic across models

This meant creating a generalized system that could scale both horizontally (new content types) and vertically (across domain models).


Core Schema (Prisma)

Here’s the core structure I used:

model Content {
id Int @id @default(autoincrement())
resourceType String // e.g., 'LEADER', 'PARTY', 'ELECTION'
resourceId Int
contentType String // COMMENT, SCANDAL, RATING, EDITORIAL
contentStatus String // APPROVED, FLAGGED, DELETED
title String?
titleLocal String?
content String
contentLocal String?
eventDate DateTime?
parentContentId Int?
createdAt DateTime @default(now())
}

This lets a single table support:

  • Comments and replies (via parentContentId)
  • Ratings and feedback
  • Multi-level editorial content

Ratings & Approval Metrics

Ratings are a special type of content with structure:

{
resourceType: 'PARTY',
resourceId: 25,
contentType: 'RATING',
content: '4',
contentLocal: '४',
}

Aggregations are done on the backend to compute:

  • Average rating per resource
  • Most-rated items by category
  • Rating trends over time (coming soon)

User Experience

On the frontend, I use a shared component:

<ResourceFeedback resourceType="LEADER" resourceId={id} />

This internally loads and renders:

  • Ratings bar
  • Add comment box
  • Comment thread with moderation tools

Content Moderation

Admins can flag content with statuses (APPROVED, FLAGGED, DELETED) and hide inappropriate or spam entries. These statuses also allow:

  • Public visibility filtering
  • Analytics around abuse patterns

Future: Add moderation dashboards and approval workflows.


Bilingual Content Support

Every content entry supports both English and Nepali. UI falls back gracefully, and users can toggle languages in their preferences or URL path.


Conclusion

Creating a polymorphic content engine let me scale feedback and editorial contributions across every part of the civic dataset.

The same structure powers:

  • Scandal logs
  • User comments
  • Leader approval tracking
  • Party ratings
  • Threaded debates

Next up: I’ll dive into how I modeled political scandal timelines and encoded hierarchy, sources, and localization into structured records.