diff --git a/.gitignore b/.gitignore index 995875333b7ad8f179077229b4239cd11f0ae21e..640e0df6ab8edc00252764721d32a2ea5eec016a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ *.pid *.map *.swp +*.env +*.swo /.trash /pids /logs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d9772e73aaa6e36433fd0878f33df5dddce63233..49c40eb11a0543d6991d6629ab6ea2ae0b9b0972 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: node:6.2 +image: node:6.12.2 services: - postgres:latest @@ -18,6 +18,7 @@ before_script: run_tests: script: - mv config/ci_test.yaml.example config/test.yaml + - mv config/ci_test.env.example config/test.env - npm test - npm run lint tags: diff --git a/config/ci_test.env.example b/config/ci_test.env.example new file mode 100644 index 0000000000000000000000000000000000000000..370623dcba16e54d4c6f7f9676b141344f7348eb --- /dev/null +++ b/config/ci_test.env.example @@ -0,0 +1,9 @@ +BLENDB_DB_USER=runner +BLENDB_DB_NAME=blendb_fixture +BLENDB_DB_PASSWORD= +BLENDB_DB_HOST=postgres +BLENDB_DB_PORT=5432 +BLENDB_ST_CREATE=true +BLENDB_ST_INSERT=true +BLENDB_ADAPTER=postgres +PORT=3000 diff --git a/config/ci_test.yaml.example b/config/ci_test.yaml.example index 2b810d85afcaae12cc5929427dc6a94410d06a0f..eaac4332129dde3d194ebeab01eb4d415d2a6ec7 100644 --- a/config/ci_test.yaml.example +++ b/config/ci_test.yaml.example @@ -1,231 +1,219 @@ # gitignore ignores files.yaml in this folder # however a config file for tests in CI is required # so this example file in fact is the CI test file -connection: - database: 'blendb_fixture' - user: 'runner' - password: '' - host: 'postgres' - port: 5432 - max: 10 - idleTimeoutMillis: 30000 -struct: - create: true - insert: true -schema: - views: - - - alias: "View 0" - data: "test/postgres/fixtures/view0.json" - origin: true - dimensions: - - "dim:0" - - "dim:7" - metrics: - - "met:0" - - "met:1" - - "met:2" - - "met:10" - - - alias: "View 1" - data: "test/postgres/fixtures/view1.json" - origin: true - dimensions: - - "dim:1" - - "dim:8" - metrics: - - "met:3" - - "met:4" - - - alias: "View 2" - data: "test/postgres/fixtures/view2.json" - origin: true - dimensions: - - "dim:2" - metrics: - - "met:5" - - "met:6" - - "met:11" - - - alias: "View 3" - data: "test/postgres/fixtures/view3.json" - origin: true - dimensions: - - "dim:2" - - "dim:3" - - "dim:4" - - - alias: "View 4" - data: "test/postgres/fixtures/view4.json" - origin: true - dimensions: - - "dim:2" - - "dim:7" - - "dim:8" - - - alias: "View 5" - data: "test/postgres/fixtures/view5.json" - origin: true - dimensions: - - "dim:3" - metrics: - - "met:7" - - - alias: "View 6" - data: "test/postgres/fixtures/view6.json" - origin: true - dimensions: - - "dim:4" - metrics: - - "met:8" - - - alias: "View 7" - data: "test/postgres/fixtures/view7.json" - origin: true - dimensions: - - "dim:4" - - "dim:5" - - "dim:6" - - - alias: "View 8" - data: "test/postgres/fixtures/view8.json" - origin: true - dimensions: - - "dim:5" - - "dim:6" - metrics: - - "met:9" - - - alias: "view 9" - data: "test/postgres/fixtures/view9.json" - origin: false - dimensions: - - "dim:2" - metrics: - - "met:5" - - "met:6" - - "met:7" - clauses: - - "dim:2!=1" - metrics: - - - name: "met:0" - dataType: "integer" - aggregation: "sum" - description: "No meaning, just used for test" - - - name: "met:1" - dataType: "integer" - aggregation: "avg" - description: "No meaning, just used for test" - - - name: "met:2" - dataType: "integer" - aggregation: "avg" - description: "No meaning, just used for test" - - - name: "met:3" - dataType: "integer" - aggregation: "sum" - description: "No meaning, just used for test" - - - name: "met:4" - dataType: "integer" - aggregation: "sum" - description: "No meaning, just used for test" - - - name: "met:5" - dataType: "integer" - aggregation: "avg" - description: "No meaning, just used for test" - - - name: "met:6" - dataType: "integer" - aggregation: "count" - description: "No meaning, just used for test" - - - name: "met:7" - dataType: "integer" - aggregation: "count" - description: "No meaning, just used for test" - - - name: "met:8" - dataType: "integer" - aggregation: "sum" - description: "No meaning, just used for test" - - - name: "met:9" - dataType: "integer" - aggregation: "count" - description: "No meaning, just used for test" - - - name: "met:10" - dataType: "integer" - aggregation: "max" - description: "No meaning, just used for test" - - - name: "met:11" - dataType: "integer" - aggregation: "min" - description: "No meaning, just used for test" - dimensions: - - - name: "dim:0" - dataType: "date" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:1" - dataType: "date" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:2" - dataType: "integer" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:3" - dataType: "string" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:4" - dataType: "string" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:5" - dataType: "boolean" - description: "A dimension of Blendb. Has 2 possible values." - - - name: "dim:6" - dataType: "integer" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:7" - dataType: "integer" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:8" - dataType: "integer" - description: "A dimension of Blendb. Has 5 possible values." - - - name: "dim:9" - dataType: "integer" - parent: "dim:0" - relation: "day" - description: "A dimension of Blendb. Has 30 possible values." - - - name: "dim:10" - dataType: "integer" - parent: "dim:0" - relation: "month" - description: "A dimension of Blendb. Has 12 possible values." - - - name: "dim:11" - dataType: "integer" - parent: "dim:0" - relation: "year" - description: "A dimension of Blendb. Has 1 possible value." - - - name: "dim:12" - dataType: "integer" - parent: "dim:0" - relation: "dayofweek" - description: "A dimension of Blendb. Has 7 possible values." +views: + - + alias: "View 0" + data: "test/postgres/fixtures/view0.json" + origin: true + dimensions: + - "dim:0" + - "dim:7" + metrics: + - "met:0" + - "met:1" + - "met:2" + - "met:10" + - + alias: "View 1" + data: "test/postgres/fixtures/view1.json" + origin: true + dimensions: + - "dim:1" + - "dim:8" + metrics: + - "met:3" + - "met:4" + - + alias: "View 2" + data: "test/postgres/fixtures/view2.json" + origin: true + dimensions: + - "dim:2" + metrics: + - "met:5" + - "met:6" + - "met:11" + - + alias: "View 3" + data: "test/postgres/fixtures/view3.json" + origin: true + dimensions: + - "dim:2" + - "dim:3" + - "dim:4" + - + alias: "View 4" + data: "test/postgres/fixtures/view4.json" + origin: true + dimensions: + - "dim:2" + - "dim:7" + - "dim:8" + - + alias: "View 5" + data: "test/postgres/fixtures/view5.json" + origin: true + dimensions: + - "dim:3" + metrics: + - "met:7" + - + alias: "View 6" + data: "test/postgres/fixtures/view6.json" + origin: true + dimensions: + - "dim:4" + metrics: + - "met:8" + - + alias: "View 7" + data: "test/postgres/fixtures/view7.json" + origin: true + dimensions: + - "dim:4" + - "dim:5" + - "dim:6" + - + alias: "View 8" + data: "test/postgres/fixtures/view8.json" + origin: true + dimensions: + - "dim:5" + - "dim:6" + metrics: + - "met:9" + - + alias: "view 9" + data: "test/postgres/fixtures/view9.json" + origin: false + dimensions: + - "dim:2" + metrics: + - "met:5" + - "met:6" + - "met:7" + clauses: + - "dim:2!=1" +metrics: + - + name: "met:0" + dataType: "integer" + aggregation: "sum" + description: "No meaning, just used for test" + - + name: "met:1" + dataType: "integer" + aggregation: "avg" + description: "No meaning, just used for test" + - + name: "met:2" + dataType: "integer" + aggregation: "avg" + description: "No meaning, just used for test" + - + name: "met:3" + dataType: "integer" + aggregation: "sum" + description: "No meaning, just used for test" + - + name: "met:4" + dataType: "integer" + aggregation: "sum" + description: "No meaning, just used for test" + - + name: "met:5" + dataType: "integer" + aggregation: "avg" + description: "No meaning, just used for test" + - + name: "met:6" + dataType: "integer" + aggregation: "count" + description: "No meaning, just used for test" + - + name: "met:7" + dataType: "integer" + aggregation: "count" + description: "No meaning, just used for test" + - + name: "met:8" + dataType: "integer" + aggregation: "sum" + description: "No meaning, just used for test" + - + name: "met:9" + dataType: "integer" + aggregation: "count" + description: "No meaning, just used for test" + - + name: "met:10" + dataType: "integer" + aggregation: "max" + description: "No meaning, just used for test" + - + name: "met:11" + dataType: "integer" + aggregation: "min" + description: "No meaning, just used for test" +dimensions: + - + name: "dim:0" + dataType: "date" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:1" + dataType: "date" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:2" + dataType: "integer" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:3" + dataType: "string" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:4" + dataType: "string" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:5" + dataType: "boolean" + description: "A dimension of Blendb. Has 2 possible values." + - + name: "dim:6" + dataType: "integer" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:7" + dataType: "integer" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:8" + dataType: "integer" + description: "A dimension of Blendb. Has 5 possible values." + - + name: "dim:9" + dataType: "integer" + parent: "dim:0" + relation: "day" + description: "A dimension of Blendb. Has 30 possible values." + - + name: "dim:10" + dataType: "integer" + parent: "dim:0" + relation: "month" + description: "A dimension of Blendb. Has 12 possible values." + - + name: "dim:11" + dataType: "integer" + parent: "dim:0" + relation: "year" + description: "A dimension of Blendb. Has 1 possible value." + - + name: "dim:12" + dataType: "integer" + parent: "dim:0" + relation: "dayofweek" + description: "A dimension of Blendb. Has 7 possible values." diff --git a/config/config.env.example b/config/config.env.example new file mode 100644 index 0000000000000000000000000000000000000000..7188cc4955ea678debfaca3852350d4b3c20b782 --- /dev/null +++ b/config/config.env.example @@ -0,0 +1,9 @@ +BLENDB_DB_USER=blendb +BLENDB_DB_NAME=blendb-test +BLENDB_DB_PASSWORD=secret +BLENDB_DB_HOST=localhost +BLENDB_DB_PORT=5432 +BLENDB_ST_CREATE=false +BLENDB_ST_INSERT=false +BLENDB_ADAPTER=postgres +PORT=3000 diff --git a/package.json b/package.json index e9cd60a701ff886bddf6a7ee872a7b77d17cb23c..abc4fca8573142f57681791ca0c40102f6212cb7 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "description": "BlenDB", "main": "index.js", "scripts": { - "start": "node index", + "start": "env $(cat config/config.env) node index", "lint": "tslint -s node_modules/tslint-stylish -t stylish src/**/*.ts test/**/*.ts", - "test": "ts-node node_modules/istanbul/lib/cli.js cover -x \"**/*.spec.ts\" -e .ts _mocha", + "test": "env $(cat config/test.env) ts-node node_modules/istanbul/lib/cli.js cover -x \"**/*.spec.ts\" -e .ts _mocha", "show-coverage": "xdg-open coverage/lcov-report/index.html", "doc-api": "raml2html -i specs/blendb-api-v1.raml -o doc/api-v1-reference.html", "database": "ts-node database/config.ts database", diff --git a/src/api/middlewares/adapter.ts b/src/api/middlewares/adapter.ts index 997f63dcbdd520fc6d40229feabc53b22d020077..15e883b086d8aa27e27ff65d8c5ca68dc37d2495 100644 --- a/src/api/middlewares/adapter.ts +++ b/src/api/middlewares/adapter.ts @@ -22,9 +22,19 @@ import { Middleware } from "../types"; import { Adapter } from "../../core/adapter"; import { PostgresAdapter } from "../../adapter/postgres"; import { PoolConfig } from "pg"; +import { Connection } from "../../util/configParser"; -export function PostgresMw(config: PoolConfig): Middleware { - let adapter: Adapter = new PostgresAdapter(config); +export function PostgresMw(config: Connection): Middleware { + let parsedConfig: PoolConfig = { + user: config.user, + database: config.database, + password: config.password, + host: config.host, + port: config.port, + max: 10, + idleTimeoutMillis: 3000 + }; + let adapter: Adapter = new PostgresAdapter(parsedConfig); return function postgresMiddleware(req, res, next) { req.adapter = adapter; next(); diff --git a/src/main.ts b/src/main.ts index 3928f5f519b0ec9df1250ebd636d7c6e552ba7da..6214b70217712560a5e582846998998eea9cc8d9 100755 --- a/src/main.ts +++ b/src/main.ts @@ -42,7 +42,14 @@ import { PostgresMw } from "./api/middlewares/adapter"; import { ErrorMw } from "./api/middlewares/error"; app.use(EngineMw(config)); -app.use(PostgresMw(config.connection)); +if (config.adapter === "postgres") { + app.use(PostgresMw(config.connection)); +} + +else { + console.error("Invalid adapter. Options available are: postgres"); + process.exit(1); +} // parse the RAML spec and load osprey middleware ramlParser.loadFile("specs/blendb-api-v1.raml") diff --git a/src/util/configParser.ts b/src/util/configParser.ts index 938406fa26344a0ba400f4fabde4ae0731f3a8e8..43601c67214839c217eae0a2a67270f3136fb22f 100644 --- a/src/util/configParser.ts +++ b/src/util/configParser.ts @@ -24,7 +24,6 @@ import { View, ViewOptions, LoadView } from "../core/view"; import { RelationType } from "../common/types"; import { Filter } from "../core/filter"; import { Clause } from "../core/clause"; -import { PoolConfig } from "pg"; import * as fs from "fs"; import * as yaml from "js-yaml"; @@ -45,12 +44,6 @@ interface ConfigSchema { dimensions: DimensionStrOptions[]; } -interface ConfigFile { - connection: PoolConfig; - struct: LoadStruct; - schema: ConfigSchema; -} - interface BuildView { view: View; file: string; @@ -63,7 +56,8 @@ export interface LoadStruct{ } export interface ParsedConfig { - connection: PoolConfig; + adapter: string; + connection: Connection; views: View[]; metrics: Metric[]; dimensions: Dimension[]; @@ -72,6 +66,14 @@ export interface ParsedConfig { buildViews: BuildView[]; } +export interface Connection { + user: string; + database: string; + password: string; + host: string; + port: number; +} + interface DimensionMap { [key: string]: Dimension; } @@ -82,19 +84,33 @@ interface MetricMap { export class ConfigParser { public static parse(configPath: string): ParsedConfig { - let config: ConfigFile = yaml.safeLoad(fs.readFileSync(configPath, { + let config: ConfigSchema = yaml.safeLoad(fs.readFileSync(configPath, { encoding: "utf-8" })); - let metricsOpts = config.schema.metrics; - let viewsOpts = config.schema.views; - let dimensionsOpts = config.schema.dimensions; + let connection: Connection = { + user: process.env.BLENDB_DB_USER, + database: process.env.BLENDB_DB_NAME, + password: process.env.BLENDB_DB_PASSWORD, + host: process.env.BLENDB_DB_HOST, + port: parseInt(process.env.BLENDB_DB_PORT, 10) + }; + + let struct: LoadStruct = { + create: process.env.BLENDB_ST_CREATE.toLowerCase() === "true", + insert: process.env.BLENDB_ST_INSERT.toLowerCase() === "true" + }; + + let metricsOpts = config.metrics; + let viewsOpts = config.views; + let dimensionsOpts = config.dimensions; let parsed: ParsedConfig = { - connection: config.connection, + adapter: process.env.BLENDB_ADAPTER || "postgres", + connection: connection, views: [], metrics: [], dimensions: [], - struct: config.struct, + struct: struct, loadViews: [], buildViews: [] };