import express from "express";
import { Container, server } from "@brushy/di";
// Tokens
const LOGGER = "LOGGER";
const CONFIG = "CONFIG";
const USER_REPOSITORY = "USER_REPOSITORY";
const USER_SERVICE = "USER_SERVICE";
// Classes
class Logger {
info(message: string) {
console.log(`[INFO] ${message}`);
}
error(message: string, error?: any) {
console.error(`[ERROR] ${message}`, error);
}
}
class UserRepository {
constructor(private logger: Logger) {}
async findAll() {
this.logger.info("Finding all users");
return [
{ id: 1, name: "John" },
{ id: 2, name: "Jane" },
];
}
}
class UserService {
constructor(
private repository: UserRepository,
private logger: Logger,
) {}
async getUsers() {
this.logger.info("Getting users from service");
return this.repository.findAll();
}
}
// Create server container
const serverContainer = new Container();
// Register dependencies
serverContainer.register(LOGGER, {
useClass: Logger,
lifecycle: "singleton",
});
serverContainer.register(CONFIG, {
useValue: { port: 3000 },
});
serverContainer.register(USER_REPOSITORY, {
useClass: UserRepository,
dependencies: [LOGGER],
lifecycle: "scoped", // Request scope
});
serverContainer.register(USER_SERVICE, {
useClass: UserService,
dependencies: [USER_REPOSITORY, LOGGER],
lifecycle: "scoped", // Request scope
});
// Configure as server container
server.setServerContainer(serverContainer);
// Create Express application
const app = express();
// Middleware - ALS request scope (recommended)
app.use(server.brushyRequestScope());
// Route to get users
app.get("/users", async (req, res) => {
try {
const userService = server.resolve<UserService>(USER_SERVICE);
const users = await userService.getUsers();
res.json(users);
} catch (error) {
const logger = server.resolve<Logger>(LOGGER);
logger.error("Failed to get users", error);
res.status(500).json({ error: "Internal server error" });
}
});
// Start server
const config = server.resolve<{ port: number }>(CONFIG);
app.listen(config.port, () => {
const logger = server.resolve<Logger>(LOGGER);
logger.info(`Server running on port ${config.port}`);
});