# atomlaw/newscoop architecture

> Architecture diagram of the GitHub repository atomlaw/newscoop, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/atomlaw/newscoop
- Repository: https://github.com/atomlaw/newscoop

## Overview

Newscoop is a newsroom CMS for creating, organizing, and publishing multilingual, issue-and-section-based journalism, with author management, geolocation, dashboards, and a flexible templating engine. The principal workflow is newsroom staff authoring and managing articles, then publishing them for readers; the repository also exposes article operations through a REST controller. Sampled code confirms API article access and creation, authentication, ACL reads, and image-storage migration. Other major capabilities are documented in the README and represented by their existing source directories; their internal wiring was not sampled.

Main entry points: [`newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php`](https://github.com/atomlaw/newscoop/blob/master/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php) (Article REST API), [`newscoop/library/Newscoop/Image/UpdateStorageService.php`](https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Image/UpdateStorageService.php) (Image storage migration), [`newscoop/library/Newscoop/Storage/StorageService.php`](https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Storage/StorageService.php) (File storage), [`newscoop/classes/Article.php`](https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Article.php) (Article model)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_editorial["Editorial workflow"]
  node_admin["Admin interface<br/>[index.php]"]
  node_articles["Article management<br/>[index.php]"]
  node_article_types["Article types<br/>[index.php]"]
  node_issues["Issue management<br/>[index.php]"]
  node_sections["Section management<br/>[index.php]"]
  node_authors["Author management<br/>[authors.php]"]
  node_languages["Language management<br/>[index.php]"]
  node_locations["Geolocation<br/>[GeoLocation.php]"]
  node_media["Media archive<br/>[index.php]"]
  node_article_model["Article model<br/>[Article.php]"]
end

subgraph group_access["Access and APIs"]
  node_api["Article REST API"]
  node_auth["Authentication<br/>[AuthController.php]"]
  node_acl["ACL storage<br/>[Storage.php]"]
end

subgraph group_publishing["Publishing experience"]
  node_dashboard["Journalist dashboard"]
  node_templates["Templates<br/>[Template.php]"]
  node_publication["Publication model<br/>[Publication.php]"]
end

subgraph group_platform["Platform services"]
  node_database[("Application database")]
  node_cache["Cache engine<br/>[CacheEngine.php]"]
  node_file_storage["File storage<br/>[StorageService.php]"]
  node_image_migration["Image storage migration"]
end

node_staff(("Newsroom staff"))
node_readers(("Readers"))

node_staff -->|"uses"| node_admin
node_readers -->|"views published"| node_templates
node_api -->|"retrieves articles"| node_article_model
node_api -->|"queries articles"| node_database
node_api -->|"creates articles"| node_article_model
node_auth -->|"looks up users"| node_database
node_acl -->|"reads rules"| node_database
node_image_migration -->|"loads and updates images"| node_database
node_image_migration -->|"moves image files"| node_file_storage
node_file_storage -.->|"none"| node_database

click node_admin "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/index.php"
click node_articles "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/articles/index.php"
click node_article_types "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/article_types/index.php"
click node_issues "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/issues/index.php"
click node_sections "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/sections/index.php"
click node_authors "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/users/authors.php"
click node_languages "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/languages/index.php"
click node_locations "https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/GeoLocation.php"
click node_media "https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/media-archive/index.php"
click node_api "https://github.com/atomlaw/newscoop/blob/master/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php"
click node_auth "https://github.com/atomlaw/newscoop/blob/master/newscoop/application/controllers/AuthController.php"
click node_acl "https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Acl/Storage.php"
click node_dashboard "https://github.com/atomlaw/newscoop/blob/master/newscoop/application/controllers/DashboardController.php"
click node_templates "https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Template.php"
click node_publication "https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Publication.php"
click node_article_model "https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Article.php"
click node_cache "https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/cache/CacheEngine.php"
click node_file_storage "https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Storage/StorageService.php"
click node_image_migration "https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Image/UpdateStorageService.php"

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_admin,node_articles,node_article_types,node_issues,node_sections,node_authors,node_languages,node_locations,node_media,node_article_model toneBlue
class node_api,node_auth,node_acl toneAmber
class node_dashboard,node_templates,node_publication toneMint
class node_database,node_cache,node_file_storage,node_image_migration toneRose
class node_staff,node_readers toneIndigo
```

## Components

### Editorial workflow

- [Admin interface](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/index.php): `newscoop/admin-files/index.php`
- [Article management](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/articles/index.php): `newscoop/admin-files/articles/index.php`
- [Article types](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/article_types/index.php): `newscoop/admin-files/article_types/index.php`
- [Issue management](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/issues/index.php): `newscoop/admin-files/issues/index.php`
- [Section management](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/sections/index.php): `newscoop/admin-files/sections/index.php`
- [Author management](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/users/authors.php): `newscoop/admin-files/users/authors.php`
- [Language management](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/languages/index.php): `newscoop/admin-files/languages/index.php`
- [Geolocation](https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/GeoLocation.php): `newscoop/classes/GeoLocation.php`
- [Media archive](https://github.com/atomlaw/newscoop/blob/master/newscoop/admin-files/media-archive/index.php): `newscoop/admin-files/media-archive/index.php`
- [Article model](https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Article.php): `newscoop/classes/Article.php`

### Access and APIs

- [Article REST API](https://github.com/atomlaw/newscoop/blob/master/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php): `newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php`
- [Authentication](https://github.com/atomlaw/newscoop/blob/master/newscoop/application/controllers/AuthController.php): `newscoop/application/controllers/AuthController.php`
- [ACL storage](https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Acl/Storage.php): `newscoop/library/Newscoop/Acl/Storage.php`

### Publishing experience

- [Journalist dashboard](https://github.com/atomlaw/newscoop/blob/master/newscoop/application/controllers/DashboardController.php): `newscoop/application/controllers/DashboardController.php`
- [Templates](https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Template.php): `newscoop/classes/Template.php`
- [Publication model](https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/Publication.php): `newscoop/classes/Publication.php`

### Platform services

- **Application database**
- [Cache engine](https://github.com/atomlaw/newscoop/blob/master/newscoop/classes/cache/CacheEngine.php): `newscoop/classes/cache/CacheEngine.php`
- [File storage](https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Storage/StorageService.php): `newscoop/library/Newscoop/Storage/StorageService.php`
- [Image storage migration](https://github.com/atomlaw/newscoop/blob/master/newscoop/library/Newscoop/Image/UpdateStorageService.php): `newscoop/library/Newscoop/Image/UpdateStorageService.php`

### Other components

- **Newsroom staff**
- **Readers**

## Connections

- Newsroom staff → Admin interface: uses
- Readers → Templates: views published
- Article REST API → Article model: retrieves articles
- Article REST API → Application database: queries articles
- Article REST API → Article model: creates articles
- Authentication → Application database: looks up users
- ACL storage → Application database: reads rules
- Image storage migration → Application database: loads and updates images
- Image storage migration → File storage: moves image files
- File storage → Application database: none
