From d9fc475def789b53a54f4f85f568f6c3b7bc5130 Mon Sep 17 00:00:00 2001 From: Andrew Alexandroff Date: Fri, 18 Jan 2019 03:49:47 +0300 Subject: [PATCH 1/3] changes for stand up --- db/dump.sql | 28 ++++------------------------ docker-compose.yml | 19 +++++++++++++++++++ docker/container/pgsql/Dockerfile | 2 ++ 3 files changed, 25 insertions(+), 24 deletions(-) create mode 100644 docker-compose.yml create mode 100644 docker/container/pgsql/Dockerfile diff --git a/db/dump.sql b/db/dump.sql index 23a5412..4d6e992 100644 --- a/db/dump.sql +++ b/db/dump.sql @@ -5,26 +5,6 @@ -- Dumped from database version 10.4 -- Dumped by pg_dump version 10.3 -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SELECT pg_catalog.set_config('search_path', '', false); -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - --- --- Name: postgres; Type: DATABASE; Schema: -; Owner: postgres --- - -CREATE DATABASE postgres WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251'; - - -ALTER DATABASE postgres OWNER TO postgres; - -\connect postgres SET statement_timeout = 0; SET lock_timeout = 0; @@ -44,28 +24,28 @@ COMMENT ON DATABASE postgres IS 'default administrative connection database'; -- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: +-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -- CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; -- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -- COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; -- --- Name: adminpack; Type: EXTENSION; Schema: -; Owner: +-- Name: adminpack; Type: EXTENSION; Schema: -; Owner: -- CREATE EXTENSION IF NOT EXISTS adminpack WITH SCHEMA pg_catalog; -- --- Name: EXTENSION adminpack; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION adminpack; Type: COMMENT; Schema: -; Owner: -- COMMENT ON EXTENSION adminpack IS 'administrative functions for PostgreSQL'; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..df8ffd1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3.2' +services: + + db: + container_name: test-task-db + build: ./docker/container/pgsql + restart: always + image: postgres + ports: + - "5432:5432" + environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: postgres + POSTGRES_USER: postgres + POSTGRES_PASSWORD: 12345 + volumes: + - ./temp/postgres:/var/lib/postgresql/data + - ./db/dump.sql:/docker-entrypoint-initdb.d/dump.sql + diff --git a/docker/container/pgsql/Dockerfile b/docker/container/pgsql/Dockerfile new file mode 100644 index 0000000..8b117aa --- /dev/null +++ b/docker/container/pgsql/Dockerfile @@ -0,0 +1,2 @@ +FROM postgres:10.4 + From 63a52d28662b8ece5bbb48499b0df0b3361e8da5 Mon Sep 17 00:00:00 2001 From: Andrew Alexandroff Date: Fri, 18 Jan 2019 16:41:18 +0300 Subject: [PATCH 2/3] changes --- config/default.js | 28 +++++++++++++++++ config/default.json | 1 + src/api/_helpers/error-handler.js | 17 +++++++++++ src/api/_helpers/jwt.js | 14 +++++++++ src/api/index.js | 48 +++++++++++++++++++++++++++++ src/api/users/user.service.js | 51 +++++++++++++++++++++++++++++++ src/api/users/users.controller.js | 21 +++++++++++++ src/graphqlSchemaV2.js | 4 +-- src/index.js | 20 +++++++++--- src/services/user/graphql.js | 44 ++++++++++++++++++++++++++ src/services/user/index.js | 48 +++++++++++++++++++++++++++++ 11 files changed, 289 insertions(+), 7 deletions(-) create mode 100644 config/default.js create mode 100644 src/api/_helpers/error-handler.js create mode 100644 src/api/_helpers/jwt.js create mode 100644 src/api/index.js create mode 100644 src/api/users/user.service.js create mode 100644 src/api/users/users.controller.js create mode 100644 src/services/user/graphql.js create mode 100644 src/services/user/index.js diff --git a/config/default.js b/config/default.js new file mode 100644 index 0000000..9a195f1 --- /dev/null +++ b/config/default.js @@ -0,0 +1,28 @@ +module.exports = { + node: 'test', + consoleLevel: 5, + graphql: { + description: 'Включен ли graphIql интерфейс на сервере', + enableUI: true, + pathname: '/graphql' + }, + http: { + protocol: 'http', + hostname: 'localhost', + port: 3000 + }, + postgres: { + host: 'localhost', + port: 5432, + user: 'postgres', + password: '12345', + database: 'postgres', + max: 10, + idleTimeoutMillis: 30000 + }, + externalTestService: {}, + secret: 'UKBKhmHGjyg&^y;ogKUVHMgvmjB u.username === username && u.password === password); + if (user) { + const {password, ...userWithoutPassword} = user; + const token = jwt.sign( + {...userWithoutPassword}, + config.secret, + {expiresIn: '24h'} + ); + return { + ...userWithoutPassword, + token + }; + } +} + +async function getAll() { + return users.map(u => { + const {password, ...userWithoutPassword} = u; + return userWithoutPassword; + }); +} diff --git a/src/api/users/users.controller.js b/src/api/users/users.controller.js new file mode 100644 index 0000000..480bd81 --- /dev/null +++ b/src/api/users/users.controller.js @@ -0,0 +1,21 @@ +const express = require('express'); +const router = express.Router(); +const userService = require('./user.service'); + +// routes +router.post('/authenticate', authenticate); +router.get('/', getAll); + +module.exports = router; + +function authenticate(req, res, next) { + userService.authenticate(req.body) + .then(user => user ? res.json(user) : res.status(400).json({message: 'Username or password is incorrect'})) + .catch(err => next(err)); +} + +function getAll(req, res, next) { + userService.getAll() + .then(users => res.json(users)) + .catch(err => next(err)); +} diff --git a/src/graphqlSchemaV2.js b/src/graphqlSchemaV2.js index 79ce385..9d61e33 100644 --- a/src/graphqlSchemaV2.js +++ b/src/graphqlSchemaV2.js @@ -14,8 +14,8 @@ export default oncePerServices(function (services = missingArgument('services')) const resolvers = Object.create(null); await (new SchemaBuilder({ - test: require('./services/test/graphql').default(services) - + test: require('./services/test/graphql').default(services), + user: require('./services/user/graphql').default(services), }).build({typeDefs, resolvers})); return makeExecutableSchema({ diff --git a/src/index.js b/src/index.js index 5108293..c6cf984 100644 --- a/src/index.js +++ b/src/index.js @@ -12,6 +12,7 @@ import {missingExport} from './common/services' import errorDataToEvent from './common/errors/errorDataToEvent' const schema = require('./index.schema'); const realConsole = console; +// const errorHandler = require('../api/_helpers/error-handler') (async function () { @@ -38,17 +39,25 @@ const realConsole = console; manager = new (require('./common/services').NodeManager(consoleAndBusServicesOnly))({ // далее consoleAndBusServicesOnly нельзя. нужно пользоваться manager.services name: nodeName, services: [ - require('./services/postgres') + require('./services/postgres'), + require('./services/user') ] }); // ждем пока NodeManager скажет что он готов. при этом часть сервисов может быть в состоянии failed await manager.started; - + let expressApp = express(); expressApp.use(cors()); - + // expressApp.use(bodyParser.urlencoded({extended: false})); + // expressApp.use(bodyParser.json()); + + expressApp.use('/', require('./api')); + + expressApp.use(require('./api/_helpers/error-handler')); + + let graphqlRouterV2 = express.Router(); const graphqlSchemaV2 = await (require('./graphqlSchemaV2').default(manager.services)()); graphqlRouterV2.post('/graphql/v2', bodyParser.json(), graphqlExpress(request => ({ @@ -57,7 +66,8 @@ const realConsole = console; }))); graphqlRouterV2.get('/graphql/v2', graphiqlExpress({endpointURL: '/graphql/v2'})); expressApp.use('/', graphqlRouterV2); - + + // Запускаем сервер let httpServer = http.Server(expressApp); await new Promise(function (resolve, reject) { @@ -66,7 +76,7 @@ const realConsole = console; else resolve(data); }) }); - + bus.event({ type: 'webserver.started', service: nodeName, diff --git a/src/services/user/graphql.js b/src/services/user/graphql.js new file mode 100644 index 0000000..4729158 --- /dev/null +++ b/src/services/user/graphql.js @@ -0,0 +1,44 @@ +import {oncePerServices, missingService} from '../../common/services/index' + +const PREFIX = 'User'; + +export default oncePerServices(function (services) { + + const graphqlBuilderSchema = require('../../common/graphql/LevelBuilder.schema'); + + const { + user = missingService('user') + } = services; + + return async function builder(args) { + + graphqlBuilderSchema.build_options(args); + const { parentLevelBuilder, typeDefs, builderContext } = args; + + typeDefs.push(` + + type ${PREFIX}QueryElement { + user_id: Int, + login: String, + email: String, + name: String, + manager: Boolean, + blocked: Boolean, + birthday: String + } + + `); + + parentLevelBuilder.addQuery({ + name: `usersQuery`, + type: `[${PREFIX}QueryElement]`, + args: ` + user_id: Int + `, + resolver: function (args, request) { + return user.getAllUsers(args) + }, + }); + + } +}); diff --git a/src/services/user/index.js b/src/services/user/index.js new file mode 100644 index 0000000..180faeb --- /dev/null +++ b/src/services/user/index.js @@ -0,0 +1,48 @@ +import configApi from 'config'; +import merge from 'lodash/merge'; +import { missingService, oncePerServices, serviceName } from '../../common/services'; + +export const name = serviceName(__filename); + +// const schema = require('./index.schema'); +const serviceConfig = configApi.get('externalTestService'); + +export default oncePerServices(function (services) { + const { + postgres = missingService('postgres') + } = services; + + class UserService { + + _timerId = null; + + constructor(options) { + // schema.ctor_options(this, options); + this._options = options; + } + + async _serviceStart() { + if (this._enabled && this._importEnabled) { + this._timerId = setInterval(() => { + return console.info(`user service is alive`); + }, this._processInterval); + } + + } + + async _serviceStop() { + clearInterval(this._timerId); + } + + async getAllUsers({context}) { + const list = await postgres.exec({ + context, + statement: `SELECT t.*, CTID FROM public.users t LIMIT 501` + }); + return list.rows.map(item => ({...item, birthday: item.data && item.data.birthday})) + } + } + + const mergedConfig = merge(serviceConfig, { dependsOn: [postgres] }); + return new (require('../../common/services').Service(services)(UserService))(name, mergedConfig); +}); From c086145dbfd642fd97c6c31ae18ca1ac73b242bb Mon Sep 17 00:00:00 2001 From: Andrew Alexandroff Date: Mon, 21 Jan 2019 13:58:26 +0300 Subject: [PATCH 3/3] Removed submodule dscommon --- .gitmodules | 3 --- dscommon | 1 - 2 files changed, 4 deletions(-) delete mode 160000 dscommon diff --git a/.gitmodules b/.gitmodules index 2f9eb3f..6b512ea 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "src/common"] path = src/common url = https://github.com/innervate-ru/common.git -[submodule "dscommon"] - path = dscommon - url = https://github.com/delightsoft/DSCommon3.git diff --git a/dscommon b/dscommon deleted file mode 160000 index e686733..0000000 --- a/dscommon +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e686733071326b1bbb9b70591d7d7a7068281ff3