Skip to content

Commit

Permalink
Merge pull request #41 from Enigmatis/transactional-mutations
Browse files Browse the repository at this point in the history
Transactional mutations
  • Loading branch information
itaykl authored Apr 30, 2020
2 parents cbfea5e + 812918b commit 0cc2a6a
Show file tree
Hide file tree
Showing 11 changed files with 1,017 additions and 935 deletions.
1,837 changes: 922 additions & 915 deletions package-lock.json

Large diffs are not rendered by default.

19 changes: 9 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,19 +71,18 @@
"@enigmatis/polaris-common": "^1.4.1",
"@enigmatis/polaris-graphql-logger": "^1.4.1",
"@enigmatis/polaris-logs": "^2.8.2",
"@enigmatis/polaris-middlewares": "^1.3.5",
"@enigmatis/polaris-middlewares": "^1.4.2",
"@enigmatis/polaris-schema": "^1.1.0",
"@enigmatis/polaris-typeorm": "^2.3.4",
"apollo-server-express": "2.11.0",
"apollo-server-plugin-base": "^0.6.10",
"express": "^4.17.1",
"graphql": "^14.6.0",
"graphql-middleware": "^4.0.2",
"graphql-tools": "^4.0.7",
"http-status": "^1.4.2",
"lodash": "^4.17.15",
"subscriptions-transport-ws": "^0.9.16",
"ts-node": "^8.8.1",
"ts-node": "^8.9.1",
"uuid": "^3.4.0"
},
"devDependencies": {
Expand All @@ -93,26 +92,26 @@
"@semantic-release/git": "^9.0.0",
"@types/express": "^4.17.4",
"@types/graphql": "^14.5.0",
"@types/jest": "^25.1.4",
"@types/lodash": "^4.14.149",
"@types/uuid": "^3.4.8",
"@types/jest": "^25.2.1",
"@types/lodash": "^4.14.150",
"@types/uuid": "^3.4.9",
"axios": "^0.19.2",
"graphql-request": "^1.8.2",
"husky": "^3.1.0",
"jest": "^25.2.6",
"jest": "^25.4.0",
"pg": "^7.18.2",
"prettier": "^1.19.1",
"rimraf": "^3.0.2",
"semantic-release": "^17.0.4",
"semantic-release": "^17.0.7",
"travis-deploy-once": "^5.0.11",
"ts-jest": "^25.3.0",
"ts-jest": "^25.4.0",
"tslint": "^5.20.1",
"tslint-config-prettier": "^1.18.0",
"tslint-consistent-codestyle": "^1.16.0",
"tslint-eslint-rules": "^5.4.0",
"tslint-plugin-prettier": "^2.3.0",
"typescript": "^3.8.3",
"ws": "^7.2.3"
"ws": "^7.2.5"
},
"husky": {
"hooks": {
Expand Down
1 change: 1 addition & 0 deletions src/config/middleware-configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ export interface MiddlewareConfiguration {
allowDataVersionAndIrrelevantEntitiesMiddleware: boolean;
allowSoftDeleteMiddleware: boolean;
allowRealityMiddleware: boolean;
allowTransactionalMutations: boolean;
}
1 change: 0 additions & 1 deletion src/config/polaris-server-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ export interface PolarisServerConfig extends ApolloServerExpressConfig {
allowSubscription: boolean;
customMiddlewares?: any[];
customContext?: (context: ExpressContext) => any;
connection?: PolarisConnection;
supportedRealities?: RealitiesHolder;
shouldAddWarningsToExtensions: boolean;
allowMandatoryHeaders: boolean;
Expand Down
1 change: 0 additions & 1 deletion src/config/polaris-server-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ export interface PolarisServerOptions extends ApolloServerExpressConfig {
allowSubscription?: boolean;
customMiddlewares?: any[];
customContext?: (context: ExpressContext) => any;
connection?: PolarisConnection;
supportedRealities?: RealitiesHolder;
shouldAddWarningsToExtensions?: boolean;
allowMandatoryHeaders?: boolean;
Expand Down
8 changes: 4 additions & 4 deletions src/middlewares/middlewares-map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,24 @@ import {
RealitiesMiddleware,
SoftDeleteMiddleware,
} from '@enigmatis/polaris-middlewares';
import { PolarisConnection } from '@enigmatis/polaris-typeorm';
import { getPolarisConnectionManager } from '@enigmatis/polaris-typeorm';

export const getMiddlewaresMap = (
logger: PolarisGraphQLLogger,
realitiesHolder: RealitiesHolder,
connection?: PolarisConnection,
): Map<string, any[]> => {
const connectionManager = getPolarisConnectionManager();
const softDeleteMiddleware = new SoftDeleteMiddleware(logger).getMiddleware();
const realitiesMiddleware = new RealitiesMiddleware(logger, realitiesHolder).getMiddleware();
const dataVersionMiddleware = new DataVersionMiddleware(
logger,
realitiesHolder,
connection,
connectionManager,
).getMiddleware();
const irrelevantEntitiesMiddleware = new IrrelevantEntitiesMiddleware(
logger,
realitiesHolder,
connection,
connectionManager,
).getMiddleware();

return new Map([
Expand Down
1 change: 1 addition & 0 deletions src/server/configurations-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const getDefaultMiddlewareConfiguration = (): MiddlewareConfiguration =>
allowDataVersionAndIrrelevantEntitiesMiddleware: true,
allowRealityMiddleware: true,
allowSoftDeleteMiddleware: true,
allowTransactionalMutations: true,
};
};

Expand Down
15 changes: 13 additions & 2 deletions src/server/polaris-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from '@enigmatis/polaris-common';
import { PolarisGraphQLLogger } from '@enigmatis/polaris-graphql-logger';
import { AbstractPolarisLogger, LoggerConfiguration } from '@enigmatis/polaris-logs';
import { PolarisLoggerPlugin } from '@enigmatis/polaris-middlewares';
import { PolarisLoggerPlugin, TransactionalMutationsPlugin } from '@enigmatis/polaris-middlewares';
import { makeExecutablePolarisSchema } from '@enigmatis/polaris-schema';
import {
getConnectionForReality,
Expand Down Expand Up @@ -136,6 +136,18 @@ export class PolarisServer {
this.getSchemaWithMiddlewares(),
),
];

if (this.polarisServerConfig.middlewareConfiguration.allowTransactionalMutations) {
const connectionManager = getPolarisConnectionManager();
plugins.push(
new TransactionalMutationsPlugin(
polarisGraphQLLogger,
this.getSupportedRealities(),
connectionManager,
),
);
}

if (this.polarisServerConfig.plugins) {
plugins.push(...(this.polarisServerConfig.plugins as ApolloServerPlugin[]));
}
Expand Down Expand Up @@ -200,7 +212,6 @@ export class PolarisServer {
const middlewaresMap = getMiddlewaresMap(
this.polarisLogger as PolarisGraphQLLogger,
this.getSupportedRealities(),
this.polarisServerConfig.connection,
);
for (const [key, value] of Object.entries({ ...middlewareConfiguration })) {
if (value) {
Expand Down
3 changes: 1 addition & 2 deletions test/integration/server/test-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ export const connectionOptions: ConnectionOptions = {
type: 'postgres',
url: process.env.CONNECTION_STRING || '',
entities: [__dirname + '/dal/entities/*.{ts,js}'],
synchronize: true,
logging: true,
synchronize: true,
dropSchema: true,
schema: process.env.SCHEMA_NAME,
};
Expand Down Expand Up @@ -64,6 +64,5 @@ const getDefaultTestServerConfig = (): PolarisServerOptions => {
supportedRealities: new RealitiesHolder(
new Map([[3, { id: 3, type: 'notreal3', name: 'default' }]]),
),
connection: getPolarisConnectionManager().get(),
};
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"request": "mutation($firstName:String!, $lastName:String!){\n a:createAuthor(firstName:$firstName,lastName:$lastName){\n id\n firstName\n lastName\n }\n b:createAuthor(firstName:$fName,lastName:$lName){\n id\n firstName\n lastName\n }\n c:createAuthor(firstName:$fName,lastName:$name){\n id\n firstName\n lastName\n}}",
"dataValidateRequest": "query($firstName:String!, $fName:String!){\n a:authorsByName(name:$firstName){\n id\n firstName\n }\n b:authorsByName(name:$fName){\n id\n firstName\n }}",
"variables": {
"firstName": "itay",
"lastName": "kl",
"fName": "asd",
"lName": "asd"
}
}
56 changes: 56 additions & 0 deletions test/integration/tests/transactional-mutations.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { PolarisServer } from '../../../src';
import { initializeDatabase } from '../server/dal/data-initalizer';
import { startTestServer, stopTestServer } from '../server/test-server';
import { graphqlRawRequest, graphQLRequest } from '../server/utils/graphql-client';
import * as multipleMutationsWithBrokenOne from './jsonRequestsAndHeaders/multipleMutationsWithBrokenOne.json';
import * as simpleQuery from './jsonRequestsAndHeaders/simpleQuery.json';

let polarisServer: PolarisServer;

describe('transactional mutations enabled integration tests', () => {
beforeEach(async () => {
polarisServer = await startTestServer();
await initializeDatabase();
});

afterEach(async () => {
await stopTestServer(polarisServer);
});

it("execute multiple mutations in one request and one of the mutations is broken, the data version wasn't changed", async () => {
let dataVersionBeforeUpdate;
try {
dataVersionBeforeUpdate = (
await graphqlRawRequest(simpleQuery.request, simpleQuery.headers)
).extensions.globalDataVersion;
await graphQLRequest(
multipleMutationsWithBrokenOne.request,
undefined,
multipleMutationsWithBrokenOne.variables,
);
} catch (err) {
const dataVersionAfterUpdate = (
await graphqlRawRequest(simpleQuery.request, simpleQuery.headers)
).extensions.globalDataVersion;
expect(dataVersionAfterUpdate).toEqual(dataVersionBeforeUpdate);
}
});

it("execute multiple mutations in one request and one of the mutations is broken, the data in db wasn't changed", async () => {
try {
await graphQLRequest(
multipleMutationsWithBrokenOne.request,
undefined,
multipleMutationsWithBrokenOne.variables,
);
} catch (err) {
const result = await graphqlRawRequest(
multipleMutationsWithBrokenOne.dataValidateRequest,
undefined,
multipleMutationsWithBrokenOne.variables,
);
expect(result.data.a.length).toEqual(0);
expect(result.data.b.length).toEqual(0);
}
});
});

0 comments on commit 0cc2a6a

Please sign in to comment.