# feestevam/painel-de-noticia-digital architecture

> Architecture diagram of the GitHub repository feestevam/painel-de-noticia-digital, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/feestevam/painel-de-noticia-digital
- Repository: https://github.com/feestevam/painel-de-noticia-digital

## Overview

Painel Digital de Notícias delivers scheduled content on public display screens and provides an authenticated operator workflow to manage it. Operators log in, create or schedule news and scene content, and the display renders eligible items as a timed carousel with weather and live-news scenes. The backend exposes API routes through controllers, formats responses, and persists news and users. The README documents additional display, upload, forecasting, and feed capabilities; some implementation paths are represented by their exact tree directories because their source was not sampled.

Main entry points: [`client/lib/api.js`](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/lib/api.js) (API client), [`client/app/components/DisplayMode.jsx`](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/DisplayMode.jsx) (Display carousel), [`server/app/view/responseView.js`](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/view/responseView.js) (Response formatter), [`client/app/components/FeedScene.jsx`](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/FeedScene.jsx) (News feed scene)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_display["Public display"]
  node_index["Display page<br/>[DisplayIndex.jsx]"]
  node_carousel["Display carousel<br/>[DisplayMode.jsx]"]
  node_weather_scene["Weather scene<br/>[WeatherScene.jsx]"]
  node_feed_scene["News feed scene<br/>[FeedScene.jsx]"]
end

subgraph group_operator["Operator management"]
  node_login["Login page<br/>[login.jsx]"]
  node_auth_client["Session handling<br/>[auth.js]"]
  node_manager_page["Management panel<br/>[newspainel.jsx]"]
  node_news_manager["Content editor<br/>[NewsManager.jsx]"]
end

subgraph group_api["API and services"]
  node_api_client["API client<br/>[api.js]"]
  node_news_routes["News routes<br/>[newsRoutes.js]"]
  node_news_controller["News controller<br/>[newsController.js]"]
  node_auth_controller["Authentication controller<br/>[authController.js]"]
  node_feed_controller["Feed controller<br/>[feedController.js]"]
  node_weather_controller["Weather controller"]
  node_g1_service["G1 RSS service<br/>[g1Service.js]"]
  node_weather_service["Weather service<br/>[weatherService.js]"]
  node_response_view["Response formatter<br/>[responseView.js]"]
end

subgraph group_storage["Persistence"]
  node_news_model["News persistence<br/>[newsModel.js]"]
  node_user_model["User persistence<br/>[userModel.js]"]
  node_database[("Prisma database<br/>[database.js]")]
end

node_viewer(("Viewer"))
node_weather_provider["Open-Meteo"]
node_g1["G1 RSS"]

node_viewer -->|"views"| node_index
node_index -->|"renders"| node_carousel
node_carousel -->|"renders"| node_weather_scene
node_carousel -->|"renders"| node_feed_scene
node_carousel -->|"loads content"| node_api_client
node_weather_scene -->|"requests weather"| node_api_client
node_feed_scene -->|"requests feeds"| node_api_client
node_feed_scene -->|"uses"| node_g1_service
node_viewer -->|"authenticates"| node_login
node_login -->|"submits credentials"| node_auth_client
node_auth_client -->|"posts login"| node_auth_controller
node_auth_controller -->|"checks users"| node_user_model
node_auth_controller -->|"formats response"| node_response_view
node_auth_client -->|"stores session"| node_manager_page
node_manager_page -->|"hosts editor"| node_news_manager
node_news_manager -->|"submits content"| node_api_client
node_manager_page -->|"creates news"| node_api_client
node_api_client -->|"calls news API"| node_news_routes
node_news_routes -->|"routes requests"| node_news_controller
node_news_controller -->|"reads and writes"| node_news_model
node_news_controller -->|"formats response"| node_response_view
node_news_model -->|"queries"| node_database
node_user_model -->|"queries"| node_database
node_feed_controller -->|"fetches RSS"| node_g1_service
node_feed_controller -->|"formats response"| node_response_view
node_g1_service -.->|"reads feed"| node_g1
node_weather_controller -->|"gets forecast"| node_weather_service
node_weather_controller -->|"formats response"| node_response_view
node_weather_service -.->|"fetches forecast"| node_weather_provider

click node_index "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/pages/DisplayIndex.jsx"
click node_carousel "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/DisplayMode.jsx"
click node_weather_scene "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/WeatherScene.jsx"
click node_feed_scene "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/FeedScene.jsx"
click node_login "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/pages/login.jsx"
click node_auth_client "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/lib/auth.js"
click node_manager_page "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/pages/newspainel.jsx"
click node_news_manager "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/NewsManager.jsx"
click node_api_client "https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/lib/api.js"
click node_news_routes "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/routes/newsRoutes.js"
click node_news_controller "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/newsController.js"
click node_auth_controller "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/authController.js"
click node_feed_controller "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/feedController.js"
click node_weather_controller "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/weatherController.js"
click node_g1_service "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/service/g1Service.js"
click node_weather_service "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/service/weatherService.js"
click node_response_view "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/view/responseView.js"
click node_news_model "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/model/newsModel.js"
click node_user_model "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/model/userModel.js"
click node_database "https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/model/database.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_index,node_carousel,node_weather_scene,node_feed_scene,node_viewer toneBlue
class node_login,node_auth_client,node_manager_page,node_news_manager toneAmber
class node_api_client,node_news_routes,node_news_controller,node_auth_controller,node_feed_controller,node_weather_controller,node_g1_service,node_weather_service,node_response_view toneMint
class node_news_model,node_user_model,node_database toneRose
class node_weather_provider,node_g1 toneIndigo
```

## Components

### Public display

- [Display page](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/pages/DisplayIndex.jsx): `client/app/pages/DisplayIndex.jsx`
- [Display carousel](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/DisplayMode.jsx): `client/app/components/DisplayMode.jsx`
- [Weather scene](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/WeatherScene.jsx): `client/app/components/WeatherScene.jsx`
- [News feed scene](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/FeedScene.jsx): `client/app/components/FeedScene.jsx`

### Operator management

- [Login page](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/pages/login.jsx): `client/app/pages/login.jsx`
- [Session handling](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/lib/auth.js): `client/lib/auth.js`
- [Management panel](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/pages/newspainel.jsx): `client/app/pages/newspainel.jsx`
- [Content editor](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/app/components/NewsManager.jsx): `client/app/components/NewsManager.jsx`

### API and services

- [API client](https://github.com/feestevam/painel-de-noticia-digital/blob/main/client/lib/api.js): `client/lib/api.js`
- [News routes](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/routes/newsRoutes.js): `server/app/routes/newsRoutes.js`
- [News controller](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/newsController.js): `server/app/controller/newsController.js`
- [Authentication controller](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/authController.js): `server/app/controller/authController.js`
- [Feed controller](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/feedController.js): `server/app/controller/feedController.js`
- [Weather controller](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/controller/weatherController.js): `server/app/controller/weatherController.js`
- [G1 RSS service](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/service/g1Service.js): `server/app/service/g1Service.js`
- [Weather service](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/service/weatherService.js): `server/app/service/weatherService.js`
- [Response formatter](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/view/responseView.js): `server/app/view/responseView.js`

### Persistence

- [News persistence](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/model/newsModel.js): `server/app/model/newsModel.js`
- [User persistence](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/model/userModel.js): `server/app/model/userModel.js`
- [Prisma database](https://github.com/feestevam/painel-de-noticia-digital/blob/main/server/app/model/database.js): `server/app/model/database.js`

### Other components

- **Viewer**
- **Open-Meteo**
- **G1 RSS**

## Connections

- Viewer → Display page: views (evidence: `README.md`)
- Display page → Display carousel: renders (evidence: `client/app/pages/DisplayIndex.jsx`)
- Display carousel → Weather scene: renders (evidence: `client/app/components/DisplayMode.jsx`)
- Display carousel → News feed scene: renders (evidence: `client/app/components/DisplayMode.jsx`)
- Display carousel → API client: loads content (evidence: `client/app/pages/DisplayIndex.jsx`)
- Weather scene → API client: requests weather (evidence: `client/app/components/WeatherScene.jsx`)
- News feed scene → API client: requests feeds (evidence: `client/app/components/FeedScene.jsx`)
- News feed scene → G1 RSS service: uses (evidence: `client/app/components/FeedScene.jsx`)
- Viewer → Login page: authenticates (evidence: `README.md`)
- Login page → Session handling: submits credentials (evidence: `client/app/pages/login.jsx`)
- Session handling → Authentication controller: posts login (evidence: `client/lib/auth.js`)
- Authentication controller → User persistence: checks users (evidence: `server/app/controller/authController.js`)
- Authentication controller → Response formatter: formats response (evidence: `server/app/controller/authController.js`)
- Session handling → Management panel: stores session (evidence: `README.md`)
- Management panel → Content editor: hosts editor (evidence: `client/app/pages/newspainel.jsx`)
- Content editor → API client: submits content (evidence: `README.md`)
- Management panel → API client: creates news (evidence: `client/app/pages/newspainel.jsx`)
- API client → News routes: calls news API (evidence: `client/lib/api.js`)
- News routes → News controller: routes requests (evidence: `server/app/routes/newsRoutes.js`)
- News controller → News persistence: reads and writes (evidence: `server/app/controller/newsController.js`)
- News controller → Response formatter: formats response (evidence: `server/app/controller/newsController.js`)
- News persistence → Prisma database: queries (evidence: `server/app/model/newsModel.js`)
- User persistence → Prisma database: queries (evidence: `server/app/model/userModel.js`)
- Feed controller → G1 RSS service: fetches RSS (evidence: `server/app/controller/feedController.js`)
- Feed controller → Response formatter: formats response (evidence: `server/app/controller/feedController.js`)
- G1 RSS service → G1 RSS: reads feed (evidence: `README.md`)
- Weather controller → Weather service: gets forecast (evidence: `server/app/controller/weatherController.js`)
- Weather controller → Response formatter: formats response (evidence: `server/app/controller/weatherController.js`)
- Weather service → Open-Meteo: fetches forecast (evidence: `README.md`)
