garatujas/000-leitura-api.md
2026-05-08 09:08:24 -03:00

214 lines
6.7 KiB
Markdown

# core.js
```typescript
// Define o caminho absoluto do arquivo JSON de dados temporários na mesma pasta do script
const jsonFilePath = __dirname + '/data.temp.json';
// Declara uma variável array de strings que armazenará os itens da lista
// Inicializa carregando os dados do arquivo
const list: string[] = await loadFromFile();
// Define uma função que carrega dados do arquivo JSON
async function loadFromFile() {
try {
// Cria um objeto do arquivo JSON usando a API do Bun
const file = Bun.file(jsonFilePath);
// Lê o conteúdo do arquivo
const content = await file.text();
// Converte o texto JSON em um array de strings e retorna
return JSON.parse(content) as string[];
} catch (error: any) {
// Verifica se o erro é de arquivo não encontrado
if (error.code === 'ENOENT')
// Se o arquivo não existe, retorna um array vazio
return [];
// Se for outro tipo de erro, lança exceção
throw error;
}
}
// Define uma função assíncrona que salva a lista no arquivo JSON
async function saveToFile() {
try {
// Escreve o conteúdo da variável list convertido em JSON no arquivo
// Bun.write grava o arquivo
await Bun.write(jsonFilePath, JSON.stringify(list));
} catch (error: any) {
// Se der erro lança uma exceção
throw new Error("Erro ao salvar os dados no arquivo: " + error.message);
}
}
// Define uma função que adiciona um novo item à lista
async function addItem(item: string) {
// Adiciona o item ao final do array
list.push(item);
// Salva a lista atualizada no arquivo
await saveToFile();
}
// Define uma função assíncrona que retorna todos os itens da lista
async function getItems() {
// Retorna array completo de itens
return list;
}
// Define função que atualiza um item em um índice específico
async function updateItem(index: number, newItem: string) {
// Valida se o índice está dentro dos limites do array
if (index < 0 || index >= list.length)
// Se inválido lança uma exceção
throw new Error("Index fora dos limites");
// Substitui o item no índice especificado
list[index] = newItem;
// Salva a lista atualizada
await saveToFile();
}
// Define uma função que remove um item em um índice específico
async function removeItem(index: number) {
// Valida se o índice está dentro dos limites válidos do array
if (index < 0 || index >= list.length)
// Se inválido lança uma exceção
throw new Error("Index fora dos limites");
// Remove 1 elemento a partir do índice especificado
list.splice(index, 1);
// Salva a lista atualizada
await saveToFile();
}
// Exporta um objeto contendo todas as funções
export default { addItem, getItems, updateItem, removeItem };
```
# api.turma2.ts
```typescript
// Importa o módulo de gerenciamento de tarefas do arquivo core.ts
import todo from "./core.ts";
// Inicia um servidor HTTP usando Bun na porta 3000
const server = Bun.serve({
port: 3000,
// Rotas e handlers HTTP do servidor
routes: {
// Rota raiz retorna um arquivo HTML estático
"/": new Response(Bun.file("./public/index.html")),
// Rota da API para gerenciar tarefas
"/api/todo": {
// retorna a lista de todas as tarefas
GET: async () => {
// Chama a função para obter todos os itens
const items = await todo.getItems()
// Retorna os itens como resposta JSON
return Response.json(items)
},
// adiciona uma nova tarefa à lista
POST: async (req) => {
// Extrai o corpo da requisição como JSON
const data = await req.json() as any;
// Obtém a propriedade item dos dados recebidos, ou null se não existir
const item = data.item || null;
// Valida se o campo 'item' foi fornecido
if (!item)
// Se não foi fornecido, retorna erro 400
return Response.json('Por favor, forneça um item para adicionar.', { status: 400 });
// Adiciona o item à lista
await todo.addItem(item);
// Retorna os dados recebidos como confirmação
return Response.json(data);
},
},
// Rota para atualizar ou deletar uma tarefa pelo índice
"/api/todo/:index": {
// atualiza uma tarefa existente
PUT: async (req) => {
// Extrai a propriedade index da URL e converte para número
const index = parseInt(req.params.index);
// Valida se o índice é um número válido
if (isNaN(index))
// Se não for válido retorna erro 400
return Response.json('Índice inválido. um número inteiro é esperado.', { status: 400 });
// Extrai o corpo da requisição como JSON
const data = await req.json() as any;
// Obtém a propriedade newItem dos dados, ou null se não existir
const newItem = data.newItem || null;
// Valida se o campo newItem existe
if (!newItem)
// Se não foi fornecido retorna erro 400
return Response.json('Por favor, forneça um novo item para atualizar.', { status: 400 });
try {
// Tenta atualizar o item no índice especificado
await todo.updateItem(index, newItem);
// Retorna mensagem de sucesso
return Response.json(`Item no índice ${index} atualizado para "${newItem}".`);
} catch (error: any) {
// Se ocorrer erro retorna erro 400 com mensagem
return Response.json(error.message, { status: 400 });
}
},
// remove uma tarefa específica
DELETE: async (req) => {
// Extrai o parâmetro index da URL e converte para número inteiro
const index = parseInt(req.params.index);
// Valida se o índice é um número válido
if (isNaN(index))
// Se não for válido, retorna erro 400 com mensagem em português
return Response.json('Índice inválido.', { status: 400 });
try {
// Tenta remover o item no índice especificado
await todo.removeItem(index);
// Retorna mensagem de sucesso
return Response.json(`Item no índice ${index} removido com sucesso.`);
} catch (error: any) {
// Se ocorrer erro retorna erro 400 com mensagem
return Response.json(error.message, { status: 400 });
}
},
},
},
// Catch all padrão para rotas não definidas
async fetch(req) {
// Retorna erro 404 (Não Encontrado) para qualquer rota não mapeada
return new Response(`Not Found`, { status: 404 });
},
});
// Imprime no console a mensagem de que o servidor está rodando e em qual URL
console.log(`Server running at http://localhost:${server.port}`);
```