Skip to main content

Drizzle Todo

A simple Todo API using Drizzle ORM with SQLite.

Location: examples/drizzle-todo

Features

  • CRUD operations with Drizzle ORM
  • Request validation with Valibot
  • SQLite database with better-sqlite3
  • Disposable pattern for cleanup

Running

cd examples/drizzle-todo
pnpm install
pnpm dev

Key Code

Controller with validation:

import { Controller, Get, Post, inject, pathParam, validated } from '@zeltjs/core';
import * as v from 'valibot';

const CreateTodoBody = v.object({
title: v.pipe(v.string(), v.minLength(1)),
});

@Controller('/todos')
class TodoController {
constructor(private todoService = inject(TodoService)) {}

@Get('/')
findAll() {
return this.todoService.findAll();
}

@Post('/')
create(body = validated(CreateTodoBody), res = response()) {
const todo = this.todoService.create({ title: body.title });
return res.json(todo, 201);
}
}

Drizzle service with Disposable:

import { Injectable } from '@zeltjs/core';
import type { Disposable } from '@zeltjs/core';
import Database from 'better-sqlite3';
import { drizzle } from 'drizzle-orm/better-sqlite3';

@Injectable()
class DrizzleService implements Disposable {
private sqlite: Database.Database;
readonly db;

constructor() {
this.sqlite = new Database('./data/todo.db');
this.db = drizzle(this.sqlite, { schema });
}

dispose() {
this.sqlite.close();
}
}

API Endpoints

MethodPathDescription
GET/todosList all todos
GET/todos/:idGet a todo by ID
POST/todosCreate a new todo
PATCH/todos/:idUpdate a todo
DELETE/todos/:idDelete a todo