Global and Course-Specific Announcements and News Management - Technical Documentation
Generated on 9/18/2025 | AI Workflow Portal
📋 Executive Summary
This report details the Xikolo cluster 20_COMM_Announcements, a comprehensive system for managing and disseminating global and course-specific announcements and news. The system integrates a Ruby on Rails web frontend with the dedicated Xikolo News Service microservice, alongside Xikolo Account and Course Services. Its primary purpose is to facilitate the creation, management, email distribution, public display, and read tracking of announcements across the platform, supporting administrative operations and public content consumption.
🏗️ Architecture Overview
The architecture for Xikolo’s Announcement and News Management system is designed as a distributed microservice-oriented setup, with the main Ruby on Rails application acting as the user-facing frontend. This frontend orchestrates interactions with several specialized microservices to manage content, user data, and course information. The core components include the primary Xikolo Rails Application, the dedicated Xikolo News Service for all announcement data, and supporting microservices for user and course information. Data persistence for announcements is handled by dedicated stores, primarily PostgreSQL, with Redis and S3 supporting caching and asset management. Asynchronous communication patterns, via RabbitMQ, are also central to the News Service’s operations, particularly for email distribution and background processing.
Architecture Diagrams
Main Architecture
graph TD adminUser["Admin / Public User"] xikoloMainApp["Xikolo Rails Application"] xikoloNewsService["Xikolo News Service"] xikoloAccountService["Xikolo Account Service"] xikoloCourseService["Xikolo Course Service"] newsDataStores["News Persistence (PG, Redis, S3)"] adminUser -->|"Manages/Views Announcements"| xikoloMainApp xikoloMainApp -->|"CRUD Announce/News, Send Emails"| xikoloNewsService xikoloMainApp -->|"Fetches User/Group Data"| xikoloAccountService xikoloMainApp -->|"Fetches Course Data"| xikoloCourseService xikoloNewsService -->|"Stores/Retrieves Content"| newsDataStores xikoloNewsService -->|"Enriches with User Info"| xikoloAccountService xikoloNewsService -->|"Associates with Courses"| xikoloCourseService
🔄 Component Interactions
Key interactions between components in this cluster:
- Admin::Announcement::RecipientsController: Authorizes ‘news.announcement.send’ permission.
- Admin::Announcement::RecipientsController: Fetches user data from Xikolo::Account service via
account_api.rel(:users).get. - Admin::AnnouncementEmailsController: Requires ‘admin_announcements’ feature.
- Admin::AnnouncementEmailsController: Interacts with Xikolo::NewsService via
news_serviceto get announcement and message details. - Admin::AnnouncementsController: Requires ‘admin_announcements’ feature.
- Admin::AnnouncementsController: Authorizes ‘news.announcement.create’ and ‘news.announcement.update’ permissions.
- AnnouncementsController: Authorizes actions using
authorize!andcurrent_user.allowed?based on permissions likenews.announcement.create,news.announcement.update,news.announcement.delete,news.announcement.send,news.announcement.send_test[Source: app/controllers/announcements_controller.rb, RAG: services/account/lib/tasks/permissions/news.yml]. - AnnouncementsController: Uses
Admin::NewsFormfor data binding and validation of announcement attributes [Source: app/controllers/announcements_controller.rb, app/forms/admin/news_form.rb]. - Home::AnnouncementsController: Checks for the ‘announcements’ feature flag [Source: app/controllers/home/announcements_controller.rb].
- Home::AnnouncementsController: Fetches announcement posts from the
newsmicroservice (Xikolo.api(:news).rel(:posts).get) [Source: app/controllers/home/announcements_controller.rb]. - Admin::AnnouncementEmailForm: Contains nested
Translationsubforms for subject and content in different languages. - Admin::AnnouncementEmailForm: Uses
RecipientsArrayprocessor to transform recipient IDs to URNs for the NewsService. - Admin::AnnouncementEmailForm::RecipientsArray: Processes
recipientsattribute forAdmin::AnnouncementEmailForm. - Admin::AnnouncementEmailForm::TranslationsArray: Processes
translationsattribute forAdmin::AnnouncementEmailForm. - Admin::AnnouncementForm: Contains nested
Translationsubforms for subject and content in different languages. - Admin::AnnouncementForm: Uses
TranslationsArrayprocessor to manage default and additional language translations. - Admin::AnnouncementForm::TranslationsArray: Processes
translationsattribute forAdmin::AnnouncementForm. - Admin::NewsForm: Inherits from
XUI::Form[Source: app/forms/admin/news_form.rb]. - Admin::NewsForm: Defines attributes for announcement properties like
title,text,publish_at,language,visual_url,audience, andtranslations[Source: app/forms/admin/news_form.rb]. - Admin::NewsForm::Translation: Defines attributes for
title,text, andlanguageof a translation [Source: app/forms/admin/news_form.rb]. - Admin::NewsForm::Translation: Used as a
subtypefor thetranslationsattribute inAdmin::NewsForm[Source: app/forms/admin/news_form.rb]. - Admin::NewsForm::TranslationsArray: Processes
translationsattribute forAdmin::NewsForm. - Alert: Uses
translations(likely a JSONB or hstore column) to store multi-language content. - Alert: Defines scopes
by_publication_dateandpublishedfor filtering. - Alert::Translation: Initializes with a locale and data hash, providing
titleandtextmethods. - Admin::AnnouncementEmailPresenter: Initializes with announcement and email resources [Source: app/presenters/admin/announcement_email_presenter.rb].
- Admin::AnnouncementEmailPresenter: Asynchronously fetches author and sender user details from the
accountmicroservice (Xikolo.api(:account)) [Source: app/presenters/admin/announcement_email_presenter.rb]. - Admin::AnnouncementPresenter: Initializes with an announcement resource [Source: app/presenters/admin/announcement_presenter.rb].
- Admin::AnnouncementPresenter: Provides formatted
created_atandtitle[Source: app/presenters/admin/announcement_presenter.rb]. - Admin::AnnouncementsListPresenter: Delegates iteration methods (
each,any?) to the underlying collection [Source: app/presenters/admin/announcements_list_presenter.rb]. - Admin::AnnouncementsListPresenter: Uses
RestifyPaginationCollectionfor handling pagination metadata from thenewsservice [Source: app/presenters/admin/announcements_list_presenter.rb]. - AnnouncementPresenter: Initializes with a news resource [Source: app/presenters/announcement_presenter.rb].
- AnnouncementPresenter: Includes
MarkdownHelperto render markdown content [Source: app/presenters/announcement_presenter.rb]. - Middleware::NewsTracker: Intercepts HTTP requests to check for ‘news’ tracking parameters (
tracking_type,tracking_id,tracking_user). - Middleware::NewsTracker: Sends an asynchronous POST request to
Xikolo.api(:news).value!.rel(:visits)to mark an announcement as read, without blocking the main request-response cycle. - Xikolo::NewsService: Communicates with
Xikolo::Accountservice to potentially retrieve user or account-related information. [Source: RAG: services/news/config/services.yml] - Xikolo::NewsService: Communicates with
Xikolo::CourseServiceto associate news with specific courses or retrieve course details. [Source: RAG: services/news/config/services.yml] - Xikolo::Account: Provides user data (name, email) for announcement recipient selection.
- Xikolo::Account: Provides group data (access, content_test, custom_recipients) for recipient selection.
- Xikolo::CourseService: Provides course data (title, course_code) for announcement recipient selection.
- News (Data Entity): Created, read, updated, and deleted via the
Xikolo::NewsServiceAPI. [Source: RAG: services/news/README.md] - News (Data Entity): Potentially associated with
Courseentities fromXikolo::CourseService. [Source: RAG: services/news/config/services.yml] - Email Notification Component: Receives news content and recipient information from other parts of
Xikolo::NewsService. - Email Notification Component: Utilizes custom templates and stylesheets located in
services/news/brand/<name>/assets/views/layoutsandservices/news/brand/<name>/assets/stylesheetsfor branding. [Source: RAG: docs/app/development/branding/email.md] - News Service (Microservice): Interacts with PostgreSQL for data persistence. [Source: services/news/config/database.yml]
- News Service (Microservice): Communicates with RabbitMQ for asynchronous messaging (both consuming and publishing). [Source: docker/compose.news.yml, services/news/config/rabbitmq.yml]
- News Msgr Consumer: Consumes messages from RabbitMQ. [Source: docker/compose.news.yml, services/news/config/rabbitmq.yml]
- News Msgr Consumer: Interacts with the News Service’s PostgreSQL database for data operations.
- News API Server: Exposes an HTTP API (debug port 4300). [Source: docker/compose.news.yml]
- News API Server: Interacts with the News Service’s PostgreSQL database for data operations.
- News Sidekiq Worker: Processes jobs from the Redis-backed Sidekiq queue. [Source: docker/compose.news.yml]
- News Sidekiq Worker: Interacts with the News Service’s PostgreSQL database.
⚙️ Technical Workflows
1. Admin Announcement Creation & Email Distribution
graph TD adminUI["Admin Interface (Web)"] mainAppControllers["Admin::AnnouncementsController / Admin::AnnouncementEmailsController"] forms["Admin::AnnouncementForm / Admin::AnnouncementEmailForm"] xikoloNewsService["Xikolo News Service"] emailProcess["Email Notification Component (via Sidekiq)"] complete["Announcement Created & Emails Sent"] adminUI -->|"Initiates Announcement/Email Create"| mainAppControllers mainAppControllers -->|"Uses Forms for Input/Validation"| forms forms -->|"Submits Data to"| xikoloNewsService xikoloNewsService -->|"Initiates Asynchronous Email Send"| emailProcess emailProcess -->|"Dispatches Notifications"| complete mainAppControllers -->|"Confirms Action Completion"| complete
This workflow details the process for administrators to create new announcements, including the option for email distribution. The process begins when an administrator accesses the dedicated user interface to initiate the creation of either a general announcement or a specific announcement email. The Admin::AnnouncementsController or Admin::AnnouncementEmailsController handles these initial requests. Data input is facilitated by form objects like Admin::AnnouncementForm for general content or Admin::AnnouncementEmailForm for email-specific details, which manage multi-language translations and recipient selection. For recipient selection, Admin::Announcement::RecipientsController dynamically fetches user and course data from the Xikolo::Account and Xikolo::CourseService microservices, caching these responses for performance. Once validated, the announcement data is submitted to the Xikolo News Service via its API. The News Service then takes over the responsibility for persisting the announcement and, if configured, initiating the email distribution process. Email sending is typically an asynchronous operation, leveraging the Email Notification Component within the News Service, which dispatches jobs to the News Sidekiq Worker for background processing. The main application receives confirmation of the announcement’s creation and display status.
2. Public Announcement Display & Read Tracking
graph TD publicUser["Public User Browser"] homeAnnounceController["Home::AnnouncementsController"] xikoloNewsService["Xikolo News Service"] announcementPresenter["AnnouncementPresenter"] newsTrackerMiddleware["Middleware::NewsTracker"] readComplete["Announcement Read Event Stored"] publicUser -->|"Requests Homepage/Announcements"| homeAnnounceController homeAnnounceController -->|"Fetches Published Posts"| xikoloNewsService xikoloNewsService -->|"Returns News Content"| announcementPresenter announcementPresenter -->|"Renders Content to"| publicUser publicUser -->|"User Views Post (Triggers)"| newsTrackerMiddleware newsTrackerMiddleware -->|"Asynchronously Records Visit"| xikoloNewsService xikoloNewsService -->|"Persists Read Status"| readComplete
This workflow outlines how announcements are displayed to end-users and how user engagement (read events) is tracked. A public user’s request for the application’s homepage or a specific announcement page is initially handled by the Home::AnnouncementsController. This controller checks for the ‘announcements’ feature flag and then queries the Xikolo News Service API to fetch relevant announcement posts. Crucially, it adjusts query parameters, such as published status, user_id, and language, based on the current user’s login status and permissions (e.g., news.announcement.show permission allows viewing drafts). The raw news resources returned by the News Service are then mapped to AnnouncementPresenter instances. The AnnouncementPresenter is responsible for formatting the content, including rendering markdown and generating a teaser from the full text, for display in the user interface. To track user engagement, the Middleware::NewsTracker intercepts HTTP requests. When it detects specific ‘news’ tracking parameters, it asynchronously sends a POST request to the Xikolo News Service’s /visits endpoint to mark the announcement as read by the user. This read tracking occurs without blocking the user’s main request, ensuring a responsive user experience.
🔧 Implementation Details
The Xikolo 20_COMM_Announcements cluster is implemented with a clear separation of concerns, leveraging a Ruby on Rails monolith as the frontend interacting with dedicated microservices. Technical considerations include robust authorization and feature flag integration. Controllers such as Admin::AnnouncementsController and Home::AnnouncementsController rely on feature flags like admin_announcements and announcements respectively, ensuring functionality is only available when enabled. Permissions, including news.announcement.create, news.announcement.update, news.announcement.send, and news.announcement.show, are strictly enforced using authorize! and current_user.allowed? checks. Error handling for interactions with microservices, particularly Restify::UnprocessableEntity errors, is implemented in controllers to provide user feedback on remote validation failures.
Dependencies and integrations are central to the system’s operation. The main Rails application heavily integrates with Xikolo.api(:news) for all core announcement and news data management, including CRUD operations, email sending, and visit tracking. It also depends on Xikolo.api(:account) to fetch user and group information for recipient selection and to resolve author/sender names for email displays. Similarly, Xikolo.api(:course) provides course details for targeted announcements. Within the Xikolo News Service itself, core dependencies include PostgreSQL for persistent data storage, RabbitMQ for asynchronous messaging and inter-service communication, Redis for caching and Sidekiq job management, and S3 for storing news-related assets. Form objects like Admin::AnnouncementEmailForm, Admin::AnnouncementForm, and Admin::NewsForm inherit from XUI::Form, providing a standardized approach to data binding and validation, including nested Translation subforms for multilingual content. Presenters such as AnnouncementPresenter utilize utilities like MarkdownHelper and HtmlTruncator for content rendering and Admin::AnnouncementsListPresenter leverages RestifyPaginationCollection for handling pagination metadata.
Configuration requirements involve application-wide settings for internationalization, specified via Xikolo.config.locales['available'] and Xikolo.config.locales['default'] to manage multiple language versions of content. Audience selection in Admin::NewsForm is derived from Xikolo.config.access_groups. Specific configuration values (e.g., database connection strings, RabbitMQ credentials, S3 bucket names) are sourced from services/news/config/database.yml, services/news/config/rabbitmq.yml, and docker/config/xikolo/news.yml respectively, but are not specified in the provided cluster data.
📚 Technical Sources & References
Components
- 📄 Admin::Announcement::RecipientsController
app/controllers/admin/announcement/recipients_controller.rb - 📄 Admin::AnnouncementEmailsController
app/controllers/admin/announcement_emails_controller.rb - 📄 Admin::AnnouncementsController
app/controllers/admin/announcements_controller.rb - 📄 AnnouncementsController
app/controllers/announcements_controller.rb - 📄 AnnouncementsController
RAG: services/account/lib/tasks/permissions/news.yml - 📄 Home::AnnouncementsController
app/controllers/home/announcements_controller.rb - 📄 Home::AnnouncementsController
spec/requests/announcements/index_spec.rb - 📄 Admin::AnnouncementEmailPresenter
app/presenters/admin/announcement_email_presenter.rb - 📄 Admin::AnnouncementPresenter
app/presenters/admin/announcement_presenter.rb - 📄 Admin::AnnouncementsListPresenter
app/presenters/admin/announcements_list_presenter.rb - 📄 AnnouncementPresenter
app/presenters/announcement_presenter.rb
Services
- 📄 Xikolo::NewsService
foundational_context - 📄 Xikolo::NewsService
RAG: services/news/README.md - 📄 Xikolo::CourseService
app/controllers/admin/announcement/recipients_controller.rb - 📄 News Service (Microservice)
services/news/README.md - 📄 News Service (Microservice)
docker/compose.news.yml
Configuration
- 📄 Admin::AnnouncementEmailForm
app/forms/admin/announcement_email_form.rb - 📄 Admin::AnnouncementEmailForm::Translation
app/forms/admin/announcement_email_form.rb - 📄 Admin::AnnouncementEmailForm::RecipientsArray
app/forms/admin/announcement_email_form.rb - 📄 Admin::AnnouncementEmailForm::TranslationsArray
app/forms/admin/announcement_email_form.rb - 📄 Admin::AnnouncementForm
app/forms/admin/announcement_form.rb - 📄 Admin::AnnouncementForm::Translation
app/forms/admin/announcement_form.rb - 📄 Admin::AnnouncementForm::TranslationsArray
app/forms/admin/announcement_form.rb - 📄 Admin::NewsForm
app/forms/admin/news_form.rb - 📄 Admin::NewsForm::Translation
app/forms/admin/news_form.rb - 📄 Admin::NewsForm::TranslationsArray
app/forms/admin/news_form.rb - 📄 Alert
app/models/alert.rb - 📄 Alert::Translation
app/models/alert.rb - 📄 Middleware::NewsTracker
lib/middleware/news_tracker.rb - 📄 Xikolo::Account
app/controllers/admin/announcement/recipients_controller.rb - 📄 Xikolo::Account
app/forms/admin/announcement_email_form.rb - 📄 News Msgr Consumer
docker/compose.news.yml - 📄 News Msgr Consumer
services/news/config/rabbitmq.yml - 📄 News API Server
docker/compose.news.yml - 📄 News Sidekiq Worker
docker/compose.news.yml - 📄 News Sidekiq Worker
services/news/config/locales/en.yml - 📄 Configuration
config/application.rb, Gemfile, config/database.yml - 📄 Process Management
Procfile, Procfile.web - 📄 Build & Deploy
Rakefile, package.json
Documentation
- 📄 News (Data Entity)
RAG: services/news/README.md - 📄 Email Notification Component
RAG: docs/app/development/branding/email.md
Other
- 📄 News (Data Entity)
foundational_context - 📄 Email Notification Component
foundational_context - 📄 announcements.scss
app/assets/admin/announcements/announcements.scss
This documentation is automatically generated from cluster analysis and should be validated against the actual codebase.