214 lines
6.7 KiB
Markdown
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}`);
|
|
```
|