Skip to content

Commit 868fc65

Browse files
committed
Moved command handlers directly into controller
1 parent 818291e commit 868fc65

File tree

10 files changed

+81
-161
lines changed

10 files changed

+81
-161
lines changed

samples/unwrapping_onion/src/core/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import express, { Application, Router } from 'express';
22
import http from 'http';
33

4-
export const getApplication = (...routers: Router[]) => {
4+
export const getApplication = (routers: Router[]) => {
55
const app: Application = express();
66

77
app.set('etag', false);

samples/unwrapping_onion/src/onion/ecommerce/app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import controllers from './controllers';
55

66
const initApp = (mongo: MongoClient) => {
77
registerHandlers(mongo);
8-
return getApplication(...controllers);
8+
return getApplication(controllers);
99
};
1010

1111
export default initApp;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { getApplication } from '#core/api';
22
import { MongoClient } from 'mongodb';
33
import registerHandlers from './shoppingCarts/application';
4-
import controllers from './shoppingCarts/controllers';
4+
import { getControllers } from './shoppingCarts/controllers';
55

66
const initApp = (mongo: MongoClient) => {
77
registerHandlers(mongo);
8-
return getApplication(...controllers);
8+
return getApplication(getControllers(mongo));
99
};
1010

1111
export default initApp;

samples/unwrapping_onion/src/unpeeled/ecommerce/shoppingCarts/application/commandHandlers/addProductToShoppingCartHandler.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

samples/unwrapping_onion/src/unpeeled/ecommerce/shoppingCarts/application/commandHandlers/confirmShoppingCart.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

samples/unwrapping_onion/src/unpeeled/ecommerce/shoppingCarts/application/commandHandlers/openShoppingCartHandler.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

samples/unwrapping_onion/src/unpeeled/ecommerce/shoppingCarts/application/commandHandlers/removeProductFromShoppingCartHandler.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

samples/unwrapping_onion/src/unpeeled/ecommerce/shoppingCarts/application/index.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,18 @@ import { GetShoppingCartById } from 'src/unpeeled/ecommerce/shoppingCarts/applic
66
import { AddProductItemToShoppingCart } from 'src/unpeeled/ecommerce/shoppingCarts/application/commands/shoppingCarts/addProductItemToShoppingCart';
77
import { RemoveProductItemFromShoppingCart } from './commands/shoppingCarts/removeProductItemFromShoppingCart';
88
import { ShoppingCartMapper } from './mappers/shoppingCartMapper';
9-
import { OpenShoppingCartHandler } from './commandHandlers/openShoppingCartHandler';
10-
import { AddProductItemToShoppingCartHandler } from './commandHandlers/addProductToShoppingCartHandler';
11-
import { RemoveProductItemFromShoppingCartHandler } from './commandHandlers/removeProductFromShoppingCartHandler';
129
import { GetShoppingCartByIdHandler } from './queryHandlers/getShoppingCartByIdQueryHandler';
1310
import { ShoppingCartRepository } from 'src/unpeeled/ecommerce/shoppingCarts/infrastructure/shoppingCartRepository';
1411
import { ConfirmShoppingCart } from './commands/shoppingCarts/confirmShoppingCart';
15-
import { ConfirmShoppingCartHandler } from './commandHandlers/confirmShoppingCart';
1612
import { GetCustomerShoppingHistory } from './queries/getCustomerShoppingHistory';
1713
import { GetCustomerShoppingHistoryHandler } from './queryHandlers/getCustomerShoppingHistoryHandler';
1814
import { CustomerShoppingHistoryMapper } from './mappers/customerShoppingHistoryMapper';
1915
import { EventBusFactory } from '#core/events';
2016

2117
const registerHandlers = (mongo: MongoClient) => {
2218
const repository = new ShoppingCartRepository(mongo);
23-
const eventBus = EventBusFactory();
24-
25-
const shoppingCartMapper = new ShoppingCartMapper();
2619
const shoppingHistoryMapper = new CustomerShoppingHistoryMapper();
2720

28-
registerCommandHandler(
29-
OpenShoppingCart,
30-
new OpenShoppingCartHandler(repository, shoppingCartMapper, eventBus)
31-
);
32-
registerCommandHandler(
33-
AddProductItemToShoppingCart,
34-
new AddProductItemToShoppingCartHandler(
35-
repository,
36-
shoppingCartMapper,
37-
eventBus
38-
)
39-
);
40-
registerCommandHandler(
41-
RemoveProductItemFromShoppingCart,
42-
new RemoveProductItemFromShoppingCartHandler(
43-
repository,
44-
shoppingCartMapper,
45-
eventBus
46-
)
47-
);
48-
registerCommandHandler(
49-
ConfirmShoppingCart,
50-
new ConfirmShoppingCartHandler(repository, shoppingCartMapper, eventBus)
51-
);
5221
registerQueryHandler(
5322
GetShoppingCartById,
5423
new GetShoppingCartByIdHandler(repository)
Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
import { CommandBusFactory } from '#core/commands';
1+
import { EventBusFactory } from '#core/events';
22
import { QueryBusFactory } from '#core/queries';
3+
import { MongoClient } from 'mongodb';
4+
import { ShoppingCartMapper } from '../application/mappers/shoppingCartMapper';
5+
import { ShoppingCartRepository } from '../infrastructure/shoppingCartRepository';
36
import { ShoppingCartController } from './shoppingCartController';
47

5-
const controllers = [
6-
new ShoppingCartController(CommandBusFactory(), QueryBusFactory()).router,
7-
];
8-
9-
export default controllers;
8+
export const getControllers = (mongo: MongoClient) => {
9+
const repository = new ShoppingCartRepository(mongo);
10+
const shoppingCartMapper = new ShoppingCartMapper();
11+
return [
12+
new ShoppingCartController(
13+
repository,
14+
shoppingCartMapper,
15+
EventBusFactory(),
16+
QueryBusFactory()
17+
).router,
18+
];
19+
};

samples/unwrapping_onion/src/unpeeled/ecommerce/shoppingCarts/controllers/shoppingCartController.ts

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,20 @@ import { RemoveProductItemFromShoppingCart } from 'src/unpeeled/ecommerce/shoppi
1313
import { RemoveProductItemFromShoppingCartRequest } from 'src/unpeeled/ecommerce/shoppingCarts/requests/removeProductItemFromShoppingCartRequest.ts';
1414
import { ConfirmShoppingCart } from 'src/unpeeled/ecommerce/shoppingCarts/application/commands/shoppingCarts/confirmShoppingCart';
1515
import { GetCustomerShoppingHistory } from 'src/unpeeled/ecommerce/shoppingCarts/application/queries/getCustomerShoppingHistory';
16+
import { ShoppingCart } from 'src/unpeeled/ecommerce/shoppingCarts';
17+
import { ShoppingCartRepository } from '../infrastructure/shoppingCartRepository';
18+
import { EventBus } from '#core/events';
19+
import { ShoppingCartModel } from '../models/shoppingCart';
20+
import { ShoppingCartMapper } from '../application/mappers/shoppingCartMapper';
1621
export class ShoppingCartController {
1722
public router = Router();
1823

19-
constructor(private commandBus: CommandBus, private queryBus: QueryBus) {
24+
constructor(
25+
private repository: ShoppingCartRepository,
26+
private mapper: ShoppingCartMapper,
27+
private eventBus: EventBus,
28+
private queryBus: QueryBus
29+
) {
2030
this.router.post('/customers/:customerId/shopping-carts/', this.open);
2131
this.router.post(
2232
'/customers/:customerId/shopping-carts/:shoppingCartId/product-items',
@@ -50,7 +60,14 @@ export class ShoppingCartController {
5060
mongoObjectId(),
5161
assertNotEmptyString(request.params.customerId)
5262
);
53-
await this.commandBus.send(command);
63+
const event = ShoppingCart.open(
64+
command.shoppingCartId,
65+
command.customerId
66+
);
67+
68+
await this.repository.store({} as ShoppingCartModel, event);
69+
70+
await this.eventBus.publish(event);
5471

5572
sendCreated(response, command.shoppingCartId);
5673
} catch (error) {
@@ -72,7 +89,20 @@ export class ShoppingCartController {
7289
assertPositiveNumber(request.body.quantity)
7390
)
7491
);
75-
await this.commandBus.send(command);
92+
const model = await this.repository.find(command.shoppingCartId);
93+
94+
if (model === null) {
95+
throw Error(
96+
`Shopping cart with id ${command.shoppingCartId} not found!`
97+
);
98+
}
99+
100+
const aggregate = this.mapper.toAggregate(model);
101+
const event = aggregate.addProductItem(command.productItem);
102+
103+
await this.repository.store(model, event);
104+
105+
await this.eventBus.publish(event);
76106

77107
response.sendStatus(200);
78108
} catch (error) {
@@ -94,7 +124,20 @@ export class ShoppingCartController {
94124
assertPositiveNumber(Number(request.query.quantity))
95125
)
96126
);
97-
await this.commandBus.send(command);
127+
const model = await this.repository.find(command.shoppingCartId);
128+
129+
if (model === null) {
130+
throw Error(
131+
`Shopping cart with id ${command.shoppingCartId} not found!`
132+
);
133+
}
134+
135+
const aggregate = this.mapper.toAggregate(model);
136+
const event = aggregate.removeProductItem(command.productItem);
137+
138+
await this.repository.store(model, event);
139+
140+
await this.eventBus.publish(event);
98141

99142
response.sendStatus(200);
100143
} catch (error) {
@@ -112,7 +155,20 @@ export class ShoppingCartController {
112155
const command = new ConfirmShoppingCart(
113156
assertNotEmptyString(request.params.shoppingCartId)
114157
);
115-
await this.commandBus.send(command);
158+
const model = await this.repository.find(command.shoppingCartId);
159+
160+
if (model === null) {
161+
throw Error(
162+
`Shopping cart with id ${command.shoppingCartId} not found!`
163+
);
164+
}
165+
166+
const aggregate = this.mapper.toAggregate(model);
167+
const event = aggregate.confirm();
168+
169+
await this.repository.store(model, event);
170+
171+
await this.eventBus.publish(event);
116172

117173
response.sendStatus(200);
118174
} catch (error) {

0 commit comments

Comments
 (0)