Skip to content

Instantly share code, notes, and snippets.

View radzserg's full-sized avatar

Sergey Radzishevskii radzserg

View GitHub Profile
const withRetry = (
func: (...args: any[]) => Promise<any>,
maxAttempts: number = 3,
timeout: number = 1_000
) => {
const sleep = (ms: number) => {
return new Promise((resolve) => {
return setTimeout(resolve, ms);
});
};
const app = express();
const PORT = 8000;
const diContainer = configureDI();
configureRouter(app, diContainer)
app.listen(PORT, () => {
console.log(`⚡️[server]: Server is running at http://localhost:${PORT}`);
});
export default function configureRouter(app: core.Express, diContainer: IDIContainer) {
const usersController = diContainer.get(UsersController);
app.route('/users')
.get(usersController.actionIndex.bind(usersController))
.post(usersController.actionCreate.bind(usersController));
}
import DIContainer, { IDIContainer, object } from "rsdi";
import { controllers } from "./controllers";
import { repositories } from "./repositories";
import { AppLogger } from "../../lib/Logger";
export default function configureDI(): IDIContainer {
const container = new DIContainer();
container.add({
[AppLogger.name]: object(AppLogger),
[UsersRepository.name]: object(UsersRepository)
export class UsersRepository {
async findAll() {
return [
{
id: 1,
name: "John Doe"
},
{
id: 2,
@radzserg
radzserg / users_controller.ts
Last active October 12, 2021 16:08
users_controller.ts
export default class UsersController {
public constructor(
private readonly usersRepository: UsersRepository,
private readonly logger: AppLogger
) {}
public async actionIndex(req: Request, res: Response) {
try {
const users = await this.usersRepository.findAll();
res.send(users);
import usersRepository from "./path/to/user-repo.ts"
import logger from "./path/to/getLogger.ts"
app.get('/users', function (req, res) {
try {
const users = usersRepository.findAll();
res.send(users);
} catch (e) {
logger.error(e);
throw new InternalSergerError("Cannot get users");
# step #1 - Inline code inside a consumer
# code is simple enough, consumer is simple enough
class OrderService {
public processOrder(Order order) {
// validate input
let totalPrice = orderData.items.reduce( (totalPrice, orderItem) => totalPrice + (orderItem.price * orderItem.quantity));
totalPrice = totalPrice + totalPrice * 0.05; // add service commission
// process payment
// update order state in DB
class OrderManager {
public createOrder(orderData): Order {
this.validate(orderData);
const order = new Order(orderData);
order.setTotalPrice(this.calculateTotal(orderData));
this.pay(orderData)
await this.save(orderData);
return order;
}
let totalPrice = orderData.items.reduce( (totalPrice, orderItem) => totalPrice + (orderItem.price * orderItem.quantity));
totalPrice = totalPrice + totalPrice * 0.05; // add service commission
// vs
const total = (new OrderCalculator).calculateTotal(orderData);