Skip to content

Commit

Permalink
feat: added realities holder
Browse files Browse the repository at this point in the history
  • Loading branch information
osher-sade committed Jun 13, 2019
1 parent 521b42d commit dbcb1ce
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 45 deletions.
2 changes: 2 additions & 0 deletions src/inversion-of-control/container-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { PolarisGraphQLLogger } from '../logging/polaris-graphql-logger';
import { IrrelevantEntitiesMiddleware } from '../middlewares/irrelevant-entities-middleware';
import { PolarisMiddleware } from '../middlewares/polaris-middleware';
import { PolarisGraphQLServer } from '../server/graphql-server';
import { RealitiesHolderValidator } from '../server/realities-holder-validator';
import { POLARIS_TYPES } from './polaris-types';

decorate(injectable(), PolarisLogger);
Expand All @@ -13,4 +14,5 @@ polarisContainer.bind(POLARIS_TYPES.GraphQLServer).to(PolarisGraphQLServer);
polarisContainer.bind(POLARIS_TYPES.GraphQLLogger).to(PolarisGraphQLLogger);
polarisContainer.bind(POLARIS_TYPES.Middleware).to(PolarisMiddleware);
polarisContainer.bind(POLARIS_TYPES.Middleware).to(IrrelevantEntitiesMiddleware);
polarisContainer.bind(POLARIS_TYPES.RealitiesHolderValidator).to(RealitiesHolderValidator);
polarisContainer.bind(POLARIS_TYPES.RealitiesHolder).toConstantValue({});
1 change: 1 addition & 0 deletions src/inversion-of-control/polaris-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ export const POLARIS_TYPES = {
InjectableResolver: Symbol('InjectableResolver'),
CommonEntityInterface: Symbol('CommonEntityInterface`'),
RealitiesHolder: Symbol('RealitiesHolder'),
RealitiesHolderValidator: Symbol('RealitiesHolderValidator'),
};
21 changes: 10 additions & 11 deletions src/server/graphql-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ import { PolarisGraphQLLogger } from '../logging/polaris-graphql-logger';
import { Middleware } from '../middlewares/middleware';
import { createMiddleware } from '../middlewares/polaris-middleware-creator';
import { PolarisProperties } from '../properties/polaris-properties';
import { RealitiesHolder } from '../realities-holder/realities-holder';
import { IrrelevantEntitiesExtension } from './irrelevant-entities-extension';
import { PolarisContext } from './polaris-context';
import { RealitiesHolderChecker } from './realities-holder-checker';
import { RealitiesHolderValidator } from './realities-holder-validator';

export interface GraphQLServer {
server: ApolloServer;
Expand All @@ -41,7 +40,8 @@ export class PolarisGraphQLServer implements GraphQLServer {
@inject(POLARIS_TYPES.PolarisServerConfig) propertiesConfig: PolarisServerConfig,
@multiInject(POLARIS_TYPES.Middleware) middlewares: Middleware[],
@inject(POLARIS_TYPES.GraphQLLogger) private polarisLogger: PolarisGraphQLLogger,
@inject(POLARIS_TYPES.RealitiesHolder) private realitiesHolder: RealitiesHolder,
@inject(POLARIS_TYPES.RealitiesHolderValidator)
private realitiesHolderValidator: RealitiesHolderValidator,
) {
const executableSchemaWithMiddleware = applyMiddleware(
schema,
Expand All @@ -54,10 +54,7 @@ export class PolarisGraphQLServer implements GraphQLServer {
context: (args: { ctx: Koa.Context; connection: any }) => this.getContext(args),
formatError: (error: any) => this.formatError(error),
formatResponse: (response: any) => this.formatResponse(response),
extensions: [
() => new IrrelevantEntitiesExtension(),
() => new RealitiesHolderChecker(realitiesHolder),
],
extensions: [() => new IrrelevantEntitiesExtension()],
};
this.server = new ApolloServer(config);
this.app = new Koa();
Expand Down Expand Up @@ -122,19 +119,21 @@ export class PolarisGraphQLServer implements GraphQLServer {
private getContext({ ctx, connection }: { ctx: Koa.Context; connection: any }): PolarisContext {
try {
if (!connection) {
return this.getHttpContext(ctx);
const context: PolarisContext = this.getHttpContext(ctx);
this.realitiesHolderValidator.validateRealitySupport(context);
return context;
} else {
return { body: {}, pubSub: new PubSub() } as any;
}
} catch (e) {
this.polarisLogger.error('Headers error', {
this.polarisLogger.error('Context error', {
polarisLogProperties: { throwable: e },
});
throw new Error('Unable to format headers');
throw new Error(e.message);
}
}

private getHttpContext(ctx: Koa.Context) {
private getHttpContext(ctx: Koa.Context): PolarisContext {
const headers = getHeaders(ctx.request.headers);
const context: PolarisContext = {
headers,
Expand Down
25 changes: 0 additions & 25 deletions src/server/realities-holder-checker.ts

This file was deleted.

25 changes: 25 additions & 0 deletions src/server/realities-holder-validator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { UserInputError } from 'apollo-server-koa';
import { inject, injectable } from 'inversify';
import { POLARIS_TYPES } from '../inversion-of-control/polaris-types';
import { RealitiesHolder } from '../realities-holder/realities-holder';
import { PolarisContext } from './polaris-context';

@injectable()
export class RealitiesHolderValidator {
constructor(@inject(POLARIS_TYPES.RealitiesHolder) private realitiesHolder: any) {}

validateRealitySupport(context: PolarisContext) {
if (context) {
const requestedReality = context.headers.realityId;
if (
requestedReality != null &&
this.realitiesHolder instanceof RealitiesHolder &&
!this.realitiesHolder.isRealitySupported(requestedReality)
) {
throw new UserInputError(
`The requested reality-id ${requestedReality} is not supported!`,
);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import { RealitiesHolder } from '../../../src/realities-holder/realities-holder'
@injectable()
export class TestRealitiesHolder extends RealitiesHolder {
getRealities(): Set<number> {
return new Set<number>([0, 2]);
return new Set<number>([0, 1, 2]);
}
}
15 changes: 7 additions & 8 deletions test/server/graphql-server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'reflect-metadata';
import { PolarisServerConfig } from '../../src/common/injectable-interfaces';
import { PolarisMiddleware } from '../../src/middlewares/polaris-middleware';
import { createMiddleware } from '../../src/middlewares/polaris-middleware-creator';
import { RealitiesHolder } from '../../src/realities-holder/realities-holder';
import { PolarisGraphQLServer } from '../../src/server/graphql-server';

const apolloServerMock: { [T in keyof ApolloServer]: any } = {
Expand Down Expand Up @@ -35,15 +34,15 @@ describe('graphql-server tests', () => {
polarisProperties: jest.fn(),
} as any;
const polarisMiddlewareMock: { [T in keyof PolarisMiddleware]: any } = {} as any;
const realitiesHolderMock: { [T in keyof RealitiesHolder]: any } = {} as any;
const realitiesHolderValidatorMock = {} as any;

test('creating new polaris server - with arguments - graphql apply middleware have been called', () => {
const server = new PolarisGraphQLServer(
graphQLSchemaMock,
polarisServerConfigMock,
[polarisMiddlewareMock],
polarisLog,
realitiesHolderMock,
realitiesHolderValidatorMock,
);

expect(applyMiddleware).toHaveBeenCalled();
Expand All @@ -56,7 +55,7 @@ describe('graphql-server tests', () => {
polarisServerConfigMock,
middlewares,
polarisLog,
realitiesHolderMock,
realitiesHolderValidatorMock,
);

expect(createMiddleware).toHaveBeenCalledTimes(middlewares.length);
Expand All @@ -68,7 +67,7 @@ describe('graphql-server tests', () => {
polarisServerConfigMock,
[polarisMiddlewareMock],
polarisLog,
realitiesHolderMock,
realitiesHolderValidatorMock,
);

expect(ApolloServer).toHaveBeenCalled();
Expand All @@ -84,7 +83,7 @@ describe('graphql-server tests', () => {
polarisServerConfigMockWithEndpoint,
[polarisMiddlewareMock],
polarisLog,
realitiesHolderMock,
realitiesHolderValidatorMock,
);
server.start();
expect(apolloServerMock.applyMiddleware).toHaveBeenCalledWith(
Expand All @@ -109,7 +108,7 @@ describe('graphql-server tests', () => {
polarisServerConfigMockWithEndpoint,
[polarisMiddlewareMock],
polarisLog,
realitiesHolderMock,
realitiesHolderValidatorMock,
);
server.start(app);
expect(apolloServerMock.applyMiddleware).toHaveBeenCalledWith(
Expand All @@ -133,7 +132,7 @@ describe('graphql-server tests', () => {
polarisServerConfigMockWithEndpoint,
[polarisMiddlewareMock],
polarisLog,
realitiesHolderMock,
realitiesHolderValidatorMock,
);
server.start(app);
expect(apolloServerMock.applyMiddleware).toHaveBeenCalledWith(
Expand Down

0 comments on commit dbcb1ce

Please sign in to comment.