import { Elysia } from 'elysia';
import { createHandler, createOptions } from '@apisr/controller';
import { createResponseHandler } from '@apisr/response';
import { elysia } from '@apisr/controller/elysia';
import { z } from '@apisr/zod';
import { User } from './models';
const responseHandler = createResponseHandler({
errors: {
notFound: { status: 404, message: 'User not found' },
validation: { status: 400, message: 'Validation error' },
},
});
const options = createOptions({
responseHandler,
bindings: (bind) => ({
user: bind.model(User, {
from: 'params',
fromKey: 'id',
async load({ id, fail }) {
const user = await User.findById(id);
if (!user) throw fail('notFound', { id });
return user;
},
}),
}),
});
const handler = createHandler(options);
// List users
const listUsers = handler(
async () => {
const users = await User.findAll();
return { users };
},
{}
);
// Get user
const getUser = handler(
async ({ user }) => {
return {
id: user.id,
name: user.name,
email: user.email,
};
},
{
payload: {
id: z.string().from('params', { key: 'id' })
},
user: true,
}
);
// Create user
const createUser = handler(
async ({ payload }) => {
const user = await User.create(payload);
return { id: user.id };
},
{
payload: {
name: z.string().from('body', { key: 'name' }),
email: z.string().from('body', { key: 'email' }),
},
}
);
// Update user
const updateUser = handler(
async ({ payload, user }) => {
await user.update(payload);
return { success: true };
},
{
payload: {
id: z.string().from('params', { key: 'id' }),
name: z.string().from('body', { key: 'name' }).optional(),
email: z.string().from('body', { key: 'email' }).optional(),
},
user: true,
}
);
// Delete user
const deleteUser = handler(
async ({ user }) => {
await user.delete();
return { success: true };
},
{
payload: {
id: z.string().from('params', { key: 'id' })
},
user: true,
}
);
const app = new Elysia()
.get('/users', ...elysia(listUsers))
.get('/users/:id', ...elysia(getUser))
.post('/users', ...elysia(createUser))
.patch('/users/:id', ...elysia(updateUser))
.delete('/users/:id', ...elysia(deleteUser))
.listen(3000);
console.log(`Server running at http://localhost:3000`);