Skip to main content
Brave Programmer Logo

BraveProgrammer

BraveProgrammer

HomeProjectsBlogsCoursesLessonsAbout

Site footer

BraveProgrammer

Free coding courses, practical tutorials, and real projects from BraveProgrammer. Learn web development with React, Next.js, and TypeScript.

Navigation

  • Home
  • Projects
  • Blogs
  • Courses

Resources

  • About
  • Lessons

© 2026 BraveProgrammer. All rights reserved.

  1. Courses
  2. /
  3. TypeScript Mastery

Lesson 55 of 56 · Typescript

Project – Todo REST API (Express + TypeORM)

Duration: 30 minutes

Folder layout

src/
  entity/
    Todo.ts
  controller/
    todo.controller.ts
  router/
    todo.router.ts
  server.ts

Entity (Todo.ts)

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class Todo {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  title!: string;

  @Column({ default: false })
  completed!: boolean;
}

Controller

import { Request, Response } from 'express';
import { AppDataSource } from '../data-source';
import { Todo } from '../entity/Todo';

const repo = AppDataSource.getRepository(Todo);

export const getTodos = async (_: Request, res: Response) => {
  const todos = await repo.find();
  res.json(todos);
};

export const createTodo = async (req: Request, res: Response) => {
  const todo = repo.create(req.body);
  const result = await repo.save(todo);
  res.status(201).json(result);
};

Router

import { Router } from 'express';
import { getTodos, createTodo } from '../controller/todo.controller';

const router = Router();
router.get('/', getTodos);
router.post('/', createTodo);
export default router;

Server (server.ts)

import 'reflect-metadata';
import express from 'express';
import { AppDataSource } from './data-source';
import todoRouter from './router/todo.router';

async function bootstrap() {
  await AppDataSource.initialize();
  const app = express();
  app.use(express.json());
  app.use('/todos', todoRouter);
  app.listen(3000, () => console.log('🦾 API listening on 3000'));
}
bootstrap();

Run npm run dev (with ts-node-dev).

Info

Add validation (class‑validator) in the controller before persisting.

Previous: CLI Tool Project – `commander` in TypeScriptNext: Full‑Stack TypeScript Capstone – React Front‑end + Express Back‑end