turash/bugulma/backend/API_REFERENCE.md
Damir Mukimov 000eab4740
Major repository reorganization and missing backend endpoints implementation
Repository Structure:
- Move files from cluttered root directory into organized structure
- Create archive/ for archived data and scraper results
- Create bugulma/ for the complete application (frontend + backend)
- Create data/ for sample datasets and reference materials
- Create docs/ for comprehensive documentation structure
- Create scripts/ for utility scripts and API tools

Backend Implementation:
- Implement 3 missing backend endpoints identified in gap analysis:
  * GET /api/v1/organizations/{id}/matching/direct - Direct symbiosis matches
  * GET /api/v1/users/me/organizations - User organizations
  * POST /api/v1/proposals/{id}/status - Update proposal status
- Add complete proposal domain model, repository, and service layers
- Create database migration for proposals table
- Fix CLI server command registration issue

API Documentation:
- Add comprehensive proposals.md API documentation
- Update README.md with Users and Proposals API sections
- Document all request/response formats, error codes, and business rules

Code Quality:
- Follow existing Go backend architecture patterns
- Add proper error handling and validation
- Match frontend expected response schemas
- Maintain clean separation of concerns (handler -> service -> repository)
2025-11-25 06:01:16 +01:00

584 lines
9.5 KiB
Markdown

# API Reference
## Base URL
```
http://localhost:8080
```
## Data Model Terminology
**Organization**: The unified entity representing all types of organizations (businesses, cultural institutions, government buildings, healthcare facilities, etc.). In the API and database, we use:
- `organization_id` - Identifier for any organization
- `owner_organization_id` - Organization that owns a site/resource
**Note**: Some backend field names still use legacy `business_id` and `owner_business_id` - these will be refactored to `organization_id` and `owner_organization_id` for consistency.
## Endpoints
### Health & Status
#### Health Check
```http
GET /health
```
**Response:**
```json
{
"status": "healthy",
"database": "connected",
"graph_db": "enabled|disabled",
"api_version": "v1"
}
```
#### Platform Statistics
```http
GET /api/stats
```
**Response:**
```json
{
"total_organizations": 42,
"total_sites": 15,
"platform_status": "active",
"api_version": "v1",
"graph_enabled": true
}
```
---
## Organizations
### List Organizations
```http
GET /api/organizations
```
### Get Organization by ID
```http
GET /api/organizations/:id
```
### Get Organizations by Subtype
```http
GET /api/organizations/subtype/:subtype
```
Subtypes: `commercial`, `cultural`, `government`, `religious`, `educational`, `infrastructure`, `healthcare`, `other`
### Get Organizations by Sector
```http
GET /api/organizations/sector/:sector
```
### Get Organizations by Certification
```http
GET /api/organizations/certification/:cert
```
Example: `/api/organizations/certification/ISO9001`
### Get Nearby Organizations
```http
GET /api/organizations/nearby?lat=52.52&lng=13.40&radius=10
```
**Query Parameters:**
- `lat` (required): Latitude
- `lng` (required): Longitude
- `radius` (required): Radius in kilometers
### Create Organization
```http
POST /api/organizations
Content-Type: application/json
```
**Request Body:**
```json
{
"name": "Berlin Recycling GmbH",
"sector": "waste_management",
"subtype": "commercial",
"description": "Industrial waste recycling facility",
"logoUrl": "https://example.com/logo.png",
"website": "https://example.com",
"address": "Alexanderplatz 1, Berlin",
"latitude": 52.5200,
"longitude": 13.4050,
"legalForm": "GmbH",
"primaryContactEmail": "info@example.com",
"primaryContactPhone": "+49 30 12345678",
"industrialSector": "38",
"companySize": 50,
"yearsOperation": 15,
"supplyChainRole": "manufacturer",
"certifications": ["ISO9001", "ISO14001"],
"businessFocus": ["waste_recycling", "circular_economy"],
"strategicVision": "Leading sustainable waste management",
"driversBarriers": "Cost reduction, regulatory compliance",
"readinessMaturity": 4,
"trustScore": 0.85,
"technicalExpertise": ["waste_processing", "material_recovery"],
"availableTechnology": ["sorting_equipment", "compactors"],
"managementSystems": ["ERP", "WMS"],
"sellsProducts": [
{
"name": "Recycled PET",
"category": "plastics",
"unit_price": 1200.50,
"moq": 1000,
"certifications": ["REACH"]
}
],
"offersServices": [
{
"type": "maintenance",
"domain": "compressors",
"on_site": true,
"hourly_rate": 85.0,
"service_area_km": 50,
"certifications": ["ISO50001"]
}
],
"needsServices": [
{
"type": "consulting",
"urgency": "medium",
"budget": 5000.0
}
],
"yearBuilt": "2005",
"verified": false,
"notes": "Expanding operations",
"sources": ["company_website", "public_registry"],
"trustNetwork": ["org-id-1", "org-id-2"],
"existingSymbioticRelationships": ["org-id-3"]
}
```
**All fields are optional except `name`, `sector`, and `subtype`.**
### Update Organization
```http
PUT /api/organizations/:id
Content-Type: application/json
```
Same body as Create.
### Delete Organization
```http
DELETE /api/organizations/:id
```
---
## Sites
### List Sites
```http
GET /api/sites
```
### Get Site by ID
```http
GET /api/sites/:id
```
### Get Nearby Sites
```http
GET /api/sites/nearby?lat=52.52&lng=13.40&radius=5
```
### Create Site
```http
POST /api/sites
Content-Type: application/json
```
**Request Body:**
```json
{
"name": "Main Processing Plant",
"address": "Industriestraße 10, Berlin",
"latitude": 52.5100,
"longitude": 13.3900,
"site_type": "industrial_site",
"floor_area_m2": 5000,
"ownership": "owned",
"owner_organization_id": "org-uuid",
"available_utilities": ["electricity", "water", "gas"],
"parking_spaces": 20,
"loading_docks": 4,
"crane_capacity_tonnes": 10.0,
"energy_rating": "B"
}
```
### Update Site
```http
PUT /api/sites/:id
```
### Delete Site
```http
DELETE /api/sites/:id
```
---
## Resource Flows
### Get Resource Flow by ID
```http
GET /api/resources/:id
```
### Get Resource Flows by Site
```http
GET /api/resources/site/:siteId
```
### Get Resource Flows by Organization
```http
GET /api/resources/organization/:organizationId
```
### Create Resource Flow
```http
POST /api/resources
Content-Type: application/json
```
**Request Body:**
```json
{
"organization_id": "org-uuid",
"site_id": "site-uuid",
"direction": "output",
"type": "heat",
"quality": {
"temperature_celsius": 85.0,
"pressure_bar": 2.5,
"purity_percent": 95.0
},
"quantity": {
"value": 1000.0,
"unit": "kWh",
"frequency": "hourly"
},
"time_profile": {
"availability": "24/7",
"seasonal_variation": false
},
"economic_data": {
"cost_per_unit": 0.08,
"currency": "EUR"
},
"constraints": {
"min_volume": 500.0,
"max_distance_km": 10.0
},
"service_details": {
"type": "maintenance",
"domain": "HVAC"
},
"precision_level": "measured",
"source_type": "declared"
}
```
### Delete Resource Flow
```http
DELETE /api/resources/:id
```
---
## Matching Engine
### Find Matches
```http
POST /api/matching/find-matches
Content-Type: application/json
```
**Request Body:**
```json
{
"resource_type": "heat",
"max_distance_km": 10.0,
"min_compatibility": 0.6,
"min_economic_score": 0.5,
"min_overall_score": 0.65
}
```
**Response:**
```json
{
"criteria": {
"resource_type": "heat",
"max_distance_km": 10.0,
"min_compatibility": 0.6,
"min_economic_score": 0.5,
"min_overall_score": 0.65,
"include_multi_party": false
},
"matches": [
{
"id": "match-uuid",
"source_flow_id": "flow-uuid-1",
"target_flow_id": "flow-uuid-2",
"compatibility_score": 0.85,
"economic_score": 0.75,
"overall_score": 0.80,
"distance_km": 3.2
}
],
"count": 1
}
```
### Create Match
```http
POST /api/matching/create
Content-Type: application/json
```
**Status:** Not yet implemented (returns 501)
### Update Match Status
```http
PUT /api/matching/status/:matchId
```
**Status:** Not yet implemented (returns 501)
---
## Field Types & Enums
### Organization Subtype
- `commercial`
- `cultural`
- `government`
- `religious`
- `educational`
- `infrastructure`
- `healthcare`
- `other`
### Legal Form
- `LLC`
- `corporation`
- `partnership`
- `sole_proprietorship`
- `GmbH`
- `UG`
- `AG`
### Supply Chain Role
- `manufacturer`
- `supplier`
- `distributor`
- `consumer`
### Site Type
- `industrial_site`
- `commercial_building`
- `office_space`
- `warehouse`
- `cultural_site`
- `religious_site`
- `government_building`
- `educational_facility`
- `healthcare_facility`
- `infrastructure`
- `mixed_use`
### Site Ownership
- `owned`
- `leased`
- `shared`
- `public`
### Resource Direction
- `input` (needed)
- `output` (available)
### Resource Type
- `heat`
- `electricity`
- `water`
- `materials`
- `waste`
- `services`
### Precision Level
- `estimated`
- `modeled`
- `measured`
### Source Type
- `declared`
- `verified`
- `metered`
---
## Error Responses
### 400 Bad Request
```json
{
"error": "Validation error message"
}
```
### 404 Not Found
```json
{
"error": "Organization not found"
}
```
### 500 Internal Server Error
```json
{
"error": "Internal server error message"
}
```
### 501 Not Implemented
```json
{
"message": "Feature to be implemented"
}
```
---
## Authentication
**Status:** Not yet implemented
All write operations (POST, PUT, DELETE) currently work without authentication. In production, these will require JWT authentication:
```http
Authorization: Bearer <jwt_token>
```
---
## Examples
### Create a Complete Organization
```bash
curl -X POST http://localhost:8080/api/organizations \
-H "Content-Type: application/json" \
-d '{
"name": "EcoTech Innovations",
"sector": "manufacturing",
"subtype": "commercial",
"description": "Sustainable technology manufacturer",
"address": "Tech Park 5, Berlin",
"latitude": 52.5200,
"longitude": 13.4050,
"legalForm": "GmbH",
"primaryContactEmail": "contact@ecotech.de",
"companySize": 100,
"yearsOperation": 8,
"supplyChainRole": "manufacturer",
"certifications": ["ISO14001", "ISO50001"],
"readinessMaturity": 4,
"trustScore": 0.9,
"sellsProducts": [
{
"name": "Solar Panel",
"category": "renewable_energy",
"unit_price": 250.0,
"moq": 10
}
]
}'
```
### Find Heat Matches Nearby
```bash
curl -X POST http://localhost:8080/api/matching/find-matches \
-H "Content-Type: application/json" \
-d '{
"resource_type": "heat",
"max_distance_km": 5,
"min_compatibility": 0.7,
"min_overall_score": 0.75
}'
```
### Search Organizations by Certification
```bash
curl http://localhost:8080/api/organizations/certification/ISO14001
```