Skip to content

Commit 0b757ff

Browse files
rubenvdlindeclaude
andauthored
fix: Apply PHPCS coding standard fixes (2127 → 81 errors remaining) (#413)
Apply named parameters, explicit boolean comparisons, file doc comments, end-method comments, and other coding standard fixes. Reduced errors from 2127 to 81 across 53 files. Includes custom NamedParametersSniff and CI updates. Co-authored-by: Claude Opus 4.6 <[email protected]>
1 parent 29cf08b commit 0b757ff

File tree

65 files changed

+4606
-2842
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+4606
-2842
lines changed

.github/workflows/code-quality.yml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: Code Quality
2+
3+
on:
4+
pull_request:
5+
branches: [main, master, development]
6+
7+
concurrency:
8+
group: quality-${{ github.head_ref || github.ref }}
9+
cancel-in-progress: true
10+
11+
jobs:
12+
php-checks:
13+
name: ${{ matrix.check.name }}
14+
runs-on: ubuntu-latest
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
check:
19+
- { name: "PHP Lint", command: "composer lint" }
20+
- { name: "PHPCS", command: "./vendor/bin/phpcs --standard=phpcs.xml" }
21+
- { name: "PHPMD", command: "./vendor/bin/phpmd lib text phpmd.xml" }
22+
- { name: "Psalm", command: "./vendor/bin/psalm --threads=1 --no-cache --output-format=github" }
23+
- { name: "PHPStan", command: "./vendor/bin/phpstan analyse --memory-limit=1G" }
24+
- { name: "PHPUnit", command: "./vendor/bin/phpunit --colors=always" }
25+
26+
steps:
27+
- name: Checkout
28+
uses: actions/checkout@v4
29+
30+
- name: Setup PHP
31+
uses: shivammathur/setup-php@v2
32+
with:
33+
php-version: '8.1'
34+
extensions: mbstring, xml, ctype, iconv, intl, dom, filter, gd, json, posix, zip, soap
35+
tools: composer:v2
36+
37+
- name: Cache Composer dependencies
38+
uses: actions/cache@v4
39+
with:
40+
path: vendor
41+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
42+
restore-keys: ${{ runner.os }}-composer-
43+
44+
- name: Install dependencies
45+
run: composer install --no-progress --prefer-dist --optimize-autoloader
46+
47+
- name: ${{ matrix.check.name }}
48+
run: ${{ matrix.check.command }}
49+
frontend-quality:
50+
name: Frontend Quality
51+
runs-on: ubuntu-latest
52+
53+
steps:
54+
- name: Checkout
55+
uses: actions/checkout@v4
56+
57+
- name: Setup Node.js
58+
uses: actions/setup-node@v4
59+
with:
60+
node-version: '20'
61+
cache: 'npm'
62+
63+
- name: Install dependencies
64+
run: npm ci
65+
66+
- name: ESLint
67+
run: npm run lint
68+
69+
- name: Stylelint
70+
run: npm run stylelint

.github/workflows/quality-check.yml

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
name: Quality Assurance Checks
22

3+
# Disabled: superseded by code-quality.yml
34
on:
45
pull_request:
5-
branches:
6-
- main
7-
- master
8-
- development
9-
- dev
10-
push:
11-
branches:
12-
- main
13-
- master
14-
- development
15-
- dev
6+
branches: [never]
167

178
jobs:
189
quality-check:

README.md

Lines changed: 245 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,255 @@
1+
<p align="center">
2+
<img src="img/app-store.svg" alt="OpenCatalogi logo" width="80" height="80">
3+
</p>
4+
5+
<h1 align="center">OpenCatalogi</h1>
6+
7+
<p align="center">
8+
<strong>Publication management and catalog federation for Nextcloud — publish, discover, and share open data across organizations</strong>
9+
</p>
10+
11+
<p align="center">
12+
<a href="https://github.com/ConductionNL/opencatalogi/releases"><img src="https://img.shields.io/github/v/release/ConductionNL/opencatalogi" alt="Latest release"></a>
13+
<a href="https://github.com/ConductionNL/opencatalogi/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-EUPL--1.2-blue" alt="License"></a>
14+
<a href="https://github.com/ConductionNL/opencatalogi/actions"><img src="https://img.shields.io/github/actions/workflow/status/ConductionNL/opencatalogi/code-quality.yml?label=quality" alt="Code quality"></a>
15+
<a href="https://documentatie.opencatalogi.nl"><img src="https://img.shields.io/badge/docs-opencatalogi.nl-green" alt="Documentation"></a>
16+
</p>
17+
118
---
2-
description: >-
3-
Welkom bij de gebruikersdocumentatie voor de OpenCatalogi Nextcloud App. Veel
4-
succes met het gebruik van de app.
5-
---
619

7-
# Welkom
20+
OpenCatalogi turns Nextcloud into a publication platform for open data and government transparency. Create catalogs, manage publications with metadata and attachments, and federate them across organizations so that citizens, businesses, and other government entities can discover and access public information. The app supports the Dutch WOO (Open Government Act) and follows Common Ground principles for interoperability.
21+
22+
It connects to a federated directory of other OpenCatalogi instances, enabling cross-organization search and discovery without centralized infrastructure. A public-facing frontend can be deployed separately for citizen access, while administrators manage everything from within Nextcloud.
23+
24+
> **Requires:** [OpenRegister](https://github.com/ConductionNL/openregister) — all data is stored as OpenRegister objects (no own database tables).
25+
26+
## Screenshots
27+
28+
<table>
29+
<tr>
30+
<td><img src="img/screenshot-dashboard.png" alt="Dashboard with publication statistics and activity overview" width="320"></td>
31+
<td><img src="img/screenshot-publications.png" alt="Publication list with metadata and status columns" width="320"></td>
32+
<td><img src="img/screenshot-catalog.png" alt="Catalog detail view with publications and settings" width="320"></td>
33+
</tr>
34+
<tr>
35+
<td align="center"><em>Dashboard</em></td>
36+
<td align="center"><em>Publications</em></td>
37+
<td align="center"><em>Catalog</em></td>
38+
</tr>
39+
</table>
40+
41+
## Features
42+
43+
### Publication Management
44+
- **Create & Edit Publications** — Rich metadata editor for publications including title, summary, category, portal URL, and custom fields
45+
- **Attachments** — Upload documents, images, and other files to publications with automatic metadata extraction
46+
- **Publication Status** — Track publications through draft, published, and archived states
47+
- **Bulk Operations** — Manage multiple publications at once with batch actions
48+
- **Download & Export** — Generate downloadable packages of publications and their attachments
49+
50+
### Catalog Federation
51+
- **Multiple Catalogs** — Create and manage separate catalogs for different domains or departments (e.g., WOO documents, software, datasets)
52+
- **Federated Directory** — Register your catalogs in a shared directory so other organizations can discover and subscribe to them
53+
- **Listings** — Subscribe to external catalogs and synchronize their publications into your local search index
54+
- **Cross-Organization Search** — Query publications across all federated catalogs from a single search interface
55+
- **Directory Sync** — Background cron job keeps federated listings up to date automatically
56+
57+
### Search & Discovery
58+
- **Faceted Search** — Filter publications by category, organization, catalog, date range, and custom metadata fields
59+
- **Full-Text Search** — Search across publication content and attached documents
60+
- **ElasticSearch Support** — Optional ElasticSearch backend for high-performance search at scale
61+
- **Public Search API** — RESTful endpoints for external frontends and third-party integrations
62+
63+
### Content Management
64+
- **Pages** — Create static content pages (about, contact, FAQ) served through the public API
65+
- **Menus** — Define navigation menus for the public-facing frontend
66+
- **Glossary** — Maintain a glossary of terms with definitions, shown alongside publications
67+
- **Themes** — Configure visual themes for the public frontend with colors, logos, and styling
68+
69+
### WOO Compliance
70+
- **Publication Categories** — Predefined categories aligned with WOO information categories (decisions, reports, advice, etc.)
71+
- **Metadata Standards** — Structured metadata following Dutch government open data standards
72+
- **Sitemap Generation** — Automatic sitemaps per catalog and category for search engine indexing
73+
- **Robots.txt** — Configurable robots.txt for controlling crawler access
74+
75+
### Administration
76+
- **Organization Management** — Configure the publishing organization with contact details and branding
77+
- **Settings Panel** — Centralized admin settings for storage, publishing rules, and federation behavior
78+
- **Manual Import** — Bulk import publications from external sources via the admin interface
79+
- **Version Info** — View app version and configuration status from the settings page
80+
81+
## Architecture
82+
83+
```mermaid
84+
graph TD
85+
A[Vue 2 Frontend] -->|REST API| B[OpenCatalogi Backend]
86+
B --> C[OpenRegister API]
87+
C --> D[(PostgreSQL JSON store)]
88+
B --> E[Federation Directory]
89+
E -->|sync| F[External OpenCatalogi Instances]
90+
B --> G[ElasticSearch — optional]
91+
H[Public Frontend — Tilburg WOO UI] -->|Public API| B
92+
B --> I[Nextcloud Activity]
93+
```
94+
95+
### Data Model
96+
97+
| Object | Description | Standard |
98+
|--------|-------------|----------|
99+
| Publication | Core metadata wrapper for published information — title, summary, category, status | DCAT-AP |
100+
| Attachment | File or document linked to a publication with its own metadata | DCAT Distribution |
101+
| Catalogue | A named collection of publications with its own slug, organization, and settings | DCAT Catalog |
102+
| Organisation | The publishing organization with contact info, logo, and branding | Schema.org Organization |
103+
| Listing | A subscription to an external catalog from the federated directory ||
104+
105+
**Data standards:** DCAT-AP (EU metadata), Schema.org, WOO information categories.
106+
107+
### Directory Structure
108+
109+
```
110+
opencatalogi/
111+
├── appinfo/ # Nextcloud app manifest, routes, navigation
112+
├── lib/ # PHP backend
113+
│ ├── Controller/ # REST API controllers (publications, catalogi, search, federation…)
114+
│ ├── Service/ # Business logic (catalog, directory, publication, search, download)
115+
│ ├── Cron/ # Background jobs (DirectorySync, Broadcast)
116+
│ ├── Flow/ # Nextcloud Flow integration
117+
│ ├── Listener/ # Event listeners
118+
│ └── Settings/ # Admin settings panel
119+
├── src/ # Vue 2 frontend — components, Pinia stores, views
120+
│ ├── catalogi/ # Catalog management views
121+
│ ├── publications/ # Publication editor and list views
122+
│ ├── search/ # Search interface
123+
│ ├── directory/ # Federation directory management
124+
│ ├── themes/ # Theme configuration
125+
│ ├── store/ # Pinia stores per entity
126+
│ └── views/ # Route-level views
127+
├── docs/ # Documentation (users, admins, developers, schemas)
128+
├── img/ # App icons and screenshots
129+
└── docusaurus/ # Product documentation site (documentatie.opencatalogi.nl)
130+
```
131+
132+
## Requirements
133+
134+
| Dependency | Version |
135+
|-----------|---------|
136+
| Nextcloud | 28 -- 33 |
137+
| PHP | 8.1+ |
138+
| PostgreSQL / MySQL 8+ / SQLite ||
139+
| [OpenRegister](https://github.com/ConductionNL/openregister) | latest |
140+
| System Cron | required for federation sync |
141+
142+
## Installation
143+
144+
### From the Nextcloud App Store
145+
146+
1. Go to **Apps** in your Nextcloud instance
147+
2. Search for **OpenCatalogi**
148+
3. Click **Download and enable**
149+
150+
> OpenRegister must be installed first. The app will attempt to install it automatically, or you can [install OpenRegister manually](https://apps.nextcloud.com/apps/openregister).
151+
152+
### From Source
153+
154+
```bash
155+
cd /var/www/html/custom_apps
156+
git clone https://github.com/ConductionNL/opencatalogi.git
157+
cd opencatalogi
158+
composer install --no-dev
159+
npm install
160+
npm run build
161+
php occ app:enable opencatalogi
162+
```
163+
164+
## Development
165+
166+
### Start the environment
167+
168+
```bash
169+
docker compose -f openregister/docker-compose.yml up -d
170+
```
171+
172+
To include the public frontend (Tilburg WOO UI):
173+
174+
```bash
175+
docker compose -f openregister/docker-compose.yml --profile ui up -d
176+
```
177+
178+
### Frontend development
179+
180+
```bash
181+
cd opencatalogi
182+
npm install
183+
npm run dev # One-time build (development mode)
184+
npm run watch # Watch mode with auto-rebuild
185+
npm run build # Production build
186+
```
187+
188+
### Code quality
189+
190+
```bash
191+
# PHP
192+
composer phpcs # Check coding standards
193+
composer cs:fix # Auto-fix PHPCS issues
194+
composer phpmd # Mess detection
195+
composer psalm # Static analysis
196+
composer phpmetrics # HTML metrics report
197+
198+
# Frontend
199+
npm run lint # ESLint
200+
npm run stylelint # CSS linting
201+
202+
# Full check (all tools)
203+
composer check:strict # Runs lint, phpcs, phpmd, psalm, phpstan, tests
204+
```
205+
206+
## Tech Stack
207+
208+
| Layer | Technology |
209+
|-------|-----------|
210+
| Frontend | Vue 2.7, Pinia, @nextcloud/vue |
211+
| Build | Webpack 5, @nextcloud/webpack-vue-config |
212+
| Backend | PHP 8.1+, Nextcloud App Framework |
213+
| Data | OpenRegister (PostgreSQL JSON objects) |
214+
| Search | ElasticSearch 8 (optional), SQL full-text (default) |
215+
| PDF | mPDF for document generation |
216+
| Templates | Twig for content rendering |
217+
| Quality | PHPCS, PHPMD, Psalm, PHPStan, phpmetrics, ESLint, Stylelint |
218+
219+
## Documentation
220+
221+
Full documentation is available at **[documentatie.opencatalogi.nl](https://documentatie.opencatalogi.nl)**
222+
223+
| Section | Description |
224+
|---------|-------------|
225+
| [User Guide](docs/Users/index.md) | Publishing, searching, and managing publications |
226+
| [Administrator Guide](docs/Administrator/README.md) | Catalog setup, directory configuration, themes, and metadata |
227+
| [Developer Guide](docs/Developers/index.md) | Local development setup, architecture, and API reference |
228+
| [Installation](docs/Installation/README.md) | On-premise, SaaS, and upgrade instructions |
229+
| [Schemas](docs/schema/) | JSON Schema definitions for publications, catalogs, and attachments |
8230

9-
***
231+
## Standards & Compliance
10232

11-
Deze documentatie richt zich op het gebruik van onze beheerapplicatie, speciaal ontworpen voor het beheren van publicaties en catalogi binnen het federatief netwerk. De OpenCatalogi Nextcloud App is een eenvoudig te installeren en krachtige oplossing voor publicatiebeheer:
233+
- **Metadata standard:** DCAT-AP (EU) for publication metadata interoperability
234+
- **WOO compliance:** Publication categories aligned with Dutch Open Government Act requirements
235+
- **Common Ground:** Follows Common Ground principles for federated, reusable government IT
236+
- **Accessibility:** WCAG AA (Dutch government requirement)
237+
- **Authorization:** RBAC via OpenRegister with organization-based multitenancy
238+
- **Federation:** Decentralized directory protocol for cross-organization catalog sharing
239+
- **Localization:** Dutch and English
12240

13-
* [**Quickstart**](installatie/instructies.md) voor een test/demo-omgeving
14-
* [**Quickstart** ](developers/installatie-van-nextcloud-development-omgeving.md)voor een development-omgeving
241+
## Related Apps
15242

16-
Onze app ondersteunt de Common Ground-aanpak, waardoor je snel toegang hebt tot bestaande IT-oplossingen die je kunt hergebruiken om de ontwikkeltijd te verkorten en de kosten te verlagen. In deze gids vind je stapsgewijze instructies, nuttige tips en best practices om je te helpen bij het optimaal beheren van je federatief netwerk, zoals publicaties of softwarecomponenten.
243+
- **[OpenRegister](https://github.com/ConductionNL/openregister)** -- Object storage layer (required dependency)
244+
- **[OpenConnector](https://github.com/ConductionNL/openconnector)** -- API gateway for importing data from external sources
245+
- **[NL Design](https://github.com/ConductionNL/nldesign)** -- Design token theming for Dutch government styling
246+
- **[DocuDesk](https://github.com/ConductionNL/docudesk)** -- Document generation from publication data
247+
- **[Softwarecatalog](https://github.com/ConductionNL/softwarecatalog)** -- GEMMA software catalog built on OpenCatalogi
17248

18-
Deze documentatie is bedoeld voor diverse doelgroepen:
249+
## License
19250

20-
* **Gebruikers:** iedereen die wil delen binnen het netwerk.
21-
* **Developers:** Ontwikkelaars die bijdragen aan de OpenCatalogi-projecten en behoefte hebben aan gedetailleerde technische informatie en API-documentatie.
22-
* **Beheerders:** Professionals die verantwoordelijk zijn voor het beheren en onderhouden van het federatief netwerk voor publicaties en componenten.
251+
EUPL-1.2
23252

24-
Voor meer informatie over OpenCatalogi en onze gemeenschappelijke inspanningen, bezoek onze [documentatie-pagina](https://documentatie.opencatalogi.nl) of de officiële website op [OpenCatalogi.nl](https://opencatalogi.nl).
253+
## Authors
25254

26-
Veel succes met het gebruik van de app. Voor vragen of bijdragen, neem gerust contact met ons op via [[email protected]](mailto:[email protected]).
255+
Built by [Conduction](https://conduction.nl) and [Acato](https://acato.nl) -- open-source software for Dutch government and public sector organizations.

0 commit comments

Comments
 (0)