From 7c5dd0775f22aab516415dbfbb192f7a9233680e Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 01:37:04 +0900 Subject: [PATCH 01/33] =?UTF-8?q?2=20=EB=AA=A8=EB=93=88=EA=B3=BC=20?= =?UTF-8?q?=EB=8F=84=EA=B5=AC=20=ED=82=A4=ED=8A=B8=20-=201=20=EC=9D=B5?= =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A0=88=EC=8A=A4(Express)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/.gitignore | 2 ++ .../2/1-express/app1.js | 8 +++++ .../2/1-express/app2.js | 34 +++++++++++++++++++ .../2/1-express/app3.js | 33 ++++++++++++++++++ .../2/1-express/package.json | 6 ++++ 5 files changed, 83 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/2/1-express/app1.js create mode 100644 node/wikibooks-nodejs-microservice/2/1-express/app2.js create mode 100644 node/wikibooks-nodejs-microservice/2/1-express/app3.js create mode 100644 node/wikibooks-nodejs-microservice/2/1-express/package.json diff --git a/node/wikibooks-nodejs-microservice/.gitignore b/node/wikibooks-nodejs-microservice/.gitignore new file mode 100644 index 0000000000..25c8fdbaba --- /dev/null +++ b/node/wikibooks-nodejs-microservice/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/1-express/app1.js b/node/wikibooks-nodejs-microservice/2/1-express/app1.js new file mode 100644 index 0000000000..22bf988205 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/1-express/app1.js @@ -0,0 +1,8 @@ +let express = require('express'); +let app = express(); + +app.get('/', (req, res) => { + res.send('Hello World'); +}); + +app.listen(3000); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/1-express/app2.js b/node/wikibooks-nodejs-microservice/2/1-express/app2.js new file mode 100644 index 0000000000..e770685104 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/1-express/app2.js @@ -0,0 +1,34 @@ +let express = require('express'); +let app = express(); +let stack = []; + +app.post('/stack', (req, res, next) => { + let buffer = ''; + + req.on('data', (data) => { + buffer += data; + }); + + req.on('end', () => { + stack.push(buffer); + return next(); + }); +}); + +app.delete('/stack', (req, res, next) => { + stack.pop(); + return next(); +}); + +app.get('/stack/:index', (req, res) => { + if (req.params.index >= 0 && req.params.index < stack.length) { + return res.end('' + stack[req.params.index]); + } + res.status(404).end(); +}); + +app.use('/stack', (req, res) => { + res.send(stack); +}); + +app.listen(3000); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/1-express/app3.js b/node/wikibooks-nodejs-microservice/2/1-express/app3.js new file mode 100644 index 0000000000..ddb0aad496 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/1-express/app3.js @@ -0,0 +1,33 @@ +let express = require('express'); +let body = require('body-parser'); +let route = express.Router(); +let app = express(); +let stack = []; + +app.use(body.text({ type: '*/*' })); + +route.post('/', (req, res, next) => { + stack.push(req.body); + + return next(); +}); + +route.delete('/', (req, res, next) => { + stack.pop(); + return next(); +}); + +route.get('/:index', (req, res) => { + if (req.params.index >= 0 && req.params.index < stack.length) { + return res.end('' + stack[req.params.index]); + } + res.status(404).end(); +}); + +route.use('/', (req, res) => { + res.send(stack); +}); + +app.use('/stack', route); + +app.listen(3000); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/1-express/package.json b/node/wikibooks-nodejs-microservice/2/1-express/package.json new file mode 100644 index 0000000000..3deab32423 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/1-express/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1" + } +} From 38e63f248e2e3e52786e5b5dd584071ca46f602d Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 10:55:20 +0900 Subject: [PATCH 02/33] =?UTF-8?q?2=20-=202=20=EB=A7=88=EC=9D=B4=ED=81=AC?= =?UTF-8?q?=EB=A1=9C(Micro)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/2/2-micro/app.js | 3 +++ node/wikibooks-nodejs-microservice/2/2-micro/package.json | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/2/2-micro/app.js create mode 100644 node/wikibooks-nodejs-microservice/2/2-micro/package.json diff --git a/node/wikibooks-nodejs-microservice/2/2-micro/app.js b/node/wikibooks-nodejs-microservice/2/2-micro/app.js new file mode 100644 index 0000000000..415217cd3d --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/2-micro/app.js @@ -0,0 +1,3 @@ +module.exports = (req, res) => { + res.end('Hello World'); +}; \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/2-micro/package.json b/node/wikibooks-nodejs-microservice/2/2-micro/package.json new file mode 100644 index 0000000000..3288245443 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/2-micro/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "micro": "^9.3.4" + }, + "scripts": { + "start": "micro app" + } +} \ No newline at end of file From 69f27e6b13eb0bae6ceeaabfdb1c2b0716932758 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 10:59:39 +0900 Subject: [PATCH 03/33] =?UTF-8?q?2=20-=203=20=EC=84=B8=EB=84=A4=EC=B9=B4(S?= =?UTF-8?q?eneca)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2/3-seneca/.gitignore | 1 + .../2/3-seneca/app1.js | 14 +++++++ .../2/3-seneca/app2.js | 25 +++++++++++ .../2/3-seneca/app3.js | 41 +++++++++++++++++++ .../2/3-seneca/package.json | 9 ++++ 5 files changed, 90 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/2/3-seneca/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/2/3-seneca/app1.js create mode 100644 node/wikibooks-nodejs-microservice/2/3-seneca/app2.js create mode 100644 node/wikibooks-nodejs-microservice/2/3-seneca/app3.js create mode 100644 node/wikibooks-nodejs-microservice/2/3-seneca/package.json diff --git a/node/wikibooks-nodejs-microservice/2/3-seneca/.gitignore b/node/wikibooks-nodejs-microservice/2/3-seneca/.gitignore new file mode 100644 index 0000000000..6320cd248d --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/3-seneca/.gitignore @@ -0,0 +1 @@ +data \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/3-seneca/app1.js b/node/wikibooks-nodejs-microservice/2/3-seneca/app1.js new file mode 100644 index 0000000000..20541e7e32 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/3-seneca/app1.js @@ -0,0 +1,14 @@ +const seneca = require('seneca'); +const service = seneca({ log: 'silent' }); + +service.add({ math: 'sum' }, (msg, next) => { + next(null, { + sum: msg.values.reduce((total, value) => (total + value), 0) + }); +}); + +service.act({ math: 'sum', values: [1, 2, 3] }, (err, msg) => { + if (err) return console.error(err); + + console.log('sum = %s', msg.sum); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/3-seneca/app2.js b/node/wikibooks-nodejs-microservice/2/3-seneca/app2.js new file mode 100644 index 0000000000..2e23fa3da9 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/3-seneca/app2.js @@ -0,0 +1,25 @@ +const seneca = require('seneca'); +const service = seneca({ log: 'silent' }); + +const stack = []; + +// http://localhost:3000/act?stack=push&value=one +service.add('stack:push,value:*', (msg, next) => { + stack.push(msg.value); + + next(null, stack); +}); + +// http://localhost:3000/act?stack=pop +service.add('stack:pop', (msg, next) => { + stack.pop(); + + next(null, stack); +}); + +// http://localhost:3000/act?stack=get +service.add('stack:get', (msg, next) => { + next(null, stack); +}); + +service.listen(3000); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/3-seneca/app3.js b/node/wikibooks-nodejs-microservice/2/3-seneca/app3.js new file mode 100644 index 0000000000..65d54b0802 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/3-seneca/app3.js @@ -0,0 +1,41 @@ +const async = require('async'); +const seneca = require('seneca'); +const service = seneca({ log: 'silent' }); + +service.use('basic'); +service.use('entity'); +service.use('jsonfile-store', { folder: 'data' }); + +const stack = service.make$('stack'); + +stack.load$((err) => { + if (err) throw err; + + service.add('stack:push,value:*', (msg, next) => { + stack.make$().save$({ value: msg.value }, (err) => { + return next(err, { value: msg.value }); + }); + }); + + service.add('stack:pop,value:*', (msg, next) => { + stack.list$({ value: msg.value }, (err, items) => { + async.each(items, (item, next) => { + item.remove$(next); + }, (err) => { + if (err) return next(err); + + return next(err, { remove: items.length }); + }); + }); + }); + + service.add('stack:get', (msg, next) => { + stack.list$((err, items) => { + if (err) return next(err); + + return next(null, items.map((item) => (item.value))); + }); + }); + + service.listen(3000); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/3-seneca/package.json b/node/wikibooks-nodejs-microservice/2/3-seneca/package.json new file mode 100644 index 0000000000..96b60e028d --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/3-seneca/package.json @@ -0,0 +1,9 @@ +{ + "dependencies": { + "async": "^3.1.0", + "seneca": "^3.14.1", + "seneca-basic": "^0.6.0", + "seneca-entity": "^4.1.0", + "seneca-jsonfile-store": "^1.1.0" + } +} From 7dd2fe317db1168a76cac6eb7480e0d89fe933db Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 14:47:22 +0900 Subject: [PATCH 04/33] =?UTF-8?q?2=20-=204=20=ED=9E=88=EB=93=9C=EB=9D=BC(H?= =?UTF-8?q?ydra)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2/4-hydra/description.md | 21 ++++ .../2/4-hydra/hello-service/.editorconfig | 10 ++ .../2/4-hydra/hello-service/.eslintrc | 97 +++++++++++++++++++ .../2/4-hydra/hello-service/.gitattributes | 2 + .../2/4-hydra/hello-service/.gitignore | 7 ++ .../2/4-hydra/hello-service/.nvmrc | 1 + .../hello-service/config/sample-config.json | 15 +++ .../2/4-hydra/hello-service/hello-service.js | 28 ++++++ .../2/4-hydra/hello-service/package.json | 26 +++++ .../hello-service/routes/hello-v1-routes.js | 27 ++++++ .../2/4-hydra/hello-service/scripts/docker.js | 64 ++++++++++++ .../hello-service/specs/helpers/chai.js | 10 ++ .../2/4-hydra/hello-service/specs/test.js | 10 ++ 13 files changed, 318 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/description.md create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.editorconfig create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.eslintrc create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitattributes create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.nvmrc create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/config/sample-config.json create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/hello-service.js create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/package.json create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/routes/hello-v1-routes.js create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/scripts/docker.js create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/helpers/chai.js create mode 100644 node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/test.js diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/description.md b/node/wikibooks-nodejs-microservice/2/4-hydra/description.md new file mode 100644 index 0000000000..2a9d5269e3 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/description.md @@ -0,0 +1,21 @@ +## 2 - 4 히드라(Hydra) + +- `npm i -g yo generator-fwsp-hydra hydra-cli` + +- `hydra-cli config local` + - `redisUrl: 127.0.0.1 redisPort: 6379 redisDb: 15` + +- `yo fwsp-hydra` + - ? Name of the service (`-service` will be appended automatically) hello + - ? Your full name? + - ? Your email address? + - ? Your organization or username? (used to tag docker images) + - ? Host the service runs on? + - ? Port the service runs on? 0 + - ? What does this service do? + - ? Does this service need auth? No + - ? Is this a hydra-express service? Yes + - ? Set up a view engine? No + - ? Set up logging? No + - ? Enable CORS on serverResponses? No + - ? Run npm install? No \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.editorconfig b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.editorconfig new file mode 100644 index 0000000000..c0f2cb2c8b --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.editorconfig @@ -0,0 +1,10 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.eslintrc b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.eslintrc new file mode 100644 index 0000000000..e498908ea5 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.eslintrc @@ -0,0 +1,97 @@ +{ + "plugins": ["jasmine"], + "extends": ["eslint:recommended", "plugin:jasmine/recommended"], + "parserOptions": { + "ecmaVersion": 6, + "ecmaFeatures": { + "jsx": true + }, + "sourceType": "module" + }, + "rules": { + "valid-jsdoc": [2, { + "requireReturn": false + }], + "comma-dangle": 0, + "curly": 2, + "semi": [2, "always"], + "no-console": 0, + "no-debugger": 2, + "no-extra-semi": 2, + "no-constant-condition": 2, + "no-alert": 2, + "no-unused-vars": ["error", { "argsIgnorePattern": "^(?:reject|_)" }], + "one-var-declaration-per-line": 2, + "operator-linebreak": [ + 2, + "after" + ], + "max-len": [ + 2, + 240 + ], + "indent": [ + 2, + 2, + { + "SwitchCase": 1 + } + ], + "quotes": [ + 2, + "single", + { + "avoidEscape": true + } + ], + "no-multi-str": 2, + "no-mixed-spaces-and-tabs": 2, + "no-trailing-spaces": 2, + "space-unary-ops": [ + 2, + { + "nonwords": false, + "overrides": {} + } + ], + "one-var": [ + 2, + { + "uninitialized": "always", + "initialized": "never" + } + ], + "keyword-spacing": [ + 2, + {} + ], + "space-infix-ops": 2, + "space-before-blocks": [ + 2, + "always" + ], + "eol-last": 2, + "space-in-parens": [ + 2, + "never" + ], + "no-multiple-empty-lines": 2, + "no-multi-spaces": 2, + "key-spacing": [ + 2, + { + "beforeColon": false, + "afterColon": true + } + ] + }, + "env": { + "browser": true, + "node": true, + "es6": true, + "jasmine": true + }, + "globals": { + "-": 0 + } +} diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitattributes b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitattributes new file mode 100644 index 0000000000..a3f05d060c --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitattributes @@ -0,0 +1,2 @@ +*.apib linguist-documentation + diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitignore b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitignore new file mode 100644 index 0000000000..0cf3873046 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +*.log +*.pem +*.rsa +node_modules +config/config.json +*/public diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.nvmrc b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.nvmrc new file mode 100644 index 0000000000..3410944e13 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/.nvmrc @@ -0,0 +1 @@ +v6.2.1 \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/config/sample-config.json b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/config/sample-config.json new file mode 100644 index 0000000000..abfc25e0b1 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/config/sample-config.json @@ -0,0 +1,15 @@ +{ + "environment": "development", + "hydra": { + "serviceName": "hello-service", + "serviceIP": "", + "servicePort": 0, + "serviceType": "hello", + "serviceDescription": "", + "redis": { + "url": "127.0.0.1", + "port": 6379, + "db": 15 + } + } +} diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/hello-service.js b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/hello-service.js new file mode 100644 index 0000000000..18e97613e0 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/hello-service.js @@ -0,0 +1,28 @@ +/** +* @name Hello +* @summary Hello Hydra Express service entry point +* @description +*/ +'use strict'; + +const version = require('./package.json').version; +const hydraExpress = require('hydra-express'); + + + +let config = require('fwsp-config'); + +/** +* Load configuration file and initialize hydraExpress app +*/ +config.init('./config/config.json') + .then(() => { + config.version = version; + return hydraExpress.init(config.getObject(), version, () => { + hydraExpress.registerRoutes({ + '/v1/hello': require('./routes/hello-v1-routes') + }); + }); + }) + .then(serviceInfo => console.log('serviceInfo', serviceInfo)) + .catch(err => console.log('err', err)); diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/package.json b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/package.json new file mode 100644 index 0000000000..6950b6b283 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/package.json @@ -0,0 +1,26 @@ +{ + "name": "hello-service", + "version": "0.0.1", + "author": " <>", + "private": true, + "scripts": { + "start": "node hello-service.js", + "debug": "node-debug hello-service.js --debug-brk", + "test": "mocha specs --reporter spec", + "docker": "node scripts/docker.js" + }, + "engines": { + "node": ">=6.2.1" + }, + "dependencies": { + "fwsp-config": "1.1.5", + "hydra-express": "1.7.1", + "fwsp-server-response": "2.2.6" + }, + "devDependencies": { + "chai": "3.5.0", + "eslint": "3.16.0", + "mocha": "3.2.0", + "superagent": "3.5.2" + } +} diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/routes/hello-v1-routes.js b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/routes/hello-v1-routes.js new file mode 100644 index 0000000000..89adcd82fa --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/routes/hello-v1-routes.js @@ -0,0 +1,27 @@ +/** + * @name hello-v1-api + * @description This module packages the Hello API. + */ +'use strict'; + +const hydraExpress = require('hydra-express'); +const hydra = hydraExpress.getHydra(); +const express = hydraExpress.getExpress(); +const ServerResponse = require('fwsp-server-response'); + +let serverResponse = new ServerResponse(); +express.response.sendError = function(err) { + serverResponse.sendServerError(this, {result: {error: err}}); +}; +express.response.sendOk = function(result) { + serverResponse.sendOk(this, {result}); +}; + +let api = express.Router(); + +api.get('/', +(req, res) => { + res.sendOk({greeting: 'Welcome to Hydra Express!'}); +}); + +module.exports = api; diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/scripts/docker.js b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/scripts/docker.js new file mode 100644 index 0000000000..5e0850194e --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/scripts/docker.js @@ -0,0 +1,64 @@ +const config = require('fwsp-config'), + fs = require('fs'), + spawn = require('child_process').spawn, + tag = `/${process.env.npm_package_name}:${process.env.npm_package_version}`; +modes = { + build: ['docker', ['build', '-t', tag, process.cwd()], { stdio: 'inherit' }], + run: ['docker', ['run', '-it', tag], { stdio: 'inherit' }], + up: ['docker', ['run', '-d', tag], { detached: true }] +}, + getDockerfile = (exposePort, logger = false) => ` + FROM node:6.3 + MAINTAINER + EXPOSE ${exposePort} + ARG NPM_TOKEN + RUN mkdir -p /usr/src/app + WORKDIR /usr/src/app + ADD . /usr/src/app + RUN echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc + ${logger ? 'RUN npm install pino-elasticsearch -g' : ''} + RUN npm install --production + RUN rm -f .npmrc + CMD ["npm", "start"] + `, + run = (mode) => { + console.log(`Running '${[modes[mode][0], ...modes[mode][1]].join(' ')}'`); + let docker = spawn(...modes[mode]); + docker.on('close', code => console.log(`docker ${mode} exited with code ${code}`)); + }; + +let mode = process.argv[2]; +if (!modes[mode]) { + console.log(`No such mode '${mode}'. Available modes: ${Object.keys(modes).join(', ')}.`); + return; +} +if (mode === 'build') { + if (!fs.existsSync('config/config.json')) { + console.log('config/config.json must exist to build docker image'); + process.exit(1); + } + if (fs.existsSync('Dockerfile')) { + run(mode); + } else { + console.log('No Dockerfile found, loading config.json and generating one...'); + config.init('./config/config.json') + .then(() => { + let Dockerfile = getDockerfile( + config.hydra.servicePort, + config.hydra.plugins && config.hydra.plugins.logger ? true : false + ).split(/\n/).map(v => v.trim()).filter(v => v.length).join('\n'); + console.log(Dockerfile); + fs.writeFile('Dockerfile', Dockerfile, err => { + if (err) { + console.log('Error writing Dockerfile', err); + process.exit(1); + } else { + console.log('Wrote Dockerfile'); + run(mode); + } + }); + }); + } +} else { + run(mode); +} diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/helpers/chai.js b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/helpers/chai.js new file mode 100644 index 0000000000..ae951a6e67 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/helpers/chai.js @@ -0,0 +1,10 @@ +'use strict'; + +var chai = require('chai'); + +chai.config.includeStack = true; + +global.expect = chai.expect; +global.AssertionError = chai.AssertionError; +global.Assertion = chai.Assertion; +global.assert = chai.assert; diff --git a/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/test.js b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/test.js new file mode 100644 index 0000000000..e3013e9ab0 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/2/4-hydra/hello-service/specs/test.js @@ -0,0 +1,10 @@ +'use strict'; + +/** +* Change into specs folder so that file loading works. +*/ +process.chdir('./specs'); + +require('./helpers/chai.js'); + +// Tests go here. From 61c4ffbd4d9d1c5d89e8adaa469636838c303aff Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 14:53:15 +0900 Subject: [PATCH 05/33] =?UTF-8?q?3=20=EB=A7=88=EC=9D=B4=ED=81=AC=EB=A1=9C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B5=AC=EC=B6=95=20-=201=20?= =?UTF-8?q?=EC=9D=B5=EC=8A=A4=ED=94=84=EB=A0=88=EC=8A=A4=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 59 +++++++++++++++++++ .../3/1-express/package.json | 6 ++ 2 files changed, 65 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/3/1-express/app.js create mode 100644 node/wikibooks-nodejs-microservice/3/1-express/package.json diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js new file mode 100644 index 0000000000..a8dc8ce6b3 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -0,0 +1,59 @@ +const express = require('express'); +const sharp = require('sharp'); +const app = express(); + +app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { + let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); + let width = +req.query.width || 300; + let height = +req.query.height || 200; + let border = +req.query.border || 5; + let bgcolor = req.query.bgcolor || '#fcfcfc'; + let fgcolor = req.query.fgcolor || '#ddd'; + let textcolor = req.query.textcolor || '#aaa'; + let textsize = +req.query.textsize || 24; + let image = sharp({ + create: { + width, + height, + channels: 4, + background: { r: 0, g: 0, b: 0 }, + }, + }); + + const thumbnail = Buffer.from(` + + + + + + + + ${width} x ${height} + + + `); + + image.overlayWith(thumbnail)[format]().pipe(res); +}); + +app.listen(3000, () => { + console.log('ready'); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/1-express/package.json b/node/wikibooks-nodejs-microservice/3/1-express/package.json new file mode 100644 index 0000000000..0e4f8061a9 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/1-express/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "express": "^4.17.1", + "sharp": "^0.19.0" + } +} From 8e51f0fd8e79c09d365bd2db0167c78e03fd060e Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 15:21:03 +0900 Subject: [PATCH 06/33] =?UTF-8?q?3=20-=201=20-=201=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/.gitignore | 1 + .../3/1-express/app.js | 27 ++++++++++++++++++ .../3/1-express/description.md | 3 ++ .../3/1-express/example.png | Bin 0 -> 55543 bytes .../3/1-express/package.json | 1 + 5 files changed, 32 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/3/1-express/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/3/1-express/description.md create mode 100644 node/wikibooks-nodejs-microservice/3/1-express/example.png diff --git a/node/wikibooks-nodejs-microservice/3/1-express/.gitignore b/node/wikibooks-nodejs-microservice/3/1-express/.gitignore new file mode 100644 index 0000000000..95a48fbcd4 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/1-express/.gitignore @@ -0,0 +1 @@ +uploads \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index a8dc8ce6b3..7750d57000 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -1,7 +1,34 @@ const express = require('express'); const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const path = require('path'); +const fs = require('fs'); const app = express(); +app.post('/uploads/:image', bodyparser.raw({ + limit: '10mb', + type: 'image/*' +}), (req, res) => { + let image = req.params.image.toLowerCase(); + + if (!image.match(/\.(png|jpg)$/)) { + return res.status(403).end(); + } + + let len = req.body.length; + let fd = fs.createWriteStream(path.join(__dirname, 'uploads', image), { + flags: 'w+', + encoding: 'binary' + }); + + fd.write(req.body); + fd.end(); + + fd.on('close', () => { + res.send({ status: 'ok', size: len }); + }); +}); + app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); let width = +req.query.width || 300; diff --git a/node/wikibooks-nodejs-microservice/3/1-express/description.md b/node/wikibooks-nodejs-microservice/3/1-express/description.md new file mode 100644 index 0000000000..36172cc094 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/1-express/description.md @@ -0,0 +1,3 @@ +## 3 - 1 - 1 이미지 업로드 + +- `curl -X POST -H 'Content-Type: image/png' --data-binary @example.png http://localhost:3000/uploads/example.png` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/1-express/example.png b/node/wikibooks-nodejs-microservice/3/1-express/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 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%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/3/1-express/package.json b/node/wikibooks-nodejs-microservice/3/1-express/package.json index 0e4f8061a9..382e9c9b43 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/package.json +++ b/node/wikibooks-nodejs-microservice/3/1-express/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "body-parser": "^1.19.0", "express": "^4.17.1", "sharp": "^0.19.0" } From 1ad8a93a1e275e90486f4a47f47cbe497adc9c08 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 15:32:46 +0900 Subject: [PATCH 07/33] =?UTF-8?q?3=20-=201=20-=202=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=EC=97=90=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EA=B0=80=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/3/1-express/app.js | 11 +++++++++++ .../3/1-express/description.md | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index 7750d57000..f027222d91 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -29,6 +29,17 @@ app.post('/uploads/:image', bodyparser.raw({ }); }); +app.head('/uploads/:image', (req, res) => { + fs.access( + path.join(__dirname, 'uploads', req.params.image), + fs.constants.R_OK, + (err) => { + res.status(err ? 404 : 200); + res.end(); + }, + ); +}); + app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); let width = +req.query.width || 300; diff --git a/node/wikibooks-nodejs-microservice/3/1-express/description.md b/node/wikibooks-nodejs-microservice/3/1-express/description.md index 36172cc094..88dafb6cae 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/description.md +++ b/node/wikibooks-nodejs-microservice/3/1-express/description.md @@ -1,3 +1,7 @@ ## 3 - 1 - 1 이미지 업로드 -- `curl -X POST -H 'Content-Type: image/png' --data-binary @example.png http://localhost:3000/uploads/example.png` \ No newline at end of file +- `curl -X POST -H 'Content-Type: image/png' --data-binary @example.png http://localhost:3000/uploads/example.png` + +## 3 - 1 - 2 폴더에 이미지가 있는지 확인 + +- `curl --head 'http://localhost:3000/uploads/example.png'` \ No newline at end of file From 82bdaa775b1adf8020978315ff819a69d2b80979 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 15:32:54 +0900 Subject: [PATCH 08/33] =?UTF-8?q?3=20-=201=20-=203=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index f027222d91..936d2df73b 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -40,6 +40,36 @@ app.head('/uploads/:image', (req, res) => { ); }); +app.get('/uploads/:image', (req, res) => { + let ext = path.extname(req.params.image); + + if (!ext.match(/^\.(png|jpg)$/)) { + return res.status(404).end(); + } + + let fd = fs.createReadStream(path.join(__dirname, 'uploads', req.params.image)); + + fd.on('error', (e) => { + if (e.code === 'ENOENT') { + res.status(404); + + if (req.accepts('html')) { + res.setHeader('Content-Type', 'text/html'); + + res.write('Error: image not found'); + } + + return res.end(); + } + + res.status(500).end(); + }); + + res.setHeader('Content-Type', 'image/' + ext.substr(1)); + + fd.pipe(res); +}); + app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); let width = +req.query.width || 300; From 8969112651a591aa432cb0036bc8450a0558a79f Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 15:43:29 +0900 Subject: [PATCH 09/33] =?UTF-8?q?3=20-=201=20-=204=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 52 +++++++------------ 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index 936d2df73b..99d01a1d0f 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -5,18 +5,23 @@ const path = require('path'); const fs = require('fs'); const app = express(); +app.param('image', (req, res, next, image) => { + if (!image.match(/\.(png|jpg)$/i)) { + return res.status(req.method === 'POST' ? 403 : 404).end(); + } + + req.image = image; + + req.localpath = path.join(__dirname, 'uploads', req.image); + + return next(); +}); + app.post('/uploads/:image', bodyparser.raw({ limit: '10mb', type: 'image/*' }), (req, res) => { - let image = req.params.image.toLowerCase(); - - if (!image.match(/\.(png|jpg)$/)) { - return res.status(403).end(); - } - - let len = req.body.length; - let fd = fs.createWriteStream(path.join(__dirname, 'uploads', image), { + let fd = fs.createWriteStream(req.localpath, { flags: 'w+', encoding: 'binary' }); @@ -25,47 +30,28 @@ app.post('/uploads/:image', bodyparser.raw({ fd.end(); fd.on('close', () => { - res.send({ status: 'ok', size: len }); + res.send({ status: 'ok', size: req.body.length }); }); }); app.head('/uploads/:image', (req, res) => { fs.access( - path.join(__dirname, 'uploads', req.params.image), + req.localpath, fs.constants.R_OK, (err) => { - res.status(err ? 404 : 200); - res.end(); + res.status(err ? 404 : 200).end(); }, ); }); app.get('/uploads/:image', (req, res) => { - let ext = path.extname(req.params.image); - - if (!ext.match(/^\.(png|jpg)$/)) { - return res.status(404).end(); - } - - let fd = fs.createReadStream(path.join(__dirname, 'uploads', req.params.image)); + let fd = fs.createReadStream(req.localpath); fd.on('error', (e) => { - if (e.code === 'ENOENT') { - res.status(404); - - if (req.accepts('html')) { - res.setHeader('Content-Type', 'text/html'); - - res.write('Error: image not found'); - } - - return res.end(); - } - - res.status(500).end(); + res.status(e.code === 'ENOENT' ? 404 : 500).end(); }); - res.setHeader('Content-Type', 'image/' + ext.substr(1)); + res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); fd.pipe(res); }); From 218d16ce64521f969faf356badb4880823aee025 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 15:49:08 +0900 Subject: [PATCH 10/33] =?UTF-8?q?3=20-=201=20-=205=20=EC=8D=B8=EB=84=A4?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index 99d01a1d0f..00c34ba659 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -17,6 +17,38 @@ app.param('image', (req, res, next, image) => { return next(); }); +app.param('width', (req, res, next, width) => { + req.width = +width; + + return next(); +}); + +app.param('height', (req, res, next, height) => { + req.height = +height; + + return next(); +}); + +function download_image(req, res) { + fs.access(req.localpath, fs.constants.R_OK, (err) => { + if (err) return res.status(404).end(); + + let image = sharp(req.localpath); + + if (req.width && req.height) { + image.ignoreAspectRatio(); + } + + if (req.width || req.height) { + image.resize(req.width, req.height); + } + + res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); + + image.pipe(res); + }); +} + app.post('/uploads/:image', bodyparser.raw({ limit: '10mb', type: 'image/*' @@ -44,17 +76,10 @@ app.head('/uploads/:image', (req, res) => { ); }); -app.get('/uploads/:image', (req, res) => { - let fd = fs.createReadStream(req.localpath); - - fd.on('error', (e) => { - res.status(e.code === 'ENOENT' ? 404 : 500).end(); - }); - - res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); - - fd.pipe(res); -}); +app.get("/uploads/:width(\\d+)x:height(\\d+)-:image", download_image); // http://localhost:3000/uploads/300x150-example.png +app.get("/uploads/_x:height(\\d+)-:image", download_image); // http://localhost:3000/uploads/_x150-example.png +app.get("/uploads/:width(\\d+)x_-:image", download_image); // http://localhost:3000/uploads/300x_-example.png +app.get("/uploads/:image", download_image); // http://localhost:3000/uploads/example.png app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); From a0d48dee387c3808f4b335c43042e9e6e6850ff6 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 15:53:05 +0900 Subject: [PATCH 11/33] =?UTF-8?q?3=20-=201=20-=206=20=EC=83=89=EC=9D=84=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EA=B0=84=EB=8B=A8=ED=95=9C=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index 00c34ba659..52bfdcf40e 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -29,6 +29,14 @@ app.param('height', (req, res, next, height) => { return next(); }); +app.param('greyscale', (req, res, next, greyscale) => { + if (greyscale != 'bw') return next('route'); + + req.greyscale = true; + + return next(); +}); + function download_image(req, res) { fs.access(req.localpath, fs.constants.R_OK, (err) => { if (err) return res.status(404).end(); @@ -43,6 +51,10 @@ function download_image(req, res) { image.resize(req.width, req.height); } + if (req.greyscale) { + image.greyscale(); + } + res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); image.pipe(res); @@ -76,9 +88,13 @@ app.head('/uploads/:image', (req, res) => { ); }); +app.get("/uploads/:width(\\d+)x:height(\\d+)-:greyscale-:image", download_image); // http://localhost:3000/uploads/300x150-bw-example.png app.get("/uploads/:width(\\d+)x:height(\\d+)-:image", download_image); // http://localhost:3000/uploads/300x150-example.png +app.get("/uploads/_x:height(\\d+)-:greyscale-:image", download_image); // http://localhost:3000/uploads/_x150-bw-example.png app.get("/uploads/_x:height(\\d+)-:image", download_image); // http://localhost:3000/uploads/_x150-example.png +app.get("/uploads/:width(\\d+)x_-:greyscale-:image", download_image); // http://localhost:3000/uploads/300x_-bw-example.png app.get("/uploads/:width(\\d+)x_-:image", download_image); // http://localhost:3000/uploads/300x_-example.png +app.get("/uploads/:greyscale-:image", download_image); // http://localhost:3000/uploads/bw-example.png app.get("/uploads/:image", download_image); // http://localhost:3000/uploads/example.png app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { From b2201ecb73135f4d481d82cc995a339e2f01dcbb Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 16:07:59 +0900 Subject: [PATCH 12/33] =?UTF-8?q?3=20-=201=20-=207=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 81 +++++++------------ 1 file changed, 29 insertions(+), 52 deletions(-) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index 52bfdcf40e..1794518a74 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -17,50 +17,6 @@ app.param('image', (req, res, next, image) => { return next(); }); -app.param('width', (req, res, next, width) => { - req.width = +width; - - return next(); -}); - -app.param('height', (req, res, next, height) => { - req.height = +height; - - return next(); -}); - -app.param('greyscale', (req, res, next, greyscale) => { - if (greyscale != 'bw') return next('route'); - - req.greyscale = true; - - return next(); -}); - -function download_image(req, res) { - fs.access(req.localpath, fs.constants.R_OK, (err) => { - if (err) return res.status(404).end(); - - let image = sharp(req.localpath); - - if (req.width && req.height) { - image.ignoreAspectRatio(); - } - - if (req.width || req.height) { - image.resize(req.width, req.height); - } - - if (req.greyscale) { - image.greyscale(); - } - - res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); - - image.pipe(res); - }); -} - app.post('/uploads/:image', bodyparser.raw({ limit: '10mb', type: 'image/*' @@ -88,14 +44,35 @@ app.head('/uploads/:image', (req, res) => { ); }); -app.get("/uploads/:width(\\d+)x:height(\\d+)-:greyscale-:image", download_image); // http://localhost:3000/uploads/300x150-bw-example.png -app.get("/uploads/:width(\\d+)x:height(\\d+)-:image", download_image); // http://localhost:3000/uploads/300x150-example.png -app.get("/uploads/_x:height(\\d+)-:greyscale-:image", download_image); // http://localhost:3000/uploads/_x150-bw-example.png -app.get("/uploads/_x:height(\\d+)-:image", download_image); // http://localhost:3000/uploads/_x150-example.png -app.get("/uploads/:width(\\d+)x_-:greyscale-:image", download_image); // http://localhost:3000/uploads/300x_-bw-example.png -app.get("/uploads/:width(\\d+)x_-:image", download_image); // http://localhost:3000/uploads/300x_-example.png -app.get("/uploads/:greyscale-:image", download_image); // http://localhost:3000/uploads/bw-example.png -app.get("/uploads/:image", download_image); // http://localhost:3000/uploads/example.png +function download_image(req, res) { + fs.access(req.localpath, fs.constants.R_OK, (err) => { + if (err) return res.status(404).end(); + + let image = sharp(req.localpath); + + let width = +req.query.width; + let height = +req.query.height; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (greyscale) { + image.greyscale(); + } + + res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); + + image.pipe(res); + }); +} + +app.get("/uploads/:image", download_image); app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); From 30b51e89fc77b2f135eff9ba3e61f4160d7928bf Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 16:10:45 +0900 Subject: [PATCH 13/33] =?UTF-8?q?3=20-=201=20-=208=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A1=B0=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/1-express/app.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/node/wikibooks-nodejs-microservice/3/1-express/app.js b/node/wikibooks-nodejs-microservice/3/1-express/app.js index 1794518a74..c352ff3b05 100644 --- a/node/wikibooks-nodejs-microservice/3/1-express/app.js +++ b/node/wikibooks-nodejs-microservice/3/1-express/app.js @@ -44,7 +44,7 @@ app.head('/uploads/:image', (req, res) => { ); }); -function download_image(req, res) { +app.get("/uploads/:image", (req, res) => { fs.access(req.localpath, fs.constants.R_OK, (err) => { if (err) return res.status(404).end(); @@ -52,7 +52,11 @@ function download_image(req, res) { let width = +req.query.width; let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); if (width > 0 && height > 0) { image.ignoreAspectRatio(); @@ -62,17 +66,17 @@ function download_image(req, res) { image.resize(width || null, height || null); } - if (greyscale) { - image.greyscale(); - } + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); image.pipe(res); }); -} - -app.get("/uploads/:image", download_image); +}); app.get(/\/thumbnail\.(jpg|png)/, (req, res, next) => { let format = (req.params[0] === 'png' ? 'png' : 'jpeg'); From f27615d24b6a4673235f0b116ae1ad1799dfb8e3 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 17:12:21 +0900 Subject: [PATCH 14/33] =?UTF-8?q?3=20-=202=20=ED=9E=88=EB=93=9C=EB=9D=BC?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/2-hydra/description.md | 18 ++++ .../3/2-hydra/example.png | Bin 0 -> 55543 bytes .../3/2-hydra/imagini-service/.editorconfig | 10 ++ .../3/2-hydra/imagini-service/.eslintrc | 97 +++++++++++++++++ .../3/2-hydra/imagini-service/.gitattributes | 2 + .../3/2-hydra/imagini-service/.gitignore | 9 ++ .../3/2-hydra/imagini-service/.nvmrc | 1 + .../imagini-service/config/sample-config.json | 15 +++ .../imagini-service/imagini-service.js | 28 +++++ .../3/2-hydra/imagini-service/package.json | 28 +++++ .../routes/imagini-v1-routes.js | 100 ++++++++++++++++++ .../2-hydra/imagini-service/scripts/docker.js | 64 +++++++++++ .../imagini-service/specs/helpers/chai.js | 10 ++ .../3/2-hydra/imagini-service/specs/test.js | 10 ++ 14 files changed, 392 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/description.md create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/example.png create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.editorconfig create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.eslintrc create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitattributes create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.nvmrc create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/config/sample-config.json create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/imagini-service.js create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/package.json create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/routes/imagini-v1-routes.js create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/scripts/docker.js create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/helpers/chai.js create mode 100644 node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/test.js diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/description.md b/node/wikibooks-nodejs-microservice/3/2-hydra/description.md new file mode 100644 index 0000000000..389ef581fe --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/description.md @@ -0,0 +1,18 @@ +## 3 - 2 히드라 사용 + +- `yo fwsp-hydra` + - ? Name of the service (`-service` will be appended automatically) imagini + - ? Your full name? + - ? Your email address? + - ? Your organization or username? (used to tag docker images) + - ? Host the service runs on? + - ? Port the service runs on? 3000 + - ? What does this service do? + - ? Does this service need auth? No + - ? Is this a hydra-express service? Yes + - ? Set up a view engine? No + - ? Set up logging? No + - ? Enable CORS on serverResponses? No + - ? Run npm install? No + +- `curl -X POST -H 'Content-Type: image/png' --data-binary @example.png http://localhost:3000/v1/imagini/example.png` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/example.png b/node/wikibooks-nodejs-microservice/3/2-hydra/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 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%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.editorconfig b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.editorconfig new file mode 100644 index 0000000000..c0f2cb2c8b --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.editorconfig @@ -0,0 +1,10 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.eslintrc b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.eslintrc new file mode 100644 index 0000000000..e498908ea5 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.eslintrc @@ -0,0 +1,97 @@ +{ + "plugins": ["jasmine"], + "extends": ["eslint:recommended", "plugin:jasmine/recommended"], + "parserOptions": { + "ecmaVersion": 6, + "ecmaFeatures": { + "jsx": true + }, + "sourceType": "module" + }, + "rules": { + "valid-jsdoc": [2, { + "requireReturn": false + }], + "comma-dangle": 0, + "curly": 2, + "semi": [2, "always"], + "no-console": 0, + "no-debugger": 2, + "no-extra-semi": 2, + "no-constant-condition": 2, + "no-alert": 2, + "no-unused-vars": ["error", { "argsIgnorePattern": "^(?:reject|_)" }], + "one-var-declaration-per-line": 2, + "operator-linebreak": [ + 2, + "after" + ], + "max-len": [ + 2, + 240 + ], + "indent": [ + 2, + 2, + { + "SwitchCase": 1 + } + ], + "quotes": [ + 2, + "single", + { + "avoidEscape": true + } + ], + "no-multi-str": 2, + "no-mixed-spaces-and-tabs": 2, + "no-trailing-spaces": 2, + "space-unary-ops": [ + 2, + { + "nonwords": false, + "overrides": {} + } + ], + "one-var": [ + 2, + { + "uninitialized": "always", + "initialized": "never" + } + ], + "keyword-spacing": [ + 2, + {} + ], + "space-infix-ops": 2, + "space-before-blocks": [ + 2, + "always" + ], + "eol-last": 2, + "space-in-parens": [ + 2, + "never" + ], + "no-multiple-empty-lines": 2, + "no-multi-spaces": 2, + "key-spacing": [ + 2, + { + "beforeColon": false, + "afterColon": true + } + ] + }, + "env": { + "browser": true, + "node": true, + "es6": true, + "jasmine": true + }, + "globals": { + "-": 0 + } +} diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitattributes b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitattributes new file mode 100644 index 0000000000..a3f05d060c --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitattributes @@ -0,0 +1,2 @@ +*.apib linguist-documentation + diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitignore b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitignore new file mode 100644 index 0000000000..527ac902b9 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +*.log +*.pem +*.rsa +node_modules +config/config.json +*/public + +uploads diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.nvmrc b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.nvmrc new file mode 100644 index 0000000000..3410944e13 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/.nvmrc @@ -0,0 +1 @@ +v6.2.1 \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/config/sample-config.json b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/config/sample-config.json new file mode 100644 index 0000000000..9bbf186114 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/config/sample-config.json @@ -0,0 +1,15 @@ +{ + "environment": "development", + "hydra": { + "serviceName": "imagini-service", + "serviceIP": "", + "servicePort": 3000, + "serviceType": "imagini", + "serviceDescription": "", + "redis": { + "url": "127.0.0.1", + "port": 6379, + "db": 15 + } + } +} diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/imagini-service.js b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/imagini-service.js new file mode 100644 index 0000000000..5867fd8750 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/imagini-service.js @@ -0,0 +1,28 @@ +/** +* @name Imagini +* @summary Imagini Hydra Express service entry point +* @description +*/ +'use strict'; + +const version = require('./package.json').version; +const hydraExpress = require('hydra-express'); + + + +let config = require('fwsp-config'); + +/** +* Load configuration file and initialize hydraExpress app +*/ +config.init('./config/config.json') + .then(() => { + config.version = version; + return hydraExpress.init(config.getObject(), version, () => { + hydraExpress.registerRoutes({ + '/v1/imagini': require('./routes/imagini-v1-routes') + }); + }); + }) + .then(serviceInfo => console.log('serviceInfo', serviceInfo)) + .catch(err => console.log('err', err)); diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/package.json b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/package.json new file mode 100644 index 0000000000..c334baca2a --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/package.json @@ -0,0 +1,28 @@ +{ + "name": "imagini-service", + "version": "0.0.1", + "author": " <>", + "private": true, + "scripts": { + "start": "node imagini-service.js", + "debug": "node-debug imagini-service.js --debug-brk", + "test": "mocha specs --reporter spec", + "docker": "node scripts/docker.js" + }, + "engines": { + "node": ">=6.2.1" + }, + "dependencies": { + "body-parser": "^1.19.0", + "fwsp-config": "1.1.5", + "fwsp-server-response": "2.2.6", + "hydra-express": "1.7.1", + "sharp": "^0.23.0" + }, + "devDependencies": { + "chai": "3.5.0", + "eslint": "3.16.0", + "mocha": "3.2.0", + "superagent": "3.5.2" + } +} diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/routes/imagini-v1-routes.js b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/routes/imagini-v1-routes.js new file mode 100644 index 0000000000..e3258302ad --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/routes/imagini-v1-routes.js @@ -0,0 +1,100 @@ +/** + * @name imagini-v1-api + * @description This module packages the Imagini API. + */ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const hydraExpress = require('hydra-express'); +const ServerResponse = require('fwsp-server-response'); +const hydra = hydraExpress.getHydra(); +const express = hydraExpress.getExpress(); + +let serverResponse = new ServerResponse(); + +express.response.sendError = function (err) { + serverResponse.sendServerError(this, { result: { error: err } }); +}; +express.response.sendOk = function (result) { + serverResponse.sendOk(this, { result }); +}; + +let api = express.Router(); + +api.param('image', (req, res, next, image) => { + if (!image.match(/\.(png|jpg)$/i)) { + return res.sendError('invalid image type/extension'); + } + + req.image = image; + req.localpath = path.join(__dirname, '../uploads', req.image); + + return next(); +}); + +api.post('/:image', bodyparser.raw({ + limit: '10mb', + type: 'image/*' +}), (req, res) => { + let fd = fs.createWriteStream(req.localpath, { + flags: 'w+', + encoding: 'binary' + }); + + fd.end(req.body); + + fd.on('close', () => { + res.sendOk({ size: req.body.length }); + }); +}); + +api.head('/:image', (req, res) => { + fs.access(req.localpath, fs.constants.R_OK, (err) => { + if (err) { + return res.sendError('image not found'); + } + + return res.sendOk(); + }); +}); + +api.get('/:image', (req, res) => { + fs.access(req.localpath, fs.constants.R_OK, (err) => { + if (err) { + return res.sendError('image not found'); + } + + let image = sharp(req.localpath); + + let width = +req.query.width; + let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + res.setHeader('Content-Type', 'image/' + path.extname(req.image).substr(1)); + + image.pipe(res); + }); +}) + +module.exports = api; diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/scripts/docker.js b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/scripts/docker.js new file mode 100644 index 0000000000..5e0850194e --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/scripts/docker.js @@ -0,0 +1,64 @@ +const config = require('fwsp-config'), + fs = require('fs'), + spawn = require('child_process').spawn, + tag = `/${process.env.npm_package_name}:${process.env.npm_package_version}`; +modes = { + build: ['docker', ['build', '-t', tag, process.cwd()], { stdio: 'inherit' }], + run: ['docker', ['run', '-it', tag], { stdio: 'inherit' }], + up: ['docker', ['run', '-d', tag], { detached: true }] +}, + getDockerfile = (exposePort, logger = false) => ` + FROM node:6.3 + MAINTAINER + EXPOSE ${exposePort} + ARG NPM_TOKEN + RUN mkdir -p /usr/src/app + WORKDIR /usr/src/app + ADD . /usr/src/app + RUN echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc + ${logger ? 'RUN npm install pino-elasticsearch -g' : ''} + RUN npm install --production + RUN rm -f .npmrc + CMD ["npm", "start"] + `, + run = (mode) => { + console.log(`Running '${[modes[mode][0], ...modes[mode][1]].join(' ')}'`); + let docker = spawn(...modes[mode]); + docker.on('close', code => console.log(`docker ${mode} exited with code ${code}`)); + }; + +let mode = process.argv[2]; +if (!modes[mode]) { + console.log(`No such mode '${mode}'. Available modes: ${Object.keys(modes).join(', ')}.`); + return; +} +if (mode === 'build') { + if (!fs.existsSync('config/config.json')) { + console.log('config/config.json must exist to build docker image'); + process.exit(1); + } + if (fs.existsSync('Dockerfile')) { + run(mode); + } else { + console.log('No Dockerfile found, loading config.json and generating one...'); + config.init('./config/config.json') + .then(() => { + let Dockerfile = getDockerfile( + config.hydra.servicePort, + config.hydra.plugins && config.hydra.plugins.logger ? true : false + ).split(/\n/).map(v => v.trim()).filter(v => v.length).join('\n'); + console.log(Dockerfile); + fs.writeFile('Dockerfile', Dockerfile, err => { + if (err) { + console.log('Error writing Dockerfile', err); + process.exit(1); + } else { + console.log('Wrote Dockerfile'); + run(mode); + } + }); + }); + } +} else { + run(mode); +} diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/helpers/chai.js b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/helpers/chai.js new file mode 100644 index 0000000000..ae951a6e67 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/helpers/chai.js @@ -0,0 +1,10 @@ +'use strict'; + +var chai = require('chai'); + +chai.config.includeStack = true; + +global.expect = chai.expect; +global.AssertionError = chai.AssertionError; +global.Assertion = chai.Assertion; +global.assert = chai.assert; diff --git a/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/test.js b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/test.js new file mode 100644 index 0000000000..e3013e9ab0 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/2-hydra/imagini-service/specs/test.js @@ -0,0 +1,10 @@ +'use strict'; + +/** +* Change into specs folder so that file loading works. +*/ +process.chdir('./specs'); + +require('./helpers/chai.js'); + +// Tests go here. From 3479de124f4c237519b673843d5a000d3c01f7bf Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 17:25:58 +0900 Subject: [PATCH 15/33] =?UTF-8?q?3=20-=203=20=EC=84=B8=EB=84=A4=EC=B9=B4?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/3-seneca/.gitignore | 1 + .../3/3-seneca/description.md | 7 ++ .../3/3-seneca/example.png | Bin 0 -> 55543 bytes .../3/3-seneca/imagini.js | 64 ++++++++++++++++++ .../3/3-seneca/package.json | 6 ++ 5 files changed, 78 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/3/3-seneca/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/3/3-seneca/description.md create mode 100644 node/wikibooks-nodejs-microservice/3/3-seneca/example.png create mode 100644 node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js create mode 100644 node/wikibooks-nodejs-microservice/3/3-seneca/package.json diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/.gitignore b/node/wikibooks-nodejs-microservice/3/3-seneca/.gitignore new file mode 100644 index 0000000000..95a48fbcd4 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/3-seneca/.gitignore @@ -0,0 +1 @@ +uploads \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/description.md b/node/wikibooks-nodejs-microservice/3/3-seneca/description.md new file mode 100644 index 0000000000..d7569a1ece --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/3-seneca/description.md @@ -0,0 +1,7 @@ +## 3 - 3 세네카 사용 + +- `curl -H 'Content-Type: application/json' --data '{"role":"upload","image":"example.png","data":"'"$(base64 example.png)"'"}' http://localhost:3000/act` + +- `curl -H 'Content-Type: application/json' --data '{"role":"check", "image": "example.png"}' http://localhost:3000/act` + +- `curl -H 'Content-Type: application/json' --data '{"role":"download", "image": "example.png","greyscale":true,"height":100}' http://localhost:3000/act` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/example.png b/node/wikibooks-nodejs-microservice/3/3-seneca/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 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%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js b/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js new file mode 100644 index 0000000000..9031242d39 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js @@ -0,0 +1,64 @@ +const seneca = require('seneca'); +const sharp = require('sharp'); +const path = require('path'); +const fs = require('fs'); + +const service = seneca({ log: 'silent' }); + +service.add('role:upload,image:*,data:*', function (msg, next) { + let filename = path.join(__dirname, 'uploads', msg.image); + let data = Buffer.from(msg.data, 'base64'); + + fs.writeFile(filename, data, (err) => { + if (err) return next(err); + + return next(null, { size: data.length }); + }); +}); + +service.add('role:check,image:*', function (msg, next) { + let filename = path.join(__dirname, 'uploads', msg.image); + + fs.access(filename, fs.constants.R_OK, (err) => { + return next(null, { exists: !err }); + }); +}); + +service.add('role:download,image:*', function (msg, next) { + + let filename = path.join(__dirname, 'uploads', msg.image); + + fs.access(filename, fs.constants.R_OK, (err) => { + if (err) return res.status(404).end(); + + let image = sharp(filename); + + let width = +msg.width; + let height = +msg.height; + let blur = +msg.blur; + let sharpen = +msg.sharpen; + let greyscale = !!msg.greyscale; + let flip = !!msg.flip; + let flop = !!msg.flop; + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + image.toBuffer().then((data) => { + return next(null, { data: data.toString('base64') }); + }); + }); +}); + +service.listen(3000); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/package.json b/node/wikibooks-nodejs-microservice/3/3-seneca/package.json new file mode 100644 index 0000000000..1fa47cbcf4 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/3-seneca/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "seneca": "^3.14.1", + "sharp": "^0.23.0" + } +} From 6e63af3c01cee87678d3eb4ad1e0cbfb5505f711 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 17:29:13 +0900 Subject: [PATCH 16/33] =?UTF-8?q?3=20-=203=20-=201=20=ED=94=8C=EB=9F=AC?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/3-seneca/imagini.js | 88 ++++++++----------- .../3/3-seneca/seneca.js | 6 ++ 2 files changed, 42 insertions(+), 52 deletions(-) create mode 100644 node/wikibooks-nodejs-microservice/3/3-seneca/seneca.js diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js b/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js index 9031242d39..cdee4e4d98 100644 --- a/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js +++ b/node/wikibooks-nodejs-microservice/3/3-seneca/imagini.js @@ -1,64 +1,48 @@ -const seneca = require('seneca'); const sharp = require('sharp'); const path = require('path'); const fs = require('fs'); -const service = seneca({ log: 'silent' }); +module.exports = function (settings = { path: 'uploads' }) { + const localpath = (image) => (path.join(settings.path, image)); -service.add('role:upload,image:*,data:*', function (msg, next) { - let filename = path.join(__dirname, 'uploads', msg.image); - let data = Buffer.from(msg.data, 'base64'); - - fs.writeFile(filename, data, (err) => { - if (err) return next(err); - - return next(null, { size: data.length }); - }); -}); - -service.add('role:check,image:*', function (msg, next) { - let filename = path.join(__dirname, 'uploads', msg.image); + const access = (filename, next) => { + fs.access(filename, fs.constants.R_OK, (err) => { + return next(!err, filename); + }); + }; - fs.access(filename, fs.constants.R_OK, (err) => { - return next(null, { exists: !err }); + this.add('role:check,image:*', function (msg, next) { + access(localpath(msg.image), (exists) => (next(null, { exists }))); }); -}); - -service.add('role:download,image:*', function (msg, next) { - - let filename = path.join(__dirname, 'uploads', msg.image); - - fs.access(filename, fs.constants.R_OK, (err) => { - if (err) return res.status(404).end(); - - let image = sharp(filename); - - let width = +msg.width; - let height = +msg.height; - let blur = +msg.blur; - let sharpen = +msg.sharpen; - let greyscale = !!msg.greyscale; - let flip = !!msg.flip; - let flop = !!msg.flop; - - if (width > 0 && height > 0) { - image.ignoreAspectRatio(); - } - - if (width > 0 || height > 0) { - image.resize(width || null, height || null); - } - if (flip) image.flip(); - if (flop) image.flop(); - if (blur > 0) image.blur(blur); - if (sharpen > 0) image.sharpen(sharpen); - if (greyscale) image.greyscale(); + this.add('role:upload,image:*,data:*', (msg, next) => { + let data = Buffer.from(msg.data, 'base64'); - image.toBuffer().then((data) => { - return next(null, { data: data.toString('base64') }); + fs.writeFile(localpath(msg.image), data, (err) => { + return next(err, { size: data.length }); }); }); -}); -service.listen(3000); \ No newline at end of file + this.add('role:download,image:*', (msg, next) => { + access(localpath(msg.image), (exists, filename) => { + if (!exists) return next(new Error('image not found')); + + let image = sharp(filename); + + let width = +msg.width || null; + let height = +msg.height || null; + + if (width && height) image.ignoreAspectRatio(); + if (width || height) image.resize(width || null, height || null); + if (msg.flip) image.flip(); + if (msg.flop) image.flop(); + if (msg.blur > 0) image.blur(msg.blur); + if (msg.sharpen > 0) image.sharpen(msg.sharpen); + if (msg.greyscale) image.greyscale(); + + image.toBuffer().then((data) => { + return next(null, { data: data.toString('base64') }); + }); + }) + }) +}; \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/3/3-seneca/seneca.js b/node/wikibooks-nodejs-microservice/3/3-seneca/seneca.js new file mode 100644 index 0000000000..2bb704af40 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/3/3-seneca/seneca.js @@ -0,0 +1,6 @@ +const seneca = require('seneca'); +const service = seneca({ log: 'silent' }); + +service.use('./imagini.js', { path: __dirname + '/uploads' }); + +service.listen(3000); \ No newline at end of file From cf033eaa4429602c2379133de250d0f38bcebb69 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 17:40:57 +0900 Subject: [PATCH 17/33] =?UTF-8?q?4=20=EC=83=81=ED=83=9C=EC=99=80=20?= =?UTF-8?q?=EB=B3=B4=EC=95=88=20-=201=20=EC=83=81=ED=83=9C=20-=202=20MySQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4/mysql/description.md | 7 + .../4/mysql/example.png | Bin 0 -> 55543 bytes .../4/mysql/imagini.js | 133 ++++++++++++++++++ .../4/mysql/package.json | 8 ++ .../4/mysql/settings.json | 3 + 5 files changed, 151 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/4/mysql/description.md create mode 100644 node/wikibooks-nodejs-microservice/4/mysql/example.png create mode 100644 node/wikibooks-nodejs-microservice/4/mysql/imagini.js create mode 100644 node/wikibooks-nodejs-microservice/4/mysql/package.json create mode 100644 node/wikibooks-nodejs-microservice/4/mysql/settings.json diff --git a/node/wikibooks-nodejs-microservice/4/mysql/description.md b/node/wikibooks-nodejs-microservice/4/mysql/description.md new file mode 100644 index 0000000000..05f236acb4 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/mysql/description.md @@ -0,0 +1,7 @@ +## 4 상태와 보안 - 1 상태 - 2 MySQL + +- `curl -X POST -H 'Content-Type: image/png' --data-binary @example.png http://localhost:3000/uploads/test.png` + +- `curl --head http://localhost:3000/uploads/test.png` + +- `curl -v -X DELETE http://localhost:3000/uploads/test.png` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/4/mysql/example.png b/node/wikibooks-nodejs-microservice/4/mysql/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 zcma%?WmKEp)~<1v;FO}lU5dLqE$(i`in|pj1PxxC;O-PC6!+p#+}(;4mvZQS_ul6_ z->>r{85vJT)=Hi=<(l`LiBf$phlxgl1_J|wsUR<{4g&+5@b`g&^m-+zllKP<3?+<$ zw1lR&@ks}29;uE8-IJCUyVH83@M$!yUVXcKs*Z!jTM(5er72}tfC(-=f;`GFjTtct z08W7p{Uz*6nB~xuC5l22fRfIE*R*TE`)j-HeA3m=wXaM2IRk^w}J~QP%p9z!H5&vf;lN3aC$R(@Fqr9n{=!RyZ2iy7BEvP zy=f}Epy&+x@J)-YS8<}7F%4!Wc@Uq932fU%xGvC!rQ`3}H%cIx$54JNU6FCejzkLy z`nitXR6-Qz6kP#Mry-17nvd^WP%Pcb>Pnym3%vxwtt~f@aq*DktZ=YZ5@Ssx8nl1Q zD-UAk3S#on^r@sVjyUXb?Yre#lwLVvs&`BTF@gqz3XAi;%E>6>U85Rg(Z7!=V@pIO zD0pV_P3mUi`mI=4J;Y-B`r{b8*>xEe@R>06r2*BSx|>+?0fZxiaXlHC5$1~=#q?(5 z@1xZ7f&Jn*(9Ht^pYQ$;65%nx0;FMysZa~QGp@Iqx!N*lm_{a1s8mypGuTb|#4d&? zF&QVYeO{@@C{zl-@2&)i+sB&&nk^zC2aC0DT&TDbwLw_f21Pbu_RDL?X1R@=%C_F* z1x&-z+7mHp2Y zCnKpSQNS4iQL=0f<|S>tqVn&!R;*oBzI|1;_nMjIO$=G7>B?+NEcDMs&sD0)1 z4B!SAB7v89e-)99}+O_2&bV z)amrc9{SYQ&?Bun&*hU}5Qg~uw2G#UtPaZhq`A6Ev!59bSNVmJ3V`Qa|Av_U1L&6fYFjQJ45y_+ z*U_Vi7P}=wwPovCWV2wLZ?Dn)9w*YvkUXhpD++w9U6GVyGnaz@TaC44_oIjL8_6jo z9(%?PktPOd(I0_hjZ65lDsP%=yPFTKqV!8?>yZ zL)R{v4h(p(RL*mQ2P&8PB1Z|_KccUy^t(ftTjkMR01dY9 z(NCKzqHF9RW@qF|6LK(SJmq4CR=^PMkY|5jS=n-zp@s<$^s6FQ=bSAt zy{-ioqz13u6R=9oRfqd8$Xp$uq3}KREV1jo?UXs(c*hY>5$v)9$Wli0WJ6}=p_lYG zAe^nA01}2;q&s8cK+><+j8hLqHnm`>BodlD1)9sN&uhLFKY15pUg~admaksE+nK4p zxrx$Y=dNcaPaD%+lV`J|=Tl=#Q7yyIk1j0(IyCihW@bz=9Oa7=JgCHEe8;_9D;$%Q zH*7;*mahB^7>01tL_|PH4Wj-u9do*OdtyX^!v8oTEj}T=1ZLiOF+%kLNljJC<7jp1 zKLq(xT&$8b)FMyf8MGJ`ggUmEqEIH&G$+$w9{T-iyw%)@zu4=t z5oi)07HoIr@qc_S1veF-HOFX>imumYe17|@Ao^g60KlfYDX${zF{VDNcZwffN-7d| zX%XMW?+*ZPdRTr-si!Bb7ob3A#khZ4Td{2l+#h8Dd9iJ7KMd?;x6xn(fWmzT`1xJaJcATuJ({szr>E7 z?6t!`Pk#t5s_k5GhG}r{LZGyM9f7#GZ#!9K@TOwvplm!j_&r=qeU`|w&1Zd+aYphO z@hF)OdprR?l4w4aba_e$Rnno3DbTQxUt5+VDIuIG1VB@7L@^mu8l)W6BwcS6ZA2;t znTyOs?>G2C55sgxHJkd^^T`VS50@pI6b=tY09D`lmsOfK<$CGWT4!l?SDLX7@~TKO z2wXH_7Lvs(3uw|VYAJ-18YX;y9a}09l>~i<(KtnWa{nBWW zEzP8uvXXRtN|0WE`E>lNnsv}78IhUyGS*eqYS4F{W6K@&@Oj~VY+0LLFVgd0i;sp* za8WXC8$d0ZZs$U0)#UtgV=9FZ@g_&yI4}ygg0egd16uw>Y}v`T@7mfrFOGC*v7NE_ zu*3Fj7oVzjL4=;SwD?qXUCuQi>Arn(Dxe5AuheyzHcm>s3NwL&QI+{BC?Z7)Ez#vg zz`bKMtDw?(4a!WJ4L$lEk)PZ6MeX9s~ zXB;J|VmxbEJiw@k69Vj`O+A2^Z>j!H2aV(Q77#BqBErArv#=TEjWP6w0Mb=r`#fy5 z9!&}pt~?NZM2g*VRF$J{7lk>JZUw*ZGSH@E6b1SBLsT?pHMMw!>n2&_YxJXk^_`Bj zlc6qvK7_JK{Gp}FD-C&2eMssOk0&a^xGf{b?~zn7lEKNx1fOYRS1dG2_V1-66m;xe zsI47!r5Sm@LYA&3dTSfp`fCvJJ)uet^rSdhv|TL8=jTRagpCBo7{2G#8ut7QmOPM~ zQx7(#N`z8hoaX{POkpk{oQnz{#y;G)zEM`mNr0;1+$?R8kc?qoobhC^G@!^`A9_}V zY~6aGm}%JBxCpZ$3as%lP!o`(DvQS5UQ-LSNq&#`de%3>Ts?4(C{zeDCnXyQUeEdo z>z`c_%T^v@*GE6Yi}l{;)$?biaS(WP)Cwhr(qwkjTp<;&eslG9<}%Ra(?}VC>mQFE zXwo_xn(U?QQJaIBeKWO*8inEqWt=Hg4z{p@PMtVcWS*lD>sn(XqMG?yw*ZU)kKgKT z5QUGgHvmP|K!~RdKsp-6XZ zY`(p3IH&I;z@$zRzYU&4Mmia1YG8JFdngsn`N^!YT&#y_$pJT{;``3IOwp3C3{bqF zc?(|x6{paz@DHJYzVbpY@tghytH)aN2?FAkTGS3^9SE+Ed!UI*(^(l=!nL}e%LBb8 zV2Yv47DtaX$J5zeTN)c*x5qv%af{MefQqCnBsv6ud9;xFOz>R@iXY=E-9LjLvlFeR zq%-{EFdDTeYU>`7(X5Tlq{~_Q@Jzdg!l6~?vZ+tt$2VA~=uhdkKJ{FlB`UH@g%;xSgvz zMryu=<53|X4%HG(k1-~DZkR|4C388Lo#_gQL#0;f(KA!Zc`?C@aTQn74UT5-J@_@s z(fBNRRkO+wUl2iesP)|ZCsQw@lpYwf?Zy^2&aX~vqs!zGq|u4^oK1AbT@D5U?)^*{ z?DV^LaN($V-uXEDnkdl>mAJAXl}?1wag-Au78SEOQHC(i`VW$*fQJz)=9VT+ABMj$ zuFEjL!Yild>NXL>ta8d@x0jjl1@Vul?VeyDNfiCY&TrrnLst=s^uYM(yiF)D+4=4^ ze;QO?M=%*SRyK^s@3KW)-`bc}M4I$&+-LwdHu|ew{RDe>SOkp(uaj*Qc};6H5dUJa z_{&2E)1yM^nWe)mt*%GETVdYMUO(>kR@Uo0hOI9O$n@&fC!_KN?c1|ol*ZJ{prNGK zRtLr=NGbBJj$soT*KnDc0kzZb66Iu!RCoo#7B8TQ-Q1ufanYdN7;nz%Y1%-!_WS0dX^uS9r;bO z7bk2_fidj`W zrrx@_O!*?tJABCN98_xg#jz1SMUY@knRX{Ikd-ZQxQU$b?a^RTdQ9u5K8qAMLSrbG z4YB+aZk82?Bv|ePJMOl<<>2oh!>FV}uHx^nlE$>aod{_5yc;`?RFuCdcc&iZ3E*E) zFiGUGFr*4l6S)o3t>@6MZs_Z7j_f(zx7nc_jc<_YS%u&2=0W{zmCYr$Agn&r-bt5}4UP0HQAYc<-w~Vj*07?#80xDBH-WO|xbpxC(%{x@-$FSrs?I;IJAV;!OE1`+m4+jFtUffxo9w6G=o2g}6*__)XdJB_Azqwya7#cc*2kPWPS` z_{8~Zcv~e2!p$e`Ixl;u_C+}}SI(UGPjr+qM9qYpsC{MlT&-VeD@%k;HbJ=Hg2eSYQCNo z|1-0yo(t?An-8LOnD>E*MQt*F44BFUQ3@yUx2)zAZCNT4Iws%BYB55q zPnZ(^#sQ61(m>JpD3IlEMXmR`h4(b}kwKZBgS9S2U$HzZ+IAXHCmdlfDsZfQvF<5W z!ly;NBnSp=Br`HcyT+@EW#e$Q3-2Xbuz&boeo+;O@L-5jYRkwt0`a3y3SANLX#LM&vP z`+fU@5Pr6T>Su>*CyXRS9ai9&JQremWk|V6IU7AVgc1iTwb;7Dak}xgnC;8h@m~q9 zXOellby1=fOMs)Gu94E}i(D+z2wC%e=UU?^4UNa_tr$$?}+ z1YL7AX0*AmT5YzAQ@C9x`fbFV$9QY>qR$-&5$-H*C}V>9v?~+cgt5drDCp_qvg#zXu7yRP9y+KsRhlJVF@%SRXC)Mt}f$ z)=&nX#kTeSQ-w{1@e<`|fAd_|Z?-s#!k4S+>)hR9mBt-V z_WNGOJ<8~KPxahIi{O5#9mh}Z7*Sf={I2Jy%A~)k<7I2WN~Tokc3jKqn&1v9Y!LGlu7#NY_@ZZwZmv z3V!bfGYMM8x(=$kdSFK?c^kXUXa?su?;!B}zE?q|3Vf|ZKP~sRjk*0s_5>a%fwhWQ zKhOEOzB%@uj1y5eT?njME2eOvSve_Of%R5-AQMOZ%D?a{uVQv$W-CRVWL56LbkvT< zWu~hrr>tiiiI`xJZ2RKL1R;(<=c`>6vrvfA6kt6rn5q88=h10(6_v|WLk^zO2<{Jc zD8{iA>39`&aFUYn_^+-4hdf^f9?ewDMSmeS&|&ryIF%QL-UQb^MnIN+kEX9(B~ zY<=3)X91cZDW(D=*AsQhtM!6fsaY&t@lA_9(tIqmzV>0Z8rxujfK+v za|T^MH8rq|p2AO+tv_%rI#QCloSQ*b;g{^kxJtPr=(4lj#If3u3AR#HH+~OPH-0%q)32TbHx}eA)z2K@olIcs>%=k>xsPwRwL~h~?(NI_m<$ATV72kXj>Wr8cS^sT^F^8kg#R*@?&=3h1joc2$+iFeb zuG0S}G7xRmBx5J0r0n8ssH^`t-?q81SYS|6d7_tiJ?d&acd%^KIJD>7T8%T$tcCZI z_N`27{`Qw>O5BWE*$8VoIYe1IY-J)-Xq6e`T{~ec=oZrgt+`Tj$33VclVGJ$C^)C@ ze!0-&4=N~E-P#W8@bkU!5Bl5D-k&GjhWf@GtKZ|8h&%9P`B7%qNGRTfa|uS!lLx?j zQAVp<@DWs~eV7&CC|x;;l*? z$$xC=EG*+e*5>{$`loGuXux)9sKG5Q$5H&W;JWnA6E2{$!B8v^zl{9}KC3Lr*@GlU z2(PlB9nE?o3>N?~Z1nec?Uf}J@Q1-0#Lg|*QX`8qAZ!vqe*eN?ecO&(!sdgiNNr%Y z$TrdnSKr3;Fm$bHknQFN{z(A*4+R710Klj=ybH<+X(^2w-zuemnR; zVB9%$PXpYK54zh@BgBz=K!175#_FrfGSo3d8&XWtpd%TDEJ35=`ixYF<|EwnLba$l zeBwTEg{P~%S>J2AVzb@I6Y&2xdul^5HDS#F| z>8`#p8)cG_regBl!U~iC4c#==4bfNRD6xEoEz4k6XMJh#gFH?X?NkSG7px3_43#6( z;_#)d^j6JR^h;X~mGVB>e9W5}kdG~*H*j^m@J(1$U5kd(nt&Gxl{ayJTYS?_Scdty zk*u7|MCfXTOdEPbWN65blBM0yO49DB#9*d}f`TL^^6*)mG zEPfQoP>|;!8&O1zQV<7l#Q!0#MrNRNqim3(uf0QFHz^@LGu>9cx|}HA2JOltZL@Fg ztmh;()6Ax0GMaV=j0G;{BlXG`jgxJ3d#~%Za&A_RW^caLR3kSi6Qy`o?!K@E$uBeHiYzt@qx7PLExMvcJf?B z-OCiRD#K2G-I>YzjqT#n(7i1iB+TK}@Gl)T-NU2C=tjqpYCj?DUxu`7FamyWwx9=3 z*cp4h`ww)CPVZy(C5P{xT!-;V+LuoBe^)`v`OGK-R9sfOR`0DR05EB(uLHI&I$rQE zt9!G)+-Of?>MsF^MJ6H6cX1&QVvS0JBFGe$Q*Np{iBnnOe0WBFLP@THI&YjPfI#t0&6;>7rk3L>eXD z-^#oVO$1e*AXl#yZwy2y#+I<6vrxmjJXiH_TmHHf{E=ebef%5651s1sPc|rSf-z12 zsUT0V2A*8rH14U{*;iKS2_qw8BM%JC0rs994=+>Kc`R_$$HiIVx_vkWpXhq6?9OF1`6KjsShA)@99h5YQsm=ba@fAa z(Jna1fL?$1Gd#z`W8KR|r1Vw3)cB*RQhlipV{)EZDoT%m{Vj&m}WBGU|Z!HQ9GZ|D3QOiI>Yt?Ep?>t-Cd(jOa6jwjLUbFF`k%x_Pb{1J{j^`!+zfET~O(Ycl5 zV=D?OcD%1%8FnIq*O8DlExhS+hoxI0Y4IPIKBfY?st99nE8KJyhPDFFV6x9uk4r*xUNkJ^OyhQ{z}R}WY`QaF6KRGJnVMHmV9o*&OKG#=Ak4qVOvp;Qm#({VNbs)0fDF z?nO-+9}CShEpYzYD$=>h>0_l6*eDgxP@FsoFcE<^9DQ%7#m!%>R_A7%#P#jpSIN?&=9Oy-hNF2>L+a7_*Nb`G6$ zly#Los`j1@X0U+TC=nQu=D4^x%XY`-K#KzS71Iv@P;OE5ye!&2>d$BKs%?)#uE%;M z>1l&-7L0zKZ{%6zg&&bQ-UXCjEQ0{S8l^S8yfU+DA>Z#6g`bsj`)B6ci3F@r%D%w8 z-%a*;jF$^WsdS98GDzoy+I!(~B;xU4o@W1OOP7berSLqTG;>>X%uvFlQnWN4BIHrq z(u^aQxUn}0QBtbk=h{@HvaV^E#bkJpr&B9UR>OzB3An-u9-F(aNEG4s=>2xFF#3Wu zV_zdfWiqg1i1-DZRt4o2fvYeu*NaB}2du9I-ll)5o=yUh=DKmD=s4dd@zU*8(k@ff zHzI`Dt!<5s>?hoRW$#g$=pMJ;Yyu!56f`LC>-I?{x5Ry-UYn117ll`vr~V~;Hfg=+ ze;`?9sk-J$kQ3Pd(dE2tU2+X<;n)m1BsE>IvmDdXa<}nNnuH&|SLIUo+xZJ%DH~S; z1xmzG6OG>x-fadDE?^}F4-0|+!*c_gV+1aR3=-RCdeZa^w{C z7cT#q1rWc_`L>B4?R>3xj$5V&mIm3NU*9LVi6wRnWeS2Ng?XyXDwZY>f~4{lg3-)< zu^uv3y&sBl2j0zhQXpbb@)&e!N`%|W%qtkjV^tdCLt2^;UrVpfg#f4lgvvoKDP-`y*quKfUAkzOEU)_AcIMl25_+!IB|2J6MLr`=q4vx1Nd5I)qbh#LW`@ z=#EP5BJCMH=*+ag@x^wd1X)?_#k1q%CF#}*DoUxcdLD&H2;3O&yhj)JQoQJR-L|Af zF#V_sO~RHd04J$@OEV@JvfYfz zMFd`I$`FH9QT_(JR}tw3{XA%9-@&w5z|Qwx8T_L1L%{noIa)5>yP$qtEAnBH2ryy= zb?5pmfZzFI)ba(xv`OFyoYl8e>NdT<8Tue(6X8{+j{7FKuL;v+b~58DqYa|b1tH(% z(60bS^3RJeJ+l$VkWA*Gi@n_kh2Y9Rd)>h5U&Jx9Cx5J=*4F|htNwldo_HnYp#52A zPKc+=3l4I4{d#i0OSg>kPef^~WdbjQr^Nt{oWSYaPix-VcvCoF=?>&XqOO_QGFsp22 zEuTRXtYEbE3abH~1MY%n#%0KYawtJ*r_@A#`>wvQ$Ky*+)G52HSv7;4TXI#zoLiJ2 zOaOpms-8C=KwOqq)QS3!pK#W!#%@XE?epq*?(Fo?zrQ0pI>o2J**ZZ5oxyz56#upC zC7C}Is=Z`%5HWG3XK9LuC7IM`jIsl_N&{O*@L)gY3`Hptu7rlyR%)q-lmm7pI%3u6`6RXbq z);q@g=p$BcxvT+=@+YZz`tYn~<|L9Ih~6p#f-k+7=pk}q*3vr= zCVTa!JtL-nZHMgX1^Bz^vLjpWyD4AO*OceTNRIHp#HM)O8WKHR8S#isQV+NEKs2>o zi3T!a$h%CU=pNfA>CC{k#;%p62$q0@cGt2jG=KfA>(=P>?sQc`2uU!M*?Fh`bBNS@ z``dnK+;C%5$eZVg59s*;6`>ZvA1f^W9%v^F_TSjIYx9nfFy41^TNu)OF{y?uv*cag zkt-9@0Hmz$d@FqK?(@OPnvBxR(Oy;gg9gsO|)+Ij%u3r5}RO$IQjeTV$ zkIkF&%@y4R>NM_htS4{>cd=1Uzk%+Qllmj2&{GiY8b)ik(M3WL?02SM<+)3LuRz9h zsFb|*;bfirPSDhKzQaD6Jn6^}YMWa(gEafk&TO7Ash1iB@de#)L;jmf{)OMcDOuQN z{h>^ejdBwOcvy7m<9f&Fn*;!{2WJfU-N>`FhVfnL9$AhxM!yCv1n001ECOL)bLv$b zsmQ@9kMIlp_fPBHGkl+k5t)MzTe&V}qyJz*9g{>E(rxrIRZ(8+tLb%w_y4vQ<&nuP zi3HX+yj2hxzX<*&%yq#$2lRHht=EED@^Fnpfl~lJhHr?DGz>*Of|vm=Ulfo5zhxDA z)4(uxrs_bZ_(3dg<%W@T?Uro^4XK!G@5^tYa+`QT{J*?o$M>pkc;GL7qy0yC7Q)32 zd1~@rV=fNKC9Q?9HFHV`!ErNAQHQM`7`L2}GxWn53Y-;GYaajjxQ|6f=Sls#Ay2LF zMC0ITRiQz|yLPM(omVx^=JTToqxhWJ4Q7I9jlboEfu6U*uTJm}RligBVjy8Cz*Zhw$~tLLH3EozVY^MG1X^4oaP{kak}L07&ToAj5d)QO`P1OP`IpD}Aq#VK%37M9 z9Jl)GieLG`RyQ@TdxL_PMBfG;V4ahe#3v;q=^fPGl{kNbqC_sT-Q{MZhsfp(^Q&m(100q-(09&3EXahH4t%d^VAnc3$wPE&YeQ7=}K z&aEqnzTLVK#QqMu9S&&RpSy}Kl!7~5IwkRab_3}n(+~R|J6K$k@aF6>;I~@>?=7M~ zLh2%KIr*~F9=*6v&nP)E#^lG){z(A;IisB|HN-k~H9z3)7NnqA2ZJvMpUN8{tg;vp zjy|qi(09S$R*^jSv;M4Utnk9d$d8>7D{h0*AW6SM^ovQi^p3qM@1uRuxJn_=Vk_`+ z4{oa)MLVA3F9H5HGSTkCr+EX)f5_nRbM0?wj+m3h_5&&B^4kWwOU%f{kowFkk1-nf z3|u4}$q^T5C@nv0P@SubIi|TBwVrhcXTC7I5)jNV!WU^%SD{$)CLJm_&gG?G{x5S@ zGxlJ5N6%<5q*vkU@zx#d3#MGPH~l40Zj!@jR7)RwLMW6$ z@L$IIZ(eS6#O zx>B3o6NM1gh2?FL961aoOUiikLhwldInJ^{Z%8}7#dPL*hEjtM8oTg^!E*Ae||$hjj7>ht&TfcWdV+S1w}DJGni@)4;c0z=P(M zPyR*muXn|?Df6|9_IlTs5U>4`F^J-`^8x`Asimyo*X5J3DPUX$2rpjkv85JiHiJl#Bde6xUV3)7d8!F^OdFjQQTj)R1*Au*wR(h87v2|7UVP1bg_*1 z_=$xa)@MheB?X*?j%!tIg@^r~#q;H=gCx{i%QU{SH`oNQRd?}f-3&vhAs8epgoJf% z)GT|6@4H^(!84rjtEaxzUsC2NA2(q=6zWsQ!4~}Tvrj3FR9JMgDwco;`WnI2VoGj$ zdBz5uq_&?0T}6F*7P- zZlA?d2mP*GUUl2C=?9UHhT&Uq0X(#4m)L3{g^s;rv*V&DdL$!%G+S+-=*DBdY6$=^ z+`<`{cNd-8MDH=0$hr(9dx|5B*pl@al%~!y7QDmQ`*UJZTT&u&Obt`g;J`K7BA}85b6K+A|)^uqub+ZJyiOZH<6m0&>afYI2>CK{{=+tGziEyxk%a==a zI~<-m!W7M?UG@EZSOFEo)mqD13A4(5+%Dh0P4;q8u$~eU2&7~{v{b4Qp;K4zM@f~@ zx^_03v!&o^Ym`xC?HQX&BYXVzv;FM_F7g_}IS8d7Y`!Kz2&Ch9S^j0LBz$fvOnJY; z8^G`Y%B0OA>BKkrzKPALCZDJ4`DFB#NZju#xLcZes#r-f_&;KruDYlWL*lud6`C5Q zSsqs}ZGK+oCyj$}_+HI${yyn^qEJR-Hq9$qWsH7wNe(cmAn1EbcyM8G!J(EsfiKQH zi&JsaaT?Lp7jmkv`l^XAcai==?J&L3m%E}e?v)QKIEbhj!m=T_crX1sS-cMhH#+6q z!#X((Cc)1*Fxjq2QBopZe#ZEN9zuB2I?)82r$DaPS_xjj^TX;4?|3l3}L}%wo=T<@knnF4>bq?ripDW1GQVQQfjjwz77u@v%)_9vt z`in{>!C^9R5(a!it}k!(vonv8}v<1E^p^xLhcDwNG>AOkjB z@y4u?2wVpr+KAthbyFvOyV!K=8KN18nMliIK;;0-f@cP2NP5fXwx?$#UBm|rGUT0u5#9L7shtZJ3AA{&hEGAp(gL%M&hB^axKQ6mQyTjxbR9l6H zn~GTTu|zUM{F(ZXPyk?GuucsluCh-AZ=xIdWxHu86%S+&94R}-Lp{Y#`|~^S1T|t% z0iwvlSWRuL7y~2#8@G!pwVHbhqw;)7ex22f+;TzW1KzRghdR6q_w$NlzGG)sF<)i4 z=gqLLlt&0_E-$KOd)cNi-J1|)vm?&nvlm3*$@B(DF3b@2T%u950xLgYVQ;vlJ&^|j zzLCN+Wb?q9K~qqU6FvXN%)e6q$L{^W8Ek?zNe;tNTz2?o0OqQyTJz&1o>yJj3kokL zDL}0s*5R!`E)j-s)L6g=DK|Gs;;kJ1AiHkkuL3T9WSfEO(x-OOs|mGI22sIv1TDvt zm_Xdu7HAu9jYW1peMqt=P7#U>o+Pdk_<)8y?QHHlj@_F2b7`2U(z_+@;*N$TV$6*h$KK1@uANU-% z5@IHVZBX{pa4+{QZA+<;`ylk69>U(WfR^jQSWzH4UR-`JHyH^ft#qF~7xewFRqFW7 zdPuJMV^@Lhj2pu71Knha%IF?_?;%bNjm^&>D8N94ch7{GL!L&uFTV;GSdY6d=u9no zHD(gw$fPc9GfRkUM|OSnCF?^7)rgqg9#p5jMh*p;6?ptQ+34P`gQ5t1C?L@h$)Jcu zq5-DvZmqH_Z}dMxU;lk%D1NZtBRI&x@%%+h?!MYdO5uiu4EFH+hEN(|g@&-#n#5%7 zG0@-R$@41pw==`lX;#}Swih@nDE&9;LmpS0sv(aL{B)+NW(T|@beOPO9DvaRvD98G z=9}%2sc+6vfH>GsXi^u#=8CAPc#&rGW>jp^-dg#z;=@C}QqwKYNzl*`n*aR;(Wb@v zcOz16D+^~$9du1i?S2}%u)gDQ< zTjQnBwH_5^{`0W)TkM+}<7#ZyK^Eci{*7}qzsTZ^-U56)8? zA6yO>q==&_aGM^}9a5ozF+Q4~R$YYl!w{lOT*)3HwYOe`z2E-1`b9)teRM8e{mxxo zS)GPHypWx-0C%yS_NkgqLDzSeq51%~5muDdCrH*j_FC|6X8zV}RhOIWFx#u(4r!s4 zG+FVDV<~uD)9OgN@W#3}!z|aE>VP?1-z@AV zem1Aq=9LItY-H0O)`Zk}f0lD;8dqXQ^Fvfb&Vk$CQ~OlV+h+_=UP+aY&~hZ~sAi++ zFYUHyLZ(ZTf5kEL;iXe_Ry zI9=u~KdY>XFh_dU}S?H`x_MVa1uEX|6 zvF1gKU5nk^hl}D*xdRj?7w?}oi=4WCYX`svEM=Yev*|r^tdcVl(~zFZycq-Bcx{S5 zvpf30Sqp@Ft)E-9AAyk*X8d+9C_&P~BoemylWoRWieE_48r~2WftBA@h>{#4sQf6F zs;B6K;leS5f?tzHDkmp>+%N=5ml7h+zt9(on@Qb`YS@m@dYFn-lrZRB36r8O03DT) zc0=MfQu%KO17~Ev{CtC2VB2sMW#&)pnjII{z!7AIg1*4wVt+ zST|>4x5ZN7Op#$sNy|NTHI}BN4pz49M)~ONU+y`+RZ@fC3viKD>a>qDjYx$y{ ztn|1IxS>nsz7Mx<*ZUrUd)}A@o{7NdhtN1-%|Gx6#&eTQ#Z9fKO2d{&vFG%ZuUXt} zu;vaTR!qB!DpkmbX$TXVr!o^5q{hgOv_e-t3^Q5ENJ}0EH>r`cNUy=HYVVR*spY+c zy~s8a4Md=XwN*c_doB5cGyTXrnIomEE0lw7Bo1~)vY$Muvdmoj{(JsYITIbbGCPUD z{wx&1dP#n6jJ^@?`@I*6&(6b-=W>2)VYvp+KBbPRzMr&Pfb+Rv-mTJ*&<1c`6yvWM z*1Yu00YvH#+ZJLkK9wYuU9}cACwQB<@y)C^qZ4Qz_0cwcyvhqjq?PJ*n|(-)GQYBA z(>PcV2S2u-@(OnBjwAF%3cO>5CcNuq<=v!o_uWU|WO18OHP+GM7zIepbp&bSs&!FSWn>j zmB=IiQK|bJ8r#nXAT(?bt6d>6_eAQy!eG<8W)Qt{Gm(~bGZUIC(i&PfYb`+5LQz)B z+50%d;i1M^iXR5T&sYy^us{!L(~WM6UUc}4!omQ=0jR9(Yzc@;IvXF8y3A}P>9>L~ z$MH*ziMc-_2>Bi6*?WoK1(4Qyv=rfUF~X^tMx0XJWc76O3%%K7;!O8O9_zTAi?h zv<~^ONmzkcH$g~-iE*UNN4Tx^Fqg})ujeFI&My?`2g7#v?j9&?#*%M6M^{nJ%#;oj zvUC?5m)-q7BFep`^FsJ<|BW?(Er+?E(~O`2O36r>G+*np0a)|9kUO6eIqN(A8i>|$ zgfSw?ZPV)B^Cjt-IJ;*+3G~yk)j8S)EoF;z&AngeqF#wya#%iujzl)xhV@4L@cmda z7cOHWC@e{MnnoY|=Pt{uGka+wB)(~X8DQTMFo?^uq?2hR%mztgsa+o5!+|BGf4E+_)8N8s((Kwg>mY!n z#kn(ksP=|J(Um}%Kf8~ZC(JrL(26CM%)b5!ICc`06K{YIe(m{YLG+<(`)i5f)mejT z%KH#JoWZsn3-8}IFTtJdM_S&)51swG{g`p^Ei-{WWh&$@4{# z&!yFOm3?`FdieG4TKrF`@4C>x)A8v;-|r0w0ADBV%qcK;3W-u2B;v-Q5WPlRc>qp+ zqM(Uq!idi+$O+$WDh0fhdroEYyt!9w&t91`*M+WVzT;qhTM<22E6EzIzxOnLb^c?Y z@E@GZjaZj(B$^p2X6@qIDR0SLy0u=Z+rD*?5UWz-p-dymkNSKXJaf4_yy~BWOs4U? z*}?eK6L+?y@=88!*$z^96S#yNp{e0~qmt4iv&bD?QL&V;T>WRyu)eT?K1e<2AZ&r) zS~C=}y`_}q~V~+I~kT=E;;g9r_2JU9mZ2dHf zr>ePSZL=mc&eZ|oxPPr`B#Do)N7XXT7U5=P3cqhfJXGQ9$JapsCqkaKFWVhIU2d-lCM&hE_?|7E+x|bM9ki4# z!m5?4&m2jVp$dcLaJ+U{ilb+dYW|j0G^BuENLkcB5RQU>Mo~~+c{aV#{fkci>pERR zi2I#UlGHG9l=%w+qIll)O2DVJy8{3-UWXBs7A5a*%JN1uK8R!#E=W*o#a3@G+L1HB zoR&{EPqN>13j9BBG9Cv-DY5H4K3pmotqE32^hT`w*{kYW&HH0Dr8}~C9T6w$_ZOa% z9#fuVI@i}7MI;hZTcAs+UhR!y`(cQ$q|7bv!YN8fi%k$Qm3LmerbG+O>b!O%lxoSb zRV$VEwV#P%5N4cZAKdxheTAcb7C1V%pi!wq#QA?Vbh!V<1^qEBQ7Wa!(g2=F8H@(` zrj&>NIyCD1^QMBqE%gx%9dl0&k%Hl|=k9cjIB!|S^!)~{8xoSg^0M;?$ELSo=m=HK zr_a#gT7Cd)Utit&R3HDEySls`~hZ1&q0YYUu&r5Y$VCMzq= z#YUr`Jd9VGxxdfjHQ6`*9luKB(W0uQ|2RcfwI{u-bgO0!9E-_+>SD4#aBGyd)leok zV`}$Y-3Nhb?H=OBLw@WdPHMVj87>-Zao^f`C{2hfKPydePQ4LE#HsG~6_$xuP-h*6 zAF(AQ2F>$3y}E6{6@@HvYyMNQdZ5jl4{X4KganAwvMkDwGFEhB;GqZn>1zLSpv~3m z+o|URnO$^u`qaz_`1t>Vb@&x5$*|9#rWIq+*uOKeAv1jkj z?N+a$aVkn6L1>bt>NV4_l^YLx$J;AtM&FeXWE84EQOZEPrnOL4-B$sXa&F@)XY{bJ zLMYra5-$UEr$6E=1J(DC!zT5#c11_R!d?oV297yah>iV&H~Y3=k~4Airqyik)X0&U z_oq#P1!jt#UjpOg)P7It^w}B`Hu1Vr*Ebvqc*Ce8cte0b{@tNN;|Q+X3t;u^MK5nF zcufpri@RYZmzOxT?d*BkU(uEgSe6n#uNMmHvu0ICA2bz*k;?hDn9EtJ7JPd=V8_Q& z0RH_NA;IRZBFg%knIV(<1tzg#BR!r~-ITsEJ@{M!4p-0F7JK@Cfzh(Wh|rbbA?p`Y zd3uNv3=&#-lxw%$EsBGfIL5vS-Is7!pyt*xa0k^zN@9@i*wa$w@UT5i;C*0dtD7pY z>};!FAUxN(2s7r)YA`lRd6U4SPb~EM`YU6KLxb&zEd+=YUB?e`!e$I(Osw#BE(#m0GDH8S*65jn>_&>lp#Np2-iQJnP5s#9YKhW=Gyh zPSV>^%>hj`B-oXd0bvTE!29>mEC2MafGi08mG9bmFwyfUxd*5Qi3RD*zY3Ba?}pF1 z8@WV=z;Z3giBEcAr8gPwys5T!DC}1{VD?ZcEq{c+(KljbiR$T~Yh3KqeYD7$=204Q z-oTU`m()48{P@WTt;735E$FmdwJV$c2~(;auzfco#bRE+gqsnwy+d)e+@Y^Ihl2TK z^sB{3u{cm_cDVI++f8zX|Ne9M(5c3(HUx8C@$U@99vN=@{-45n?+w?h+M0h3$3($? zViQ|%0 zq^?MH$H$98VB1AtHJlFE6IB~S=?2~Ka*1^FZ5|}|K?T(BV^||yr3ORaNiNzXaogx|wo;&;e zh7vhOA{!67G@R}F6N1-SZPQk3P1RpR3WJtwn2-ZbQn)c~|Mc|GY-fJoHKdVwiZgdx>-98FY?m`OACSkt;dzd#4{gwNE5*yPwJo zwlgwjdmZ9ec*FwMtZ)%sCe|ViWJBkcvPP^~*#z)%tJ6v0+H`~kl|{0D_j$Vd{^)AC zegD#VQMo)vReBf$Nhc^AdIHH*T-k0x-^0U-nYA?&;T@Z8hSr zs&#Ptt=s;Wjq>H zy;2)24WfCr*4JD6@pRv?kc2{FFJCdI z&OVym=RU1!JC|dQIvqXwCFARQMR=7FMPdbWe^)7iS}czJAv#ES2n>wDg%{4^byCzX z!85!MgM+XsZm9F^J&Zz*3k&o=K5sX&#JM@9He;nepnDpKpV~p(-8c1c9a%?{)&u!$*0K~$tW-A za{+N2l80cZkCFx)nxfpS5I0)F$Xryu5OECzV?9rIyGtc9!mb^ea4p?~GGF=(MM2p& z6e!A=B%)Jy-I-F=`)W%B7-xykQZq;~zmpzPw-8>SQM^^_8ThqTmoCpwTCb^crc&f* z$QXEN^Ueb7xD-q@$Lbrtm3lIi<}^AE(aC7gnkvGOF^93s<)u6vzsk4yPlFUiadLOJ z%|m^q=mb8c=IVKDC^obuWj7cJdYY!L{cg~;6d7+_`iVs)zDZK*nBi+0x8U^whubm7 zyMoIbZV2$nE-V@tb))m$BPOdAF{|1AX#8ZL=c_&W3$==UNu*#_xJib%c5AO3I-SSp z(v-5K`|g5$-JJ9qA;8!4H9Ra+qWoUfLIEDX9Fa*sXQ{P;jNG6#^OFifK= z?QZXykw%fJ0rOojVC>&FiJO?O!8+umQ6S1_(aJFG2ZSx4VW^}xdte|nJ^e@%8LxN&~ zGG?#cLuUJXqFzjn@f&N%WI{V$m>L0l-r$7v?!Kh%~*B44>D{Q zR7D*&+LURq$OUP^XP!#lqo0V zg8+cA2SZZSl^f3g3JAb!?$xzY9fdlLKYa^UmqS)n%}C;TkK?c*k;I@B1)l9@<}sio zulQnF=zFej&s!@uFKXP0RQX;=w1SGzI8vmXPaAgWIqDefgf*sbLiU6qWQzP|U`-H> z`Vj&+rycTFvVfjPZ~f{7I8Hpfe2Pw~?6=$KMD2iG_|MkY0~SZRBOH#Pf5nqMxYdvy zV58U-CWREpyNKu8eTMF0OXwqby;Zj?MrW&jfUr2;&3SM&IQEH_Qke}k_%T6l(`7mXV#q`*&upM`C1m)P19q(U~RrM`wTL)y{0MLCj26-go2 zs3e57YWl(dBW*K&P@^j%w%q`qsmn(S4%#I4`JKQffOpYk12pY9Q)Tevo{hy(!tr&~ zuBN>g^X}7HXXJi&&8wm%h0{#sk809$r}Efgv<`(brvK1pjB6v917old z<*DN$jAn?3k+S|vR8OlwZEs30XDdf<$TcCOUcx5uPWFQwUlX}8@>>xUG?_cK<+9y( zjd@MM^q!08pKsUNi(4m|-VHNU@LZYou&n$BaK$h@QX$)eoDTR=B4OALFxf6A*%wiM!%ZTQg};qTNJ>P)B0BX zo|y;*(Z7z{H^L53m#q(YU$cZ%XwMFA8M$?p&Z1n|Q>TwmbS<3tA5(1IWx1(<>a$dF z?A&@_KE{};dY6QqeI$3EQMxa&6g?O9uUdQ~KLm*UG^ukkB=9m%MNrnr&dD-{R=;Pv zT`ixH{NNJL=8U?*=e!e)ZqmIKI1&}cP5C$kjqt}#iyH@zqQnM+%ktw{4ei{N$&u}a z5mIcIe|$W2%v`t|bdPid36q7ug#?Tp_ykl;{yc&U9-inqL6Nwro}d2-lq&*^+wKT7 zRdw^(5r~l%4ws{pcID{~`=Cgg|3rGJdc%gwzTFIlr5$y|#E(3PWd9)k(d$t_aOLnt zV_dx}vR!ikAbpOC%=W+Y%^`RfLi8!?T29)?F^URv3sRDb$<=Hp(sT->D$h@FV8JFnLD>-u&K<*JGm>+plGc}cv%i{zX9JGCw2s(AXk_jEY~8e3P|=t2O!MNrqqzAA$Qbodd+7U zL6gLAmfnhYy5qhyAEo3w+TKM9fl?PAnwKm#I>9CzEgT&WG zB-1oU^(`s(;9G~Q)z-LF##%<$sBN0YA13{&d8BGZ0ExtKc(4r_X{_OwixPrksY`8B7G!!6vfYB){vl<(>_c2)a*WB z^z5KKFiCG#Lwk+B;c~tXV%-E=u)&?Hrv0;*sA?4oonV0~P^h#gp8LjcnLO_P!x=UBXnVEA{`l22pAnkxKlHA%d|S!><3 z)$#3NN&JDEwBQD`ueaksVBoAVoVMz+{B*6Dxi(T;)v(lu8M(*X!W}$L!!VN|wUzTh zWL}m*3of^Y@??87tm7qfr7!0+5eLhSh^s^~D7F}GCLtUIi@WG^M*7uGs;)h zc*;Cw7qz--?GoMGK!Uk06P{8?Hh;hlxt4C*`lax{Jn zNWThvwIJrfei3m8#e?$4Tu&4WEd61Ks0@HO{JNo6q>zf(8V9z0Z48+l z6GOW%O&Mv|^4%aF+hGuzM=Pl2w~GI`n#Y>C7X6z9~0SF6+qCMS7 zL<8NbME;r%9l_X#;ZoRD_3(lh`@at-A@bI5y+otcDvR&N4KLFquWo*QjZrJ$n#XJw z@fDd0wg5ksME~(9{ul?KA{G!(kQ~yVNxO~KbLnC9ASW$ok2zJ|?8D`NR1O~-UtuBr zYaYBcA7PzEXUeKT0DjrxjR8Ep+!k@SwTKKwVx6thzt?^7`2l=2%bmrLG?}~;H@?Pz zOeS?3FiHh+-NRPM{q1AS?k;;+3qCJ9RQOGBvUXhAT}!}|+DJvHSwrOSH{GYdI=usX zXWNFHyqrrW0H+YZE}Ka4!#3U9N4&q7eb95it`{J7x;dM*5=BJ@dZ_fp_k62F{mGB_HX`kGBwJgx%R7A334or(qXf*qwI^y2i? z-vREWQq@pnz&GpfDX#e}PYF+?+olKV^?Cp>=VBst(|?0ts%(_!G%kZ!p%F?`5N?;Ns6UusOgy#rG%{SmM!kSY}VZ zL@~jTY|35c*NKln4Es{!$@i=S`VaY#Gv$+6vfZY@oWO>@DKq%xPp~^bDJgPsD%_t` z4$iF$-ff;uv(jaGogGQGDX26R05aa`FenJv-^9Xx#IRt*u$QoxEP>ydH|m)#XMyd* zrNVm9&2Jz=P$1@OMUq)9 zju_A{)>{(7gjI4VNzBi|-m?NAxS2bMQm`%pbLLu(1x0sx=S!zqIK&AX{r8+utzP`) z->z}nZOsgy>E{sO1n4uRjQi}2u4c<}1~_4oHxn3s0q&>; z2J^8vuUwoa!hm?0?cQbRY61Rm!y>v`UblK>CplSNs%`#4r6un2?MtCXD6?!-J)beB zz<`V}`@5M2yPhq+N)!wW=!gVO9M^2r zyIUnOIWt#{kqd!}*7%XXSX3LPEK73^GF$NE?u3an8I+;uL?UbYO<-+Pwe6Le2J^j1 z(3p14gP~F2LQPEUEEoZ+8NA56g@uHvR-_yWy);%%Z*!lWn0#D=d#6leCawP4vVTL> zb;EL8Kd^KB*~H0zBQR$SsQ>kv43sxTl3D9KX-}aV>BN`L-rZ);l0=%i~p+tl}EdlAgIW_ZMtznB(Yk`@Q+tP(V zA~DT~>8$x%;zNG={6giW8pQfCS z_aZ6_1i36VMP6g;r>0%em&~%FxY>f!!Ao3PcBA$=_bFA7Ar7*02~LSInRa>?U$bylQM zKVRr6WaXLt7|AOQ+kluKu#s8RXP@yxP@s;Mh&Rhmy;G=UPZhg6d#9^`Hkxx5A}+6o z;41KBKuINX{PTqr^W))haci8RMtxIBw=2$(6fxJxZg6_FlVa2nqQE%Sc3!XqzkM?A zR|}8xPS|iBcMMXtGu7bBuWB1!^^S*}NfGDcwM-1?Tx@!^CD#=k<^}~%#2~n!ItA`- zhB{H(lL7P}(0GH{y{ltLeKV^%|4zYu@{@~b3zfqxP2MIX7q{LBV4q*$LM_^elIs4E zo%+Iq+db1-mtpN2bF2muRWyA`a$+E(Ef^Y?Rpz6UC>d0NA!hok>u%oRJCtUgWR~d> z)+{fCv&NsP<<(a!JG$?Y;Nd@FiEG`zb_}T&(A)42Z!N zFeZ@jQYC28gH4mJ^)`e;xU#bR7Iswj7U`vEV#1FO9`inTrh4c@_4C~apPn+Hxmp!3 zv{DB)gUOoT<|V7WouI_ox)qX{5&A&(CxwJj2y-M#CprK8Ribzjk3@Fr*@EL!rtOD} zns8}~)@0UHAk;#lkx*~ zB7plyUE?>I$4l1vm*_sA~8B^#X7sI-x{RxLk-Xvj>UJ`wsjBFCt+9p>fzS z(i_8Z+r2Sn6m`)nXFPF?cO$D=r@#%H)jlPRg?`!7pz@>W90_fNZyy5hGOn{{JU@IT zX;cGJ7nAOw)iNXr=v(C2gYG zxB}BflE|Frgfsp#po5}a7-XQ;CBlQAQuO-l&r~vkXpL4kN7H_I@BJiyNf=-CnYKb+ z41tS5X&$Zni6Z-GE?6t)wSWfZikD>!wDuEv9j#Ht(+us$+?)Q(BsJZ*CJ!u*P5EUjv$a zvDhnvBvtWv2x5j0<=VFDOJQDi2%!J=(p< z+OjcRx};y%^E=Cr$61stI?5b~e86@_L%-IK_IJE#4>@s%Lh?!uy~)8t{^prz&}%|! zh|6s-s!KF~;3m(xrm-~aOg-ZUmQoeH>|FBk>eTA~`KLnar=_3FJe1zm<} zo_*`NUkNW{?vJRo`yVBYK_;!HI0y6W8!4@@dGTQ5m_wV5BkeHknA+pUGgvIwi$u5s z2Qy)31kMRO^q#{nrlkB%lrI}k7)uw(qcmFWN?jgJHdLMe3*I#nDxHp?-{$f?#6Lt# z#Y&vqa`j}Vbi_EVHrf!IQ#960zJ$*$2jZX;&-*NQ&NJi+J-xTwG1LqYD`=4|Kg7O6 zw`yMprHs;b*ZX;OD=6dVCfL zJNrA7%pfMu%xUC;Fv?$&*Zyoo67u6g=hJTnMz)rgdATVr$B<+xJz?QE~c#xb2)TW`|P+0RmU~j1U ze3J`v;e{>(!_B1TPUtN-yxWrBJU+kID5UtL4I#^olP7L{4y2Yd*;<*PT6iZ5E2sw} zYYJ$sbNUZh>b`{_SO{=7y4=zVL5S@2hw7pY=)o553HW;p(t zf&mQdQ;Q^~muq6!`_0pCbD+*GzZyzLf>l*uD! zqBr?`tKtx8r0bZOMy|T?Xdx`m?36Qz(^>;K=AMc%HdzJ7%0Io8C_POXyYu*)%aB{; zw^_0437~kL*0c^gLi5Rvh+yD|xFALkr$R}Go|-d&<8Vas@^7)+`4 zwkCsXm)eR@<>-=EK7>^h?81-4XIwZ0O_l!X=~58|3YGq;H0H zMt%_Pt7rn!wZ2jHS_DR|jXQ@TIf9hEM^iY?aJ?YxmTp+3P4RE*?vyg~c9DUugMayJ z{VC^K`0USA+j*ln++I>)Y&O6mL!{-@(0h45U^#6I90_F=oFTAaSODa$vL++ghxSc7{Vk3RxqOLidR9Vb*_Z2q2*U zQ*3%#nZw)E4nNsqw`Xl)jhdVGCW6iDmBxN$Nrg&g>hW|YTRlE|T{Z31pK8`q3!HM1 z);sgb^l@*i09EzbW(yz+cpMbRld4^AaJ-7`%c4lr7f?Wq$II-K%c$`Q2PiYQByHXt zm=22pt(ELls1YMSoxShz3eYT)E{u<-`@54FnoTN)E=kEx)N_uuY|<|V8sjath1*pV zRMy+~!hsLEs|Tyzf<$kKfB;b%1n@)PH@bM_j_en{EX|(fZZ;5;_+HJo+zcla#XVD2 zxA(nFx3UlV2oJDCp)$<*zLBCj?9+zpYou5b6zvg*1}~A|9pOks!!3qQs5PQXn@;)c@0(7IgNBI~I#JFwZ;?o;0GGuJ+jB*smcQT9CB30j$ zGhV9!{UR2tOl`%ruR4U<6R{Ky#2ZVQkw?QYJ4M;B36!puL_6P3pQtoi z8^d}=Qm&wb(`T@1^;PAV6UE|^N%CTaI<1jYGB)Z!rTR_6lbV`gHa<)qlh52y#;}z? zk2kI0W6xsepm4rOa}qQYezdjB3DuBt6_YuYXFL<}6Z-HHzxyO7Y%#v<9R@AA-#^38 zt!}2N3p}_0M4a)p5fU!>OJQJnKqdT>gk4xE>5qMIGuz5>l17E5vu>}c4sSCBeM%T~ zhpDdc>?c{HjirxoT}gZkzvghRAC)kP^StX82);ndyY0G798}Eb?`rFboFl#ey53ZN z;Q0=vAzc>Vk>OuA1un4|Mp&j>w3vsSk!HLHWSkTW2;m&1XsLe`nB&^zZx28<94=B? zYSkLj^U^QxAi2Y!XEO(4slw-c%IXFE^Gpr{L?jI`j1{DugO8P5I0a4a7uNWJmb)vr z53fTipr`Del@5xku?KX zT(uLEINc$9|FjbJ9dNS`_3QcCV@SNHQ%dyiKNz}gghUqCzH)Quk2K`zLOPS>A=U|+lhS!XUE-=#EAUzu_99Ow=L&e zV};%>GHJyvHzc&%ctihqVr`X}c-~p~ouQ!xt@Qk8uLm*pAc@QwNL`J{jprtDVS?p8 z?|-l~EN6CAcqZl+`;Kgm8A;-!(}UXQpOScqB~UfA8-9!OGu=LMDwKKUC)RxC3k+iu zz5yoU=lHgy!^tp;d&P309%6B0VqqNLw79?TXA<TnBm?9)FBCp z2cKLG1Y4%a4VF;w^(auQbf7dH<0@bhW`=`6UbZ8^?xGX?Gue&ofiG{G)d}DBe9ouG zoT$8UQD7~G1=jI^PzvZ?yfkYtf)9g3w`|;~(#@3Bj`lkE;y|2BLjM+u*RP>DB-Asy z&M}z>rzj`K2yX=f8zK7q=EAFr19e>cs3B4yX!(b>;5yjM*FPYBP@skNgTm{321t}J z9FIQ*Cr`I}8UGsOfTjXM!&(r6{?|XXwUSud<>76CyaZSYu|Cx0ul}SNr!2a1n(vQ< zZ54ql_I6A4n~-Xoc2^;ZS{TU}hqyugE!1MVp*W!XB3LD&@@o{+ ztlK^DkGhk97rF*NQ>_Ft41j&^UvXi7{bc~T>>arXN$^nl=uFh$g$A=@eR!d=dkhf^ zy58vGjUdm|RCv{I(`O^E2Dw((x5Yi1-!Wg7<>R_xoZeNa&{5T?Tz_CyjFPvY#Cbjq{4;9bZOM zZ2FdSEhhPaby>Iqffn+=KmMm#{wQcL8G*YFshh*BjO$QnB;ZF(f!dLrTl=^9jKd{Vwj{=89Svi?j-%ai_zi0X;IrWBo-th z(HqIlq@kTk?)d%ilYI9L+U+{|^)Rv)O_}6cW_&9}GGV!VET~SC@;;jtx&GRiBZx*` z{G^)kwtrd4(zY*ziV^!ixksRBeVGs}Z6tZj+d1-2mxLVAr((MT-2QMPdoW?U=-|tL zdqfCEX2ox=a4B%WMJ0PITX07{>i?U7yZ09Mrh}KQ+cWETHiaUzN8kB& zHsNM^Kx`_07ta<6Iw}SJoVh@je0#Kbr^g2kA&;iphldKH37#t2}7 zC)jmN!n3BpU$X>Ru#|!`>g(|NH>-AAI+;mboSTMGa}E64LuN|k0AhQ4w;&|}$FXQ? zfyeqofSQ_VrjtS|aoS_^X?WNd5R3Py4G=1>p4B~}AC`=!Zx?b*2SMjr>6(ZjtLnnb5UXj+ z@_(5@fAyV-(dChWf0kms*(6aA<_xIdldL0M&l>z!p{?;F!W6WZ9>NO_GeY|N*BkoO z$Q>101`f}iP!FzmrGU4(OC`%mKkpMDaCr;AMwb5RHOp#Mz-=GLC}UQV;bH_0rk~!yXt$po<^Hns*06 zQDEb5HP&u(7UAKo_{+833{`))qmZ7~@?+~|B)m5KNJFZzJ_blLU5cNC5Pdz>*x^aX ztH-JU9rEVVL%SPcX4iW$ZywgOo(dJ-6%y-L=MXhxh?Va>c}PfCAu z=ADATTgi6EFa8eM%;xHz5^$Jj0S9#PuVr3o1A56^yqg!shBdpN!o*Ba0tBf*GEsTMbI-Z{F;yUh&fatXW6yQme46PlY$MfdbrCU%hzZH7H?G=0r`X;9X zWTR149ZGx#q}^jOX>olI8*$Akjj8{k!zS6apu-()m8W`<^)dl+1`KakPiv ztX;$>!MrR#Z=F9iiQwQ0r5KKg043+6`&b5mP4SOcN{n&>;Tn35&}={Oevq=U79G^0)Fe=1VO7&PFy4F0gZlAl2qA9>-k$As(A;aHhY2>i_DBw~2* zHjr7$nmP1?(tC=~4Qo4gAku&HK2!`Nj zT8ukYhbnMRmbn&&gZ}0tgy=0yp&*izzkq8U+Ncm*TnMKO%l7!VFlF?T;KaL86cO?x z_FsGai48w8;%AH2;8wcr$3Ni1tnCxLo_T$hX`iMGa0qqjob+r~X2!MX7+t{7uxznV zT4ygnV?iPS+=Qx+ypz&7l3EfsZNTZurPMx+D+~2>jytp%H(95TW=dkrqYvosLjTiR zJG~I*H*@05*$Cp}ZcWr~kgG>t>lJL)+|WH9C4ec(;Wc>Ni|-gtzTJTEhz@8k&U;8p z*)Wy}8h(tHh|7v3JM_j9TZCYP4LYaX~t6qXX1 z-rc`mzVQ^YHAj}an;eo*C{_q#lNgOu>`Gjj(rL__-Fvb73b;ej-lISEd^bzv>l(GG~sS1xs^1EsHg)hBzT-zVJ zOvEO8aV*kjlYzn%i{LXebr|?aq#V>^iMNnl~?25ys1*S_l|7mQBFR`h{v3O0gS~h4IW*|l373&|_ zkMq3(=KFXMwD+uFNY2vil>~t4d0$|zc^o<9M}z&A@cEfBgzp5%WbNFx?SucP1&EN_ z?JMFv05a+)rpr?G)A;~2myW5n(Gk@d%RUA7zu^03dATPdV{D3?Q*n>cbBdt70M25b ztC)iZ|A;WCpQh${x`cxch#SLBZC>u7;c{>tm8Ywl{mK1I4|09SP1XDC)lOZYnX1un2k_|>~GZqFZt_jNouv2J<(c! z$8-_)eb=K;V}LBTuhDE3+JIISYOxpxqrBjU!}H@VACU?GiSz`@&*M@Q~{91KJ{#XDZ|&aXU%v^}GoE5qL=xS7_AUI^6&~p-z!bM_2#FXsV)$ogOeQq#=|u1l zH!|z>mN^6t&hq@W0lN}L(rNx*?LAD87MpT!_uLJ8-wvC6<<|gEeu_;T;^t{zij$plIwoitm=mD5$n1<7a@-nxsEQtCKkR zAU$1h>lS_F38POLE=_FwTj5x#0;fmv5}3B(r{3@rKzaJ8PL-jX?nny{vNt@W9&eqE z2u!$ED0JGgG2Qp@zcnk?;CuQjS~uv0*)pe{XGqxCK&+YImIP7*z%1_eRV#4Jjr-s@ z;!J1RHxF5Kp6e!E2AD=LMZK2f9~mG=2dl*Wg#ZCIa8D3eozNR%lsA*eMOKBils7{l zuVLcmNlA(K(|CdqN{kWaP~?bk+c?izx^$_YWA!TBF0MD#xF~=zND=y;l?j4N2zn(x zmDj?g83#ms&cBKC-@nM>zA-$f*o>nS==a?GXSOx1k57?6iylhLZ?95G@x5p*V@>7v z9)NzOLJ-{Q4coNxgEOixR5*0^%IEP0ioqA@nD-$+W^1n39e-RllN;TVhbNYn+TD#v z#%psqX#K+Dh@$DbeZLkgTkh$si4CZ2ORb`ZeS#0u0KU_;n~H<~OJ1btek&qTQq+_K zZ!y-Qx&c|5)geR6#OYi~_jjtYt=z?Pl3zxcfg6o{41Vvps$L+EPd#hK08QTwfP>+6 zEOqy3XsB|4ZrMR5ah6*9Lpkwknd{o4js=~8LVWKUBLgy#I$QU=F0*&{0Q{?P*Krn? zQmXKQ(VcPqp#Woo*k4J0>Tz>Lm{`s#niyGdkV-slgB43|%`ZqFHJfjzJklA^s$cdk zi1#b&k5bHNqjp%M_>b#6J8Ph!Q5{GF>52<|ivTrqD zUXq)OGhMj@o5y%CYI0$VW)6Cjw~|xCvsD*;noArx!TFSVhydGfxvbDi9Mfho=ikQ zQ8yR;&~jQ3O8G)T%1?W{z3%z3(ueU_nYH`J{Fsi)7w1vbrFMpR(g(yk(p1~ZE`s#Q zp3i-;<2!8gsa(pAuOeR8^P#P3onX@2Kvo1hm|rNxU<%}GbWu0{f_Uz^3h{LaJx&#-4qZb+~e zdTi&5GnfNjwZemP`NWREM2@uWEBFF_CQCR_AI48D`;+TycS;@PnryF3BjPh4ki>QC{pT+2Q)JUt%J`NQ!D!FEEHH?Fg5Kc-TL17uNo4@mC1;Yryb>V)h6g zj+K;lGo}yueXeE-1d8diDP4hHYoJef_8nPKbHeYBFTHdn$g3K8;!l*;sS1HTLi`>K z4`x(fgMyP`QQKzRk*RmE=keF9?spKa1A%d}8s|nF=FURYf1c!PD_6l(Q+E`b3mh(y z#97N6h?7$Ix%pzk&wh~JK=kUHt9(DAHF@iB;E0n3#5d7&h@C4>%!GL^2mS{Y;(x+8 zUgG3CS?n3(mk;pbtY`?%fKf@moey`cz`pF@f4QV%oy&Prm~|j- zx-b;3SNiqvh{?lWBxqb!;k_6(Qn2TlIJ5tqlGy&E4%#0{vrFi=pr%$19{Djoh(Pf{#Bf&^0J-JDQ$zduUo@jcX&pg5Aman zHg9H7-M?Q+?YTYkWcC0RtHTGi%98CW^)v#JGoq2#|LX-%3s8VbMh4m4R3Gw#!7R!_ z{$2Q*jMVb(F+B*BegrmdKb6_hnTu_H4T#75OV4+R0K1mB) zrGw^sPRvkHckWivhZZI7`GEpA&N$=G$^OEC#&81V!-Fd!!p&Sa@W-ufZ4B{?))U&ykcNcP7FA zgmwM5&6cD5W*AWih^Q8mC-!)hMDe5BY_q>CBwfcS+jQ5V4XMkek=S|~mejKOG%&nP z`xL=JIUOG^eApW)gSCJ?XRPP+r#`e2LNMhoizSkZU6OKQ3_qZd+?Yom)P;6}p9K%H zH{P?-hi1xmu%mnm?iQW~ARQMEio?j)o0RDA!|T3Srk$?{?i(*4zCWd{GF+OI+X=C{ zp?dgUDi`!ZiFpxc1(uJ2#Li|VA`Ps2i4HdAd@-1>C^Z5prGzrP1`8Zik6tiz^Rnju ztoJXsUXZ^272@vm2srSvDsc2~DcDkO&C_*Q_;n{lM948lDCq?S^nZZ*r3PzBd?q^? zjt)o7{{d6jb#LJBnlhucAf01>iSF&HM!l6HVw_$t|Noj{<5pu$L)_D<=~F#Z3walG_;B2CkqM zOriA=+yIZO0yZZKIf6ZFEem@L{%bx@y?%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/4/mysql/imagini.js b/node/wikibooks-nodejs-microservice/4/mysql/imagini.js new file mode 100644 index 0000000000..fb0a5efe1a --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/mysql/imagini.js @@ -0,0 +1,133 @@ +const settings = require('./settings'); +const mysql = require('mysql'); +const db = mysql.createConnection(settings.db); +const express = require('express'); +const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const path = require('path'); +const app = express(); + +db.connect((err) => { + if (err) throw err; + + console.log('db: ready'); + + db.query(` + CREATE TABLE IF NOT EXISTS images + ( + id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_used TIMESTAMP NULL DEFAULT NULL, + name VARCHAR(300) NOT NULL, + size INT(11) UNSIGNED NOT NULL, + data LONGBLOB NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY name (name) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 + `); + + setInterval(() => { + db.query(` + DELETE FROM images + WHERE (date_created < UTC_TIMESTAMP - INTERVAL 1 WEEK AND date_used IS NULL) + OR (date_used < UTC_TIMESTAMP - INTERVAL 1 MONTH) + `); + }, 3600 * 1000); + + app.param('image', (req, res, next, image) => { + if (!image.match(/\.(png|jpg)$/i)) { + return res.status(403).end(); + } + + db.query("SELECT * FROM images WHERE name = ?", [image], (err, images) => { + if (err || !images.length) { + return res.status(404).end(); + } + + req.image = images[0]; + + return next(); + }); + }); + + app.post('/uploads/:name', bodyparser.raw({ + limit: '10mb', + type: 'image/*' + }), (req, res) => { + db.query("INSERT INTO images SET ?", { + name: req.params.name, + size: req.body.length, + data: req.body + }, (err) => { + if (err) { + return res.send({ status: 'error', code: err.code }); + } + + res.send({ status: 'ok', size: req.body.length }); + }); + }); + + app.head('/uploads/:image', (req, res) => { + return res.status(200).end(); + }); + + app.get("/uploads/:image", (req, res) => { + let image = sharp(req.image.data); + + let width = +req.query.width; + let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + db.query("UPDATE images SET date_used = UTC_TIMESTAMP WHERE id = ?", [req.image.id]); + + res.setHeader('Content-Type', 'image/' + path.extname(req.image.name).substr(1)); + + image.pipe(res); + }); + + app.delete('/uploads/:image', (req, res) => { + db.query('DELETE FROM images WHERE id = ?', [req.image.id], (err) => { + return res.status(err ? 500 : 200).end(); + }); + }); + + app.get('/stats', (req, res) => { + db.query(` + SELECT + COUNT(*) total, + SUM(size) size, + MAX(date_created) last_created + FROM images + `, (err, rows) => { + if (err) { + return res.status(500).end(); + } + + rows[0].uptime = process.uptime(); + + return res.send(rows[0]); + }); + }) + + app.listen(3000, () => { + console.log('app: ready'); + }); +}) \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/4/mysql/package.json b/node/wikibooks-nodejs-microservice/4/mysql/package.json new file mode 100644 index 0000000000..b73601350b --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/mysql/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "mysql": "^2.17.1", + "sharp": "^0.19.0" + } +} diff --git a/node/wikibooks-nodejs-microservice/4/mysql/settings.json b/node/wikibooks-nodejs-microservice/4/mysql/settings.json new file mode 100644 index 0000000000..dc44d360b6 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/mysql/settings.json @@ -0,0 +1,3 @@ +{ + "db": "mysql://root@localhost/imagini" +} \ No newline at end of file From ef1ffad1bfbb20220af664791fa2e81887e9f7a2 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 21:40:05 +0900 Subject: [PATCH 18/33] 4 - 1 - 3 RethinkDB --- .../4/rethinkdb/example.png | Bin 0 -> 55543 bytes .../4/rethinkdb/imagini.js | 133 ++++++++++++++++++ .../4/rethinkdb/package.json | 8 ++ .../4/rethinkdb/settings.json | 6 + 4 files changed, 147 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/4/rethinkdb/example.png create mode 100644 node/wikibooks-nodejs-microservice/4/rethinkdb/imagini.js create mode 100644 node/wikibooks-nodejs-microservice/4/rethinkdb/package.json create mode 100644 node/wikibooks-nodejs-microservice/4/rethinkdb/settings.json diff --git a/node/wikibooks-nodejs-microservice/4/rethinkdb/example.png b/node/wikibooks-nodejs-microservice/4/rethinkdb/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 zcma%?WmKEp)~<1v;FO}lU5dLqE$(i`in|pj1PxxC;O-PC6!+p#+}(;4mvZQS_ul6_ z->>r{85vJT)=Hi=<(l`LiBf$phlxgl1_J|wsUR<{4g&+5@b`g&^m-+zllKP<3?+<$ zw1lR&@ks}29;uE8-IJCUyVH83@M$!yUVXcKs*Z!jTM(5er72}tfC(-=f;`GFjTtct z08W7p{Uz*6nB~xuC5l22fRfIE*R*TE`)j-HeA3m=wXaM2IRk^w}J~QP%p9z!H5&vf;lN3aC$R(@Fqr9n{=!RyZ2iy7BEvP zy=f}Epy&+x@J)-YS8<}7F%4!Wc@Uq932fU%xGvC!rQ`3}H%cIx$54JNU6FCejzkLy z`nitXR6-Qz6kP#Mry-17nvd^WP%Pcb>Pnym3%vxwtt~f@aq*DktZ=YZ5@Ssx8nl1Q zD-UAk3S#on^r@sVjyUXb?Yre#lwLVvs&`BTF@gqz3XAi;%E>6>U85Rg(Z7!=V@pIO zD0pV_P3mUi`mI=4J;Y-B`r{b8*>xEe@R>06r2*BSx|>+?0fZxiaXlHC5$1~=#q?(5 z@1xZ7f&Jn*(9Ht^pYQ$;65%nx0;FMysZa~QGp@Iqx!N*lm_{a1s8mypGuTb|#4d&? zF&QVYeO{@@C{zl-@2&)i+sB&&nk^zC2aC0DT&TDbwLw_f21Pbu_RDL?X1R@=%C_F* z1x&-z+7mHp2Y zCnKpSQNS4iQL=0f<|S>tqVn&!R;*oBzI|1;_nMjIO$=G7>B?+NEcDMs&sD0)1 z4B!SAB7v89e-)99}+O_2&bV z)amrc9{SYQ&?Bun&*hU}5Qg~uw2G#UtPaZhq`A6Ev!59bSNVmJ3V`Qa|Av_U1L&6fYFjQJ45y_+ z*U_Vi7P}=wwPovCWV2wLZ?Dn)9w*YvkUXhpD++w9U6GVyGnaz@TaC44_oIjL8_6jo z9(%?PktPOd(I0_hjZ65lDsP%=yPFTKqV!8?>yZ zL)R{v4h(p(RL*mQ2P&8PB1Z|_KccUy^t(ftTjkMR01dY9 z(NCKzqHF9RW@qF|6LK(SJmq4CR=^PMkY|5jS=n-zp@s<$^s6FQ=bSAt zy{-ioqz13u6R=9oRfqd8$Xp$uq3}KREV1jo?UXs(c*hY>5$v)9$Wli0WJ6}=p_lYG zAe^nA01}2;q&s8cK+><+j8hLqHnm`>BodlD1)9sN&uhLFKY15pUg~admaksE+nK4p zxrx$Y=dNcaPaD%+lV`J|=Tl=#Q7yyIk1j0(IyCihW@bz=9Oa7=JgCHEe8;_9D;$%Q zH*7;*mahB^7>01tL_|PH4Wj-u9do*OdtyX^!v8oTEj}T=1ZLiOF+%kLNljJC<7jp1 zKLq(xT&$8b)FMyf8MGJ`ggUmEqEIH&G$+$w9{T-iyw%)@zu4=t z5oi)07HoIr@qc_S1veF-HOFX>imumYe17|@Ao^g60KlfYDX${zF{VDNcZwffN-7d| zX%XMW?+*ZPdRTr-si!Bb7ob3A#khZ4Td{2l+#h8Dd9iJ7KMd?;x6xn(fWmzT`1xJaJcATuJ({szr>E7 z?6t!`Pk#t5s_k5GhG}r{LZGyM9f7#GZ#!9K@TOwvplm!j_&r=qeU`|w&1Zd+aYphO z@hF)OdprR?l4w4aba_e$Rnno3DbTQxUt5+VDIuIG1VB@7L@^mu8l)W6BwcS6ZA2;t znTyOs?>G2C55sgxHJkd^^T`VS50@pI6b=tY09D`lmsOfK<$CGWT4!l?SDLX7@~TKO z2wXH_7Lvs(3uw|VYAJ-18YX;y9a}09l>~i<(KtnWa{nBWW zEzP8uvXXRtN|0WE`E>lNnsv}78IhUyGS*eqYS4F{W6K@&@Oj~VY+0LLFVgd0i;sp* za8WXC8$d0ZZs$U0)#UtgV=9FZ@g_&yI4}ygg0egd16uw>Y}v`T@7mfrFOGC*v7NE_ zu*3Fj7oVzjL4=;SwD?qXUCuQi>Arn(Dxe5AuheyzHcm>s3NwL&QI+{BC?Z7)Ez#vg zz`bKMtDw?(4a!WJ4L$lEk)PZ6MeX9s~ zXB;J|VmxbEJiw@k69Vj`O+A2^Z>j!H2aV(Q77#BqBErArv#=TEjWP6w0Mb=r`#fy5 z9!&}pt~?NZM2g*VRF$J{7lk>JZUw*ZGSH@E6b1SBLsT?pHMMw!>n2&_YxJXk^_`Bj zlc6qvK7_JK{Gp}FD-C&2eMssOk0&a^xGf{b?~zn7lEKNx1fOYRS1dG2_V1-66m;xe zsI47!r5Sm@LYA&3dTSfp`fCvJJ)uet^rSdhv|TL8=jTRagpCBo7{2G#8ut7QmOPM~ zQx7(#N`z8hoaX{POkpk{oQnz{#y;G)zEM`mNr0;1+$?R8kc?qoobhC^G@!^`A9_}V zY~6aGm}%JBxCpZ$3as%lP!o`(DvQS5UQ-LSNq&#`de%3>Ts?4(C{zeDCnXyQUeEdo z>z`c_%T^v@*GE6Yi}l{;)$?biaS(WP)Cwhr(qwkjTp<;&eslG9<}%Ra(?}VC>mQFE zXwo_xn(U?QQJaIBeKWO*8inEqWt=Hg4z{p@PMtVcWS*lD>sn(XqMG?yw*ZU)kKgKT z5QUGgHvmP|K!~RdKsp-6XZ zY`(p3IH&I;z@$zRzYU&4Mmia1YG8JFdngsn`N^!YT&#y_$pJT{;``3IOwp3C3{bqF zc?(|x6{paz@DHJYzVbpY@tghytH)aN2?FAkTGS3^9SE+Ed!UI*(^(l=!nL}e%LBb8 zV2Yv47DtaX$J5zeTN)c*x5qv%af{MefQqCnBsv6ud9;xFOz>R@iXY=E-9LjLvlFeR zq%-{EFdDTeYU>`7(X5Tlq{~_Q@Jzdg!l6~?vZ+tt$2VA~=uhdkKJ{FlB`UH@g%;xSgvz zMryu=<53|X4%HG(k1-~DZkR|4C388Lo#_gQL#0;f(KA!Zc`?C@aTQn74UT5-J@_@s z(fBNRRkO+wUl2iesP)|ZCsQw@lpYwf?Zy^2&aX~vqs!zGq|u4^oK1AbT@D5U?)^*{ z?DV^LaN($V-uXEDnkdl>mAJAXl}?1wag-Au78SEOQHC(i`VW$*fQJz)=9VT+ABMj$ zuFEjL!Yild>NXL>ta8d@x0jjl1@Vul?VeyDNfiCY&TrrnLst=s^uYM(yiF)D+4=4^ ze;QO?M=%*SRyK^s@3KW)-`bc}M4I$&+-LwdHu|ew{RDe>SOkp(uaj*Qc};6H5dUJa z_{&2E)1yM^nWe)mt*%GETVdYMUO(>kR@Uo0hOI9O$n@&fC!_KN?c1|ol*ZJ{prNGK zRtLr=NGbBJj$soT*KnDc0kzZb66Iu!RCoo#7B8TQ-Q1ufanYdN7;nz%Y1%-!_WS0dX^uS9r;bO z7bk2_fidj`W zrrx@_O!*?tJABCN98_xg#jz1SMUY@knRX{Ikd-ZQxQU$b?a^RTdQ9u5K8qAMLSrbG z4YB+aZk82?Bv|ePJMOl<<>2oh!>FV}uHx^nlE$>aod{_5yc;`?RFuCdcc&iZ3E*E) zFiGUGFr*4l6S)o3t>@6MZs_Z7j_f(zx7nc_jc<_YS%u&2=0W{zmCYr$Agn&r-bt5}4UP0HQAYc<-w~Vj*07?#80xDBH-WO|xbpxC(%{x@-$FSrs?I;IJAV;!OE1`+m4+jFtUffxo9w6G=o2g}6*__)XdJB_Azqwya7#cc*2kPWPS` z_{8~Zcv~e2!p$e`Ixl;u_C+}}SI(UGPjr+qM9qYpsC{MlT&-VeD@%k;HbJ=Hg2eSYQCNo z|1-0yo(t?An-8LOnD>E*MQt*F44BFUQ3@yUx2)zAZCNT4Iws%BYB55q zPnZ(^#sQ61(m>JpD3IlEMXmR`h4(b}kwKZBgS9S2U$HzZ+IAXHCmdlfDsZfQvF<5W z!ly;NBnSp=Br`HcyT+@EW#e$Q3-2Xbuz&boeo+;O@L-5jYRkwt0`a3y3SANLX#LM&vP z`+fU@5Pr6T>Su>*CyXRS9ai9&JQremWk|V6IU7AVgc1iTwb;7Dak}xgnC;8h@m~q9 zXOellby1=fOMs)Gu94E}i(D+z2wC%e=UU?^4UNa_tr$$?}+ z1YL7AX0*AmT5YzAQ@C9x`fbFV$9QY>qR$-&5$-H*C}V>9v?~+cgt5drDCp_qvg#zXu7yRP9y+KsRhlJVF@%SRXC)Mt}f$ z)=&nX#kTeSQ-w{1@e<`|fAd_|Z?-s#!k4S+>)hR9mBt-V z_WNGOJ<8~KPxahIi{O5#9mh}Z7*Sf={I2Jy%A~)k<7I2WN~Tokc3jKqn&1v9Y!LGlu7#NY_@ZZwZmv z3V!bfGYMM8x(=$kdSFK?c^kXUXa?su?;!B}zE?q|3Vf|ZKP~sRjk*0s_5>a%fwhWQ zKhOEOzB%@uj1y5eT?njME2eOvSve_Of%R5-AQMOZ%D?a{uVQv$W-CRVWL56LbkvT< zWu~hrr>tiiiI`xJZ2RKL1R;(<=c`>6vrvfA6kt6rn5q88=h10(6_v|WLk^zO2<{Jc zD8{iA>39`&aFUYn_^+-4hdf^f9?ewDMSmeS&|&ryIF%QL-UQb^MnIN+kEX9(B~ zY<=3)X91cZDW(D=*AsQhtM!6fsaY&t@lA_9(tIqmzV>0Z8rxujfK+v za|T^MH8rq|p2AO+tv_%rI#QCloSQ*b;g{^kxJtPr=(4lj#If3u3AR#HH+~OPH-0%q)32TbHx}eA)z2K@olIcs>%=k>xsPwRwL~h~?(NI_m<$ATV72kXj>Wr8cS^sT^F^8kg#R*@?&=3h1joc2$+iFeb zuG0S}G7xRmBx5J0r0n8ssH^`t-?q81SYS|6d7_tiJ?d&acd%^KIJD>7T8%T$tcCZI z_N`27{`Qw>O5BWE*$8VoIYe1IY-J)-Xq6e`T{~ec=oZrgt+`Tj$33VclVGJ$C^)C@ ze!0-&4=N~E-P#W8@bkU!5Bl5D-k&GjhWf@GtKZ|8h&%9P`B7%qNGRTfa|uS!lLx?j zQAVp<@DWs~eV7&CC|x;;l*? z$$xC=EG*+e*5>{$`loGuXux)9sKG5Q$5H&W;JWnA6E2{$!B8v^zl{9}KC3Lr*@GlU z2(PlB9nE?o3>N?~Z1nec?Uf}J@Q1-0#Lg|*QX`8qAZ!vqe*eN?ecO&(!sdgiNNr%Y z$TrdnSKr3;Fm$bHknQFN{z(A*4+R710Klj=ybH<+X(^2w-zuemnR; zVB9%$PXpYK54zh@BgBz=K!175#_FrfGSo3d8&XWtpd%TDEJ35=`ixYF<|EwnLba$l zeBwTEg{P~%S>J2AVzb@I6Y&2xdul^5HDS#F| z>8`#p8)cG_regBl!U~iC4c#==4bfNRD6xEoEz4k6XMJh#gFH?X?NkSG7px3_43#6( z;_#)d^j6JR^h;X~mGVB>e9W5}kdG~*H*j^m@J(1$U5kd(nt&Gxl{ayJTYS?_Scdty zk*u7|MCfXTOdEPbWN65blBM0yO49DB#9*d}f`TL^^6*)mG zEPfQoP>|;!8&O1zQV<7l#Q!0#MrNRNqim3(uf0QFHz^@LGu>9cx|}HA2JOltZL@Fg ztmh;()6Ax0GMaV=j0G;{BlXG`jgxJ3d#~%Za&A_RW^caLR3kSi6Qy`o?!K@E$uBeHiYzt@qx7PLExMvcJf?B z-OCiRD#K2G-I>YzjqT#n(7i1iB+TK}@Gl)T-NU2C=tjqpYCj?DUxu`7FamyWwx9=3 z*cp4h`ww)CPVZy(C5P{xT!-;V+LuoBe^)`v`OGK-R9sfOR`0DR05EB(uLHI&I$rQE zt9!G)+-Of?>MsF^MJ6H6cX1&QVvS0JBFGe$Q*Np{iBnnOe0WBFLP@THI&YjPfI#t0&6;>7rk3L>eXD z-^#oVO$1e*AXl#yZwy2y#+I<6vrxmjJXiH_TmHHf{E=ebef%5651s1sPc|rSf-z12 zsUT0V2A*8rH14U{*;iKS2_qw8BM%JC0rs994=+>Kc`R_$$HiIVx_vkWpXhq6?9OF1`6KjsShA)@99h5YQsm=ba@fAa z(Jna1fL?$1Gd#z`W8KR|r1Vw3)cB*RQhlipV{)EZDoT%m{Vj&m}WBGU|Z!HQ9GZ|D3QOiI>Yt?Ep?>t-Cd(jOa6jwjLUbFF`k%x_Pb{1J{j^`!+zfET~O(Ycl5 zV=D?OcD%1%8FnIq*O8DlExhS+hoxI0Y4IPIKBfY?st99nE8KJyhPDFFV6x9uk4r*xUNkJ^OyhQ{z}R}WY`QaF6KRGJnVMHmV9o*&OKG#=Ak4qVOvp;Qm#({VNbs)0fDF z?nO-+9}CShEpYzYD$=>h>0_l6*eDgxP@FsoFcE<^9DQ%7#m!%>R_A7%#P#jpSIN?&=9Oy-hNF2>L+a7_*Nb`G6$ zly#Los`j1@X0U+TC=nQu=D4^x%XY`-K#KzS71Iv@P;OE5ye!&2>d$BKs%?)#uE%;M z>1l&-7L0zKZ{%6zg&&bQ-UXCjEQ0{S8l^S8yfU+DA>Z#6g`bsj`)B6ci3F@r%D%w8 z-%a*;jF$^WsdS98GDzoy+I!(~B;xU4o@W1OOP7berSLqTG;>>X%uvFlQnWN4BIHrq z(u^aQxUn}0QBtbk=h{@HvaV^E#bkJpr&B9UR>OzB3An-u9-F(aNEG4s=>2xFF#3Wu zV_zdfWiqg1i1-DZRt4o2fvYeu*NaB}2du9I-ll)5o=yUh=DKmD=s4dd@zU*8(k@ff zHzI`Dt!<5s>?hoRW$#g$=pMJ;Yyu!56f`LC>-I?{x5Ry-UYn117ll`vr~V~;Hfg=+ ze;`?9sk-J$kQ3Pd(dE2tU2+X<;n)m1BsE>IvmDdXa<}nNnuH&|SLIUo+xZJ%DH~S; z1xmzG6OG>x-fadDE?^}F4-0|+!*c_gV+1aR3=-RCdeZa^w{C z7cT#q1rWc_`L>B4?R>3xj$5V&mIm3NU*9LVi6wRnWeS2Ng?XyXDwZY>f~4{lg3-)< zu^uv3y&sBl2j0zhQXpbb@)&e!N`%|W%qtkjV^tdCLt2^;UrVpfg#f4lgvvoKDP-`y*quKfUAkzOEU)_AcIMl25_+!IB|2J6MLr`=q4vx1Nd5I)qbh#LW`@ z=#EP5BJCMH=*+ag@x^wd1X)?_#k1q%CF#}*DoUxcdLD&H2;3O&yhj)JQoQJR-L|Af zF#V_sO~RHd04J$@OEV@JvfYfz zMFd`I$`FH9QT_(JR}tw3{XA%9-@&w5z|Qwx8T_L1L%{noIa)5>yP$qtEAnBH2ryy= zb?5pmfZzFI)ba(xv`OFyoYl8e>NdT<8Tue(6X8{+j{7FKuL;v+b~58DqYa|b1tH(% z(60bS^3RJeJ+l$VkWA*Gi@n_kh2Y9Rd)>h5U&Jx9Cx5J=*4F|htNwldo_HnYp#52A zPKc+=3l4I4{d#i0OSg>kPef^~WdbjQr^Nt{oWSYaPix-VcvCoF=?>&XqOO_QGFsp22 zEuTRXtYEbE3abH~1MY%n#%0KYawtJ*r_@A#`>wvQ$Ky*+)G52HSv7;4TXI#zoLiJ2 zOaOpms-8C=KwOqq)QS3!pK#W!#%@XE?epq*?(Fo?zrQ0pI>o2J**ZZ5oxyz56#upC zC7C}Is=Z`%5HWG3XK9LuC7IM`jIsl_N&{O*@L)gY3`Hptu7rlyR%)q-lmm7pI%3u6`6RXbq z);q@g=p$BcxvT+=@+YZz`tYn~<|L9Ih~6p#f-k+7=pk}q*3vr= zCVTa!JtL-nZHMgX1^Bz^vLjpWyD4AO*OceTNRIHp#HM)O8WKHR8S#isQV+NEKs2>o zi3T!a$h%CU=pNfA>CC{k#;%p62$q0@cGt2jG=KfA>(=P>?sQc`2uU!M*?Fh`bBNS@ z``dnK+;C%5$eZVg59s*;6`>ZvA1f^W9%v^F_TSjIYx9nfFy41^TNu)OF{y?uv*cag zkt-9@0Hmz$d@FqK?(@OPnvBxR(Oy;gg9gsO|)+Ij%u3r5}RO$IQjeTV$ zkIkF&%@y4R>NM_htS4{>cd=1Uzk%+Qllmj2&{GiY8b)ik(M3WL?02SM<+)3LuRz9h zsFb|*;bfirPSDhKzQaD6Jn6^}YMWa(gEafk&TO7Ash1iB@de#)L;jmf{)OMcDOuQN z{h>^ejdBwOcvy7m<9f&Fn*;!{2WJfU-N>`FhVfnL9$AhxM!yCv1n001ECOL)bLv$b zsmQ@9kMIlp_fPBHGkl+k5t)MzTe&V}qyJz*9g{>E(rxrIRZ(8+tLb%w_y4vQ<&nuP zi3HX+yj2hxzX<*&%yq#$2lRHht=EED@^Fnpfl~lJhHr?DGz>*Of|vm=Ulfo5zhxDA z)4(uxrs_bZ_(3dg<%W@T?Uro^4XK!G@5^tYa+`QT{J*?o$M>pkc;GL7qy0yC7Q)32 zd1~@rV=fNKC9Q?9HFHV`!ErNAQHQM`7`L2}GxWn53Y-;GYaajjxQ|6f=Sls#Ay2LF zMC0ITRiQz|yLPM(omVx^=JTToqxhWJ4Q7I9jlboEfu6U*uTJm}RligBVjy8Cz*Zhw$~tLLH3EozVY^MG1X^4oaP{kak}L07&ToAj5d)QO`P1OP`IpD}Aq#VK%37M9 z9Jl)GieLG`RyQ@TdxL_PMBfG;V4ahe#3v;q=^fPGl{kNbqC_sT-Q{MZhsfp(^Q&m(100q-(09&3EXahH4t%d^VAnc3$wPE&YeQ7=}K z&aEqnzTLVK#QqMu9S&&RpSy}Kl!7~5IwkRab_3}n(+~R|J6K$k@aF6>;I~@>?=7M~ zLh2%KIr*~F9=*6v&nP)E#^lG){z(A;IisB|HN-k~H9z3)7NnqA2ZJvMpUN8{tg;vp zjy|qi(09S$R*^jSv;M4Utnk9d$d8>7D{h0*AW6SM^ovQi^p3qM@1uRuxJn_=Vk_`+ z4{oa)MLVA3F9H5HGSTkCr+EX)f5_nRbM0?wj+m3h_5&&B^4kWwOU%f{kowFkk1-nf z3|u4}$q^T5C@nv0P@SubIi|TBwVrhcXTC7I5)jNV!WU^%SD{$)CLJm_&gG?G{x5S@ zGxlJ5N6%<5q*vkU@zx#d3#MGPH~l40Zj!@jR7)RwLMW6$ z@L$IIZ(eS6#O zx>B3o6NM1gh2?FL961aoOUiikLhwldInJ^{Z%8}7#dPL*hEjtM8oTg^!E*Ae||$hjj7>ht&TfcWdV+S1w}DJGni@)4;c0z=P(M zPyR*muXn|?Df6|9_IlTs5U>4`F^J-`^8x`Asimyo*X5J3DPUX$2rpjkv85JiHiJl#Bde6xUV3)7d8!F^OdFjQQTj)R1*Au*wR(h87v2|7UVP1bg_*1 z_=$xa)@MheB?X*?j%!tIg@^r~#q;H=gCx{i%QU{SH`oNQRd?}f-3&vhAs8epgoJf% z)GT|6@4H^(!84rjtEaxzUsC2NA2(q=6zWsQ!4~}Tvrj3FR9JMgDwco;`WnI2VoGj$ zdBz5uq_&?0T}6F*7P- zZlA?d2mP*GUUl2C=?9UHhT&Uq0X(#4m)L3{g^s;rv*V&DdL$!%G+S+-=*DBdY6$=^ z+`<`{cNd-8MDH=0$hr(9dx|5B*pl@al%~!y7QDmQ`*UJZTT&u&Obt`g;J`K7BA}85b6K+A|)^uqub+ZJyiOZH<6m0&>afYI2>CK{{=+tGziEyxk%a==a zI~<-m!W7M?UG@EZSOFEo)mqD13A4(5+%Dh0P4;q8u$~eU2&7~{v{b4Qp;K4zM@f~@ zx^_03v!&o^Ym`xC?HQX&BYXVzv;FM_F7g_}IS8d7Y`!Kz2&Ch9S^j0LBz$fvOnJY; z8^G`Y%B0OA>BKkrzKPALCZDJ4`DFB#NZju#xLcZes#r-f_&;KruDYlWL*lud6`C5Q zSsqs}ZGK+oCyj$}_+HI${yyn^qEJR-Hq9$qWsH7wNe(cmAn1EbcyM8G!J(EsfiKQH zi&JsaaT?Lp7jmkv`l^XAcai==?J&L3m%E}e?v)QKIEbhj!m=T_crX1sS-cMhH#+6q z!#X((Cc)1*Fxjq2QBopZe#ZEN9zuB2I?)82r$DaPS_xjj^TX;4?|3l3}L}%wo=T<@knnF4>bq?ripDW1GQVQQfjjwz77u@v%)_9vt z`in{>!C^9R5(a!it}k!(vonv8}v<1E^p^xLhcDwNG>AOkjB z@y4u?2wVpr+KAthbyFvOyV!K=8KN18nMliIK;;0-f@cP2NP5fXwx?$#UBm|rGUT0u5#9L7shtZJ3AA{&hEGAp(gL%M&hB^axKQ6mQyTjxbR9l6H zn~GTTu|zUM{F(ZXPyk?GuucsluCh-AZ=xIdWxHu86%S+&94R}-Lp{Y#`|~^S1T|t% z0iwvlSWRuL7y~2#8@G!pwVHbhqw;)7ex22f+;TzW1KzRghdR6q_w$NlzGG)sF<)i4 z=gqLLlt&0_E-$KOd)cNi-J1|)vm?&nvlm3*$@B(DF3b@2T%u950xLgYVQ;vlJ&^|j zzLCN+Wb?q9K~qqU6FvXN%)e6q$L{^W8Ek?zNe;tNTz2?o0OqQyTJz&1o>yJj3kokL zDL}0s*5R!`E)j-s)L6g=DK|Gs;;kJ1AiHkkuL3T9WSfEO(x-OOs|mGI22sIv1TDvt zm_Xdu7HAu9jYW1peMqt=P7#U>o+Pdk_<)8y?QHHlj@_F2b7`2U(z_+@;*N$TV$6*h$KK1@uANU-% z5@IHVZBX{pa4+{QZA+<;`ylk69>U(WfR^jQSWzH4UR-`JHyH^ft#qF~7xewFRqFW7 zdPuJMV^@Lhj2pu71Knha%IF?_?;%bNjm^&>D8N94ch7{GL!L&uFTV;GSdY6d=u9no zHD(gw$fPc9GfRkUM|OSnCF?^7)rgqg9#p5jMh*p;6?ptQ+34P`gQ5t1C?L@h$)Jcu zq5-DvZmqH_Z}dMxU;lk%D1NZtBRI&x@%%+h?!MYdO5uiu4EFH+hEN(|g@&-#n#5%7 zG0@-R$@41pw==`lX;#}Swih@nDE&9;LmpS0sv(aL{B)+NW(T|@beOPO9DvaRvD98G z=9}%2sc+6vfH>GsXi^u#=8CAPc#&rGW>jp^-dg#z;=@C}QqwKYNzl*`n*aR;(Wb@v zcOz16D+^~$9du1i?S2}%u)gDQ< zTjQnBwH_5^{`0W)TkM+}<7#ZyK^Eci{*7}qzsTZ^-U56)8? zA6yO>q==&_aGM^}9a5ozF+Q4~R$YYl!w{lOT*)3HwYOe`z2E-1`b9)teRM8e{mxxo zS)GPHypWx-0C%yS_NkgqLDzSeq51%~5muDdCrH*j_FC|6X8zV}RhOIWFx#u(4r!s4 zG+FVDV<~uD)9OgN@W#3}!z|aE>VP?1-z@AV zem1Aq=9LItY-H0O)`Zk}f0lD;8dqXQ^Fvfb&Vk$CQ~OlV+h+_=UP+aY&~hZ~sAi++ zFYUHyLZ(ZTf5kEL;iXe_Ry zI9=u~KdY>XFh_dU}S?H`x_MVa1uEX|6 zvF1gKU5nk^hl}D*xdRj?7w?}oi=4WCYX`svEM=Yev*|r^tdcVl(~zFZycq-Bcx{S5 zvpf30Sqp@Ft)E-9AAyk*X8d+9C_&P~BoemylWoRWieE_48r~2WftBA@h>{#4sQf6F zs;B6K;leS5f?tzHDkmp>+%N=5ml7h+zt9(on@Qb`YS@m@dYFn-lrZRB36r8O03DT) zc0=MfQu%KO17~Ev{CtC2VB2sMW#&)pnjII{z!7AIg1*4wVt+ zST|>4x5ZN7Op#$sNy|NTHI}BN4pz49M)~ONU+y`+RZ@fC3viKD>a>qDjYx$y{ ztn|1IxS>nsz7Mx<*ZUrUd)}A@o{7NdhtN1-%|Gx6#&eTQ#Z9fKO2d{&vFG%ZuUXt} zu;vaTR!qB!DpkmbX$TXVr!o^5q{hgOv_e-t3^Q5ENJ}0EH>r`cNUy=HYVVR*spY+c zy~s8a4Md=XwN*c_doB5cGyTXrnIomEE0lw7Bo1~)vY$Muvdmoj{(JsYITIbbGCPUD z{wx&1dP#n6jJ^@?`@I*6&(6b-=W>2)VYvp+KBbPRzMr&Pfb+Rv-mTJ*&<1c`6yvWM z*1Yu00YvH#+ZJLkK9wYuU9}cACwQB<@y)C^qZ4Qz_0cwcyvhqjq?PJ*n|(-)GQYBA z(>PcV2S2u-@(OnBjwAF%3cO>5CcNuq<=v!o_uWU|WO18OHP+GM7zIepbp&bSs&!FSWn>j zmB=IiQK|bJ8r#nXAT(?bt6d>6_eAQy!eG<8W)Qt{Gm(~bGZUIC(i&PfYb`+5LQz)B z+50%d;i1M^iXR5T&sYy^us{!L(~WM6UUc}4!omQ=0jR9(Yzc@;IvXF8y3A}P>9>L~ z$MH*ziMc-_2>Bi6*?WoK1(4Qyv=rfUF~X^tMx0XJWc76O3%%K7;!O8O9_zTAi?h zv<~^ONmzkcH$g~-iE*UNN4Tx^Fqg})ujeFI&My?`2g7#v?j9&?#*%M6M^{nJ%#;oj zvUC?5m)-q7BFep`^FsJ<|BW?(Er+?E(~O`2O36r>G+*np0a)|9kUO6eIqN(A8i>|$ zgfSw?ZPV)B^Cjt-IJ;*+3G~yk)j8S)EoF;z&AngeqF#wya#%iujzl)xhV@4L@cmda z7cOHWC@e{MnnoY|=Pt{uGka+wB)(~X8DQTMFo?^uq?2hR%mztgsa+o5!+|BGf4E+_)8N8s((Kwg>mY!n z#kn(ksP=|J(Um}%Kf8~ZC(JrL(26CM%)b5!ICc`06K{YIe(m{YLG+<(`)i5f)mejT z%KH#JoWZsn3-8}IFTtJdM_S&)51swG{g`p^Ei-{WWh&$@4{# z&!yFOm3?`FdieG4TKrF`@4C>x)A8v;-|r0w0ADBV%qcK;3W-u2B;v-Q5WPlRc>qp+ zqM(Uq!idi+$O+$WDh0fhdroEYyt!9w&t91`*M+WVzT;qhTM<22E6EzIzxOnLb^c?Y z@E@GZjaZj(B$^p2X6@qIDR0SLy0u=Z+rD*?5UWz-p-dymkNSKXJaf4_yy~BWOs4U? z*}?eK6L+?y@=88!*$z^96S#yNp{e0~qmt4iv&bD?QL&V;T>WRyu)eT?K1e<2AZ&r) zS~C=}y`_}q~V~+I~kT=E;;g9r_2JU9mZ2dHf zr>ePSZL=mc&eZ|oxPPr`B#Do)N7XXT7U5=P3cqhfJXGQ9$JapsCqkaKFWVhIU2d-lCM&hE_?|7E+x|bM9ki4# z!m5?4&m2jVp$dcLaJ+U{ilb+dYW|j0G^BuENLkcB5RQU>Mo~~+c{aV#{fkci>pERR zi2I#UlGHG9l=%w+qIll)O2DVJy8{3-UWXBs7A5a*%JN1uK8R!#E=W*o#a3@G+L1HB zoR&{EPqN>13j9BBG9Cv-DY5H4K3pmotqE32^hT`w*{kYW&HH0Dr8}~C9T6w$_ZOa% z9#fuVI@i}7MI;hZTcAs+UhR!y`(cQ$q|7bv!YN8fi%k$Qm3LmerbG+O>b!O%lxoSb zRV$VEwV#P%5N4cZAKdxheTAcb7C1V%pi!wq#QA?Vbh!V<1^qEBQ7Wa!(g2=F8H@(` zrj&>NIyCD1^QMBqE%gx%9dl0&k%Hl|=k9cjIB!|S^!)~{8xoSg^0M;?$ELSo=m=HK zr_a#gT7Cd)Utit&R3HDEySls`~hZ1&q0YYUu&r5Y$VCMzq= z#YUr`Jd9VGxxdfjHQ6`*9luKB(W0uQ|2RcfwI{u-bgO0!9E-_+>SD4#aBGyd)leok zV`}$Y-3Nhb?H=OBLw@WdPHMVj87>-Zao^f`C{2hfKPydePQ4LE#HsG~6_$xuP-h*6 zAF(AQ2F>$3y}E6{6@@HvYyMNQdZ5jl4{X4KganAwvMkDwGFEhB;GqZn>1zLSpv~3m z+o|URnO$^u`qaz_`1t>Vb@&x5$*|9#rWIq+*uOKeAv1jkj z?N+a$aVkn6L1>bt>NV4_l^YLx$J;AtM&FeXWE84EQOZEPrnOL4-B$sXa&F@)XY{bJ zLMYra5-$UEr$6E=1J(DC!zT5#c11_R!d?oV297yah>iV&H~Y3=k~4Airqyik)X0&U z_oq#P1!jt#UjpOg)P7It^w}B`Hu1Vr*Ebvqc*Ce8cte0b{@tNN;|Q+X3t;u^MK5nF zcufpri@RYZmzOxT?d*BkU(uEgSe6n#uNMmHvu0ICA2bz*k;?hDn9EtJ7JPd=V8_Q& z0RH_NA;IRZBFg%knIV(<1tzg#BR!r~-ITsEJ@{M!4p-0F7JK@Cfzh(Wh|rbbA?p`Y zd3uNv3=&#-lxw%$EsBGfIL5vS-Is7!pyt*xa0k^zN@9@i*wa$w@UT5i;C*0dtD7pY z>};!FAUxN(2s7r)YA`lRd6U4SPb~EM`YU6KLxb&zEd+=YUB?e`!e$I(Osw#BE(#m0GDH8S*65jn>_&>lp#Np2-iQJnP5s#9YKhW=Gyh zPSV>^%>hj`B-oXd0bvTE!29>mEC2MafGi08mG9bmFwyfUxd*5Qi3RD*zY3Ba?}pF1 z8@WV=z;Z3giBEcAr8gPwys5T!DC}1{VD?ZcEq{c+(KljbiR$T~Yh3KqeYD7$=204Q z-oTU`m()48{P@WTt;735E$FmdwJV$c2~(;auzfco#bRE+gqsnwy+d)e+@Y^Ihl2TK z^sB{3u{cm_cDVI++f8zX|Ne9M(5c3(HUx8C@$U@99vN=@{-45n?+w?h+M0h3$3($? zViQ|%0 zq^?MH$H$98VB1AtHJlFE6IB~S=?2~Ka*1^FZ5|}|K?T(BV^||yr3ORaNiNzXaogx|wo;&;e zh7vhOA{!67G@R}F6N1-SZPQk3P1RpR3WJtwn2-ZbQn)c~|Mc|GY-fJoHKdVwiZgdx>-98FY?m`OACSkt;dzd#4{gwNE5*yPwJo zwlgwjdmZ9ec*FwMtZ)%sCe|ViWJBkcvPP^~*#z)%tJ6v0+H`~kl|{0D_j$Vd{^)AC zegD#VQMo)vReBf$Nhc^AdIHH*T-k0x-^0U-nYA?&;T@Z8hSr zs&#Ptt=s;Wjq>H zy;2)24WfCr*4JD6@pRv?kc2{FFJCdI z&OVym=RU1!JC|dQIvqXwCFARQMR=7FMPdbWe^)7iS}czJAv#ES2n>wDg%{4^byCzX z!85!MgM+XsZm9F^J&Zz*3k&o=K5sX&#JM@9He;nepnDpKpV~p(-8c1c9a%?{)&u!$*0K~$tW-A za{+N2l80cZkCFx)nxfpS5I0)F$Xryu5OECzV?9rIyGtc9!mb^ea4p?~GGF=(MM2p& z6e!A=B%)Jy-I-F=`)W%B7-xykQZq;~zmpzPw-8>SQM^^_8ThqTmoCpwTCb^crc&f* z$QXEN^Ueb7xD-q@$Lbrtm3lIi<}^AE(aC7gnkvGOF^93s<)u6vzsk4yPlFUiadLOJ z%|m^q=mb8c=IVKDC^obuWj7cJdYY!L{cg~;6d7+_`iVs)zDZK*nBi+0x8U^whubm7 zyMoIbZV2$nE-V@tb))m$BPOdAF{|1AX#8ZL=c_&W3$==UNu*#_xJib%c5AO3I-SSp z(v-5K`|g5$-JJ9qA;8!4H9Ra+qWoUfLIEDX9Fa*sXQ{P;jNG6#^OFifK= z?QZXykw%fJ0rOojVC>&FiJO?O!8+umQ6S1_(aJFG2ZSx4VW^}xdte|nJ^e@%8LxN&~ zGG?#cLuUJXqFzjn@f&N%WI{V$m>L0l-r$7v?!Kh%~*B44>D{Q zR7D*&+LURq$OUP^XP!#lqo0V zg8+cA2SZZSl^f3g3JAb!?$xzY9fdlLKYa^UmqS)n%}C;TkK?c*k;I@B1)l9@<}sio zulQnF=zFej&s!@uFKXP0RQX;=w1SGzI8vmXPaAgWIqDefgf*sbLiU6qWQzP|U`-H> z`Vj&+rycTFvVfjPZ~f{7I8Hpfe2Pw~?6=$KMD2iG_|MkY0~SZRBOH#Pf5nqMxYdvy zV58U-CWREpyNKu8eTMF0OXwqby;Zj?MrW&jfUr2;&3SM&IQEH_Qke}k_%T6l(`7mXV#q`*&upM`C1m)P19q(U~RrM`wTL)y{0MLCj26-go2 zs3e57YWl(dBW*K&P@^j%w%q`qsmn(S4%#I4`JKQffOpYk12pY9Q)Tevo{hy(!tr&~ zuBN>g^X}7HXXJi&&8wm%h0{#sk809$r}Efgv<`(brvK1pjB6v917old z<*DN$jAn?3k+S|vR8OlwZEs30XDdf<$TcCOUcx5uPWFQwUlX}8@>>xUG?_cK<+9y( zjd@MM^q!08pKsUNi(4m|-VHNU@LZYou&n$BaK$h@QX$)eoDTR=B4OALFxf6A*%wiM!%ZTQg};qTNJ>P)B0BX zo|y;*(Z7z{H^L53m#q(YU$cZ%XwMFA8M$?p&Z1n|Q>TwmbS<3tA5(1IWx1(<>a$dF z?A&@_KE{};dY6QqeI$3EQMxa&6g?O9uUdQ~KLm*UG^ukkB=9m%MNrnr&dD-{R=;Pv zT`ixH{NNJL=8U?*=e!e)ZqmIKI1&}cP5C$kjqt}#iyH@zqQnM+%ktw{4ei{N$&u}a z5mIcIe|$W2%v`t|bdPid36q7ug#?Tp_ykl;{yc&U9-inqL6Nwro}d2-lq&*^+wKT7 zRdw^(5r~l%4ws{pcID{~`=Cgg|3rGJdc%gwzTFIlr5$y|#E(3PWd9)k(d$t_aOLnt zV_dx}vR!ikAbpOC%=W+Y%^`RfLi8!?T29)?F^URv3sRDb$<=Hp(sT->D$h@FV8JFnLD>-u&K<*JGm>+plGc}cv%i{zX9JGCw2s(AXk_jEY~8e3P|=t2O!MNrqqzAA$Qbodd+7U zL6gLAmfnhYy5qhyAEo3w+TKM9fl?PAnwKm#I>9CzEgT&WG zB-1oU^(`s(;9G~Q)z-LF##%<$sBN0YA13{&d8BGZ0ExtKc(4r_X{_OwixPrksY`8B7G!!6vfYB){vl<(>_c2)a*WB z^z5KKFiCG#Lwk+B;c~tXV%-E=u)&?Hrv0;*sA?4oonV0~P^h#gp8LjcnLO_P!x=UBXnVEA{`l22pAnkxKlHA%d|S!><3 z)$#3NN&JDEwBQD`ueaksVBoAVoVMz+{B*6Dxi(T;)v(lu8M(*X!W}$L!!VN|wUzTh zWL}m*3of^Y@??87tm7qfr7!0+5eLhSh^s^~D7F}GCLtUIi@WG^M*7uGs;)h zc*;Cw7qz--?GoMGK!Uk06P{8?Hh;hlxt4C*`lax{Jn zNWThvwIJrfei3m8#e?$4Tu&4WEd61Ks0@HO{JNo6q>zf(8V9z0Z48+l z6GOW%O&Mv|^4%aF+hGuzM=Pl2w~GI`n#Y>C7X6z9~0SF6+qCMS7 zL<8NbME;r%9l_X#;ZoRD_3(lh`@at-A@bI5y+otcDvR&N4KLFquWo*QjZrJ$n#XJw z@fDd0wg5ksME~(9{ul?KA{G!(kQ~yVNxO~KbLnC9ASW$ok2zJ|?8D`NR1O~-UtuBr zYaYBcA7PzEXUeKT0DjrxjR8Ep+!k@SwTKKwVx6thzt?^7`2l=2%bmrLG?}~;H@?Pz zOeS?3FiHh+-NRPM{q1AS?k;;+3qCJ9RQOGBvUXhAT}!}|+DJvHSwrOSH{GYdI=usX zXWNFHyqrrW0H+YZE}Ka4!#3U9N4&q7eb95it`{J7x;dM*5=BJ@dZ_fp_k62F{mGB_HX`kGBwJgx%R7A334or(qXf*qwI^y2i? z-vREWQq@pnz&GpfDX#e}PYF+?+olKV^?Cp>=VBst(|?0ts%(_!G%kZ!p%F?`5N?;Ns6UusOgy#rG%{SmM!kSY}VZ zL@~jTY|35c*NKln4Es{!$@i=S`VaY#Gv$+6vfZY@oWO>@DKq%xPp~^bDJgPsD%_t` z4$iF$-ff;uv(jaGogGQGDX26R05aa`FenJv-^9Xx#IRt*u$QoxEP>ydH|m)#XMyd* zrNVm9&2Jz=P$1@OMUq)9 zju_A{)>{(7gjI4VNzBi|-m?NAxS2bMQm`%pbLLu(1x0sx=S!zqIK&AX{r8+utzP`) z->z}nZOsgy>E{sO1n4uRjQi}2u4c<}1~_4oHxn3s0q&>; z2J^8vuUwoa!hm?0?cQbRY61Rm!y>v`UblK>CplSNs%`#4r6un2?MtCXD6?!-J)beB zz<`V}`@5M2yPhq+N)!wW=!gVO9M^2r zyIUnOIWt#{kqd!}*7%XXSX3LPEK73^GF$NE?u3an8I+;uL?UbYO<-+Pwe6Le2J^j1 z(3p14gP~F2LQPEUEEoZ+8NA56g@uHvR-_yWy);%%Z*!lWn0#D=d#6leCawP4vVTL> zb;EL8Kd^KB*~H0zBQR$SsQ>kv43sxTl3D9KX-}aV>BN`L-rZ);l0=%i~p+tl}EdlAgIW_ZMtznB(Yk`@Q+tP(V zA~DT~>8$x%;zNG={6giW8pQfCS z_aZ6_1i36VMP6g;r>0%em&~%FxY>f!!Ao3PcBA$=_bFA7Ar7*02~LSInRa>?U$bylQM zKVRr6WaXLt7|AOQ+kluKu#s8RXP@yxP@s;Mh&Rhmy;G=UPZhg6d#9^`Hkxx5A}+6o z;41KBKuINX{PTqr^W))haci8RMtxIBw=2$(6fxJxZg6_FlVa2nqQE%Sc3!XqzkM?A zR|}8xPS|iBcMMXtGu7bBuWB1!^^S*}NfGDcwM-1?Tx@!^CD#=k<^}~%#2~n!ItA`- zhB{H(lL7P}(0GH{y{ltLeKV^%|4zYu@{@~b3zfqxP2MIX7q{LBV4q*$LM_^elIs4E zo%+Iq+db1-mtpN2bF2muRWyA`a$+E(Ef^Y?Rpz6UC>d0NA!hok>u%oRJCtUgWR~d> z)+{fCv&NsP<<(a!JG$?Y;Nd@FiEG`zb_}T&(A)42Z!N zFeZ@jQYC28gH4mJ^)`e;xU#bR7Iswj7U`vEV#1FO9`inTrh4c@_4C~apPn+Hxmp!3 zv{DB)gUOoT<|V7WouI_ox)qX{5&A&(CxwJj2y-M#CprK8Ribzjk3@Fr*@EL!rtOD} zns8}~)@0UHAk;#lkx*~ zB7plyUE?>I$4l1vm*_sA~8B^#X7sI-x{RxLk-Xvj>UJ`wsjBFCt+9p>fzS z(i_8Z+r2Sn6m`)nXFPF?cO$D=r@#%H)jlPRg?`!7pz@>W90_fNZyy5hGOn{{JU@IT zX;cGJ7nAOw)iNXr=v(C2gYG zxB}BflE|Frgfsp#po5}a7-XQ;CBlQAQuO-l&r~vkXpL4kN7H_I@BJiyNf=-CnYKb+ z41tS5X&$Zni6Z-GE?6t)wSWfZikD>!wDuEv9j#Ht(+us$+?)Q(BsJZ*CJ!u*P5EUjv$a zvDhnvBvtWv2x5j0<=VFDOJQDi2%!J=(p< z+OjcRx};y%^E=Cr$61stI?5b~e86@_L%-IK_IJE#4>@s%Lh?!uy~)8t{^prz&}%|! zh|6s-s!KF~;3m(xrm-~aOg-ZUmQoeH>|FBk>eTA~`KLnar=_3FJe1zm<} zo_*`NUkNW{?vJRo`yVBYK_;!HI0y6W8!4@@dGTQ5m_wV5BkeHknA+pUGgvIwi$u5s z2Qy)31kMRO^q#{nrlkB%lrI}k7)uw(qcmFWN?jgJHdLMe3*I#nDxHp?-{$f?#6Lt# z#Y&vqa`j}Vbi_EVHrf!IQ#960zJ$*$2jZX;&-*NQ&NJi+J-xTwG1LqYD`=4|Kg7O6 zw`yMprHs;b*ZX;OD=6dVCfL zJNrA7%pfMu%xUC;Fv?$&*Zyoo67u6g=hJTnMz)rgdATVr$B<+xJz?QE~c#xb2)TW`|P+0RmU~j1U ze3J`v;e{>(!_B1TPUtN-yxWrBJU+kID5UtL4I#^olP7L{4y2Yd*;<*PT6iZ5E2sw} zYYJ$sbNUZh>b`{_SO{=7y4=zVL5S@2hw7pY=)o553HW;p(t zf&mQdQ;Q^~muq6!`_0pCbD+*GzZyzLf>l*uD! zqBr?`tKtx8r0bZOMy|T?Xdx`m?36Qz(^>;K=AMc%HdzJ7%0Io8C_POXyYu*)%aB{; zw^_0437~kL*0c^gLi5Rvh+yD|xFALkr$R}Go|-d&<8Vas@^7)+`4 zwkCsXm)eR@<>-=EK7>^h?81-4XIwZ0O_l!X=~58|3YGq;H0H zMt%_Pt7rn!wZ2jHS_DR|jXQ@TIf9hEM^iY?aJ?YxmTp+3P4RE*?vyg~c9DUugMayJ z{VC^K`0USA+j*ln++I>)Y&O6mL!{-@(0h45U^#6I90_F=oFTAaSODa$vL++ghxSc7{Vk3RxqOLidR9Vb*_Z2q2*U zQ*3%#nZw)E4nNsqw`Xl)jhdVGCW6iDmBxN$Nrg&g>hW|YTRlE|T{Z31pK8`q3!HM1 z);sgb^l@*i09EzbW(yz+cpMbRld4^AaJ-7`%c4lr7f?Wq$II-K%c$`Q2PiYQByHXt zm=22pt(ELls1YMSoxShz3eYT)E{u<-`@54FnoTN)E=kEx)N_uuY|<|V8sjath1*pV zRMy+~!hsLEs|Tyzf<$kKfB;b%1n@)PH@bM_j_en{EX|(fZZ;5;_+HJo+zcla#XVD2 zxA(nFx3UlV2oJDCp)$<*zLBCj?9+zpYou5b6zvg*1}~A|9pOks!!3qQs5PQXn@;)c@0(7IgNBI~I#JFwZ;?o;0GGuJ+jB*smcQT9CB30j$ zGhV9!{UR2tOl`%ruR4U<6R{Ky#2ZVQkw?QYJ4M;B36!puL_6P3pQtoi z8^d}=Qm&wb(`T@1^;PAV6UE|^N%CTaI<1jYGB)Z!rTR_6lbV`gHa<)qlh52y#;}z? zk2kI0W6xsepm4rOa}qQYezdjB3DuBt6_YuYXFL<}6Z-HHzxyO7Y%#v<9R@AA-#^38 zt!}2N3p}_0M4a)p5fU!>OJQJnKqdT>gk4xE>5qMIGuz5>l17E5vu>}c4sSCBeM%T~ zhpDdc>?c{HjirxoT}gZkzvghRAC)kP^StX82);ndyY0G798}Eb?`rFboFl#ey53ZN z;Q0=vAzc>Vk>OuA1un4|Mp&j>w3vsSk!HLHWSkTW2;m&1XsLe`nB&^zZx28<94=B? zYSkLj^U^QxAi2Y!XEO(4slw-c%IXFE^Gpr{L?jI`j1{DugO8P5I0a4a7uNWJmb)vr z53fTipr`Del@5xku?KX zT(uLEINc$9|FjbJ9dNS`_3QcCV@SNHQ%dyiKNz}gghUqCzH)Quk2K`zLOPS>A=U|+lhS!XUE-=#EAUzu_99Ow=L&e zV};%>GHJyvHzc&%ctihqVr`X}c-~p~ouQ!xt@Qk8uLm*pAc@QwNL`J{jprtDVS?p8 z?|-l~EN6CAcqZl+`;Kgm8A;-!(}UXQpOScqB~UfA8-9!OGu=LMDwKKUC)RxC3k+iu zz5yoU=lHgy!^tp;d&P309%6B0VqqNLw79?TXA<TnBm?9)FBCp z2cKLG1Y4%a4VF;w^(auQbf7dH<0@bhW`=`6UbZ8^?xGX?Gue&ofiG{G)d}DBe9ouG zoT$8UQD7~G1=jI^PzvZ?yfkYtf)9g3w`|;~(#@3Bj`lkE;y|2BLjM+u*RP>DB-Asy z&M}z>rzj`K2yX=f8zK7q=EAFr19e>cs3B4yX!(b>;5yjM*FPYBP@skNgTm{321t}J z9FIQ*Cr`I}8UGsOfTjXM!&(r6{?|XXwUSud<>76CyaZSYu|Cx0ul}SNr!2a1n(vQ< zZ54ql_I6A4n~-Xoc2^;ZS{TU}hqyugE!1MVp*W!XB3LD&@@o{+ ztlK^DkGhk97rF*NQ>_Ft41j&^UvXi7{bc~T>>arXN$^nl=uFh$g$A=@eR!d=dkhf^ zy58vGjUdm|RCv{I(`O^E2Dw((x5Yi1-!Wg7<>R_xoZeNa&{5T?Tz_CyjFPvY#Cbjq{4;9bZOM zZ2FdSEhhPaby>Iqffn+=KmMm#{wQcL8G*YFshh*BjO$QnB;ZF(f!dLrTl=^9jKd{Vwj{=89Svi?j-%ai_zi0X;IrWBo-th z(HqIlq@kTk?)d%ilYI9L+U+{|^)Rv)O_}6cW_&9}GGV!VET~SC@;;jtx&GRiBZx*` z{G^)kwtrd4(zY*ziV^!ixksRBeVGs}Z6tZj+d1-2mxLVAr((MT-2QMPdoW?U=-|tL zdqfCEX2ox=a4B%WMJ0PITX07{>i?U7yZ09Mrh}KQ+cWETHiaUzN8kB& zHsNM^Kx`_07ta<6Iw}SJoVh@je0#Kbr^g2kA&;iphldKH37#t2}7 zC)jmN!n3BpU$X>Ru#|!`>g(|NH>-AAI+;mboSTMGa}E64LuN|k0AhQ4w;&|}$FXQ? zfyeqofSQ_VrjtS|aoS_^X?WNd5R3Py4G=1>p4B~}AC`=!Zx?b*2SMjr>6(ZjtLnnb5UXj+ z@_(5@fAyV-(dChWf0kms*(6aA<_xIdldL0M&l>z!p{?;F!W6WZ9>NO_GeY|N*BkoO z$Q>101`f}iP!FzmrGU4(OC`%mKkpMDaCr;AMwb5RHOp#Mz-=GLC}UQV;bH_0rk~!yXt$po<^Hns*06 zQDEb5HP&u(7UAKo_{+833{`))qmZ7~@?+~|B)m5KNJFZzJ_blLU5cNC5Pdz>*x^aX ztH-JU9rEVVL%SPcX4iW$ZywgOo(dJ-6%y-L=MXhxh?Va>c}PfCAu z=ADATTgi6EFa8eM%;xHz5^$Jj0S9#PuVr3o1A56^yqg!shBdpN!o*Ba0tBf*GEsTMbI-Z{F;yUh&fatXW6yQme46PlY$MfdbrCU%hzZH7H?G=0r`X;9X zWTR149ZGx#q}^jOX>olI8*$Akjj8{k!zS6apu-()m8W`<^)dl+1`KakPiv ztX;$>!MrR#Z=F9iiQwQ0r5KKg043+6`&b5mP4SOcN{n&>;Tn35&}={Oevq=U79G^0)Fe=1VO7&PFy4F0gZlAl2qA9>-k$As(A;aHhY2>i_DBw~2* zHjr7$nmP1?(tC=~4Qo4gAku&HK2!`Nj zT8ukYhbnMRmbn&&gZ}0tgy=0yp&*izzkq8U+Ncm*TnMKO%l7!VFlF?T;KaL86cO?x z_FsGai48w8;%AH2;8wcr$3Ni1tnCxLo_T$hX`iMGa0qqjob+r~X2!MX7+t{7uxznV zT4ygnV?iPS+=Qx+ypz&7l3EfsZNTZurPMx+D+~2>jytp%H(95TW=dkrqYvosLjTiR zJG~I*H*@05*$Cp}ZcWr~kgG>t>lJL)+|WH9C4ec(;Wc>Ni|-gtzTJTEhz@8k&U;8p z*)Wy}8h(tHh|7v3JM_j9TZCYP4LYaX~t6qXX1 z-rc`mzVQ^YHAj}an;eo*C{_q#lNgOu>`Gjj(rL__-Fvb73b;ej-lISEd^bzv>l(GG~sS1xs^1EsHg)hBzT-zVJ zOvEO8aV*kjlYzn%i{LXebr|?aq#V>^iMNnl~?25ys1*S_l|7mQBFR`h{v3O0gS~h4IW*|l373&|_ zkMq3(=KFXMwD+uFNY2vil>~t4d0$|zc^o<9M}z&A@cEfBgzp5%WbNFx?SucP1&EN_ z?JMFv05a+)rpr?G)A;~2myW5n(Gk@d%RUA7zu^03dATPdV{D3?Q*n>cbBdt70M25b ztC)iZ|A;WCpQh${x`cxch#SLBZC>u7;c{>tm8Ywl{mK1I4|09SP1XDC)lOZYnX1un2k_|>~GZqFZt_jNouv2J<(c! z$8-_)eb=K;V}LBTuhDE3+JIISYOxpxqrBjU!}H@VACU?GiSz`@&*M@Q~{91KJ{#XDZ|&aXU%v^}GoE5qL=xS7_AUI^6&~p-z!bM_2#FXsV)$ogOeQq#=|u1l zH!|z>mN^6t&hq@W0lN}L(rNx*?LAD87MpT!_uLJ8-wvC6<<|gEeu_;T;^t{zij$plIwoitm=mD5$n1<7a@-nxsEQtCKkR zAU$1h>lS_F38POLE=_FwTj5x#0;fmv5}3B(r{3@rKzaJ8PL-jX?nny{vNt@W9&eqE z2u!$ED0JGgG2Qp@zcnk?;CuQjS~uv0*)pe{XGqxCK&+YImIP7*z%1_eRV#4Jjr-s@ z;!J1RHxF5Kp6e!E2AD=LMZK2f9~mG=2dl*Wg#ZCIa8D3eozNR%lsA*eMOKBils7{l zuVLcmNlA(K(|CdqN{kWaP~?bk+c?izx^$_YWA!TBF0MD#xF~=zND=y;l?j4N2zn(x zmDj?g83#ms&cBKC-@nM>zA-$f*o>nS==a?GXSOx1k57?6iylhLZ?95G@x5p*V@>7v z9)NzOLJ-{Q4coNxgEOixR5*0^%IEP0ioqA@nD-$+W^1n39e-RllN;TVhbNYn+TD#v z#%psqX#K+Dh@$DbeZLkgTkh$si4CZ2ORb`ZeS#0u0KU_;n~H<~OJ1btek&qTQq+_K zZ!y-Qx&c|5)geR6#OYi~_jjtYt=z?Pl3zxcfg6o{41Vvps$L+EPd#hK08QTwfP>+6 zEOqy3XsB|4ZrMR5ah6*9Lpkwknd{o4js=~8LVWKUBLgy#I$QU=F0*&{0Q{?P*Krn? zQmXKQ(VcPqp#Woo*k4J0>Tz>Lm{`s#niyGdkV-slgB43|%`ZqFHJfjzJklA^s$cdk zi1#b&k5bHNqjp%M_>b#6J8Ph!Q5{GF>52<|ivTrqD zUXq)OGhMj@o5y%CYI0$VW)6Cjw~|xCvsD*;noArx!TFSVhydGfxvbDi9Mfho=ikQ zQ8yR;&~jQ3O8G)T%1?W{z3%z3(ueU_nYH`J{Fsi)7w1vbrFMpR(g(yk(p1~ZE`s#Q zp3i-;<2!8gsa(pAuOeR8^P#P3onX@2Kvo1hm|rNxU<%}GbWu0{f_Uz^3h{LaJx&#-4qZb+~e zdTi&5GnfNjwZemP`NWREM2@uWEBFF_CQCR_AI48D`;+TycS;@PnryF3BjPh4ki>QC{pT+2Q)JUt%J`NQ!D!FEEHH?Fg5Kc-TL17uNo4@mC1;Yryb>V)h6g zj+K;lGo}yueXeE-1d8diDP4hHYoJef_8nPKbHeYBFTHdn$g3K8;!l*;sS1HTLi`>K z4`x(fgMyP`QQKzRk*RmE=keF9?spKa1A%d}8s|nF=FURYf1c!PD_6l(Q+E`b3mh(y z#97N6h?7$Ix%pzk&wh~JK=kUHt9(DAHF@iB;E0n3#5d7&h@C4>%!GL^2mS{Y;(x+8 zUgG3CS?n3(mk;pbtY`?%fKf@moey`cz`pF@f4QV%oy&Prm~|j- zx-b;3SNiqvh{?lWBxqb!;k_6(Qn2TlIJ5tqlGy&E4%#0{vrFi=pr%$19{Djoh(Pf{#Bf&^0J-JDQ$zduUo@jcX&pg5Aman zHg9H7-M?Q+?YTYkWcC0RtHTGi%98CW^)v#JGoq2#|LX-%3s8VbMh4m4R3Gw#!7R!_ z{$2Q*jMVb(F+B*BegrmdKb6_hnTu_H4T#75OV4+R0K1mB) zrGw^sPRvkHckWivhZZI7`GEpA&N$=G$^OEC#&81V!-Fd!!p&Sa@W-ufZ4B{?))U&ykcNcP7FA zgmwM5&6cD5W*AWih^Q8mC-!)hMDe5BY_q>CBwfcS+jQ5V4XMkek=S|~mejKOG%&nP z`xL=JIUOG^eApW)gSCJ?XRPP+r#`e2LNMhoizSkZU6OKQ3_qZd+?Yom)P;6}p9K%H zH{P?-hi1xmu%mnm?iQW~ARQMEio?j)o0RDA!|T3Srk$?{?i(*4zCWd{GF+OI+X=C{ zp?dgUDi`!ZiFpxc1(uJ2#Li|VA`Ps2i4HdAd@-1>C^Z5prGzrP1`8Zik6tiz^Rnju ztoJXsUXZ^272@vm2srSvDsc2~DcDkO&C_*Q_;n{lM948lDCq?S^nZZ*r3PzBd?q^? zjt)o7{{d6jb#LJBnlhucAf01>iSF&HM!l6HVw_$t|Noj{<5pu$L)_D<=~F#Z3walG_;B2CkqM zOriA=+yIZO0yZZKIf6ZFEem@L{%bx@y?%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/4/rethinkdb/imagini.js b/node/wikibooks-nodejs-microservice/4/rethinkdb/imagini.js new file mode 100644 index 0000000000..ba2df15b1c --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/rethinkdb/imagini.js @@ -0,0 +1,133 @@ +const settings = require('./settings'); +const express = require('express'); +const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const path = require('path'); +const rethinkdb = require('rethinkdb'); +const app = express(); + +rethinkdb.connect(settings.db, (err, db) => { + if (err) throw err; + + console.log('db: ready'); + + rethinkdb.tableList().run(db, (err, tables) => { + if (err) throw err; + + if (!tables.includes('images')) { + rethinkdb.tableCreate('images').run(db); + } + }); + + setInterval(() => { + let expiration = Date.now() - (30 * 86400 * 1000); + + rethinkdb.table('images').filter((image) => { + return image('date_used').lt(expiration); + }).delete().run(db); + }, 3600 * 1000); + + app.param('image', (req, res, next, image) => { + if (!image.match(/\.(png|jpg)$/i)) { + return res.status(403).end(); + } + + rethinkdb.table('images').filter({ + name: image + }).limit(1).run(db, (err, images) => { + if (err) throw res.status(404).end(); + + images.toArray((err, images) => { + if (err) return res.status(500).end(); + if (!images.length) return res.status(404).end(); + + req.image = images[0]; + + return next(); + }); + }); + }); + + app.post('/uploads/:name', bodyparser.raw({ + limit: '10mb', + type: 'image/*' + }), (req, res) => { + rethinkdb.table('images').insert({ + name: req.params.name, + size: req.body.length, + data: req.body + }).run(db, (err) => { + if (err) { + return res.send({ status: 'error', code: err.code }); + } + + res.send({ status: 'ok', size: req.body.length }); + }); + }); + + app.head('/uploads/:image', (req, res) => { + return res.status(200).end(); + }); + + app.get("/uploads/:image", (req, res) => { + let image = sharp(req.image.data); + + let width = +req.query.width; + let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + rethinkdb.table('images').get(req.image.id).update({ date_used: Date.now() }).run(db); + + res.setHeader('Content-Type', 'image/' + path.extname(req.image.name).substr(1)); + + image.pipe(res); + }); + + app.delete('/uploads/:image', (req, res) => { + rethinkdb.table('images').get(req.image.id).delete().run(db, (err) => { + return res.status(err ? 500 : 200).end(); + }); + }); + + app.get('/stats', (req, res) => { + let uptime = process.uptime(); + + rethinkdb.table('images').count().run(db, (err, total) => { + if (err) return res.status(500).end(); + + rethinkdb.table('images').sum('size').run(db, (err, size) => { + if (err) return res.status(500).end(); + + rethinkdb.table('images').max('date_used').run(db, (err, last_used) => { + if (err) return res.status(500).end(); + + last_used = (last_used ? new Date(last_used.date_used) : null); + + return res.send({ total, size, last_used, uptime }); + }); + }); + }); + }); + + app.listen(3000, () => { + console.log('app: ready'); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/4/rethinkdb/package.json b/node/wikibooks-nodejs-microservice/4/rethinkdb/package.json new file mode 100644 index 0000000000..77f2d973d2 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/rethinkdb/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "rethinkdb": "^2.3.3", + "sharp": "^0.19.0" + } +} diff --git a/node/wikibooks-nodejs-microservice/4/rethinkdb/settings.json b/node/wikibooks-nodejs-microservice/4/rethinkdb/settings.json new file mode 100644 index 0000000000..559c40c0c0 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/rethinkdb/settings.json @@ -0,0 +1,6 @@ +{ + "db": { + "host": "localhost", + "db": "imagini" + } +} \ No newline at end of file From ea25ea66e52ad473c354710599b32bcb101c8d2b Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:06:20 +0900 Subject: [PATCH 19/33] =?UTF-8?q?4=20-=201=20-=204=20=EB=A0=88=EB=94=94?= =?UTF-8?q?=EC=8A=A4(Redis)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4/redis/example.png | Bin 0 -> 55543 bytes .../4/redis/imagini.js | 88 ++++++++++++++++++ .../4/redis/package.json | 8 ++ 3 files changed, 96 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/4/redis/example.png create mode 100644 node/wikibooks-nodejs-microservice/4/redis/imagini.js create mode 100644 node/wikibooks-nodejs-microservice/4/redis/package.json diff --git a/node/wikibooks-nodejs-microservice/4/redis/example.png b/node/wikibooks-nodejs-microservice/4/redis/example.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 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%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/4/redis/imagini.js b/node/wikibooks-nodejs-microservice/4/redis/imagini.js new file mode 100644 index 0000000000..a0032272a7 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/redis/imagini.js @@ -0,0 +1,88 @@ +const express = require('express'); +const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const path = require('path'); +const redis = require('redis'); +const db = redis.createClient(); +const app = express(); + +db.on('connect', () => { + console.log('db: ready'); + + app.post('/uploads/:name', bodyparser.raw({ + limit: '10mb', + type: 'image/*' + }), (req, res) => { + db.hmset(req.params.name, { + size: req.body.length, + data: req.body.toString('base64') + }, (err) => { + if (err) { + return res.send({ status: 'error', code: err.code }); + } + + res.send({ status: 'ok', size: req.body.length }); + }); + }); + + app.param('image', (req, res, next, name) => { + if (!name.match(/\.(png|jpg)$/i)) { + return res.status(req.method === 'POST' ? 403 : 404).end(); + } + + db.hgetall(name, (err, image) => { + if (err || !image) return res.status(404).end(); + + req.image = image; + req.image.name = name; + + return next(); + }); + }); + + app.head('/uploads/:image', (req, res) => { + return res.status(200).end(); + }); + + app.get("/uploads/:image", (req, res) => { + let image = sharp(Buffer.from(req.image.data, 'base64')); + + let width = +req.query.width; + let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + db.hset(req.image.name, 'date_used', Date.now()); + + res.setHeader('Content-Type', 'image/' + path.extname(req.image.name).substr(1)); + + image.pipe(res); + }); + + app.delete('/uploads/:image', (req, res) => { + db.del(req.image.name, (err) => { + return res.status(err ? 500 : 200).end(); + }) + }); + + app.listen(3000, () => { + console.log('app: ready'); + }); +}); diff --git a/node/wikibooks-nodejs-microservice/4/redis/package.json b/node/wikibooks-nodejs-microservice/4/redis/package.json new file mode 100644 index 0000000000..7b0c2fe046 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/4/redis/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "redis": "^2.8.0", + "sharp": "^0.19.0" + } +} From 786a0ac4370738146b4dadf6b2d9895b2591df9b Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:22:45 +0900 Subject: [PATCH 20/33] =?UTF-8?q?5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5/imagini.js | 133 ++++++++++++++++++ .../5/package.json | 8 ++ .../5/settings.json | 3 + 3 files changed, 144 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/5/imagini.js create mode 100644 node/wikibooks-nodejs-microservice/5/package.json create mode 100644 node/wikibooks-nodejs-microservice/5/settings.json diff --git a/node/wikibooks-nodejs-microservice/5/imagini.js b/node/wikibooks-nodejs-microservice/5/imagini.js new file mode 100644 index 0000000000..fb0a5efe1a --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/imagini.js @@ -0,0 +1,133 @@ +const settings = require('./settings'); +const mysql = require('mysql'); +const db = mysql.createConnection(settings.db); +const express = require('express'); +const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const path = require('path'); +const app = express(); + +db.connect((err) => { + if (err) throw err; + + console.log('db: ready'); + + db.query(` + CREATE TABLE IF NOT EXISTS images + ( + id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_used TIMESTAMP NULL DEFAULT NULL, + name VARCHAR(300) NOT NULL, + size INT(11) UNSIGNED NOT NULL, + data LONGBLOB NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY name (name) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 + `); + + setInterval(() => { + db.query(` + DELETE FROM images + WHERE (date_created < UTC_TIMESTAMP - INTERVAL 1 WEEK AND date_used IS NULL) + OR (date_used < UTC_TIMESTAMP - INTERVAL 1 MONTH) + `); + }, 3600 * 1000); + + app.param('image', (req, res, next, image) => { + if (!image.match(/\.(png|jpg)$/i)) { + return res.status(403).end(); + } + + db.query("SELECT * FROM images WHERE name = ?", [image], (err, images) => { + if (err || !images.length) { + return res.status(404).end(); + } + + req.image = images[0]; + + return next(); + }); + }); + + app.post('/uploads/:name', bodyparser.raw({ + limit: '10mb', + type: 'image/*' + }), (req, res) => { + db.query("INSERT INTO images SET ?", { + name: req.params.name, + size: req.body.length, + data: req.body + }, (err) => { + if (err) { + return res.send({ status: 'error', code: err.code }); + } + + res.send({ status: 'ok', size: req.body.length }); + }); + }); + + app.head('/uploads/:image', (req, res) => { + return res.status(200).end(); + }); + + app.get("/uploads/:image", (req, res) => { + let image = sharp(req.image.data); + + let width = +req.query.width; + let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + db.query("UPDATE images SET date_used = UTC_TIMESTAMP WHERE id = ?", [req.image.id]); + + res.setHeader('Content-Type', 'image/' + path.extname(req.image.name).substr(1)); + + image.pipe(res); + }); + + app.delete('/uploads/:image', (req, res) => { + db.query('DELETE FROM images WHERE id = ?', [req.image.id], (err) => { + return res.status(err ? 500 : 200).end(); + }); + }); + + app.get('/stats', (req, res) => { + db.query(` + SELECT + COUNT(*) total, + SUM(size) size, + MAX(date_created) last_created + FROM images + `, (err, rows) => { + if (err) { + return res.status(500).end(); + } + + rows[0].uptime = process.uptime(); + + return res.send(rows[0]); + }); + }) + + app.listen(3000, () => { + console.log('app: ready'); + }); +}) \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/package.json b/node/wikibooks-nodejs-microservice/5/package.json new file mode 100644 index 0000000000..b73601350b --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "mysql": "^2.17.1", + "sharp": "^0.19.0" + } +} diff --git a/node/wikibooks-nodejs-microservice/5/settings.json b/node/wikibooks-nodejs-microservice/5/settings.json new file mode 100644 index 0000000000..88afb918a1 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/settings.json @@ -0,0 +1,3 @@ +{ + "db": "mysql://root@localhost/imagini" +} \ No newline at end of file From 92c44937a56c46c92a7c5625b684bb214b59f1ad Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:24:09 +0900 Subject: [PATCH 21/33] =?UTF-8?q?5=20-=202=20=ED=94=84=EB=A0=88=EC=9E=84?= =?UTF-8?q?=EC=9B=8C=ED=81=AC=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/5/package.json | 10 +++++++++- node/wikibooks-nodejs-microservice/5/test/run.js | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 node/wikibooks-nodejs-microservice/5/test/run.js diff --git a/node/wikibooks-nodejs-microservice/5/package.json b/node/wikibooks-nodejs-microservice/5/package.json index b73601350b..b0791dcdae 100644 --- a/node/wikibooks-nodejs-microservice/5/package.json +++ b/node/wikibooks-nodejs-microservice/5/package.json @@ -4,5 +4,13 @@ "express": "^4.17.1", "mysql": "^2.17.1", "sharp": "^0.19.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "chai-http": "^4.3.0", + "mocha": "^6.2.0" + }, + "scripts": { + "test": "node test/run" } -} +} \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/run.js b/node/wikibooks-nodejs-microservice/5/test/run.js new file mode 100644 index 0000000000..e8dbf442c5 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/run.js @@ -0,0 +1 @@ +console.log('ok'); \ No newline at end of file From 11c4e9334caea6ac1a9a16804a5f43cfe81d8242 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:27:06 +0900 Subject: [PATCH 22/33] =?UTF-8?q?5=20-=203=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5/test/integration/image-upload.js | 3 +++ .../5/test/run.js | 18 +++++++++++++++++- .../5/test/sample.png | Bin 0 -> 55543 bytes .../5/test/tools.js | 5 +++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js create mode 100644 node/wikibooks-nodejs-microservice/5/test/sample.png create mode 100644 node/wikibooks-nodejs-microservice/5/test/tools.js diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js new file mode 100644 index 0000000000..9ba6d7c072 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js @@ -0,0 +1,3 @@ +describe('Uploading image', () => { + it('should accept only images'); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/run.js b/node/wikibooks-nodejs-microservice/5/test/run.js index e8dbf442c5..5a97128391 100644 --- a/node/wikibooks-nodejs-microservice/5/test/run.js +++ b/node/wikibooks-nodejs-microservice/5/test/run.js @@ -1 +1,17 @@ -console.log('ok'); \ No newline at end of file +const fs = require('fs'); +const path = require('path'); +const mocha = require('mocha'); +const suite = new mocha(); + +fs.readdir(path.join(__dirname, 'integration'), (err, files) => { + if (err) throw err; + + files.filter((filename) => (filename.match(/\.js$/))) + .map((filename) => { + suite.addFile(path.join(__dirname, 'integration', filename)); + }); + + suite.run((failures) => { + process.exit(failures); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/sample.png b/node/wikibooks-nodejs-microservice/5/test/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 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%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA zv2ELKY+tc$+qP{djqL`FoyPWi_1^pWef#?h&U3AqIp&yIgP?_6zVy$LG^MStM$Cxj z*B_*n6;inwT>gD%GyBvx4EQ24VL~r4+|V@VGe*~rz-qd^FO78_rN&pP5U~qVko?3d z$m-W4(V9(G7?Mw>(&JA=XmZ40PpxD-Zq(Rtl%noBoOqe9aFl*ti>Fq`gr z8jzveB(GyKkpg*)fcCZL4)^&CpqEaR;uhIt%|nEug%C$Q6!pcOFO70h)rYM=fSYB3KRU*X2@esI*1 zRVmIn=bvSxT!eoLm2dPJl>aLry)~qVC9DK2VPo)o>?ec-1kp(O$!UoV*lNvuLNScX z#@DZd#2_I`%Kq^`)%ih#ahuK7d|3&{)f*LBQ$Ig!O@IZ`b{5M>=3(Wv&4tkWqi+QL zWqI8oi-VSUbWnZVUzl zi+$9<8!lr(Xh0Bc(QrJN7RE-MYiw|G|0boWAt%4L&i!k!5CQJkbmMd*90Ra~}DDz`&CT98!p-AiJdhj05$vdU+onPk>=Ql-ZS4p%rhzAr(t<$F5He%hp zn=$F9+Nw@WhbPY^T`(^I24FSnLWS>H1Fb*ooAtlJL8LLWVYJKDmgFdq1bJN;-vaO? zAG)4OMtWETg^4W;wd>oFz0nPr21#JKDzV$`^q@-#gzP#fHuslcDBT2utYK3C8h9a_ zv?Ll9e9;y5-b!Wq;6$P~=r1qXu6Hz(m9NHnh$mqm4%8ul{at)CX&W{0S`n|zY%r8L zp$&clrG1|e-}8JbnU|#FUcR;}KN9ZT9lSX{--fn_FAq?rlAQp+xL!otx38eqhZc;| z&1sG!Ol%FWNq3WAD^{6$Gaz-{$BrvN=Scp!LOvX0UfRnKvbjMJvG{cvyNl?n#RhKI z;ydv~qVy9O>?(W=aFOW4vvh03`3S4*!>|%OuTmK@!okna6ZH;a{D>Us!HkShHkP1_ zD{q7h9=}5_EMOH$8xq%cfycN+tvVUBco|%Ug z@ekcAn_tyj!HPOVkr$0`->Q1Kc2(>sRlJ5VLAl~9uf38+yYI;hk%b%5bt4X&O_4w6 zDgoniGPSXPcA4$83B`o4taC$AcXa+(%?V!$64|l)(*L}k;LA%@w>WI9rx@8ixRcy= zr!(_&D9I*Gplo(As9SzP%*6VdQsLO!{`s83+ZPmCy+A?!9YMWDd(DmU+5yeFY|3!g z7%4qdccBVXuU&3=h1x4?r&&N>+Y-~aqo;gxx=+_@2s0Byi&k}5AhX1qzjjlza+ow{ zHq6D}l{SseeAtMS9&qc;EX;8M zcf!)XM~@Dp^IxSy6wLF5D2+}4$nE%dleLoe9r^f}Q|q%Tnd8}!^QS2O+N7lg!|?rRsr ze2?nC;L&CZ!OE}>%@#Q@?a@J=tAJ%07(bsP))#I=I(GDfb~R5RyYx!9jd!QeXQV zrPVlpzw$VgF|eKkr0m0S{0EBaJ^^oPQg=dq=5d)pYJ8jYPY5(d8@PtvE&pXHVpeIV zy`3W=xY_83e%6q)-_hnU1FwkDo7n(2>6)lddkQcwD_B?lu={C&;ip(h7!d9a)GvQL>4nJq&w5-7rTl7cU_3~7m(+-Npkl<)g=(Dp#iXl_D=v!%Jm0L^4GS#Pf^LEyTZlLMd%WOIbBsFWg(EBg+g8myS?9*lhE+TL6*VXRT z{^67(8Esgp2b5rsYfhMz83Qc!zMT&(#bi%-d$LeqLD*=iJuo?`dYjY}<@dMHfoM4i z=Hm{^LZpX*ZatKj@mLg`#252}>mC7dyrkQALH#Y~&H}Qdd3D8MQ4kv`X4o*LjpLUGIK`z^4>wzy_sS-P=b(vlal?e()+iAKy~9u z7>EtDP%It$KT$$9O&|92`69!!Rn^|*fV2iYZj+wNl1Kl;dZ0&sXCpwhZvmC><;6T| z-bFeVqa@TfVcn^22?-U%I><6al(cIB!i!W7_28 zGR{?;87}<{soF;K%K6114nYkVOe&ZOh8Jk~{%YHQW-q1#+_~U``rS~}Xu)F;bS?)C z^W$rah-xLEUXc~GEuGf6-4`4q6%X{R(dv9tjKV2vpIkOwpTuIvX}4L;jVtBpjTdW z4f>D3G2$-O3W-hDHG0U>p?Zi0NSm&U#Wyo@QhWcahYP_kw!9v5zO03NM5@Wjy zO=!N454poCd&zgAH1Vz_!iW@y{gHHCn8XW{v{$J_;7f_B9fXm}5;5fjK0;hx4|d+i z4n(`#26STxD`H8k@%qH%E{&RqI{44Gqk|(6(wwH-euq-PM1gn?CM8nh{dh^#y0d@xx^ zk^O8VPT(yX5t<_7KSX4H&2e!424KmcuLJPVC4YeTotGx`S+s@*P~L8@R<$q2|YyMrle4oWvt5$#K8qE?Poko#0wldxBZ z3!d2#^gbWRM_}ezN^UphZ}1d}+@zCQ&}uJN$ID!;{7D7D^ni*ys27m!2%cz1&9;tT zAOSmwEhH|_ST1;V2m|oLY0JpY;RJg+vz0`P83GClh&7Ytdp?V#=Okm*^Ft|)tlD|B ze@$muUPXpBi#3tl^;2`wrXLa4v38>K3Dj4x#=x01MJM}Lv7iyvHI30E($fjvC|ZaDUH+-7aLR~9fpd62bxdHg_q zKv=mw2gFC%7&~2i+#=+2l%rdZc{BYpQE`r*cO9_fYAymyxv3_^A-!YB{wGo#plwso z=Gvt(iOgVEt_r=*amxv-(`$u$dlMNeEp1Q`#iwp6clNmSc3x0)MI^8@Iy8LTk)UM0 zK(^W3jV9KLCaPvD|C7zG`Gt!fpmJX0PCKNrRG-87KIJDt;~*CqI#?Jsr}=GNGoAhj z8T;?(+;#Y7$=1xspzC~pGdEegwVT_u^?Mja8JX=z2Kp}A;o#VZq1@oh$ z9Cob2?n18!*Nv)NWiofKcbsw+81T8TI71+kfl7P*8PgmKNVWyD>BWM6qCK62VAHUNE-iHlT{$CWw1v>1WVoQz=lQ`ZVADFunZI}Hw z^&uu^+D8o}8!A1#Zu~fFy*LhlJE0JHi}V{ix1z{lVSJ+YO-iVou?x?6i4!vJ__Jq6 zT})!LL#&DQ_P|0g=D>J@K^vx+Ye6LSxS9ZCC_*n4CL1**GOfI#{aOo@ReLG_$I(*N z!^z4*9T9u^4xZu~0y#VeY^tZHJ<7D47>4&tE_e6EZ?J2uh~^`X&5UsND8Mpmdl+;C zQy*joBo4wRC^hba#IDhw2+u$EsF9y+&V^SZ$J#=OXHXGk}0V6`iEOsEswPr!0}y*HE0ttDXT^9b2wtE z&RCU7WuE0JUZ=>Sc6ujCt+tRNz!aIil3LAOd0;4N?6Emhy(hYQofc)87 z_gk8bm(V1rXEKVi=+aKU;0h~3Y66rDmH5l;e)5NnUZw`gE96z_<5gm5bhR> z-)=+jVoPK94SaD-(_E9hN){)b&FsMw=aAHc!33ZRs?yrtdBEJFlUMx+Yh<_ICcZP7XWn+5i{zm?Tk~__ zKX`F~+1|nlL60FmL5iAS+>N$f_j+E)CdNDq$W)^_%bRsqecnqbO81YY9L?brp-=0Q9TM=MU_ zmN!rEdhsP&uq;t?LgChJH&54q)WpLOYXjJo#))TX>3;!u6Kkq_nn9X(&?tE;SkvV}flUPmz@2&B+&9gr=ya1p^D4gcID%s(AN(~mdOSNRSxB&lD}{4K zLoFISq4rS9IbE7O^{^2RsuVIdWj1^Q1p^L0@KEGU+^2D>w>@DGiale50EjyC8ZFje z_gIIrg;Ec7b?n!JnhcSpF}z#}>tR(EX`7f>9Xv|1Wfp=ueAtR@cplt41-9po5B7O6 zvwgE!$5iqAk_rZXuAtaes@SYKEbOl~U{>Ti)>JQK$HtHSWoU_BwMUC{WaKP*TOm}endT^NZR{Z?YzdBtZkmYZ+Je3IdTIeyi)JiuD^ zXr=yn;2cZ4tw12a4!9m2iL~Q|>5oad5IZd}U6;i4|1w~>Ed}FF^-b6|sn(rWZp@m=&r zovEX4gn>-ts{eOrjKg08h9$)J^*&ZJ!|u0`jpv0G#>R+rhrrToN-mJT1KWUvER{C_uCo9otCi41 z4d5EDv*HyGcVt(R3BNl2U~F3Yw8z(=?b()~%l(z?9ki2RU`i?S)1k0tx5_i0;LzO= zLuD9Veyu@Vrq_(KF~K+JO961pgR?Sq>hH zoq|1jugsnYEbp@i&T)UuI(|v?dt%0b&_p_|lZJ;^NcS>l)VALZy339Y6&Lxj@zIKu zk9$I2s848+l-sXkrJ)=@BM*NCJHF1!$3zBj0MWAJ3EhYBmh_LlD_ZyiOk&{lV93I(-C-laTDOni~?|&Kkl}3~^=FNW6?tK8Kq@l}MW5rNDAaqij#i zJsx3_&S+eWQjX}|w<}(WQi6`lK!kKet+5hw2O^P*6>~+`sfotTS4DelxPcADTL-r$ zdF^SJL^PPFnc<`rnsoYUe>PuNCT@>b6$h)F2o2W>(V^`tx}UcKcqhd1U=>DhbDh$& z{o68LIc}H|fJH#WRjMsdy~oDmL~vXt{`tg3UZ{a+(DR>O-pk)}a7i=B4Oz04Z=qHL z$3h*-7=f;_)`Rnji}{jHMjuwXA6u)ti+x@gc3fWgvEq2ii7LO-P-BbIMS-FJJt^L? zb2A)J@2Y-yXdd@hBt5RfqqM+cKN_IJNBu3znMGdrnL+AI?ov**dr!{9{md`!Ifqk0 z+}O#_9Z7g+rMQ!--e`u{kmmtQu=w5@hkt%IVE82}6;pWm`*~dxJFf0L$g+dkJQcM> zni0AeJU(fE(D5DZ;>g-uoOxyU!aV#Smg+h9#an!O+0o59wCoi?W>E z2=%8R|NjA;Y;Mb05BJQXj=1B$zPp0LwuotMqdo8aRBp>2;eO3?g41$-&`T?7laBlS zR>3xYb@GtfYztOofM&)Z<2B1_9Q>h~rdhG8oo_#??y_e@CoR5|)q&+o^>p5rJyDnv zZw7O>Kg)kJOj5Ud4y&f^S&_h=Q^Ss;MC}j2we4?Q@nhzF^xQeVQ4ft}iA_ZU_>u|I zDkNZ2mPjdMxqnJ_d~>c_`^f))kaIs!hE{jk4Ckr5s{5Bi@4Ijn2Hlf>^uOb%owr~v z<(Kw$#fDzb)lTRSXwxWR(8&~$mquZC?@IVV&~kGyEFfn3uwnmpXjb4XW8y507S1Ptb1&zecBKW0}u^q3I!R zDES;`<1f-K{q~X}jV9MfD!*N?>;<+{8kNTBN~FPtshW$X)H5NIo=h zo}mN$JfZ@OZNS9`(5Z))*%(-AEeqOg22f^h$2w7TpK9-JkO+a3^7#Bn zUE>~!D7i6CPxsxafiLIE+K6i7T!^Rc>uDt)lspo&Jn)bNb_6S2K$J=X!GBx-$Z3*xC-;FLSH`ej zsTr+pnjMD5mnQFxLM*N1;80dD-~87YjIVGC;qBywx3)!4JQ>>Et2rpn2@~k%Z}kfW zea5lggt)~M8tG>}zDDmGulE^g-B3-JI1_ej0=)@i4sUE4%b+8cmOWQ(H22vPc2>dS zF%O8j$T%$*p}Wf-p$S*(i8tOa#^%nd_q4LjngOb(!p8fN43VJY$W#G$8n-|aDAbYK z-59_ZB)1xbL)EGOEAyZ~6l)=$mS4*xnZD?*~%5q-e~ z$vWt!E9gUq6-$qQ^tc|$#8!hQE0QmBX4~yS21)yW}F;` zuX3a6K3C*<>kYphDhm-1dvUVSvmDIKb>Ll3)cHVhhaF`i#>(5&vs_EfjQ#~uL$bD~ zJpFit4B_76==x_q?cGZ4RKKm2oh5EG`=VF*p^-wSg*SP$K6+9p;luV;bLiR&c3ibv z+x%q;i^}AI$qM5_bN&9`nJ%0cfA8vdlWn0xh5%4q`*Tmiso4kruNHsL ziS?Z|b?B*W#4waZvXxh(htE#`MDZAq);<*~W4T24OAdwagj<weLeXpRCxU5=aLo zd6s0V_PG`}=p_~+P=WPUTp1W-LE-dUti1=&CwqEN2f=ps?gYGhN@JWe|rVl?S%y)?cSdlCjY6=M%o3# zr3; z5s=71A$sNO;*C5M0U{a@`NxSq^MXFm1ZnK{UyN zIEZOkro3K=@3A6nmUMaRKnQT?CD6M^XhV@8xuf;@`0OZk)83FU+Z7L$@Z{ugxX;)3 zdd-1Il-MU-)efrZg`q9+tspB=CInlRJ>3vxBdm7;w(T@ph z!Lr>PgH1W5J6|Uh$b7hC0zmh4>@BsUy{j|UtR3#~WeXT5_hwYYE;wv$h~{{(Vd}x{ zMzx-}*87|=%o$_3FIbB1!<=u%8_54s{K5%G)!k*c`T2RY=Y{^JXNP;GVlmyi&wQO0 z00TIwTU8^O1TnXd-90ba*1b%y=c;=i%P2Q|@uZV8J1&CC-n#pw+#+ z+#UjJNR5GJIy2H7krF35gtXp9hCMMdpLy`T!d;3N<_fYz6%}S~>ccz65SEIWlrbNe zD3h9x4S}(U^uV~-uaCM>5%TW5*z_nI&D1)rOF_g;OA0+HVEs#UZ&M+B zR%_3w{jnhySPYj=!dh6;y~^uF`T1U8Z&2@tochP=Fu|`GHJt?2GcvUGl@td4m**Tq zc0_Gdu4{#VwFAkEv-W#dD&jB-LM`4_p<(R{qSoV%j*pI4JVMLK_)`e!vtMke<9Ndl zqXy(xnt5TCv0ciD2?jfIHR(fr>5KeDJBLwp0Yum;2?zIL%&<{N2NSA*{UJWi)=DH5 zzCnZFqVR|(Haawqs_1Sl@p1Yhi}_r1hQz9zRYe05mjNI*pzrucxBm;Na*{SC!`Mzm zul*k6b|MGf;#(tAoQwi}?dN7Wz|h>n4ka(LQkqbBp1Q&>-rWilSX2H&C;{v4P{#Hp z^au0)Jdn$Fa*2u=U$7lm%_ADOyc89Xg38rX1~)<$@eO9&li)-IGS}e(*p#%m6KuGt zze;jBD@5tR^Jits_CCh8k9)<1eMNAuq_V$9VC`)aqws$|DB;)rD_PtE4rv`%K7E*+ zkjyLKg4z|jKf7{fD4qn%$d0F=#JD33;$&tI7a7#TLq-`<)s>(}5o_fL?WW*2P6w=V z*5ppWm|t_d{l)OAa2oP~OM#>{nq8lKcxyyjGSK7&I>-wTn@0GDqBnggsbQB8B4Icj#^j|-YJ|u`)UZDS8vi`7x6C7%B2kzxkQOF|heK2Kgjy#B+J29OI0zx7 zK5(Ksx?{GTh#P25mP?};3Shv)vf8m^DcV5@SlVGNBRj%0pis?l)}MGEqjz4<|&>m1Tu z``q?}1P*}n-8Q|p?Qi}bX30=FyyEh54d|i;G{4!;|J2}US<2^JDd=UYd5`8i^g7i7 zQUeyMQCmU8IVQCNY@`L4zjjj@ zb~=sw1{@UnvL!Vj$b|>@3p7fi_I;#94b_kzm%Je zA_=YX>5{S|wH$xMI`bdsp1dbo-IMf{srTU6HZB^3H|k(s4(AarHqhDU3!s3ZI(~me z8yh8|3Lhh0#g*_h`8FOOWugyXp%#?BjE}YFMg2@BArd=VXffDo@Vm5If~zcY&rRD( z#-2DwH0PuO8)Li%*?X!R;3PdWI#q*Km+O$9nv&U7`23aOiny)gf+Qb7t_0hR`RnRf zJ0J?PQSTJ1kgo|2qd7r9@T+7sJhqa!wqiV_WGX;4tfBYidHOlbycY9zK9PWY>BsQy zLlj){7g&5k9w4W{DhxHD+RkFk~qTnaM^@sPrl%hkGz9Rl%)h%n5tvIbhV1 zXM=OW?lOu}NjoXB;)#7FPS%!6K6NdrCrJGO1uAv>!DIjbh5!y+h{Akk+8=fpcs6tx zjt@s~j@nnzCsay*s-K)$oL{{u4fYU~W0%ZQTtr>HQ6ieY?8`F+DXE-@mP?xB2sfex zK9`T<5xg=qf)b%VyjkX|G$35?259kd% zQJhbF@65CCm(RWU9=+K+nYa!%Kl1%;?yc1e8N1{KY2JkFQjaK)whhqJu+Z*eW8|;IMTaAe zaP3A9-*WNnev4u>^#6WM1;B4+m*eg_8PHihI5z|V*O47NIb`X*;*NFRIyFduDAKgK z-m3+-^Z^O%q#GV&FE_RT*ey4@8eIo5tZc!ux#3XiZ0x%{|OxNR-7vq}Kgc2Nblu=_&d3zw;)yrKSFzc`FUs zu3HvmN+CqIC`}?#q&DVr7@wx*0;bscbKG6LD{>@6Ipb{TgSS^yo&#@)Mxl{F}@%P0L$cFN%5{l`-BfA!&Jel}=WW zE0I;2lrkZ9$yqu^@;MG`gargm;xnY?BuPlSJ_Xp`1K!_;#Bs>o%TUWwFS?I=9rRWy+P-7K*G7)lG_loO+6uqwK(YYLk0+h@|4My}^M1 z8*NSbyB}6&|MA3A(dxv|lEpYZT|(W*-1xU5UnMI)CBJ#t{nkOfv~ zVXOsb;3RuqkZ=K&22Bf?7)=#irLHb|bl9>82cixNEm9NE#RA`T-Kyj(A4koCS}?(> z=oF}I3pHbRW`#$uXNRGXTO;d>@6w+lJPCh(ldoa9nHZDCZ=>M88oYvqy5$k10_}L~ z4hraV&0h*Yt{idQ?Nn*#Fi)B4P~~~ifpekJfv=qq+cC~vB!%L18HD-S;nDst_fvu< z|3HW87sZ~nw&zYK_NvYluXxk~;xgK?!{F1M7kW&`DS@h6hD4v^uuf=*(j-o4 z)LE}mYC%i#4F0%N2N#zwi8y>7yW(3Iv2U>Kc>%$e53Kx<$>eQw4qnxTq)YT~d+RRP z^A_mJ zc?}mt7bHhN>l6ee@V>GU5D8iA4==QH82^`JxVsF7i77`N5h*t+N^)s3_o+(s`yo^I0~qZQ43d@&$^4mFSi0jx28F;gfhOern3mKe z&ghHiFJu1cT(b$>7Wz+{>khnkmSC)*N+0b31j(6XRr|7k`Z=;Cu4CWrOxPy4C2+y5 z1(=ZRO6Y7z1z}<-0N@bDTEfk(>T6;~t9^Cv(`7%{p-7rmVRd~cLNw9OLadeckO)*q zgF9%jkgA|&n9SvUt{J^{60`mR9+EEiZnJQTg3c-~&yh75$3P5*r+B^Yy}&F=W)MQE_~NdORD+=8 zu^u*Efy3-nva^c-ZhZtw1LAL?T#;!fAWnif_$f50z0n(qJ%u7+weYsSyj3vnbcsS) zMAu6N{dafqA_=*ddckwc>W+tO#4mc-V|Ptx+rF^kr?}DZS-!|MCv< zbGpaj(SL6qyF=a;mSfVGF57b0fVk1T&{0P*V2`9WcJf2G0|7n(?R?7oPv6EJ?@Wq9!Jydo|RNNYv##Nn;%OLfC z2-D5I+b96sggXx{3Xki$AUYPi(ig9j+{~5bz@> zu;EA5oG?ndC2j%&p`e93RQHpi?Ow*(q16u^0`#}si#mx-SdTCY2;GHAu5F$4OyZ0?89H+X%HX?TN`pf=GCjT#I6-%G? zme+@;hIPaGij~xgnbg>udlnevC=*lbK=7d;yvW|SB={+Zktu)?0CFroDajDkK@yQn zjpBJ75azQ)b-=7zRK4gU(Y`ushu@;75rWImFH@I z+|ED0{QAB=t($gcoax~?s<$F9;M5Bgf3(OECC1BHah)n7O5iklPL8D}Xa`iw9WWNO z-~>n=FkKe1!s^<*KGR-NZ)&-tK;+@&un&U|oFZ=o3%E;zNf60JrsG7waHADkY9&l> zn0Sd*W8i#)cW}=}!Yo=cf*VXo*W&phAMR;asz`4d7)9ct1mUPse zxFpv_n?cd?7(En&4WrkoFkChbFs}XYRCG-V`#I|@OCEbIMUZ@xVaOUh9BogS(ZClQ z)$O;UH>l6YYJ3TsZS24Mgm<}lfEr$FYw9v?^*z*RX6Qq2G-lJLDeF?h@L z29=>?XW)$sHC{_|;e}?KX!V$~r3C@ym){&a;ZV9$$ctw{%~dBbR zI%Z50Ke`YuxQ@2AGPEedN_Rd+;q_)}b|rMcu^rU;1Z}heEh?;}(hqC2d062_>qYat9b(ABNb#fMPl;(R%1B0g(4TE7Wy=Nk?ezx&)P=;qK(;RG=54FX0> z&l_6oxhAYe2VZHfdm2Mz5EE@@l-Ug{m=i@LPw|DtAH7>5Og@dN#t(|%N5fp##plQO z?C!97wLhs_lehaNmrRxuagDQNO))#GUj?{NvX4jEKEPDQY%v#4v!Tx>SDeA*1K{Ud zU|w3T;20v$94XGc?1``Af37|;{_a60{Qb(_Zp_}yeMPHQZzL&=N!LE;nh;pM#oTCG ztWIQ&#zj@r;=m;8^;-l=)?3{VU7t!I*4G?s-xF;zaj6g_3z=g+t|$cD>NS8Xu;RhY ziOX2fcX719jhjUiD(C;?qje$#ib6BX%v#l)$!4)F1L7jJ^vH#M-HH)VvdErpz@Z(Nn^f+6a_m)PS72RSx;=ud?Y6E2dxQD-lPjhIL_PHiIb042&Ds zqzK!bql`gYoseE+{#@>~0PD-Z&aWTwQ2T%1X@Zy$Im~@tL!U^l;&B3pJk2FzTZy#X zOYjgyDh~e9y*D z8d+np^@?}q1SFb1q%P?KKPmT%hEXXAJ=Es=1-#v4?4Hg_QF})-n%L!O{)E2H!TgVO zLC-k@aur2}fo2;~`%2d#?nC0fLls60TcO`i^YKce4nVuB2_MP`{CvBhwI53TJfw<^ ztuj?e9Gn`T=O)|81|Ci(B>_)Z`U;u3@wn@p#(m`vV{j-RbXsQX-psDC;C_K zy;FaSl9h{8qE)jIns4y2p99ouvxU%Owjh}2U9?kF;=n|~TjZ?JIhG)n581ZWBK!LBmkZ54`Uv^kvm7x z)$vAvST-?jRv@VHciF$3w+nU>ELAm}U|0{c&}Jvnfm5rO_Z-uE$93M6!u(BTp2mx% z%?JhHuIg7BoxfRZ|H$eK6WM}}-qMu`sehrw3DcZL0w79=TS5GfqtIF)5PpfvPP&Ag z8^w>-;a*8h>g909ZcB5OpSrNHPF9OnzZjfZEcj*ufj@b&iBKme9@S_rT*b{14SA?S zzJYUldbzCWaI7+S7iE3LY0Y_#0v$9S#Iuyt@alLQq+pjK4ZSti}}s&UMZ zvzXUMb2Ry>|>Hire2mHF7UWKp0nYQrqXKzq!c2t zX_Dw2P@54`YCx|r%8er`cHM$BZa};!0d^G+a(Sh~sO-cj-LJJCQj#Pormd*)dPq_y zymXoI3jA|8usa=5j1C*5jF9v-B=H?V9VG}fN@FWPlvv~NgZ^0n-=iyFV@<-9DP9=T z2Kmp3?v(5;V@hliH9w=Y16UxSF6-eoRvevN!MAUHL$_)8kf!No(RJ&vcx3ND#rZ>E-=?)XTE(ztVN#ffX?xyQXhfTW3$e zbAnYy3?ru0Qn%NdJ|wbEdMtS52G0KvvyF~B$6{rDM>1ykEW9?hX+#toa@x?16~*F4 z;>;}Pfjy(nOqCm38Gq8kPFCHW)pu=2^h6#s{7$wn=PYc&`>s0jJfev^K8fBOyX zee&~ozM~zp7G?VmEFd}KpN}qagT`KCR;G<_l-hV< zs4ULhlmZSh1~^yGc0Mb7R<*Zu<6_rE7v?%RsYR374qojd58rIY!6j7x)s~#F8=1ME z2_Q@i+iJsy+xje;0G?i&Aeu{#2tJo^uu!cykbw)jW~0Qu7eqa_&-(=w3hi1u)g47>>?vk|T{|QzAn?g<&PX5PE%x zd7s#SL6Z*!t>u-0Cg_qa0Csag5|2{;+0j2YZfd&#_}pJX5KvSK!sL|;d2;15I$ zm<;SoT>8CsJ-;jTK{V0E<&TQ?%RIB+P|%@oK@wXk|0j50V4<}_A$KffR|^1Z>9MJh zja6rHjNuPdfUMg)y9Kd0@OB@6aHws(_LM?(HB7+v?2{{Jx#I-^-ar6_N!3XLC9IVL zERJX0+xD3LD^EI-4?#=18+ais{>QA7*yr;N)Qv=(K(MYT3I9g#K$~UfH9NGF(}Yy& zvW~J7@E6!EX}*{o-2*%_exZH)hUF?HDx_*vdmBXnD+JYw1F?z!cc^ZoYi<_<-SIlc z&`AxgQ70f-?-^es^n)lhOxyM$9M%D zJP;E1ggoz}moSEz_ly{gNF(@xef=7>SYoaM(IzFCq5Plc42w^o1KI#}7Hi6vDiqg~ zQ~Px!Kc2$qV03Jpfxu;>t8t1Gs7&UD_fpnqo{@(2-OyJFLjv4a)^M@|I zdka$j_}~T^*)-KZ@S~po2L_f&p|=LAFwAt3oUrsi7=j4g+v&VupEP+Iw)jgSQ@*!U z7l>?yhlr*1eG2>U@G7Ss$PnZ=pg5!I45; zMEC8*K1dMwn}d(tyA3i0vAD9^lwY@glS2DH^2lKN68lxK0TN9zdptL9ncl9%6A<@W zw`*nHM}o*x7&GqWGDXy-C%F~^NBxAWF9_ZUJKh`mpB&6?>k*RO+a&tXd^o(ZJ01wd z#YW!AkVd*Gkj1egu2GqBdYkT;Hs2KV#Rgj9_2ytW&cd@Ac3MHG@5X_qAZ;%-eMlA- z-#8xq!f;F2c__l*;V=QB+Y}UT4BfYTF))1zVv>Uz>6u&(G22CSB3hbe%iY{p9% zg$%|&mV)0vU(T3s_eP}OY>c?2#th){|K#wiu`0iOkKr|%@&X3ha1MFUS9LQ<2m+rU z0>d|h(6?}%2FF%c@`#D0N&mno`RG3k9&bKC;ZWo1T@P6-3>QISwVC36PVYjqZ$&an z;3$3N0+p+a;51t5N<|K~K_y9?zUoUIbNV*!l06%`g)m4La$xAnAh9jC9o%sbId#k* zr=5)kj!K%_@VR&6^L!w%6{nB45qG&|$Ek;NHN9Z7t^g<1H2(iHiV7JbM-_AwiP95; zP4@mTTSn<;1BY*J>ve^zv;zfRg9y2$+O1`=e~XDM&`LP^kYAL1EZes|jOs{g+(>sQ zX!V0w%=&R$6Z8PsuUog@q9L*v_07^bBAp@yv6v#dnLJUSKJPSchW;oNl~v*XY=g;@ z;HJ24O{Dnm4*my_0gxWD_m0n2lC^q}6P}1^xW?^&{J^f9Tn+oNg|t}4+d`*tRc1-@ z&OC*Yn`DsJ2TJ1jiJB0{V>(e6Gv?F(I*94vuRvd&?iLwOS4+J@|`d**Yt`?CLqji0VCnZz38lqiUGqkJ6=<@cfjglWGRl@ccBN7sQ< zn;I#Z1=atE!Gi8TfMCxciW?)oo7UNyO za=QFNF)qE@@Q;@h7Hxb9qS?)0Gs*G=lKtqlIWO*Ca_ak#*(jLWzDz*GLk}s-G%VHHd2Hl#qxi&LrLb0ar0a0g$QjY z)}1UHo*QlG4gCc|chfsf=LfSIAe~e8P{2Hv8!KjWkp$e9xq!pZV%I^hWzhgN=cuXR zNi{rtw#oT-QSyPR)EHeCO3$h<%*bF3v>WQu(A)vuFpxGd?NQVyRrw3}?h$)mtPzG{ zcksZ~4egXXmrehFwO#i&98BAel5BLVM9Hq6Wz{9xDyu}ddP_vFi53LW+hTRr>LjAG z5g|lY@6lTxLIhb|MD$ofcs=iT&ifyH^UKVc`DMB@bT7dY|BIw^fOTAIS>UXgx^v)?|% z=vT&o$F?;cqY;|cb#ygTlh|~XJU)UT8yh{!+4Pt;N;$fg0yBD+N()ESyXOb92lM+z zej7)V@mdQ=`s@vMcddNQ|A8o%PeI>O5xDdhX&XQK&6`A5{T^T2#8cp~O^DyC6!TsbRLiI3JXC~!$y&A&(^V2xMdTUizABlQUe{1CPKvm<%u z@NrMbIOCyRq0Ds_ABN@W%_nPfr%x{?20Bvq+AdhLLI8`3)^+ld{3X)9D^F19mEc~OKyj;vw&492sUJ`k#UXY5!cyfr)%C4C2NePyl}Zs9gjmNUP`&Bx|ij@f40!c#Rm z&W9aOSFjODwxC7y(zqzsvz~PoM*k8_85f_qiZp!PX+&Fp5+d#+i%5Hkp8NwQ(!KZbu~Hjm%)npb8Z}XKYJV23W0?O0*!f*?Ba3$&6sv zL&T@`Mm_+dEhy9533^*C*CgBgJKK^UhdOvhcJDUdtxi8ApXMk1<*S`j;N{BZRpfh5 z-hv6^l;{LLc3f6^ECa*+dutiSI<;kM^q$}NaL8?rb!MA|Nl2dljgi?&=WRUOfOo?S z*4eXxx&^ru@svVp@Unj7uh)9*m8z{Lxj;;2vw5SRPfeCch60YVk;Y}7t~7N zS&#DIc=>owJ^W~(q#29^*)uPP_66y3iCf_;_eIgk;A>e$$9W|kemGC%wu%dN1+=x1 zq!oN%h}W7A4YeGElqP$yRWmnwU~!Go(9e^?fTmI-8}W211z{<&g$i)D=lZqf(n==8 zieKkfvx5`m8Rx^o*&E%kar7}wtJ#IZU%i~8bu+boTBiv7RUC-9|LM8B)js|z)$Ez( zEOQZRh_{B-jo5`BJHO})GT=(Cd&Xy#jyaGKQ_`6lBpzHWE5Za&egT^^`Iagg?s;04 zfo1lCkm5oQ_>jmPU#+rl>}R@k?j8aJM~aDi=UO)^G{k<$F>(0adR2URT^} zhP`^IhV6XBqCJ>PIyPShReS$6d~w;(dg;3(0t5J{?4!JFGB4jRj6s*zy5?9#jm!LH zSu^hx3g!#0KB^nS-GN4#s^qCsvBYyWB%XdrqFaq(2~V~KeMNPI${f=&+UV15rb(*s z(JXyoaKaksHx;fyJg?CawQIa)7cyCRuVznibLhK6Ak?Q%i=vDchrZwd!K3!}f*EXsHbSmLD9KTUnsG0bb|jbMTI1uY z9Q);R7-Bs>5B+-~(48z@eR$IHu6q0$_Iv9=UK8X73hh-9z@_?2%QpWp=DD2|$Acs~ zhrj_8D;SRaP4%+m^9>CMnWB3aA9uJ!Hm_w1J#Qm-&XfI~T-ze~V(7ZN+(U>%k)Z>oKetN>ZtO2v; zK??XP=2_=4V;drrnl^0q<(_G26R1U9PopM5hmS_6z~jIET3ERrF28b+*h`4L7)A`2 zOI&Asc!lJkk`M7Yd;c5n{tpd4yubY6e^lc-%?S&*W$BFyxo=`VrU8&)39FYjV9;AlAK240*z;pAjue~Ez;e4l^PN8}!Svq$m_rIRSMDz4vd5p@`pSpJitsn5>h-9hG>mS_ z%c1B7&?dexji-Yl12wjdpd6bzOW>z}oj!Ii)+BlMhsTBEHfi))5WeK=IaeHCb~$_D zZDiw9i}v3l&=kA{jfzg0kk`bb{CirlsPOwP>$_T7ipiv*;RG8XjIt}hWL0gfNvr- zPkwbN?FLhRuk7{pSi2AB(k#~cqMTmdQkAy@vx~Fx)gH>q1gU;?Dv7SD=Ki>lL&B5X zbujoe(Az5K(yu<4pt^u}OX5ix5o;sQp;psllJZ@7n;}%CGk{BQ*iEpmv%RvI3kg?^ zIfNB50y3!=B?aWBijACAWu$nrlrcKFX^=}ylqrW1Ldr0Si#=%z%yRvYX#v(~Kus=g z2xBU$#zEngc248O!?YjClTydu;yxc+` z-19)}FL?xU7%OYT8uzQ&?d;S_R2P##lI8{vmqk|cl-(SJWF>n5tIYzO3hEkUtb8Ze zSn*1|O`dqsa$wNMn!Iki?>Cm(g5{T*HY7YA;z1)JECy=KAm_S&2%W3L-N^($!-mv6 zXvtsjR=$kijq&=Ibv9=t!|yKWm-bbB&84C0Q@1hk<5LujNr{H1XM=JV4chF2384%> znXqJex_eZn{LP87cr*U+*jr=Lyz?`yg0`ox^nDK8C>eAFDxzb8V9OhyJeeGj>4Q$XkkM8D0$!GQhX$A-^! zri~AS&8pqGZaQJL^#gb^-hfTlru`61PYvZV!I>Vqzg>?vhEK3VNsv4I}5r+Nkd;0=%JLjRU?apV&?WA z#9joAKv-B&NqC~P)kutm;2Vr-&AYE5Knb#Mll9BIgVx7F${eE=77C})P};LGi#-ax6=bYM!DnBGb-?=ai}Z2>h=&QY z2R-$(`-2^u2U}4&Fk{h3mR16_hZAzf#>>f1U9e+2W)lg9=;q29$6Ba8Sv7Va7M1sh zP(mnn2kcx4tsDw+q#O<-P3lj+(de2J5~*h2geUuxq44+!`lQxCbP2s6cuUD90k>RH zT~^E>hQnE45|zS9cZU{nSAD^MpGx6I;D-$Dykb-wOE?n_!X@Jvp}0pwO`s#u7!vnd zB7cl?hS3xS-|sUCJru$P-PIS(Ph#A-5&T3E=-{gEbm`dr52 zBfX}M{$8_kwnvE)qy0II2_EXPQKgUpxwTg%{$=DmOVR$+>*~ zf{LXEC@KW!!Ub~u+XoPj6-(349^Q#bd#9gnwgJXFnb)#h7+#w8_w(KSosZ ze>5vpQM1>G7lRrwsaZgK0SN3(Gn`c_EEm?(LH*%FU>pGIHziNa6SAx~_!dvI(c?KO zkAI=$RZES_uQFaqSJvU`u{%1PyKCn4(`jXscCV*FGhmhNj{+=|df*d!|IeTg(~iWU z3qZn@Y|OR9MJ&87UGgkQvZtp$ePQzED8ko;H z5oz(Nm3vI~b)5cWQobn^C{0bDqCVvg7Ts2sDlLbn#2a74Y*J-J+H+H-@O2^fGj!(k z0ntb9&m%P6Iy`4G8faHFyIIPlyb4XnVynGsnJ)Me{H( zj>eAJE##EML)cYo#>v!aEdf0h&{WaW+=Y9R%WaH9ykpXbc)DMTkq-^R6#VHLy;Fbspj zs%&!79}kJx`@|}$5~aWL0UWU8TwYnh6SwIg1lgP*IQFhBVx#cdp>l0sGgg_t9HhoT0R%$Dv~09k;bn z{Kr0*go)Ef9XY0hc`z1F)Kq&SPm;)Ska%*G-r(`GGA(HSn_@$QkI(sRN6E^_eY1hY zJnu~7#f5%?k@|vdkI|5K5NHDYHCE=6z9aD|Pu?oPuw+lM=%oaaF1=>UYE1gIL>Xgq z74IQ6lFR3wVgTRv#C(3p8ii?4>apWlsDD}r2+BK zb+#Aeb!bA4KG$o5^SOy-<}@w=P-Ms-_0xXrG5!HshTDMoMK((TcGQL&c*&34+W#rg zi-hTlJTw;&8)jP$@`D>I)fny<8F3^Q{3Ge2uvqruXZaI{yT_Nmx$T8pNQ0Yfr3{{a zy?LxiT(O99CDRuOb1^M)I7w$11gRqVd@@YwfVFWCXrtsegF1%B83EH@+HSV06%BaX zZ3)EbtZs8aUT0XF6A#`CBSo#MnxDmOzJrl?n|1+MF6Xq5_~pHJYc|TQ9@71Oc}LFg zQr_K3KxeQTard(6V=1GMK=4BuZ=l@$N5?>M*i-L+7?rTR{Pc9fRcP&)?yH%M`7_$} zsyDb}kU7$sXP4?w#J|&476}~D-5;*3%2uL%=0pb$0Y2o-zJQB$SnUW(@@n6ytOY8h0=^UQEW+ysoXbACr@54=_^8tfW*0V7gUvslIe? zS!&OQ*wcE%Om&hhG?%g|*x{|8MJc8UN1 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/5/test/tools.js b/node/wikibooks-nodejs-microservice/5/test/tools.js new file mode 100644 index 0000000000..cdc9096b3c --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/tools.js @@ -0,0 +1,5 @@ +const fs = require('fs'); +const path = require('path'); + +exports.service = require('../imagini.js'); +exports.sample = fs.readFileSync(path.join(__dirname, 'sample.png')); \ No newline at end of file From 633cb85b15f9d7a9e05aed463c98460321de3a97 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:37:24 +0900 Subject: [PATCH 23/33] =?UTF-8?q?5=20-=203=20-=201=20chai=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5/imagini.js | 10 +++---- .../5/test/integration/image-upload.js | 29 ++++++++++++++++++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/node/wikibooks-nodejs-microservice/5/imagini.js b/node/wikibooks-nodejs-microservice/5/imagini.js index fb0a5efe1a..1bc71172e8 100644 --- a/node/wikibooks-nodejs-microservice/5/imagini.js +++ b/node/wikibooks-nodejs-microservice/5/imagini.js @@ -10,8 +10,6 @@ const app = express(); db.connect((err) => { if (err) throw err; - console.log('db: ready'); - db.query(` CREATE TABLE IF NOT EXISTS images ( @@ -127,7 +125,7 @@ db.connect((err) => { }); }) - app.listen(3000, () => { - console.log('app: ready'); - }); -}) \ No newline at end of file + app.listen(3000); +}) + +module.exports = app; \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js index 9ba6d7c072..7a212c5af6 100644 --- a/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js @@ -1,3 +1,30 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + describe('Uploading image', () => { - it('should accept only images'); + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_upload.png') + .end(() => { + return done(); + }); + }); + + it('should accept a PNG images', function (done) { + chai + .request(tools.service) + .post('/uploads/test_image_upload.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + return done(); + }); + }); }); \ No newline at end of file From a4ef75520152b658d4334dc583fd8f74677f412f Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:47:46 +0900 Subject: [PATCH 24/33] =?UTF-8?q?5=20-=203=20-=202=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=BB=A4=EB=B2=84=EB=A6=AC=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5/.gitignore | 2 + .../5/description.md | 5 +++ .../5/test/integration/image-parameter.js | 38 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/5/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/5/description.md create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-parameter.js diff --git a/node/wikibooks-nodejs-microservice/5/.gitignore b/node/wikibooks-nodejs-microservice/5/.gitignore new file mode 100644 index 0000000000..2b7cecf776 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/.gitignore @@ -0,0 +1,2 @@ +.nyc_output +coverage \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/description.md b/node/wikibooks-nodejs-microservice/5/description.md new file mode 100644 index 0000000000..ad766b28fe --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/description.md @@ -0,0 +1,5 @@ +## 5 - 3 - 2 코드 커버리지 추가 + +- `npx nyc npm test` + +- `npx nyc report --reporter=html` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-parameter.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-parameter.js new file mode 100644 index 0000000000..55754bdd1f --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-parameter.js @@ -0,0 +1,38 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('The image parameter', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_upload.png') + .end(() => { + return done(); + }); + }); + + it('should reply 403 fro non image extension', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_paramter.txt') + .end((err, res) => { + chai.expect(res).to.have.status(403); + + return done(); + }); + }); + + it('should reply 404 for non image existence', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_parameter.png') + .end((err, res) => { + chai.expect(res).to.have.status(404); + + return done(); + }); + }); +}); \ No newline at end of file From e6500ce015d913bbe8d0378d0d79fbbb07c3c0b8 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 22:50:56 +0900 Subject: [PATCH 25/33] =?UTF-8?q?5=20-=203=20-=203=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=BB=A4=EB=B2=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5/imagini.js | 10 +- .../5/test/integration/image-check.js | 48 ++++++++ .../5/test/integration/image-download.js | 109 ++++++++++++++++++ .../5/test/integration/image-stats.js | 22 ++++ .../5/test/integration/image-upload.js | 26 +++++ 5 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-check.js create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-download.js create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js diff --git a/node/wikibooks-nodejs-microservice/5/imagini.js b/node/wikibooks-nodejs-microservice/5/imagini.js index 1bc71172e8..d883a827ca 100644 --- a/node/wikibooks-nodejs-microservice/5/imagini.js +++ b/node/wikibooks-nodejs-microservice/5/imagini.js @@ -70,6 +70,14 @@ db.connect((err) => { }); app.get("/uploads/:image", (req, res) => { + if (Object.keys(req.query).length === 0) { + db.query("UPDATE images SET date_used = UTC_TIMESTAMP WHERE id = ?", [req.image.id]); + + res.setHeader("Content-Type", "image/" + path.extname(req.image.name).substr(1)); + + return res.end(req.image.data); + } + let image = sharp(req.image.data); let width = +req.query.width; @@ -112,7 +120,7 @@ db.connect((err) => { SELECT COUNT(*) total, SUM(size) size, - MAX(date_created) last_created + MAX(date_used) last_used FROM images `, (err, rows) => { if (err) { diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-check.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-check.js new file mode 100644 index 0000000000..bd77bc72da --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-check.js @@ -0,0 +1,48 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Checking image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_check.png') + .end(() => { + return done(); + }); + }); + + it("should return 404 if it doesn't exist", (done) => { + chai + .request(tools.service) + .head('/uploads/test_image_check.png') + .end((err, res) => { + chai.expect(res).to.have.status(404); + + return done(); + }); + }); + + it('should return 200 if it exists', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_check.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + chai + .request(tools.service) + .head('/uploads/test_image_check.png') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + return done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-download.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-download.js new file mode 100644 index 0000000000..fddeba2d78 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-download.js @@ -0,0 +1,109 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); +const sharp = require('sharp'); + +chai.use(http); + +describe('Downloading image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_download.png') + .end(() => { + chai + .request(tools.service) + .post('/uploads/test_image_download.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + return done(); + }); + }); + }); + + it('should return the original image size if no parameters given', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_download.png') + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.length(tools.sample.length); + + return done(); + }); + }); + + it('should be able to resize the image as we request', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_download.png?width=200&height=100') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + + let image = sharp(res.body); + + image + .metadata() + .then((metadata) => { + chai.expect(metadata).to.have.property('width', 200); + chai.expect(metadata).to.have.property('height', 100); + + return done(); + }); + }); + }); + + it("should be able to resize the image width as we request", (done) => { + chai + .request(tools.service) + .get("/uploads/test_image_download.png?width=200") + .end((err, res) => { + chai.expect(res).to.have.status(200); + + let image = sharp(res.body); + + image + .metadata() + .then((metadata) => { + chai.expect(metadata).to.have.property("width", 200); + + return done(); + }); + }); + }); + + it("should be able to resize the image height as we request", (done) => { + chai + .request(tools.service) + .get("/uploads/test_image_download.png?height=100") + .end((err, res) => { + chai.expect(res).to.have.status(200); + + let image = sharp(res.body); + + image + .metadata() + .then((metadata) => { + chai.expect(metadata).to.have.property("height", 100); + + return done(); + }); + }); + }); + + it('should be able add image effects as we request', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_download.png?flip=y&flop=y&greyscale=y&blur=10&sharpen=10') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js new file mode 100644 index 0000000000..d8c90c6ead --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js @@ -0,0 +1,22 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Statistics', () => { + it('should return an object with total, size, last_used and uptime', (done) => { + chai + .request(tools.service) + .get('/stats') + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.property('total'); + chai.expect(res.body).to.have.property('size'); + chai.expect(res.body).to.have.property('last_used'); + chai.expect(res.body).to.have.property('uptime'); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js index 7a212c5af6..5eb1f0dc05 100644 --- a/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-upload.js @@ -27,4 +27,30 @@ describe('Uploading image', () => { return done(); }); }); + + it('should deny duplicated images', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_upload.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + chai + .request(tools.service) + .post('/uploads/test_image_upload.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('error'); + chai.expect(res.body).to.have.property('code', 'ER_DUP_ENTRY'); + + return done(); + }); + + }); + }); }); \ No newline at end of file From f0a521b4ce5290f7a39af08a06ce4903cb034528 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 23:27:55 +0900 Subject: [PATCH 26/33] =?UTF-8?q?5=20-=204=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=20=EB=AA=A8=EC=9D=98=20=EA=B0=9D=EC=B2=B4=20=EB=A7=8C=EB=93=A4?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5/imagini.js | 2 + .../5/package.json | 5 +- .../5/test/integration/image-delete-old.js | 24 +++++++ .../5/test/integration/image-delete.js | 70 +++++++++++++++++++ .../5/test/integration/image-stats.js | 29 ++++++++ 5 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-delete-old.js create mode 100644 node/wikibooks-nodejs-microservice/5/test/integration/image-delete.js diff --git a/node/wikibooks-nodejs-microservice/5/imagini.js b/node/wikibooks-nodejs-microservice/5/imagini.js index d883a827ca..05bcd60aee 100644 --- a/node/wikibooks-nodejs-microservice/5/imagini.js +++ b/node/wikibooks-nodejs-microservice/5/imagini.js @@ -7,6 +7,8 @@ const bodyparser = require('body-parser'); const path = require('path'); const app = express(); +app.db = db; + db.connect((err) => { if (err) throw err; diff --git a/node/wikibooks-nodejs-microservice/5/package.json b/node/wikibooks-nodejs-microservice/5/package.json index b0791dcdae..bfc367cc9e 100644 --- a/node/wikibooks-nodejs-microservice/5/package.json +++ b/node/wikibooks-nodejs-microservice/5/package.json @@ -8,9 +8,10 @@ "devDependencies": { "chai": "^4.2.0", "chai-http": "^4.3.0", - "mocha": "^6.2.0" + "mocha": "^6.2.0", + "sinon": "^7.4.2" }, "scripts": { "test": "node test/run" } -} \ No newline at end of file +} diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-delete-old.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-delete-old.js new file mode 100644 index 0000000000..1c7b55bfdf --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-delete-old.js @@ -0,0 +1,24 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Deleting older image', () => { + let clock = sinon.useFakeTimers({ shouldAdvanceTime: true }); + + it('should run every hour', (done) => { + chai + .request(tools.service) + .get('/stats') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + clock.tick(3600 * 1000); + clock.restore(); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-delete.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-delete.js new file mode 100644 index 0000000000..659ee556de --- /dev/null +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-delete.js @@ -0,0 +1,70 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Deleting image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_delete.png') + .end(() => { + return done(); + }); + }); + + it('should return 200 if it exists', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_delete.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + chai + .request(tools.service) + .delete('/uploads/test_image_delete.png') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + return done(); + }); + }); + }); + + it('should return 500 if it exists', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_delete.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + let query = sinon.stub(tools.service.db, 'query'); + + query + .withArgs('DELETE FROM images WHERE id = ?') + .callsArgWithAsync(2, new Error('Fake')); + + query + .callThrough(); + + chai + .request(tools.service) + .delete('/uploads/test_image_delete.png') + .end((err, res) => { + chai.expect(res).to.have.status(500); + + query.restore(); + + return done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js b/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js index d8c90c6ead..80e0c106a1 100644 --- a/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js +++ b/node/wikibooks-nodejs-microservice/5/test/integration/image-stats.js @@ -1,4 +1,5 @@ const chai = require('chai'); +const sinon = require('sinon'); const http = require('chai-http'); const tools = require('../tools'); @@ -19,4 +20,32 @@ describe('Statistics', () => { return done(); }); }); + + it('should return 500 if a database error happens', (done) => { + let query = sinon.stub(tools.service.db, 'query'); + + query + .withArgs(` + SELECT + COUNT(*) total, + SUM(size) size, + MAX(date_used) last_used + FROM images + `) + .callsArgWithAsync(1, new Error('Fake')); + + query + .callThrough(); + + chai + .request(tools.service) + .get('/stats') + .end((err, res) => { + chai.expect(res).to.have.status(500); + + query.restore(); + + return done(); + }); + }); }); \ No newline at end of file From 5944b1ff7a7d6f6b68df2a194ed98bfa6f0b073d Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 23:44:10 +0900 Subject: [PATCH 27/33] =?UTF-8?q?6=20=EB=A7=88=EC=9D=B4=ED=81=AC=EB=A1=9C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=B0=B0=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6/imagini/.gitignore | 2 + .../6/imagini/description.md | 5 + .../6/imagini/imagini.js | 141 ++++++++++++++++++ .../6/imagini/package.json | 17 +++ .../6/imagini/settings.json | 3 + .../6/imagini/test/integration/image-check.js | 48 ++++++ .../test/integration/image-delete-old.js | 24 +++ .../imagini/test/integration/image-delete.js | 70 +++++++++ .../test/integration/image-download.js | 109 ++++++++++++++ .../test/integration/image-parameter.js | 38 +++++ .../6/imagini/test/integration/image-stats.js | 51 +++++++ .../imagini/test/integration/image-upload.js | 56 +++++++ .../6/imagini/test/run.js | 17 +++ .../6/imagini/test/sample.png | Bin 0 -> 55543 bytes .../6/imagini/test/tools.js | 5 + 15 files changed, 586 insertions(+) create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/.gitignore create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/description.md create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/imagini.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/package.json create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/settings.json create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-check.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete-old.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-download.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-parameter.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-stats.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-upload.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/run.js create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/sample.png create mode 100644 node/wikibooks-nodejs-microservice/6/imagini/test/tools.js diff --git a/node/wikibooks-nodejs-microservice/6/imagini/.gitignore b/node/wikibooks-nodejs-microservice/6/imagini/.gitignore new file mode 100644 index 0000000000..2b7cecf776 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/.gitignore @@ -0,0 +1,2 @@ +.nyc_output +coverage \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/description.md b/node/wikibooks-nodejs-microservice/6/imagini/description.md new file mode 100644 index 0000000000..ad766b28fe --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/description.md @@ -0,0 +1,5 @@ +## 5 - 3 - 2 코드 커버리지 추가 + +- `npx nyc npm test` + +- `npx nyc report --reporter=html` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/imagini.js b/node/wikibooks-nodejs-microservice/6/imagini/imagini.js new file mode 100644 index 0000000000..05bcd60aee --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/imagini.js @@ -0,0 +1,141 @@ +const settings = require('./settings'); +const mysql = require('mysql'); +const db = mysql.createConnection(settings.db); +const express = require('express'); +const sharp = require('sharp'); +const bodyparser = require('body-parser'); +const path = require('path'); +const app = express(); + +app.db = db; + +db.connect((err) => { + if (err) throw err; + + db.query(` + CREATE TABLE IF NOT EXISTS images + ( + id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_used TIMESTAMP NULL DEFAULT NULL, + name VARCHAR(300) NOT NULL, + size INT(11) UNSIGNED NOT NULL, + data LONGBLOB NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY name (name) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 + `); + + setInterval(() => { + db.query(` + DELETE FROM images + WHERE (date_created < UTC_TIMESTAMP - INTERVAL 1 WEEK AND date_used IS NULL) + OR (date_used < UTC_TIMESTAMP - INTERVAL 1 MONTH) + `); + }, 3600 * 1000); + + app.param('image', (req, res, next, image) => { + if (!image.match(/\.(png|jpg)$/i)) { + return res.status(403).end(); + } + + db.query("SELECT * FROM images WHERE name = ?", [image], (err, images) => { + if (err || !images.length) { + return res.status(404).end(); + } + + req.image = images[0]; + + return next(); + }); + }); + + app.post('/uploads/:name', bodyparser.raw({ + limit: '10mb', + type: 'image/*' + }), (req, res) => { + db.query("INSERT INTO images SET ?", { + name: req.params.name, + size: req.body.length, + data: req.body + }, (err) => { + if (err) { + return res.send({ status: 'error', code: err.code }); + } + + res.send({ status: 'ok', size: req.body.length }); + }); + }); + + app.head('/uploads/:image', (req, res) => { + return res.status(200).end(); + }); + + app.get("/uploads/:image", (req, res) => { + if (Object.keys(req.query).length === 0) { + db.query("UPDATE images SET date_used = UTC_TIMESTAMP WHERE id = ?", [req.image.id]); + + res.setHeader("Content-Type", "image/" + path.extname(req.image.name).substr(1)); + + return res.end(req.image.data); + } + + let image = sharp(req.image.data); + + let width = +req.query.width; + let height = +req.query.height; + let blur = +req.query.blur; + let sharpen = +req.query.sharpen; + let greyscale = ['y', 'yes', '1', 'on'].includes(req.query.greyscale); + let flip = ['y', 'yes', '1', 'on'].includes(req.query.flip); + let flop = ['y', 'yes', '1', 'on'].includes(req.query.flop); + + if (width > 0 && height > 0) { + image.ignoreAspectRatio(); + } + + if (width > 0 || height > 0) { + image.resize(width || null, height || null); + } + + if (flip) image.flip(); + if (flop) image.flop(); + if (blur > 0) image.blur(blur); + if (sharpen > 0) image.sharpen(sharpen); + if (greyscale) image.greyscale(); + + db.query("UPDATE images SET date_used = UTC_TIMESTAMP WHERE id = ?", [req.image.id]); + + res.setHeader('Content-Type', 'image/' + path.extname(req.image.name).substr(1)); + + image.pipe(res); + }); + + app.delete('/uploads/:image', (req, res) => { + db.query('DELETE FROM images WHERE id = ?', [req.image.id], (err) => { + return res.status(err ? 500 : 200).end(); + }); + }); + + app.get('/stats', (req, res) => { + db.query(` + SELECT + COUNT(*) total, + SUM(size) size, + MAX(date_used) last_used + FROM images + `, (err, rows) => { + if (err) { + return res.status(500).end(); + } + + rows[0].uptime = process.uptime(); + + return res.send(rows[0]); + }); + }) + + app.listen(3000); +}) + +module.exports = app; \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/package.json b/node/wikibooks-nodejs-microservice/6/imagini/package.json new file mode 100644 index 0000000000..bfc367cc9e --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/package.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "mysql": "^2.17.1", + "sharp": "^0.19.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "chai-http": "^4.3.0", + "mocha": "^6.2.0", + "sinon": "^7.4.2" + }, + "scripts": { + "test": "node test/run" + } +} diff --git a/node/wikibooks-nodejs-microservice/6/imagini/settings.json b/node/wikibooks-nodejs-microservice/6/imagini/settings.json new file mode 100644 index 0000000000..88afb918a1 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/settings.json @@ -0,0 +1,3 @@ +{ + "db": "mysql://root@localhost/imagini" +} \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-check.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-check.js new file mode 100644 index 0000000000..bd77bc72da --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-check.js @@ -0,0 +1,48 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Checking image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_check.png') + .end(() => { + return done(); + }); + }); + + it("should return 404 if it doesn't exist", (done) => { + chai + .request(tools.service) + .head('/uploads/test_image_check.png') + .end((err, res) => { + chai.expect(res).to.have.status(404); + + return done(); + }); + }); + + it('should return 200 if it exists', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_check.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + chai + .request(tools.service) + .head('/uploads/test_image_check.png') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + return done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete-old.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete-old.js new file mode 100644 index 0000000000..1c7b55bfdf --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete-old.js @@ -0,0 +1,24 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Deleting older image', () => { + let clock = sinon.useFakeTimers({ shouldAdvanceTime: true }); + + it('should run every hour', (done) => { + chai + .request(tools.service) + .get('/stats') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + clock.tick(3600 * 1000); + clock.restore(); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete.js new file mode 100644 index 0000000000..659ee556de --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-delete.js @@ -0,0 +1,70 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Deleting image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_delete.png') + .end(() => { + return done(); + }); + }); + + it('should return 200 if it exists', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_delete.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + chai + .request(tools.service) + .delete('/uploads/test_image_delete.png') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + return done(); + }); + }); + }); + + it('should return 500 if it exists', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_delete.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + let query = sinon.stub(tools.service.db, 'query'); + + query + .withArgs('DELETE FROM images WHERE id = ?') + .callsArgWithAsync(2, new Error('Fake')); + + query + .callThrough(); + + chai + .request(tools.service) + .delete('/uploads/test_image_delete.png') + .end((err, res) => { + chai.expect(res).to.have.status(500); + + query.restore(); + + return done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-download.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-download.js new file mode 100644 index 0000000000..fddeba2d78 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-download.js @@ -0,0 +1,109 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); +const sharp = require('sharp'); + +chai.use(http); + +describe('Downloading image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_download.png') + .end(() => { + chai + .request(tools.service) + .post('/uploads/test_image_download.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + return done(); + }); + }); + }); + + it('should return the original image size if no parameters given', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_download.png') + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.length(tools.sample.length); + + return done(); + }); + }); + + it('should be able to resize the image as we request', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_download.png?width=200&height=100') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + + let image = sharp(res.body); + + image + .metadata() + .then((metadata) => { + chai.expect(metadata).to.have.property('width', 200); + chai.expect(metadata).to.have.property('height', 100); + + return done(); + }); + }); + }); + + it("should be able to resize the image width as we request", (done) => { + chai + .request(tools.service) + .get("/uploads/test_image_download.png?width=200") + .end((err, res) => { + chai.expect(res).to.have.status(200); + + let image = sharp(res.body); + + image + .metadata() + .then((metadata) => { + chai.expect(metadata).to.have.property("width", 200); + + return done(); + }); + }); + }); + + it("should be able to resize the image height as we request", (done) => { + chai + .request(tools.service) + .get("/uploads/test_image_download.png?height=100") + .end((err, res) => { + chai.expect(res).to.have.status(200); + + let image = sharp(res.body); + + image + .metadata() + .then((metadata) => { + chai.expect(metadata).to.have.property("height", 100); + + return done(); + }); + }); + }); + + it('should be able add image effects as we request', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_download.png?flip=y&flop=y&greyscale=y&blur=10&sharpen=10') + .end((err, res) => { + chai.expect(res).to.have.status(200); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-parameter.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-parameter.js new file mode 100644 index 0000000000..55754bdd1f --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-parameter.js @@ -0,0 +1,38 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('The image parameter', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_upload.png') + .end(() => { + return done(); + }); + }); + + it('should reply 403 fro non image extension', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_paramter.txt') + .end((err, res) => { + chai.expect(res).to.have.status(403); + + return done(); + }); + }); + + it('should reply 404 for non image existence', (done) => { + chai + .request(tools.service) + .get('/uploads/test_image_parameter.png') + .end((err, res) => { + chai.expect(res).to.have.status(404); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-stats.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-stats.js new file mode 100644 index 0000000000..80e0c106a1 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-stats.js @@ -0,0 +1,51 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Statistics', () => { + it('should return an object with total, size, last_used and uptime', (done) => { + chai + .request(tools.service) + .get('/stats') + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.property('total'); + chai.expect(res.body).to.have.property('size'); + chai.expect(res.body).to.have.property('last_used'); + chai.expect(res.body).to.have.property('uptime'); + + return done(); + }); + }); + + it('should return 500 if a database error happens', (done) => { + let query = sinon.stub(tools.service.db, 'query'); + + query + .withArgs(` + SELECT + COUNT(*) total, + SUM(size) size, + MAX(date_used) last_used + FROM images + `) + .callsArgWithAsync(1, new Error('Fake')); + + query + .callThrough(); + + chai + .request(tools.service) + .get('/stats') + .end((err, res) => { + chai.expect(res).to.have.status(500); + + query.restore(); + + return done(); + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-upload.js b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-upload.js new file mode 100644 index 0000000000..5eb1f0dc05 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/integration/image-upload.js @@ -0,0 +1,56 @@ +const chai = require('chai'); +const http = require('chai-http'); +const tools = require('../tools'); + +chai.use(http); + +describe('Uploading image', () => { + beforeEach((done) => { + chai + .request(tools.service) + .delete('/uploads/test_image_upload.png') + .end(() => { + return done(); + }); + }); + + it('should accept a PNG images', function (done) { + chai + .request(tools.service) + .post('/uploads/test_image_upload.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + return done(); + }); + }); + + it('should deny duplicated images', (done) => { + chai + .request(tools.service) + .post('/uploads/test_image_upload.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('ok'); + + chai + .request(tools.service) + .post('/uploads/test_image_upload.png') + .set('Content-Type', 'image/png') + .send(tools.sample) + .end((err, res) => { + chai.expect(res).to.have.status(200); + chai.expect(res.body).to.have.status('error'); + chai.expect(res.body).to.have.property('code', 'ER_DUP_ENTRY'); + + return done(); + }); + + }); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/run.js b/node/wikibooks-nodejs-microservice/6/imagini/test/run.js new file mode 100644 index 0000000000..5a97128391 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/run.js @@ -0,0 +1,17 @@ +const fs = require('fs'); +const path = require('path'); +const mocha = require('mocha'); +const suite = new mocha(); + +fs.readdir(path.join(__dirname, 'integration'), (err, files) => { + if (err) throw err; + + files.filter((filename) => (filename.match(/\.js$/))) + .map((filename) => { + suite.addFile(path.join(__dirname, 'integration', filename)); + }); + + suite.run((failures) => { + process.exit(failures); + }); +}); \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/sample.png b/node/wikibooks-nodejs-microservice/6/imagini/test/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4089b31566891d5eeb3bef62ae5ffc8a44c8b1 GIT binary patch literal 55543 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%0A5)fd(=TvLJ`2SJ$5B_;}!P+p~*lujA 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 literal 0 HcmV?d00001 diff --git a/node/wikibooks-nodejs-microservice/6/imagini/test/tools.js b/node/wikibooks-nodejs-microservice/6/imagini/test/tools.js new file mode 100644 index 0000000000..cdc9096b3c --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/imagini/test/tools.js @@ -0,0 +1,5 @@ +const fs = require('fs'); +const path = require('path'); + +exports.service = require('../imagini.js'); +exports.sample = fs.readFileSync(path.join(__dirname, 'sample.png')); \ No newline at end of file From 0bf497ed68954cbadb8089476d41134eb537d883 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Sun, 8 Sep 2019 23:57:18 +0900 Subject: [PATCH 28/33] =?UTF-8?q?6=20-=203=20=EB=8F=84=EC=BB=A4=EB=A5=BC?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=9C=20=EB=B0=B0=ED=8F=AC=20-=202=20?= =?UTF-8?q?=EB=8F=84=EC=BB=A4=ED=8C=8C=EC=9D=BC=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/6/Dockerfile | 11 +++++++++++ node/wikibooks-nodejs-microservice/6/description.md | 6 ++++++ .../6/imagini/settings.json | 3 --- node/wikibooks-nodejs-microservice/6/settings.json | 3 +++ 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 node/wikibooks-nodejs-microservice/6/Dockerfile create mode 100644 node/wikibooks-nodejs-microservice/6/description.md create mode 100644 node/wikibooks-nodejs-microservice/6/settings.json diff --git a/node/wikibooks-nodejs-microservice/6/Dockerfile b/node/wikibooks-nodejs-microservice/6/Dockerfile new file mode 100644 index 0000000000..cd846ff9a5 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/Dockerfile @@ -0,0 +1,11 @@ +FROM node:10 +MAINTAINER neverlish + +ADD imagini/imagini.js /opt/app/imagini.js +ADD imagini/package.json /opt/app/package.json +ADD imagini/settings.json /opt/app/settings.json + +WORKDIR /opt/app +RUN npm i + +CMD ["node", "/opt/app/imagini"] \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/description.md b/node/wikibooks-nodejs-microservice/6/description.md new file mode 100644 index 0000000000..637bd8ddf9 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/description.md @@ -0,0 +1,6 @@ +## 6 - 3 도커를 사용한 배포 - 2 도커파일 정의 + +- `docker pull node:alpine` +- `docker build -t imagini:0.0.1 .` +- `docker run -i -t imagini:0.0.1 sh` +- `docker run -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/settings.json b/node/wikibooks-nodejs-microservice/6/imagini/settings.json index 88afb918a1..e69de29bb2 100644 --- a/node/wikibooks-nodejs-microservice/6/imagini/settings.json +++ b/node/wikibooks-nodejs-microservice/6/imagini/settings.json @@ -1,3 +0,0 @@ -{ - "db": "mysql://root@localhost/imagini" -} \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/settings.json b/node/wikibooks-nodejs-microservice/6/settings.json new file mode 100644 index 0000000000..647769c277 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/settings.json @@ -0,0 +1,3 @@ +{ + "db": "mysql://root@host.docker.internal/imagini" +} \ No newline at end of file From 2984cb6fb5fa370e8e615cfbdea6c3dd6bc8d723 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Mon, 9 Sep 2019 00:05:29 +0900 Subject: [PATCH 29/33] =?UTF-8?q?6=20-=203=20-=203=20=EC=BB=A8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=84=88=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/6/Dockerfile | 2 ++ node/wikibooks-nodejs-microservice/6/description.md | 6 +++++- .../wikibooks-nodejs-microservice/6/imagini/imagini.js | 10 +++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/node/wikibooks-nodejs-microservice/6/Dockerfile b/node/wikibooks-nodejs-microservice/6/Dockerfile index cd846ff9a5..87bfd51b41 100644 --- a/node/wikibooks-nodejs-microservice/6/Dockerfile +++ b/node/wikibooks-nodejs-microservice/6/Dockerfile @@ -8,4 +8,6 @@ ADD imagini/settings.json /opt/app/settings.json WORKDIR /opt/app RUN npm i +EXPOSE 3000 + CMD ["node", "/opt/app/imagini"] \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/description.md b/node/wikibooks-nodejs-microservice/6/description.md index 637bd8ddf9..275a9b1eb1 100644 --- a/node/wikibooks-nodejs-microservice/6/description.md +++ b/node/wikibooks-nodejs-microservice/6/description.md @@ -3,4 +3,8 @@ - `docker pull node:alpine` - `docker build -t imagini:0.0.1 .` - `docker run -i -t imagini:0.0.1 sh` -- `docker run -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` \ No newline at end of file +- `docker run -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` + +## 6 - 3 - 3 컨테이너 관리 +- `time docker stop CONTAINER_ID` +- `docker run -d -p 80:3000 -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/imagini.js b/node/wikibooks-nodejs-microservice/6/imagini/imagini.js index 05bcd60aee..a4f68e2840 100644 --- a/node/wikibooks-nodejs-microservice/6/imagini/imagini.js +++ b/node/wikibooks-nodejs-microservice/6/imagini/imagini.js @@ -135,7 +135,15 @@ db.connect((err) => { }); }) - app.listen(3000); + app.listen(3000, () => { + console.log('ready'); + }); + + process.on('SIGTERM', () => { + db.end(() => { + process.exit(0); + }); + }); }) module.exports = app; \ No newline at end of file From e0cd0d76efb27c9b586e6ad887c6178b4dbf263e Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Mon, 9 Sep 2019 00:11:50 +0900 Subject: [PATCH 30/33] =?UTF-8?q?6=20-=203=20-=204=20=EC=BB=A8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=84=88=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/6/description.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/node/wikibooks-nodejs-microservice/6/description.md b/node/wikibooks-nodejs-microservice/6/description.md index 275a9b1eb1..0fce713a2d 100644 --- a/node/wikibooks-nodejs-microservice/6/description.md +++ b/node/wikibooks-nodejs-microservice/6/description.md @@ -7,4 +7,8 @@ ## 6 - 3 - 3 컨테이너 관리 - `time docker stop CONTAINER_ID` -- `docker run -d -p 80:3000 -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` \ No newline at end of file +- `docker run -d -p 80:3000 -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` + +## 6 - 3 - 4 컨테이너 정리 +- `docker rm $(docker ps -qa)` +- `docker rmi $(docker images -q)` \ No newline at end of file From 3555003067999bc9a78a6534e73f5ee6f048a56c Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Mon, 9 Sep 2019 00:38:40 +0900 Subject: [PATCH 31/33] =?UTF-8?q?6=20-=204=20MySQL=20=EB=B0=B0=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/6/.gitignore | 3 +++ node/wikibooks-nodejs-microservice/6/description.md | 10 +++++++++- .../wikibooks-nodejs-microservice/6/imagini/.gitignore | 2 -- node/wikibooks-nodejs-microservice/6/settings.json | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 node/wikibooks-nodejs-microservice/6/.gitignore delete mode 100644 node/wikibooks-nodejs-microservice/6/imagini/.gitignore diff --git a/node/wikibooks-nodejs-microservice/6/.gitignore b/node/wikibooks-nodejs-microservice/6/.gitignore new file mode 100644 index 0000000000..0ac6e33b12 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/.gitignore @@ -0,0 +1,3 @@ +.nyc_output +coverage +mysql \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/description.md b/node/wikibooks-nodejs-microservice/6/description.md index 0fce713a2d..04c34c0a1d 100644 --- a/node/wikibooks-nodejs-microservice/6/description.md +++ b/node/wikibooks-nodejs-microservice/6/description.md @@ -11,4 +11,12 @@ ## 6 - 3 - 4 컨테이너 정리 - `docker rm $(docker ps -qa)` -- `docker rmi $(docker images -q)` \ No newline at end of file +- `docker rmi $(docker images -q)` + +## 6 - 4 MySQL 배포 +- `docker network create imagini` +- `docker network ls` +- `docker run --name imagini-database --network imagini -v $(pwd)/mysql:/var/lib/mysql -e MYSQL_DATABASE=imagini -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.7` +- `docker run --rm -t -i --network imagini node:latest bash` + - `# ping imagini-database -c 5` +- `docker run --name imagini-service --network imagini -p 80:3000 -d -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/imagini/.gitignore b/node/wikibooks-nodejs-microservice/6/imagini/.gitignore deleted file mode 100644 index 2b7cecf776..0000000000 --- a/node/wikibooks-nodejs-microservice/6/imagini/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.nyc_output -coverage \ No newline at end of file diff --git a/node/wikibooks-nodejs-microservice/6/settings.json b/node/wikibooks-nodejs-microservice/6/settings.json index 647769c277..cf07e65572 100644 --- a/node/wikibooks-nodejs-microservice/6/settings.json +++ b/node/wikibooks-nodejs-microservice/6/settings.json @@ -1,3 +1,3 @@ { - "db": "mysql://root@host.docker.internal/imagini" + "db": "mysql://root:secret@imagini-database/imagini" } \ No newline at end of file From 14fd67ffa22bbce781f5a400f77d8aaebb7c2177 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Mon, 9 Sep 2019 01:35:46 +0900 Subject: [PATCH 32/33] =?UTF-8?q?6=20-=205=20=EB=8F=84=EC=BB=A4=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EC=A6=88=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6/description.md | 5 ++++- .../6/docker-compose.yml | 22 +++++++++++++++++++ .../6/settings.json | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 node/wikibooks-nodejs-microservice/6/docker-compose.yml diff --git a/node/wikibooks-nodejs-microservice/6/description.md b/node/wikibooks-nodejs-microservice/6/description.md index 04c34c0a1d..7f74a42364 100644 --- a/node/wikibooks-nodejs-microservice/6/description.md +++ b/node/wikibooks-nodejs-microservice/6/description.md @@ -19,4 +19,7 @@ - `docker run --name imagini-database --network imagini -v $(pwd)/mysql:/var/lib/mysql -e MYSQL_DATABASE=imagini -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.7` - `docker run --rm -t -i --network imagini node:latest bash` - `# ping imagini-database -c 5` -- `docker run --name imagini-service --network imagini -p 80:3000 -d -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` \ No newline at end of file +- `docker run --name imagini-service --network imagini -p 80:3000 -d -v $(pwd)/settings.json:/opt/app/settings.json imagini:0.0.1` + +## 6 - 5 도커 컴포즈 사용 +- `docker-compose up -d` diff --git a/node/wikibooks-nodejs-microservice/6/docker-compose.yml b/node/wikibooks-nodejs-microservice/6/docker-compose.yml new file mode 100644 index 0000000000..2feb24f7b7 --- /dev/null +++ b/node/wikibooks-nodejs-microservice/6/docker-compose.yml @@ -0,0 +1,22 @@ +version: "3" +networks: + imagini: +services: + database: + image: mysql:5.7 + networks: + - imagini + volumes: + - ${PWD}/mysql:/var/lib/mysql + environment: + MYSQL_DATABASE: imagini + MYSQL_ROOT_PASSWORD: secret + service: + image: imagini:0.0.1 + networks: + - imagini + volumes: + - ${PWD}/settings.json:/opt/app/settings.json + ports: + - "80:3000" + restart: on-failure diff --git a/node/wikibooks-nodejs-microservice/6/settings.json b/node/wikibooks-nodejs-microservice/6/settings.json index cf07e65572..94b05b1985 100644 --- a/node/wikibooks-nodejs-microservice/6/settings.json +++ b/node/wikibooks-nodejs-microservice/6/settings.json @@ -1,3 +1,3 @@ { - "db": "mysql://root:secret@imagini-database/imagini" + "db": "mysql://root:secret@database/imagini" } \ No newline at end of file From 306c63dc6e6b50183de3b3c59956eae0d8f52b58 Mon Sep 17 00:00:00 2001 From: Jinho Hyeon Date: Mon, 9 Sep 2019 01:36:05 +0900 Subject: [PATCH 33/33] =?UTF-8?q?6=20-=205=20-=201=20=EB=8F=84=EC=BB=A4=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EC=A6=88=20=EA=B3=A0=EA=B8=89=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/wikibooks-nodejs-microservice/6/description.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/node/wikibooks-nodejs-microservice/6/description.md b/node/wikibooks-nodejs-microservice/6/description.md index 7f74a42364..c2ab5dcdc1 100644 --- a/node/wikibooks-nodejs-microservice/6/description.md +++ b/node/wikibooks-nodejs-microservice/6/description.md @@ -23,3 +23,8 @@ ## 6 - 5 도커 컴포즈 사용 - `docker-compose up -d` + +## 6 - 5 - 1 도커 컴포즈 고급 활용 +- `docker-compose logs service` +- `docker-compose ps` +- `docker-compose down` \ No newline at end of file