Skip to content

Instantly share code, notes, and snippets.

View Caballerog's full-sized avatar
:octocat:
live$.pipe(map(person => person.teach(me)),tap(me => me.betterEachDay())))

Carlos Caballero Caballerog

:octocat:
live$.pipe(map(person => person.teach(me)),tap(me => me.betterEachDay())))
View GitHub Profile
import { Middleware } from "./middleware";
import { Server } from "../server";
import { User } from "../interfaces";
export class UserExistsMiddleware extends Middleware {
public constructor(private server: Server) {
super();
}
public execute({ email, password }: User): boolean {
import { Handler, User } from "../interfaces";
export abstract class Middleware implements Handler {
private next: Handler;
public setNextMiddleware(next: Handler): Handler {
this.next = next;
return next;
}
public abstract execute(user: User): boolean;
export interface User {
email: string;
password: string;
}
import { User } from "./user.interface";
export interface Handler {
setNextMiddleware(handler: Handler): void;
execute(user: User): boolean;
}
import { Handler } from "./handler";
import { HandlerA } from "./handlerA";
import { HandlerB } from "./handlerB";
import { HandlerC } from "./handlerC";
function clientCode(handler: Handler) {
const options = ["optionA", "optionB", "optionC"];
for (const option of options) {
console.log(`Client: Who does ${option}?`);
import { AbstractHandler } from "./abstract-handler";
export class HandlerA extends AbstractHandler {
public handle(request: string): string {
if (request === "optionA") {
return `A: I'll do the operation -> ${request}.`;
}
return super.handle(request);
}
}
import { Handler } from "./handler";
export abstract class AbstractHandler implements Handler {
private nextHandler: Handler;
public setNext(handler: Handler): Handler {
this.nextHandler = handler;
return handler;
}
export interface Handler {
setNext(handler: Handler): Handler;
handle(request: string): string;
}
import { ConcreteAgent } from "./concrete-agent";
import { ConcreteAuctioneerA } from "./concrete-auctioneerA";
import { ConcreteAuctioneerB } from "./concrete-auctioneerB";
import { ConcreteAuctioneerC } from "./concrete-auctioneerC";
import { ConcreteAuctioneerD } from "./concrete-auctioneerD";
import { Product } from "./product.model";
const concreteAgent = new ConcreteAgent();
const auctioneerA = new ConcreteAuctioneerA();
import { Agent } from "./agent.interface";
import { Auctioneer } from "./auctioneer.interface";
import { ConcreteAgent } from "./concrete-agent";
export class ConcreteAuctioneerD implements Auctioneer {
name = "ConcreteAuctioneerD";
MAX_LIMIT = 1000;
public update(agent: Agent): void {
if (!(agent instanceof ConcreteAgent)) {