Skip to content

Commit

Permalink
feat(server): added PolarisServer
Browse files Browse the repository at this point in the history
  • Loading branch information
osher-sade committed Nov 14, 2019
1 parent c0612ac commit e0d8c1f
Show file tree
Hide file tree
Showing 10 changed files with 313 additions and 211 deletions.
346 changes: 144 additions & 202 deletions package-lock.json

Large diffs are not rendered by default.

17 changes: 12 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,25 @@
"homepage": "https://github.com/Enigmatis/polaris-core#readme",
"dependencies": {
"@enigmatis/polaris-common": "^1.0.6",
"@enigmatis/polaris-graphql-logger": "^1.0.2",
"@enigmatis/polaris-middlewares": "^1.0.0",
"@enigmatis/polaris-graphql-logger": "^1.0.3",
"@enigmatis/polaris-logs": "^2.5.5",
"@enigmatis/polaris-middlewares": "^1.0.1",
"@enigmatis/polaris-schema": "^1.0.5",
"apollo-server": "^2.9.7",
"http-status": "^1.4.0"
"apollo-server-express": "^2.9.9",
"express": "^4.17.1",
"graphql-middleware": "^4.0.2",
"http-status": "^1.4.0",
"ip": "^1.1.5",
"uuid": "^3.3.3"
},
"devDependencies": {
"@commitlint/cli": "^8.2.0",
"@commitlint/config-conventional": "^8.2.0",
"@semantic-release/changelog": "^3.0.5",
"@semantic-release/git": "^7.0.18",
"@types/jest": "^24.0.22",
"@types/ip": "^1.1.0",
"@types/jest": "^24.0.23",
"@types/uuid": "^3.4.6",
"husky": "^3.0.9",
"jest": "24.1.0",
"prettier": "^1.19.1",
Expand Down
5 changes: 5 additions & 0 deletions src/config/middleware-configuration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface MiddlewareConfiguration {
allowDataVersionMiddleware: boolean;
allowSoftDeleteMiddleware: boolean;
allowRealityMiddleware: boolean;
}
12 changes: 12 additions & 0 deletions src/config/polaris-server-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { ApplicationLogProperties, LoggerConfiguration } from '@enigmatis/polaris-logs';
import { MiddlewareConfiguration } from './middleware-configuration';

export interface PolarisServerConfig {
typeDefs: any;
resolvers: any;
port: number;
applicationLogProperties: ApplicationLogProperties;
loggerConfiguration?: LoggerConfiguration;
middlewareConfiguration?: MiddlewareConfiguration;
endpoint?: string;
}
2 changes: 1 addition & 1 deletion src/errors/error-formatter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AuthenticationError, ForbiddenError, UserInputError } from 'apollo-server';
import { AuthenticationError, ForbiddenError, UserInputError } from 'apollo-server-express';
import * as status from 'http-status';
import { PolarisError } from './polaris-error';

Expand Down
2 changes: 1 addition & 1 deletion src/errors/polaris-error.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ApolloError } from 'apollo-server';
import { ApolloError } from 'apollo-server-express';

export class PolarisError extends ApolloError {
constructor(
Expand Down
8 changes: 8 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
export { PolarisServer } from './server/polaris-server';
export { PolarisServerConfig } from './config/polaris-server-config';
export { formatError } from './errors/error-formatter';
export { PolarisError } from './errors/polaris-error';
export { gql } from 'apollo-server-express';
export * from '@enigmatis/polaris-logs';
export * from '@enigmatis/polaris-common';
export * from '@enigmatis/polaris-graphql-logger';
export * from '@enigmatis/polaris-middlewares';
export * from '@enigmatis/polaris-schema';
126 changes: 126 additions & 0 deletions src/server/polaris-server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import {
DATA_VERSION,
INCLUDE_LINKED_OPER,
OICD_CLAIM_UPN,
PolarisGraphQLContext,
REALITY_ID,
REQUEST_ID,
REQUESTING_SYS,
REQUESTING_SYS_NAME,
} from '@enigmatis/polaris-common';
import { PolarisGraphQLLogger } from '@enigmatis/polaris-graphql-logger';
import { LoggerConfiguration } from '@enigmatis/polaris-logs';
import {
dataVersionMiddleware,
realitiesMiddleware,
softDeletedMiddleware,
} from '@enigmatis/polaris-middlewares';
import { makeExecutablePolarisSchema } from '@enigmatis/polaris-schema';
import { ApolloServer } from 'apollo-server-express';
import * as express from 'express';
import { applyMiddleware } from 'graphql-middleware';
import { address } from 'ip';
import { v4 } from 'uuid';
import { formatError, PolarisServerConfig } from '..';
import { MiddlewareConfiguration } from '../config/middleware-configuration';

const app = express();

export class PolarisServer {
public static getDefaultMiddlewareConfiguration(): MiddlewareConfiguration {
return {
allowDataVersionMiddleware: true,
allowRealityMiddleware: true,
allowSoftDeleteMiddleware: true,
};
}

public static getDefaultLoggerConfiguration(): LoggerConfiguration {
return {
loggerLevel: 'info',
writeToConsole: true,
writeFullMessageToConsole: false,
};
}

private static getPolarisContext(context: any): PolarisGraphQLContext {
const requestId = context.req.headers[REQUEST_ID] ? context.req.headers[REQUEST_ID] : v4();
return {
requestHeaders: {
dataVersion: +context.req.headers[DATA_VERSION],
requestId,
realityId: +context.req.headers[REALITY_ID],
includeLinkedOper: context.req.headers[INCLUDE_LINKED_OPER] === 'true',
requestingSystemId: context.req.headers[REQUESTING_SYS],
requestingSystemName: context.req.headers[REQUESTING_SYS_NAME],
upn: context.req.headers[OICD_CLAIM_UPN],
},
responseHeaders: {
requestId,
},
clientIp: address(),
request: {
query: context.req.body.query,
operationName: context.req.body.operationName,
polarisVariables: context.req.body.variables,
},
response: context.res,
returnedExtensions: {
globalDataVersion: 0,
},
};
}
public apolloServer: ApolloServer;
public polarisServerConfig?: PolarisServerConfig;
public polarisGraphQLLogger: PolarisGraphQLLogger;

constructor(config: PolarisServerConfig) {
this.polarisServerConfig = config;
if (!this.polarisServerConfig.middlewareConfiguration) {
this.polarisServerConfig.middlewareConfiguration = PolarisServer.getDefaultMiddlewareConfiguration();
}
if (!this.polarisServerConfig.loggerConfiguration) {
this.polarisServerConfig.loggerConfiguration = PolarisServer.getDefaultLoggerConfiguration();
}
this.polarisGraphQLLogger = new PolarisGraphQLLogger(
this.polarisServerConfig.applicationLogProperties,
this.polarisServerConfig.loggerConfiguration,
);
this.apolloServer = new ApolloServer({
schema: this.getSchemaWithMiddlewares(),
formatError,
context: ctx => PolarisServer.getPolarisContext(ctx),
});
this.apolloServer.applyMiddleware({ app });
app.use(this.apolloServer.getMiddleware());
}

public async start() {
if (this.polarisServerConfig) {
await app.listen({ port: this.polarisServerConfig.port });
this.polarisGraphQLLogger.info(
`Server started at http://localhost:${this.polarisServerConfig.port}${this.apolloServer.graphqlPath}`,
);
}
}

public async stop() {
await this.apolloServer.stop();
this.polarisGraphQLLogger.info('Server stopped');
}

private getSchemaWithMiddlewares() {
if (this.polarisServerConfig) {
const schema = makeExecutablePolarisSchema(
this.polarisServerConfig.typeDefs,
this.polarisServerConfig.resolvers,
);
return applyMiddleware(
schema,
dataVersionMiddleware,
softDeletedMiddleware,
realitiesMiddleware,
);
}
}
}
2 changes: 1 addition & 1 deletion test/errors/error-formatter.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AuthenticationError, ForbiddenError, UserInputError } from 'apollo-server';
import { AuthenticationError, ForbiddenError, UserInputError } from 'apollo-server-express';
import * as status from 'http-status';
import { formatError, PolarisError } from '../../src';

Expand Down
4 changes: 3 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
"src/type-declarations"
],
"types": [
"jest"
"jest",
"ip",
"uuid"
],
"declaration": true,
"lib": [
Expand Down

0 comments on commit e0d8c1f

Please sign in to comment.