Visão Geral

Esta API, construída com Cloudflare Workers, permite o upload de imagens para o R2, recuperação de imagens, validação de relatos no Firestore, listagem de usuários e análise de imagens via uma API externa.

URL Base: https://mapazzz-backend.mapzzz.workers.dev

Endpoints

POST /upload GET /image/:filename POST /validate GET /users POST /analyze

Endpoints Detalhados

POST /upload

Envia uma imagem para o bucket R2.

Formato da Requisição: multipart/form-data com campo image.

Resposta: Texto simples (ex.: "Imagem nome.jpg salva no R2!")

"Imagem teste.jpg salva no R2!"

GET /image/:filename

Recupera uma imagem do R2 pelo nome do arquivo.

Parâmetro: :filename (ex.: "imagens/teste.jpg")

Resposta: Imagem binária com Content-Type apropriado.

POST /validate

Valida um relato no Firestore com base em votos.

Formato da Requisição: JSON com reportId (string) e votes (number).

{"reportId": "relato123", "votes": 75}

Resposta: Texto simples (ex.: "Relato atualizado")

GET /users

Lista os usuários do Firestore.

Resposta: Array JSON com campos dos usuários.

[{ "nome": { "stringValue": "João" }, "idade": { "integerValue": "30" } }]

POST /analyze

Analisa uma imagem usando uma API externa.

Formato da Requisição: multipart/form-data com campo image.

Resposta: JSON com resultados da análise.

{
  "analise_imagem": {
    "tipo_conteudo": "Local",
    "descricao_geral": "Área com água parada",
    "avaliacao_risco_malaria": { "nivel_risco": "Alto" }
  }
}

Exemplos de Código

JavaScript
Python
cURL

JavaScript (fetch)

const BASE_URL = 'https://mapazzz-backend.mapzzz.workers.dev';

// /upload
async function uploadImage(file) {
    const formData = new FormData();
    formData.append('image', file);
    const response = await fetch(`${BASE_URL}/upload`, { method: 'POST', body: formData });
    console.log(await response.text());
}

// /image/:filename
async function fetchImage(filename) {
    const response = await fetch(`${BASE_URL}/image/${filename}`);
    const blob = await response.blob();
    const imgUrl = URL.createObjectURL(blob);
    document.body.appendChild(Object.assign(document.createElement('img'), { src: imgUrl }));
}

// /validate
async function validateReport(reportId, votes) {
    const response = await fetch(`${BASE_URL}/validate`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ reportId, votes })
    });
    console.log(await response.text());
}

// /users
async function fetchUsers() {
    const response = await fetch(`${BASE_URL}/users`);
    console.log(await response.json());
}

// /analyze
async function analyzeImage(file) {
    const formData = new FormData();
    formData.append('image', file);
    const response = await fetch(`${BASE_URL}/analyze`, { method: 'POST', body: formData });
    console.log(await response.json());
}

// Exemplo de uso
uploadImage(document.querySelector('input[type="file"]').files[0]);
fetchImage('imagens/teste.jpg');
validateReport('relato123', 75);
fetchUsers();
analyzeImage(document.querySelector('input[type="file"]').files[0]);

Python (requests)

import requests

BASE_URL = 'https://mapazzz-backend.mapzzz.workers.dev'

# /upload
def upload_image(file_path):
    with open(file_path, 'rb') as f:
        files = {'image': f}
        response = requests.post(f'{BASE_URL}/upload', files=files)
        print(response.text)

# /image/:filename
def fetch_image(filename):
    response = requests.get(f'{BASE_URL}/image/{filename}')
    with open('downloaded_image.jpg', 'wb') as f:
        f.write(response.content)

# /validate
def validate_report(report_id, votes):
    data = {'reportId': report_id, 'votes': votes}
    response = requests.post(f'{BASE_URL}/validate', json=data)
    print(response.text)

# /users
def fetch_users():
    response = requests.get(f'{BASE_URL}/users')
    print(response.json())

# /analyze
def analyze_image(file_path):
    with open(file_path, 'rb') as f:
        files = {'image': f}
        response = requests.post(f'{BASE_URL}/analyze', files=files)
        print(response.json())

# Exemplo de uso
upload_image('teste.jpg')
fetch_image('imagens/teste.jpg')
validate_report('relato123', 75)
fetch_users()
analyze_image('teste.jpg')

cURL (terminal)

# /upload
curl -X POST -F "image=@teste.jpg" https://mapazzz-backend.mapzzz.workers.dev/upload

# /image/:filename
curl -o downloaded_image.jpg https://mapazzz-backend.mapzzz.workers.dev/image/imagens/teste.jpg

# /validate
curl -X POST -H "Content-Type: application/json" -d '{"reportId": "relato123", "votes": 75}' https://mapazzz-backend.mapzzz.workers.dev/validate

# /users
curl https://mapazzz-backend.mapzzz.workers.dev/users

# /analyze
curl -X POST -F "image=@teste.jpg" https://mapazzz-backend.mapzzz.workers.dev/analyze

Tratamento de Erros

Os endpoints retornam erros com códigos de status HTTP:

Código Descrição
400 Requisição inválida (ex.: sem imagem)
404 Imagem ou recurso não encontrado
405 Método não suportado
500 Erro interno do servidor