Skip to content

Commit 47be348

Browse files
committed
Refactoring transaction boilerplate
1 parent a46451f commit 47be348

File tree

4 files changed

+38
-27
lines changed

4 files changed

+38
-27
lines changed

src/Adapters/Storage/Mongo/MongoStorageAdapter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,13 +1055,13 @@ export class MongoStorageAdapter implements StorageAdapter {
10551055
return Promise.resolve(transactionalSection);
10561056
}
10571057

1058-
commitTransactionalSession(transactionalSection): Promise<void> {
1058+
commitTransactionalSession(transactionalSection: any): Promise<void> {
10591059
return transactionalSection.commitTransaction().then(() => {
10601060
transactionalSection.endSession();
10611061
});
10621062
}
10631063

1064-
abortTransactionalSession(transactionalSection): Promise<void> {
1064+
abortTransactionalSession(transactionalSection: any): Promise<void> {
10651065
return transactionalSection.abortTransaction().then(() => {
10661066
transactionalSection.endSession();
10671067
});

src/Adapters/Storage/StorageAdapter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,6 @@ export interface StorageAdapter {
115115
conn: ?any
116116
): Promise<void>;
117117
createTransactionalSession(): Promise<any>;
118-
commitTransactionalSession(transactionalSession: string): Promise<void>;
119-
abortTransactionalSession(transactionalSession: string): Promise<void>;
118+
commitTransactionalSession(transactionalSession: any): Promise<void>;
119+
abortTransactionalSession(transactionalSession: any): Promise<void>;
120120
}

src/Controllers/DatabaseController.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ class DatabaseController {
411411
schemaCache: any;
412412
schemaPromise: ?Promise<SchemaController.SchemaController>;
413413
skipMongoDBServer13732Workaround: boolean;
414-
transactionalSession: ?any;
414+
_transactionalSession: ?any;
415415

416416
constructor(
417417
adapter: StorageAdapter,
@@ -425,6 +425,7 @@ class DatabaseController {
425425
// it. Instead, use loadSchema to get a schema.
426426
this.schemaPromise = null;
427427
this.skipMongoDBServer13732Workaround = skipMongoDBServer13732Workaround;
428+
this._transactionalSession = null;
428429
}
429430

430431
collectionExists(className: string): Promise<boolean> {
@@ -1533,15 +1534,33 @@ class DatabaseController {
15331534
}
15341535

15351536
createTransactionalSession() {
1536-
return this.adapter.createTransactionalSession();
1537+
return this.adapter
1538+
.createTransactionalSession()
1539+
.then(transactionalSession => {
1540+
this._transactionalSession = transactionalSession;
1541+
});
15371542
}
15381543

1539-
commitTransactionalSession(transactionalSession) {
1540-
return this.adapter.commitTransactionalSession(transactionalSession);
1544+
commitTransactionalSession() {
1545+
if (!this._transactionalSession) {
1546+
throw new Error('There is no transactional session to commit');
1547+
}
1548+
return this.adapter
1549+
.commitTransactionalSession(this._transactionalSession)
1550+
.then(() => {
1551+
this._transactionalSession = null;
1552+
});
15411553
}
15421554

1543-
abortTransactionalSession(transactionalSession) {
1544-
return this.adapter.abortTransactionalSession(transactionalSession);
1555+
abortTransactionalSession() {
1556+
if (!this._transactionalSession) {
1557+
throw new Error('There is no transactional session to abort');
1558+
}
1559+
return this.adapter
1560+
.abortTransactionalSession(this._transactionalSession)
1561+
.then(() => {
1562+
this._transactionalSession = null;
1563+
});
15451564
}
15461565

15471566
// TODO: create indexes on first creation of a _User object. Otherwise it's impossible to

src/batch.js

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,11 @@ function handleBatch(router, req) {
8888
initialPromise = req.config.database.createTransactionalSession();
8989
}
9090

91-
return initialPromise.then(transactionalSession => {
91+
return initialPromise.then(() => {
9292
const promises = req.body.requests.map(restRequest => {
9393
const routablePath = makeRoutablePath(restRequest.path);
9494
// Construct a request that we can send to a handler
9595

96-
if (transactionalSession) {
97-
req.config.database.transactionalSession = transactionalSession;
98-
}
99-
10096
const request = {
10197
body: restRequest.body,
10298
config: req.config,
@@ -118,23 +114,19 @@ function handleBatch(router, req) {
118114

119115
return Promise.all(promises)
120116
.then(results => {
121-
if (transactionalSession) {
122-
return req.config.database
123-
.commitTransactionalSession(transactionalSession)
124-
.then(() => {
125-
return { response: results };
126-
});
117+
if (req.body.transaction) {
118+
return req.config.database.commitTransactionalSession().then(() => {
119+
return { response: results };
120+
});
127121
} else {
128122
return { response: results };
129123
}
130124
})
131125
.catch(error => {
132-
if (transactionalSession) {
133-
return req.config.database
134-
.abortTransactionalSession(transactionalSession)
135-
.then(() => {
136-
throw error;
137-
});
126+
if (req.body.transaction) {
127+
return req.config.database.abortTransactionalSession().then(() => {
128+
throw error;
129+
});
138130
} else {
139131
throw error;
140132
}

0 commit comments

Comments
 (0)