20 KiB
LDPv2 Backend API Documentation
Base URL
http://localhost:8080/api
Authentication
Login
POST /auth/login
Request Body:
{
"username": "string",
"password": "string"
}
Response:
{
"token": "string",
"type": "Bearer",
"user": {
"id": "uuid",
"username": "string",
"email": "string",
"role": "ADMIN | USER",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
}
Register
POST /auth/register
Request Body:
{
"username": "string (3-50 chars)",
"email": "string (valid email)",
"password": "string (min 6 chars)"
}
Response: Same as Login
Business Units
Create Business Unit
POST /business-units
Auth Required: Yes
Request Body:
{
"name": "string (required, max 255)",
"description": "string (optional)"
}
Response:
{
"id": "uuid",
"name": "string",
"description": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update Business Unit
PUT /business-units/{id}
Auth Required: Yes
Request Body:
{
"name": "string (optional, max 255)",
"description": "string (optional)"
}
Response: Same as Create
Get Business Unit by ID
GET /business-units/{id}
Auth Required: Yes
Response: Same as Create
List Business Units
GET /business-units
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)sortBy(default: "name")sortDirection(default: "asc", values: "asc" | "desc")
Response:
{
"content": [BusinessUnitResponse],
"totalElements": "number",
"totalPages": "number",
"size": "number",
"number": "number"
}
Search Business Units
GET /business-units/search
Auth Required: Yes
Query Parameters:
q(required) - search querypage(default: 0)size(default: 20)
Response: Same as List
Delete Business Unit
DELETE /business-units/{id}
Auth Required: Yes
Response: 204 No Content
Environments
Create Environment
POST /environments
Auth Required: Yes
Request Body:
{
"name": "string (required, max 100)",
"description": "string (optional)",
"isProduction": "boolean (default: false)",
"criticalityLevel": "integer (1-5, optional)"
}
Response:
{
"id": "uuid",
"name": "string",
"description": "string",
"isProduction": "boolean",
"criticalityLevel": "integer",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update Environment
PUT /environments/{id}
Auth Required: Yes
Request Body:
{
"name": "string (optional, max 100)",
"description": "string (optional)",
"isProduction": "boolean (optional)",
"criticalityLevel": "integer (1-5, optional)"
}
Response: Same as Create
Get Environment by ID
GET /environments/{id}
Auth Required: Yes
Response: Same as Create
List Environments
GET /environments
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)sortBy(default: "name")sortDirection(default: "asc")
Response: Paginated list of environments
Search Environments
GET /environments/search
Auth Required: Yes
Query Parameters:
query(required)page(default: 0)size(default: 20)
Response: Paginated list of environments
Delete Environment
DELETE /environments/{id}
Auth Required: Yes
Response: 204 No Content
Applications
Create Application
POST /applications
Auth Required: Yes
Request Body:
{
"name": "string (required, max 255)",
"description": "string (optional)",
"status": "IDEA | IN_DEVELOPMENT | IN_SERVICE | MAINTENANCE | DECOMMISSIONED (required)",
"businessUnitId": "uuid (required)",
"endOfLifeDate": "date (optional)",
"endOfSupportDate": "date (optional)"
}
Response:
{
"id": "uuid",
"name": "string",
"description": "string",
"status": "ApplicationStatus",
"businessUnit": {
"id": "uuid",
"name": "string"
},
"endOfLifeDate": "date",
"endOfSupportDate": "date",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update Application
PUT /applications/{id}
Auth Required: Yes
Request Body:
{
"name": "string (optional, max 255)",
"description": "string (optional)",
"status": "ApplicationStatus (optional)",
"businessUnitId": "uuid (optional)",
"endOfLifeDate": "date (optional)",
"endOfSupportDate": "date (optional)"
}
Response: Same as Create
Update Application Status
PATCH /applications/{id}/status
Auth Required: Yes
Query Parameters:
status(required) - ApplicationStatus enum value
Response: Same as Create
Get Application by ID
GET /applications/{id}
Auth Required: Yes
Response: Same as Create
List Applications
GET /applications
Auth Required: Yes
Query Parameters:
status(optional) - filter by statusbusinessUnitId(optional) - filter by business unitname(optional) - search by namepage(default: 0)size(default: 20)sortBy(default: "name")sortDirection(default: "asc")
Response: Paginated list of applications
Get Applications by Status
GET /applications/by-status/{status}
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)
Response: Paginated list of applications
Get Applications by Business Unit
GET /applications/by-business-unit/{businessUnitId}
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)
Response: Paginated list of applications
Delete Application
DELETE /applications/{id}
Auth Required: Yes
Response: 204 No Content
Get Application Contacts
GET /applications/{applicationId}/contacts
Auth Required: Yes
Response:
[
{
"applicationId": "uuid",
"contact": {
"id": "uuid",
"contactRole": {
"id": "uuid",
"roleName": "string",
"description": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
},
"persons": [
{
"person": {
"id": "uuid",
"firstName": "string",
"lastName": "string",
"email": "string",
"phone": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
},
"isPrimary": "boolean"
}
],
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
}
]
Add Contact to Application
POST /applications/{applicationId}/contacts
Auth Required: Yes
Request Body:
{
"contactId": "uuid (required)"
}
Response: Application contact response
Remove Contact from Application
DELETE /applications/{applicationId}/contacts/{contactId}
Auth Required: Yes
Response: 204 No Content
Versions
Create Version
POST /applications/{applicationId}/versions
Auth Required: Yes
Request Body:
{
"versionIdentifier": "string (required, max 100)",
"externalReference": "string (optional, max 500)",
"releaseDate": "date (required, not in future)",
"endOfLifeDate": "date (optional, must be after releaseDate)"
}
Response:
{
"id": "uuid",
"applicationId": "uuid",
"applicationName": "string",
"versionIdentifier": "string",
"externalReference": "string",
"releaseDate": "date",
"endOfLifeDate": "date",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update Version
PUT /applications/{applicationId}/versions/{id}
Auth Required: Yes
Request Body:
{
"versionIdentifier": "string (optional, max 100)",
"externalReference": "string (optional, max 500)",
"releaseDate": "date (optional, not in future)",
"endOfLifeDate": "date (optional)"
}
Response: Same as Create
Get Version by ID
GET /applications/{applicationId}/versions/{id}
Auth Required: Yes
Response: Same as Create
List Versions for Application
GET /applications/{applicationId}/versions
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)sortBy(default: "releaseDate")sortDirection(default: "desc")
Response: Paginated list of versions
Get Latest Version
GET /applications/{applicationId}/versions/latest
Auth Required: Yes
Response: Version response or 404
Delete Version
DELETE /applications/{applicationId}/versions/{id}
Auth Required: Yes
Response: 204 No Content
Deployments
Record Deployment
POST /deployments
Auth Required: Yes
Request Body:
{
"applicationId": "uuid (required)",
"versionId": "uuid (required)",
"environmentId": "uuid (required)",
"deploymentDate": "timestamp (required, not in future)",
"deployedBy": "string (optional)",
"notes": "string (optional)"
}
Response:
{
"id": "uuid",
"application": {
"id": "uuid",
"name": "string",
"status": "ApplicationStatus",
"businessUnitName": "string"
},
"version": {
"id": "uuid",
"versionIdentifier": "string",
"releaseDate": "date"
},
"environment": {
"id": "uuid",
"name": "string",
"isProduction": "boolean"
},
"deploymentDate": "timestamp",
"deployedBy": "string",
"notes": "string",
"createdAt": "timestamp"
}
Get Deployment by ID
GET /deployments/{id}
Auth Required: Yes
Response: Same as Record
List Deployments
GET /deployments
Auth Required: Yes
Query Parameters:
applicationId(optional)environmentId(optional)versionId(optional)dateFrom(optional, ISO timestamp)dateTo(optional, ISO timestamp)page(default: 0)size(default: 20)sortBy(default: "deploymentDate")sortDirection(default: "desc")
Response: Paginated list of deployments
Get Current Deployment State
GET /deployments/current
Auth Required: Yes
Query Parameters:
applicationId(optional)environmentId(optional)
Response:
[
{
"application": {
"id": "uuid",
"name": "string",
"status": "ApplicationStatus",
"businessUnitName": "string"
},
"environment": {
"id": "uuid",
"name": "string",
"isProduction": "boolean"
},
"version": {
"id": "uuid",
"versionIdentifier": "string",
"releaseDate": "date"
},
"deploymentDate": "timestamp",
"deployedBy": "string"
}
]
Get Deployments by Application
GET /deployments/by-application/{applicationId}
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)
Response: Paginated list of deployments
Get Deployments by Environment
GET /deployments/by-environment/{environmentId}
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)
Response: Paginated list of deployments
Persons
Create Person
POST /persons
Auth Required: Yes
Request Body:
{
"firstName": "string (required, max 100)",
"lastName": "string (required, max 100)",
"email": "string (required, valid email)",
"phone": "string (optional, max 50)"
}
Response:
{
"id": "uuid",
"firstName": "string",
"lastName": "string",
"email": "string",
"phone": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update Person
PUT /persons/{id}
Auth Required: Yes
Request Body:
{
"firstName": "string (optional, max 100)",
"lastName": "string (optional, max 100)",
"email": "string (optional, valid email)",
"phone": "string (optional, max 50)"
}
Response: Same as Create
Get Person by ID
GET /persons/{id}
Auth Required: Yes
Response: Same as Create
List Persons
GET /persons
Auth Required: Yes
Query Parameters:
name(optional) - search by first or last namepage(default: 0)size(default: 20)sortBy(default: "lastName")sortDirection(default: "asc")
Response: Paginated list of persons
Delete Person
DELETE /persons/{id}
Auth Required: Yes
Response: 204 No Content
Contact Roles
Create Contact Role
POST /contact-roles
Auth Required: Admin only
Request Body:
{
"roleName": "string (required, max 100)",
"description": "string (optional)"
}
Response:
{
"id": "uuid",
"roleName": "string",
"description": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
List Contact Roles
GET /contact-roles
Auth Required: Yes
Response: Array of contact role responses
Contacts
Create Contact
POST /contacts
Auth Required: Yes
Request Body:
{
"contactRoleId": "uuid (required)",
"personIds": ["uuid"] (required, at least one),
"primaryPersonId": "uuid (required, must be in personIds)"
}
Response:
{
"id": "uuid",
"contactRole": {
"id": "uuid",
"roleName": "string",
"description": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
},
"persons": [
{
"person": {
"id": "uuid",
"firstName": "string",
"lastName": "string",
"email": "string",
"phone": "string",
"createdAt": "timestamp",
"updatedAt": "timestamp"
},
"isPrimary": "boolean"
}
],
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Get Contact by ID
GET /contacts/{id}
Auth Required: Yes
Response: Same as Create
List Contacts
GET /contacts
Auth Required: Yes
Response: Array of contact responses
Add Person to Contact
POST /contacts/{contactId}/persons/{personId}
Auth Required: Yes
Query Parameters:
isPrimary(default: false)
Response: Contact response
Remove Person from Contact
DELETE /contacts/{contactId}/persons/{personId}
Auth Required: Yes
Response: Contact response
Set Primary Person
PATCH /contacts/{contactId}/persons/{personId}/primary
Auth Required: Yes
Response: Contact response
Delete Contact
DELETE /contacts/{id}
Auth Required: Yes
Response: 204 No Content
Dependency Types
Create Dependency Type
POST /dependency-types
Auth Required: Admin only
Request Body:
{
"typeName": "string (required, max 100)",
"description": "string (optional)"
}
Response:
{
"id": "uuid",
"typeName": "string",
"description": "string",
"isCustom": "boolean",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update Dependency Type
PUT /dependency-types/{id}
Auth Required: Admin only
Request Body:
{
"typeName": "string (optional, max 100)",
"description": "string (optional)"
}
Response: Same as Create
Get Dependency Type by ID
GET /dependency-types/{id}
Auth Required: Yes
Response: Same as Create
List Dependency Types
GET /dependency-types
Auth Required: Yes
Response: Array of dependency type responses
Delete Dependency Type
DELETE /dependency-types/{id}
Auth Required: Admin only
Response: 204 No Content
External Dependencies
Create External Dependency
POST /dependencies/for-application/{applicationId}
Auth Required: Yes
Request Body:
{
"dependencyTypeId": "uuid (required)",
"name": "string (required, max 255)",
"description": "string (optional)",
"technicalDocumentation": "string (optional)",
"validityStartDate": "date (optional)",
"validityEndDate": "date (optional, must be >= startDate)"
}
Response:
{
"id": "uuid",
"application": {
"id": "uuid",
"name": "string",
"status": "ApplicationStatus",
"businessUnitName": "string"
},
"dependencyType": {
"id": "uuid",
"typeName": "string",
"description": "string",
"isCustom": "boolean",
"createdAt": "timestamp",
"updatedAt": "timestamp"
},
"name": "string",
"description": "string",
"technicalDocumentation": "string",
"validityStartDate": "date",
"validityEndDate": "date",
"isActive": "boolean",
"daysUntilExpiration": "integer (nullable)",
"status": "ACTIVE | EXPIRING | EXPIRED | NOT_YET_VALID",
"createdAt": "timestamp",
"updatedAt": "timestamp"
}
Update External Dependency
PUT /dependencies/{id}
Auth Required: Yes
Request Body:
{
"dependencyTypeId": "uuid (optional)",
"name": "string (optional, max 255)",
"description": "string (optional)",
"technicalDocumentation": "string (optional)",
"validityStartDate": "date (optional)",
"validityEndDate": "date (optional)"
}
Response: Same as Create
Get External Dependency by ID
GET /dependencies/{id}
Auth Required: Yes
Response: Same as Create
List External Dependencies
GET /dependencies
Auth Required: Yes
Query Parameters:
applicationId(optional)dependencyTypeId(optional)status(optional) - ACTIVE | EXPIRING | EXPIRED | NOT_YET_VALIDpage(default: 0)size(default: 20)sortBy(default: "name")sortDirection(default: "asc")
Response: Paginated list of external dependencies
Get Dependencies by Application
GET /dependencies/by-application/{applicationId}
Auth Required: Yes
Query Parameters:
page(default: 0)size(default: 20)
Response: Paginated list of external dependencies
Get Expiring Dependencies
GET /dependencies/expiring
Auth Required: Yes
Query Parameters:
days(default: 30) - number of days to look ahead
Response: Array of external dependencies expiring within specified days
Get Expired Dependencies
GET /dependencies/expired
Auth Required: Yes
Response: Array of expired external dependencies
Delete External Dependency
DELETE /dependencies/{id}
Auth Required: Yes
Response: 204 No Content
Enums
ApplicationStatus
IDEA- IdeaIN_DEVELOPMENT- In DevelopmentIN_SERVICE- In ServiceMAINTENANCE- MaintenanceDECOMMISSIONED- Decommissioned
User Roles
ADMIN- AdministratorUSER- Regular User
Dependency Status (Computed)
ACTIVE- Currently validEXPIRING- Expires within 30 daysEXPIRED- Past end dateNOT_YET_VALID- Before start date
Error Responses
All endpoints may return the following error responses:
400 Bad Request
{
"timestamp": "timestamp",
"status": 400,
"message": "Error message",
"errors": {
"fieldName": "Field error message"
}
}
401 Unauthorized
{
"timestamp": "timestamp",
"status": 401,
"message": "Invalid username or password"
}
404 Not Found
{
"timestamp": "timestamp",
"status": 404,
"message": "Resource not found with id: {id}"
}
500 Internal Server Error
{
"timestamp": "timestamp",
"status": 500,
"message": "An unexpected error occurred",
"details": "Error details"
}
Authentication Headers
All authenticated endpoints require the following header:
Authorization: Bearer {jwt_token}
The JWT token is obtained from the /auth/login or /auth/register endpoints.
Pagination
Paginated responses follow this structure:
{
"content": [],
"pageable": {
"sort": {
"sorted": "boolean",
"unsorted": "boolean",
"empty": "boolean"
},
"pageNumber": "integer",
"pageSize": "integer",
"offset": "integer",
"paged": "boolean",
"unpaged": "boolean"
},
"totalPages": "integer",
"totalElements": "integer",
"last": "boolean",
"first": "boolean",
"numberOfElements": "integer",
"size": "integer",
"number": "integer",
"sort": {
"sorted": "boolean",
"unsorted": "boolean",
"empty": "boolean"
},
"empty": "boolean"
}
Notes
- All dates are in ISO-8601 format (
YYYY-MM-DD) - All timestamps are in ISO-8601 format with timezone (
YYYY-MM-DDTHH:mm:ss.SSSZ) - UUIDs are in standard format (
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) - The API uses JSON for request and response bodies
- Swagger UI is available at
/swagger-ui.htmlfor interactive API documentation - Health check endpoint:
/actuator/health(no auth required)