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

6.7 KiB

core.js

// 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

// 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}`);