# LicServer API Spezifikation (v1) Dokumentation der REST-Schnittstellen des CASPOS Lizenzservers. ## 1. Endpunkte (Port 9981 - Activation API) ### Activation (Aktivierung) #### `POST /v1/activate` Aktiviert eine neue Lizenz. **Request Body (`application/json`):** ```json { "productId": "string", "productVersion": "string", "activationCode": "string", "hardwareBindingType": "string", "hardwareBindingId": "string" } ``` **Response `200 OK` (`application/json`):** ```json { "licenseData": { "id": "string", "serialNumber": "string", "productId": "string", "filename": "string", "content": "string" // Base64 Byte-Inhalt }, "apiKey": "string", "secret": "string" } ``` **Response Headers:** - `ETag` (string): Der ETag-Wert der Lizenz. --- #### `POST /v1/activate-existing` Aktiviert eine bereits vorhandene Lizenz erneut. **Request Body (`application/json`):** ```json { "productId": "string", "productVersion": "string", "serialNumber": "string", "proofOfPossessionHash": "string", "salt": "string", "hardwareBindingType": "string", "hardwareBindingId": "string" } ``` **Response `200 OK` (`application/json`):** *Gleiche Struktur wie bei `/v1/activate`.* --- ### Licenses (Lizenzen) #### `GET /v1/licenses/{id}` Holt die Lizenz-Details zu einer bestimmten Lizenz-ID. **Request Parameters:** - `id` (path, string, required): Die UUID der Lizenz. - `If-None-Match` (header, string, optional): ETag zur Cache-Validierung. **Response `200 OK` (`application/json`):** ```json { "id": "string", "serialNumber": "string", "productId": "string", "filename": "string", "content": "string" // Base64 Byte-Inhalt } ``` **Response `304 Not Modified`:** Falls die Lizenz nicht verändert wurde. **Response `404 Not Found` / `403 Forbidden`:** Standard Fehlerobjekt `ProblemDetails`. --- ## 2. Endpunkte (Port 9980 - Management API) Alle Anfragen an die Management-API müssen authentifiziert sein. - **Header-Format:** `X-Api-Key: ` ### Partners (Partner) #### `GET /api-v1/partners` Gibt eine paginierte Liste aller Partner zurück. **Request Parameters (Query):** - `search` (string, optional): Filtert nach Name/E-Mail. - `page` (integer, default: 1) - `pageSize` (integer, default: 20) **Response `200 OK` (`application/json`):** ```json { "page": 1, "pageSize": 20, "totalCount": 1, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false, "items": [ { "id": "string (UUID)", "name": "string", "email": "string", "erpId": "string" } ] } ``` #### `GET /api-v1/partners/{id}` Holt Partner-Details zu einer bestimmten ID. **Response `200 OK` (`application/json`):** ```json { "id": "string (UUID)", "name": "string", "email": "string", "erpId": "string" } ``` ### Customers (Kunden von Partnern) #### `GET /api-v1/partners/{partnerId}/customers` Gibt eine paginierte Liste aller Kunden eines bestimmten Partners zurück. **Request Parameters (Query):** - `search` (string, optional): Filtert nach Name/E-Mail. - `page` (integer, default: 1) - `pageSize` (integer, default: 20) **Response `200 OK` (`application/json`):** ```json { "page": 1, "pageSize": 20, "totalCount": 1, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false, "items": [ { "id": "string (UUID)", "name": "string", "street": "string", "houseNumber": "string", "houseNumberAddon": "string", "zipCode": "string", "city": "string", "countryCode": "string", "email": "string", "partnerId": "string (UUID)", "erpId": "string" } ] } ``` #### `GET /api-v1/partners/{partnerId}/customers/{customerId}` Holt detaillierte Kundeninformationen. **Response `200 OK` (`application/json`):** ```json { "id": "string (UUID)", "name": "string", "street": "string", "houseNumber": "string", "houseNumberAddon": "string", "zipCode": "string", "city": "string", "countryCode": "string", "email": "string", "partnerId": "string (UUID)", "erpId": "string", "partnerName": "string", "taxNumber": "string", "vatIdNumber": "string", "notes": "string", "locations": [] } ``` --- ## 3. Typen & Schemas ### `LicenseData` ```json { "id": "string", "serialNumber": "string", "productId": "string", "filename": "string", "content": "string" // Base64 Byte-Inhalt } ``` ### `ProblemDetails` ```json { "type": "string", "title": "string", "status": 0, "detail": "string", "instance": "string" } ```