Skip to content

Commit 5428bf6

Browse files
committed
Implemented and connected MongoDB repository
1 parent ce00539 commit 5428bf6

File tree

7 files changed

+71
-10
lines changed

7 files changed

+71
-10
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { Collection, Document, Filter, MongoClient, ObjectId } from 'mongodb';
2+
3+
export interface Repository<T> {
4+
add(entity: T): Promise<void>;
5+
update(entity: T): Promise<void>;
6+
find(id: string): Promise<T | null>;
7+
}
8+
9+
export class MongoDbRepository<T extends Document & { _id: ObjectId }>
10+
implements Repository<T>
11+
{
12+
private collection: Collection<T>;
13+
14+
constructor(
15+
mongo: MongoClient,
16+
collectionName: string,
17+
databaseName?: string | undefined
18+
) {
19+
const db = mongo.db(databaseName);
20+
this.collection = db.collection<T>(collectionName);
21+
}
22+
async add(entity: T): Promise<void> {
23+
await this.collection.updateOne(entity, {}, { upsert: true });
24+
}
25+
async update(entity: T): Promise<void> {
26+
await this.collection.updateOne(entity, {}, { upsert: false });
27+
}
28+
29+
async find(id: string): Promise<T | null> {
30+
const result = await this.collection.findOne(new ObjectId(id) as Filter<T>);
31+
32+
if (result === null) return null;
33+
34+
return result as T;
35+
}
36+
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { getApplication } from '#core/api';
2+
import { MongoClient } from 'mongodb';
23
import registerHandlers from './application/shoppingCarts';
34
import controllers from './controllers';
45

5-
registerHandlers();
6-
const app = getApplication(...controllers);
6+
const initApp = (mongo: MongoClient) => {
7+
registerHandlers(mongo);
8+
return getApplication(...controllers);
9+
};
710

8-
export default app;
11+
export default initApp;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import { RegisterCommandHandler } from '#core/commands';
22
import ShoppingCartRepository from '../../infrastructure/shoppingCarts/shoppingCartRepository';
33
import OpenShoppingCart from '../../domain/commands/shoppingCarts/openShoppingCart';
44
import OpenShoppingCartHandler from './openShoppingCartHandler';
5+
import { MongoClient } from 'mongodb';
56

6-
const registerHandlers = () => {
7+
const registerHandlers = (mongo: MongoClient) => {
78
RegisterCommandHandler(
89
OpenShoppingCart,
9-
new OpenShoppingCartHandler(new ShoppingCartRepository())
10+
new OpenShoppingCartHandler(new ShoppingCartRepository(mongo))
1011
);
1112
};
1213

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import { startAPI } from '#core/api';
2-
import { disconnectFromMongoDB } from '#core/mongodb';
3-
import app from './app';
2+
import { disconnectFromMongoDB, getMongoDB } from '#core/mongodb';
3+
import initApp from './app';
44

55
//////////////////////////////////////////////////////////
66
/// API
77
//////////////////////////////////////////////////////////
88

99
process.once('SIGTERM', disconnectFromMongoDB);
10-
startAPI(app, 5000);
10+
11+
(async () => {
12+
const mongo = await getMongoDB();
13+
const app = initApp(mongo);
14+
startAPI(app);
15+
})().catch(console.error);
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
export default class ShoppingCartRepository {}
1+
import { MongoDbRepository } from '#core/repositories';
2+
import { MongoClient } from 'mongodb';
3+
import { ShoppingCartModel } from '../../models/shoppingCart';
4+
5+
export default class ShoppingCartRepository extends MongoDbRepository<ShoppingCartModel> {
6+
constructor(mongo: MongoClient) {
7+
super(mongo, 'shoppingCarts');
8+
}
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { ObjectId } from 'mongodb';
2+
3+
export class ShoppingCartModel {
4+
constructor(public _id: ObjectId) {}
5+
}

samples/unwrapping_onion/src/tests/e2e/fullFlow.e2e.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@ import { v4 as uuid } from 'uuid';
33
import { config } from '#config';
44
// import { greaterOrEqual } from '#core/validation';
55
import { TestResponse } from '#testing/api/testResponse';
6-
import app from '../../ecommerce/app';
6+
import initApp from '../../ecommerce/app';
77
import {
88
MongoDBContainer,
99
StartedMongoDBContainer,
1010
} from '#testing/api/mongoDB/mongoDBContainer';
1111
import { disconnectFromMongoDB } from '#core/mongodb';
12+
import { Application } from 'express';
1213

1314
describe('Full flow', () => {
15+
let app: Application;
1416
let mongodbContainer: StartedMongoDBContainer;
1517

1618
beforeAll(async () => {
1719
mongodbContainer = await new MongoDBContainer().start();
1820
config.mongoDB.connectionString = mongodbContainer.getConnectionString();
1921
console.log(config.mongoDB.connectionString);
22+
app = initApp(mongodbContainer.getClient());
2023
});
2124

2225
afterAll(async () => {

0 commit comments

Comments
 (0)