Criando uma API REST Todo-List com Next.js e NestJS
Este projeto é uma aplicação de lista de tarefas no estilo “quadro” com tarefas “A Fazer” e “Executadas”. Utilizaremos Next.js para o frontend e NestJS para o backend. O banco de dados H2 será usado para testes e homologação, enquanto o MySQL será usado para produção.
Estrutura do Projeto
A estrutura do projeto será organizada da seguinte forma:
/todo-list-app
├── backend/ # Código do backend NestJS
├── frontend/ # Código do frontend Next.js
├── docker/ # Configuração Docker para o projeto
├── README.md # Documentação do projeto
Pré-requisitos
Antes de iniciar, certifique-se de ter instalado:
- Node.js (versão 20.11 ou superior)
- Docker (para facilitar a execução do banco de dados e da aplicação)
- Git (para versionamento de código)
Configurando o Backend (NestJS)
1. Criar o backend com NestJS
No terminal, execute:
mkdir todo-list-app && cd todo-list-app
npx @nestjs/cli new backend
cd backend
npm install2. Instalar dependências
npm install @nestjs/typeorm typeorm mysql2 h2 reflect-metadata3. Configurar banco de dados
Edite o arquivo src/app.module.ts:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Task } from './task.entity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: process.env.NODE_ENV === 'production' ? 'mysql' : 'h2',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'todo_db',
entities: [Task],
synchronize: true,
}),
],
})
export class AppModule {}4. Criar a entidade Task
Crie o arquivo src/task.entity.ts:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Task {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
status: 'A Fazer' | 'Executada';
}5. Criar o controlador e serviço
npx nest generate resource taskEdite src/task/task.controller.ts para adicionar endpoints:
@Get()
async getAllTasks() {
return this.taskService.findAll();
}
@Post()
async createTask(@Body() taskData: CreateTaskDto) {
return this.taskService.create(taskData);
}6. Rodar o backend
npm run start:devA API estará disponível em http://localhost:3000/task.
7. Testar API no navegador
Abra no navegador ou use Postman:
GET http://localhost:3000/task→ Lista todas as tarefasPOST http://localhost:3000/task→ Cria uma nova tarefa
Configurando o Frontend (Next.js)
1. Criar o frontend com Next.js
cd ..
npx create-next-app frontend
cd frontend
npm install2. Criar página principal
Edite pages/index.tsx:
import { useState, useEffect } from 'react';
export default function Home() {
const [tasks, setTasks] = useState([]);
useEffect(() => {
fetch('http://localhost:3000/task')
.then((res) => res.json())
.then((data) => setTasks(data));
}, []);
return (
<div>
<h1>Lista de Tarefas</h1>
<ul>
{tasks.map((task) => (
<li key={task.id}>{task.title} - {task.status}</li>
))}
</ul>
</div>
);
}3. Rodar o frontend
npm run devO frontend estará disponível em http://localhost:3001.
Testando a Aplicação Completa
-
Rodar o backend:
cd backend npm run start:dev -
Rodar o frontend:
cd ../frontend npm run dev -
Acessar no navegador:
- Backend API:
http://localhost:3000/task - Frontend:
http://localhost:3001
- Backend API: