Bỏ qua

REST API

Authentication

Login

Đăng nhập và lấy access token.

POST /login/access-token
Content-Type: application/x-www-form-urlencoded

Request Body:

username=admin@greenmap.hanoi&password=yourpassword

Response:

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer"
}


Users

Get Current User

GET /users/me
Authorization: Bearer <token>

Response:

{
  "id": 1,
  "email": "admin@greenmap.hanoi",
  "full_name": "Admin User",
  "role": "admin",
  "is_active": true
}

Create User

POST /users/
Authorization: Bearer <admin_token>
Content-Type: application/json

Request Body:

{
  "email": "user@example.com",
  "password": "securepassword",
  "full_name": "New User",
  "role": "citizen"
}

List Users (Admin only)

GET /users/?skip=0&limit=20
Authorization: Bearer <admin_token>

Reports

Create Report

POST /reports/
Authorization: Bearer <token>
Content-Type: multipart/form-data

Request Body:

title: Rác thải chưa thu gom
description: Bãi rác lớn tại góc đường...
latitude: 21.0285
longitude: 105.8542
image: [file]

Response:

{
  "id": 123,
  "title": "Rác thải chưa thu gom",
  "description": "Bãi rác lớn tại góc đường...",
  "latitude": 21.0285,
  "longitude": 105.8542,
  "image_url": "/uploads/reports/abc123.jpg",
  "status": "PENDING",
  "created_at": "2025-12-10T14:30:00Z"
}

List Reports

GET /reports/?status=PENDING&skip=0&limit=20
Authorization: Bearer <token>

Query Parameters:

Param Type Description
status string Filter by status (PENDING, APPROVED, REJECTED)
skip int Pagination offset
limit int Number of items per page

Update Report Status

PUT /reports/{id}
Authorization: Bearer <admin_token>
Content-Type: application/json

Request Body:

{
  "status": "APPROVED"
}


Locations

List Locations

GET /locations/?type=park
Authorization: Bearer <token>

Query Parameters:

Param Type Description
type string Filter by type (park, charging, bicycle, tourist)
lat float Center latitude for geo query
lng float Center longitude for geo query
radius float Radius in km

Create Location

POST /locations/
Authorization: Bearer <admin_token>
Content-Type: application/json

Request Body:

{
  "name": "Công viên Thống Nhất",
  "type": "park",
  "latitude": 21.0117,
  "longitude": 105.8442,
  "description": "Công viên lớn nhất Hà Nội",
  "metadata": {
    "area": 50000,
    "facilities": ["playground", "lake", "jogging_track"]
  }
}

Update Location

PUT /locations/{id}
Authorization: Bearer <admin_token>

Delete Location

DELETE /locations/{id}
Authorization: Bearer <admin_token>

System

Health Check

GET /system/health

Response:

{
  "status": "healthy",
  "database": "connected",
  "broker": "connected",
  "version": "1.0.0"
}