PHPackages                             diversworld/contao-dw-api-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. diversworld/contao-dw-api-bundle

ActiveContao-bundle[API Development](/categories/api)

diversworld/contao-dw-api-bundle
================================

API-Bundle für den Contao Diveclub Manager zur Kommunikation mit der iOS-App (https://apps.apple.com/de/app/diveclub-manager/id6759004094). Ermöglicht die Verwaltung von Events, Reservierungen, Ausrüstung und Kursfortschritten.

1.0.13(1mo ago)142GPL-3.0-or-laterPHPPHP ^8.2

Since Feb 9Pushed 1mo agoCompare

[ Source](https://github.com/diversworld/contao-dw-api-bundle)[ Packagist](https://packagist.org/packages/diversworld/contao-dw-api-bundle)[ RSS](/packages/diversworld-contao-dw-api-bundle/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (12)Versions (30)Used By (0)

[![Latest Version on Packagist](https://camo.githubusercontent.com/ddf895ee61451b4fd8468742e4b18fe586e98c98299643bc39c62a79db5e6207/687474703a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f646976657273776f726c642f636f6e74616f2d64772d6170692d62756e646c652e7376673f7374796c653d666c6174)](https://packagist.org/packages/diversworld/contao-dw-api-bundle)[![Dynamic JSON Badge](https://camo.githubusercontent.com/a2a8834f5ed06f2126801b804848d78585dfe78ac4e4183410bbabeab82c78e1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e3f75726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d253246646976657273776f726c64253246636f6e74616f2d64772d6170692d62756e646c652532466d61696e253246636f6d706f7365722e6a736f6e2671756572793d2532342e72657175697265253542253232636f6e74616f253246636f72652d62756e646c65253232253544266c6162656c3d436f6e74616f25323056657273696f6e)](https://camo.githubusercontent.com/a2a8834f5ed06f2126801b804848d78585dfe78ac4e4183410bbabeab82c78e1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e3f75726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d253246646976657273776f726c64253246636f6e74616f2d64772d6170692d62756e646c652532466d61696e253246636f6d706f7365722e6a736f6e2671756572793d2532342e72657175697265253542253232636f6e74616f253246636f72652d62756e646c65253232253544266c6162656c3d436f6e74616f25323056657273696f6e)[![Installations via composer per month](https://camo.githubusercontent.com/d662f9a5430fec0d61b2f2c2bee03f5a4b9eb88d36a6770c7cd9e747066899f0/687474703a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646d2f646976657273776f726c642f636f6e74616f2d64772d6170692d62756e646c652e7376673f7374796c653d666c6174)](https://packagist.org/packages/diversworld/contao-dw-api-bundle)[![Installations via composer total](https://camo.githubusercontent.com/17015b34df51c568705b04ca0d3d393bf2812206b60305bd5803f3c0b6319d7b/687474703a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f646976657273776f726c642f636f6e74616f2d64772d6170692d62756e646c652e7376673f7374796c653d666c6174)](https://packagist.org/packages/diversworld/contao-dw-api-bundle)[![Packagist License](https://camo.githubusercontent.com/25cb8055f189a2eab7a12bc705bbaec8379f38741fc8fc16e1237f9c4ef03055/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f646976657273776f726c642f636f6e74616f2d64772d6170692d62756e646c65)](https://camo.githubusercontent.com/25cb8055f189a2eab7a12bc705bbaec8379f38741fc8fc16e1237f9c4ef03055/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f646976657273776f726c642f636f6e74616f2d64772d6170692d62756e646c65)

[![Diversworld](docs/dw-logo-k.png "Diversworld Logo")](docs/dw-logo-k.png)

iOS App

Contao Diveclub API Bundle
==========================

[](#contao-diveclub-api-bundle)

API Bundle für die Kommunikation zwischen Contao und einer iOS App im Rahmen des Diveclub Managers.

Features
--------

[](#features)

- **Events:** Abfrage von Tauchkursen und Terminen.
- **Reservierungen:** Verwaltung von Buchungen (Ansehen und Erstellen).
- **Ausrüstung:** Zugriff auf Leihausrüstung (Jackets, Anzüge, etc.).
- **Tauchflaschen &amp; Atemregler:** Spezielle Endpunkte für Flaschen und Regler.
- **TÜV-Checks:** Übersicht über anstehende Revisionen und Prüfvorschläge.
- **App-Konfiguration &amp; News:** Bereitstellung von Logo, Info-Texten und Nachrichten für die iOS-App.
- **Schüler:** Verwaltung von Kursteilnehmern.
- **Mitglieder:** Abruf der Mitgliederliste (ID, Nachname, Vorname, E-Mail).
- **JSON-Format:** Alle Antworten sind für die einfache Integration in iOS optimiert.

### JSON-Format &amp; Datentypen

[](#json-format--datentypen)

- **Datumswerte:** Alle Datumsfelder (z. B. `tstamp`, `reserved_at`, `picked_up_at`, `returned_at`, `lastOrder`, `buyDate`) werden einheitlich als **Integer-Timestamp** zurückgegeben.
- **Preise:** Preis- und Gebührenfelder (z. B. `rentalFee`, `totalPrice`, `price`) werden explizit als **Float**zurückgegeben.
- **Modelle:** Die Endpunkte geben grundsätzlich alle Felder der zugrundeliegenden Datenbank-Tabellen zurück ( `model->row()`).

API Endpunkte
-------------

[](#api-endpunkte)

Alle Endpunkte befinden sich unter dem Präfix `/api`.

### Events

[](#events)

- `GET /api/events`: Liste aller Kurse/Events.
- `GET /api/events/{id}`: Details zu einem bestimmten Event.

### Reservierungen

[](#reservierungen)

- `GET /api/reservations`: Liste aller Reservierungen des angemeldeten Benutzers.
- `GET /api/reservations/{id}`: Details inkl. aller gebuchten Items.
    - Gibt bei Items auch die Timestamps `created_at` und `updated_at` zurück.
- `POST /api/reservations`: Neue Reservierung erstellen.
    - Erwartet JSON mit `member_id`, optional `reservedFor`, `asset_type` (z.B. `equipment`, `tank`, `regulator`, `multiple`) und einer Liste von `items`.
    - Bei `items` können zusätzlich `item_id`, `item_type`, `types`, `sub_type` und `notes` übergeben werden.
    - **Beispiel Request:**```
        {
          "member_id": 1,
          "reservedFor": 1,
          "asset_type": "multiple",
          "items": [
            {
              "item_id": 42,
              "item_type": "equipment",
              "types": "jacket",
              "sub_type": "m",
              "notes": "Größe M bitte"
            },
            {
              "item_id": 12,
              "item_type": "tank",
              "notes": "12L Stahl"
            }
          ]
        }
        ```

### Kurse

[](#kurse)

- `GET /api/courses`: Liste aller verfügbaren Kurse.
- `GET /api/courses/{id}`: Details zu einem bestimmten Kurs.
- `POST /api/courses/enroll`: Anmeldung zu einem Kurs.
    - Erwartet JSON mit `course_id` und optional `event_id`.

### Kursanmeldungen

[](#kursanmeldungen)

- `GET /api/enrollments`: Liste der Kursanmeldungen des aktuell angemeldeten Benutzers.

### Instruktoren

[](#instruktoren)

- `PATCH /api/instructor/approve/{id}`: Kursanmeldung eines Schülers genehmigen (Status auf `active` setzen).
- `PATCH /api/instructor/reject/{id}`: Kursanmeldung eines Schülers ablehnen (Status auf `dropped` setzen).

### Kursfortschritt

[](#kursfortschritt)

- `GET /api/progress`: Kursfortschritt des aktuell angemeldeten Schülers.
- `GET /api/progress/instructor`: (Instruktoren) Liste der Schüler und deren Fortschritte für alle betreuten Kurse/Events.
- `PATCH /api/progress/{exerciseId}`: (Instruktoren) Übung als abgeschlossen markieren oder Notizen hinzufügen.
    - Erwartet JSON mit `status`, `dateCompleted` (Timestamp) und optional `notes`.

### Leihausrüstung

[](#leihausrüstung)

- `GET /api/equipment`: Liste der allgemeinen Ausrüstung.
    - Enthält nun zusätzliche Felder: `types`, `sub_type`, `type_label`, `sub_type_label`, `manufacturer_label`, `size_label` und `status_label`.
- `GET /api/equipment/{id}`: Details zu einem Ausrüstungsgegenstand.
    - Enthält nun zusätzliche Felder: `types`, `sub_type`, `type_label`, `sub_type_label`, `manufacturer_label`, `size_label` und `status_label`.
- `GET /api/equipment/options`: Liste aller verfügbaren Optionen für Ausrüstung (Typen, Hersteller, Größen).
    - Gibt ein JSON-Objekt mit den Schlüsseln `types`, `manufacturers` und `sizes` zurück.

### Tauchflaschen (Tanks)

[](#tauchflaschen-tanks)

- `GET /api/tanks`: Liste der verfügbaren Tauchflaschen.
    - **Sichtbarkeit:** Administratoren sehen alle Flaschen. Angemeldete Nutzer sehen ihre eigenen Flaschen (Status `owned`) sowie alle veröffentlichten Flaschen mit dem Status `available`. Gäste sehen alle veröffentlichten Flaschen.
    - **Filterung:** Unterstützt den Query-Parameter `status`.
        - `status=available`: Liefert alle veröffentlichten Flaschen mit dem Status `available` (z. B. für die Equipment-Auswahl).
        - `status=owned`: Liefert alle Flaschen mit dem Status `owned`, die dem aktuell angemeldeten Mitglied gehören (z. B. für TÜV-Reservierungen). Erfordert Authentifizierung.
- `GET /api/tanks/{id}`: Details zu einer bestimmten Flasche.
    - **Sicherheit:** Nur für Administratoren, den Besitzer oder bei öffentlicher Markierung zugänglich.
- `POST /api/tanks`: Neue Flasche anlegen.
    - **Pflichtfelder:** `title`, `serialNumber`, `size`.
    - **Besonderheit:** Der angemeldete Nutzer wird automatisch als Besitzer (`owner`) gesetzt, falls nicht anders angegeben.
- `PUT/PATCH /api/tanks/{id}`: Bestehende Flasche aktualisieren.
    - **Sicherheit:** Nur für Administratoren oder den Besitzer der Flasche erlaubt.
- `DELETE /api/tanks/{id}`: Flasche löschen.
    - **Sicherheit:** Nur für Administratoren oder den Besitzer der Flasche erlaubt.
- `GET /api/tanks/options`: Liste aller verfügbaren Optionen für Tauchflaschen (Größen, Hersteller).

#### Verfügbare Felder beim Speichern (Tanks):

[](#verfügbare-felder-beim-speichern-tanks)

Folgende Felder können via `POST` oder `PUT/PATCH` übertragen werden: `title`, `alias`, `status`, `rentalFee`, `serialNumber`, `manufacturer`, `bazNumber`, `size`, `o2clean`, `owner`, `checkId`, `lastCheckDate`, `nextCheckDate`, `lastOrder`, `addNotes`, `notes`, `published`, `start`, `stop`.

### Atemregler

[](#atemregler)

- `GET /api/regulators/{id}`: Details zum Atemregler.
- `GET /api/regulator/options`: Liste aller verfügbaren Optionen für Atemregler (Hersteller, Modelle 1. &amp; 2. Stufe).

### TÜV Prüfungen

[](#tüv-prüfungen)

- `GET /api/students`: Liste der registrierten Schüler.
- `GET /api/students/{id}`: Schülerdetails.
- `GET /api/tank-checks`: Liste der TÜV-Prüfvorschläge.
- `GET /api/tank-checks/{id}`: Details zum Prüfvorschlag inkl. verknüpfter Artikel.
- `POST /api/tank-checks/book`: Buchung einer TÜV-Prüfung für eine oder mehrere Flaschen.
    - Erwartet JSON mit `proposal_id` und einer Liste von `items` (Flaschendaten und gewählte Artikel-IDs).
    - Optional unterstützt: `notes` auf Buchungsebene sowie `notes` je Item/Flasche.
    - **Rückgabe:** Enthält den `total_price` der Buchung sowie eine Liste der `items` mit der berechneten `totalPrice`pro Flasche.
    - Beispiel Request: ```
        {
          "proposal_id": 12,
          "notes": "Bitte Rückruf bei Rückfragen.",
          "items": [
            {
              "serialNumber": "ABC123",
              "manufacturer": "Scubatech",
              "bazNumber": "B12345",
              "size": "12",
              "price": 25.00,
              "o2clean": true,
              "articles": [1, 3, 5],
              "notes": "Ventil klemmt gelegentlich"
            }
          ]
        }
        ```
    - Beispiel Response: ```
        {
          "success": true,
          "booking_number": "B-20260213-140700-123",
          "total_price": 45.50,
          "items": [
            {
              "serialNumber": "ABC123",
              "totalPrice": 45.50
            }
          ]
        }
        ```

### Authentifizierung

[](#authentifizierung)

- `POST /api/login`: Login für Frontend-Benutzer.
    - Erwartet JSON mit `username` und `password`.
    - Gibt bei Erfolg Benutzerdaten inkl. `role` zurück.
    - Prüft, ob die API in der `tl_dc_config` aktiviert wurde.
- `POST /api/logout`: Logout für Frontend-Benutzer.
    - Beendet die aktuelle Session.
- `GET /api/me`: Aktuelle Benutzerdaten inkl. `role` abrufen.
    - Erfordert eine aktive Session.
- `PATCH /api/me`: Eigene Benutzerdaten aktualisieren.
    - Erwartet JSON mit den zu ändernden Feldern (z.B. `firstname`, `lastname`, `email`, etc.).
    - Erfordert eine aktive Session.
- `PATCH /api/password`: Passwort ändern.
    - Erwartet JSON mit `currentPassword` und `newPassword`.
    - Erfordert eine aktive Session.

### App &amp; News

[](#app--news)

- `GET /api/app/config`: Liefert die globale App-Konfiguration (API-Status, Logo-Pfad, Info-Text, Impressum, Datenschutz, Nutzungsbedingungen, News-Archiv-ID).
- `GET /api/app/news`: Liste der News aus dem konfigurierten Archiv (inkl. Headline, Teaser und Vorschaubild).
    - Unterstützt Query-Parameter: `archive=[1,2]` (Liste von Archiv-IDs) und `limit=4` (Anzahl der Einträge).
- `GET /api/app/news/{id}`: Details zu einer News-Meldung.
    - Enthält nun zusätzlich ein `images` Array mit Pfaden zu allen Bildern aus den Inhaltselementen.
- `GET /api/app/news/details?id={id}`: Details zu einer News-Meldung via Query-Parameter.

### Mitglieder

[](#mitglieder)

- `GET /api/members`: Liste aller Mitglieder.
    - Antwortfelder: `mitglieds_id`, `name` (Nachname), `vorname`, `email`.
    - Gibt ein leeres Array zurück, wenn die API in der Diveclub-Konfiguration nicht aktiviert ist (`activateApi = true`erforderlich).
- Beispiel-Response: ```
    [
      {"mitglieds_id": 12, "name": "Muster", "vorname": "Max", "email": "max.muster@example.org"},
      {"mitglieds_id": 13, "name": "Beispiel", "vorname": "Erika", "email": "erika.beispiel@example.org"}
    ]
    ```

Konfiguration
-------------

[](#konfiguration)

Die Einstellungen für die App und die API werden im Contao Backend unter **Diveclub &gt; Einstellungen (tl\_dc\_config)**vorgenommen:

- **API aktivieren:** Schaltet den Zugriff für die App frei.
- **App-Logo:** Bilddatei für die Startseite.
- **Info-Text App:** Begrüßungstext für die Startseite.
- **Impressum (App):** Rechtliche Angaben für die App.
- **Datenschutzhinweise (App):** Hinweise zum Datenschutz für die App.
- **Nutzungsbedingungen (App):** Nutzungsbedingungen/AGB für die App.
- **News-Archiv:** Auswahl des Archivs, das in der App angezeigt werden soll.

Installation
------------

[](#installation)

1. Das Bundle via Composer hinzufügen: ```
    composer require diversworld/contao-dw-api-bundle
    ```
2. Contao Installtool ausführen oder Migrationen starten (inkl. neuer Felder): ```
    ddev php vendor/bin/contao-console contao:migrate -n
    ddev php vendor/bin/contao-console cache:clear --env=prod
    ```
3. Sicherstellen, dass das `diversworld/contao-diveclub-bundle` ebenfalls installiert ist, da dieses API-Bundle darauf aufbaut.

Anforderungen
-------------

[](#anforderungen)

- Contao 5.3 oder höher (optimiert für Contao 5.7)
- PHP 8.2 oder höher
- `diversworld/contao-diveclub-bundle`

Kompatibilität &amp; Modernisierung
-----------------------------------

[](#kompatibilität--modernisierung)

Das Bundle wurde für **Contao 5.7** und **Symfony 7** optimiert:

- **Routing:** Verwendung von PHP 8 Attributen (`#[Route]`) statt Annotationen. Durch die explizite Angabe des Typs `attribute` im `ContaoManager` Plugin wird die Kompatibilität mit Contao 5.3+ sichergestellt.
- **Security:** Nutzung des `UserPasswordHasherInterface` und `IsGranted` Attributen.
- **String Handling:** Umstellung auf `StringUtil::restoreBasicEntities()` für volle Kompatibilität mit Contao 5+.

###  Health Score

44

—

FairBetter than 92% of packages

Maintenance91

Actively maintained with recent releases

Popularity12

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity57

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

29

Last Release

48d ago

Major Versions

0.1.7 → 1.0.02026-02-18

### Community

Maintainers

![](https://www.gravatar.com/avatar/14e24177ea8533f12c20f5a91d3d2e80ecfe7de16c29ca9a4886770761ac3960?d=identicon)[diversworld](/maintainers/diversworld)

---

Top Contributors

[![diversworld](https://avatars.githubusercontent.com/u/3169414?v=4)](https://github.com/diversworld "diversworld (59 commits)")

---

Tags

apicontaocontao-bundledivingdiveclubcourse-managementios-appequipment-managementdiversworld

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/diversworld-contao-dw-api-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/diversworld-contao-dw-api-bundle/health.svg)](https://phpackages.com/packages/diversworld-contao-dw-api-bundle)
```

###  Alternatives

[dieschittigs/contao-content-api

Access Contao content via an easy to use JSON-API

412.4k1](/packages/dieschittigs-contao-content-api)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
