From cd335481aa7ae80540e4a7d93233f6ef359a93f7 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 00:28:37 +0100 Subject: [PATCH 01/45] Update package.json cambio de version de ^4.14.2 a ^4.18.2 --- nodejs-helloworld/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodejs-helloworld/package.json b/nodejs-helloworld/package.json index c9768b5e49..ed2bdca998 100644 --- a/nodejs-helloworld/package.json +++ b/nodejs-helloworld/package.json @@ -6,6 +6,6 @@ "author": "Red Hat Training", "license": "ASL", "dependencies": { - "express": "~4.14.2" + "express": "^4.18.2" } } From 18fbf039f607f7d380ad71f0ed2bbb0cee69c9d0 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 00:41:09 +0100 Subject: [PATCH 02/45] Update package.json "Agrega script start en package.json" --- nodejs-helloworld/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nodejs-helloworld/package.json b/nodejs-helloworld/package.json index ed2bdca998..d372e528f7 100644 --- a/nodejs-helloworld/package.json +++ b/nodejs-helloworld/package.json @@ -7,5 +7,8 @@ "license": "ASL", "dependencies": { "express": "^4.18.2" + }, + "scripts": { + "start": "node app.js" } } From fd8c7be9a9e3a5585d44727b91dfeee212d93567 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 00:55:14 +0100 Subject: [PATCH 03/45] Update package.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit incluir una sección "scripts" con un comando "start" --- nodejs-helloworld/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nodejs-helloworld/package.json b/nodejs-helloworld/package.json index d372e528f7..9e864dfbd0 100644 --- a/nodejs-helloworld/package.json +++ b/nodejs-helloworld/package.json @@ -3,12 +3,12 @@ "version": "1.0.0", "description": "Hello World!", "main": "app.js", + "scripts": { + "start": "node app.js" + }, "author": "Red Hat Training", "license": "ASL", "dependencies": { "express": "^4.18.2" - }, - "scripts": { - "start": "node app.js" } } From 8058057149b72cd844b7231021aeee438cf4ad0b Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 01:26:21 +0100 Subject: [PATCH 04/45] Create api_node carpeta de una nueva aplicacion --- todoapp/api_node | 1 + 1 file changed, 1 insertion(+) create mode 100644 todoapp/api_node diff --git a/todoapp/api_node b/todoapp/api_node new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/todoapp/api_node @@ -0,0 +1 @@ + From 36f2e507ccd73469709d303cfd80e88ac24c341d Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 11:11:53 +0100 Subject: [PATCH 05/45] Update run.sh run.sh actualizado --- todoapp/nodejs_api/run.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/todoapp/nodejs_api/run.sh b/todoapp/nodejs_api/run.sh index 34949eb0c7..b28269550d 100644 --- a/todoapp/nodejs_api/run.sh +++ b/todoapp/nodejs_api/run.sh @@ -1,6 +1,2 @@ #!/bin/bash - -source /opt/rh/nodejs010/enable - -node app.js - +npm install && node app.js From 4203b474c8eba49c48d370c54f31afac348f11b8 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 11:12:29 +0100 Subject: [PATCH 06/45] Update package.json actualizacion de versiones --- todoapp/nodejs_api/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index 4b898030a1..b92de1d6b9 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -1,10 +1,10 @@ { "name": "todo", - "version": "0.0.1", + "version": "0.0.2", "private": true, "dependencies": { - "restify": "4.0.3", - "sequelize": "3.14.2", - "mysql": "2.9.0" + "restify": "^11.1.0", + "sequelize": "^6.37.2", + "mysql2": "^3.6.0" } } From 7a92345cdc9fdf0a922bd456e4cf3128ddd8c8b6 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 11:13:37 +0100 Subject: [PATCH 07/45] Update app.js actualizacion version --- todoapp/nodejs_api/app.js | 58 ++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/todoapp/nodejs_api/app.js b/todoapp/nodejs_api/app.js index 11ce178e09..9a38bcc978 100644 --- a/todoapp/nodejs_api/app.js +++ b/todoapp/nodejs_api/app.js @@ -1,35 +1,37 @@ -var restify = require('restify'); +const restify = require('restify'); +const corsMiddleware = require('restify-cors-middleware'); +const controller = require('./controllers/items'); +const serverinfo = require('./controllers/serverinfo'); +const db = require('./models/db'); +const model = require('./models/items'); -var controller = require('./controllers/items'); -var serverinfo = require('./controllers/serverinfo'); - -var db = require('./models/db'); -var model = require('./models/items'); +const cors = corsMiddleware({ + origins: ['*'], + allowHeaders: ['Authorization'], + exposeHeaders: ['Authorization'] +}); -model.connect(db.params, function(err) { - if (err) throw err; +model.connect(db.params, (err) => { + if (err) throw err; }); -var server = restify.createServer() - .use(restify.fullResponse()) - .use(restify.queryParser()) - .use(restify.bodyParser()) - .use(restify.CORS()); - -controller.context(server, '/todo/api', model); -serverinfo.context(server, '/todo/api'); +const server = restify.createServer(); +server.pre(cors.preflight); +server.use(cors.actual); +server.use(restify.plugins.queryParser()); +server.use(restify.plugins.bodyParser()); -var port = process.env.PORT || 30080; -server.listen(port, function (err) { - if (err) - console.error(err); - else - console.log('App is ready at : ' + port); +controller.context(server, '/todo/api', model); +serverinfo.context(server, '/todo/api'); + +const port = process.env.PORT || 30080; +server.listen(port, () => { + console.log(`App is ready at: ${port}`); }); - -if (process.env.environment == 'production') - process.on('uncaughtException', function (err) { - console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))) - }); - + +if (process.env.environment === 'production') { + process.on('uncaughtException', (err) => { + console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))); + }); +} From c118dc9148956854d432ee109f6027728e887e40 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 11:14:22 +0100 Subject: [PATCH 08/45] Update db.js actualizacion version --- todoapp/nodejs_api/models/db.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/todoapp/nodejs_api/models/db.js b/todoapp/nodejs_api/models/db.js index 4e9b393a88..38b3896d5a 100644 --- a/todoapp/nodejs_api/models/db.js +++ b/todoapp/nodejs_api/models/db.js @@ -1,12 +1,16 @@ +const { Sequelize } = require('sequelize'); + module.exports.params = { - dbname: process.env.MYSQL_ENV_MYSQL_DATABASE, - username: process.env.MYSQL_ENV_MYSQL_USER, - password: process.env.MYSQL_ENV_MYSQL_PASSWORD, - params: { - host: "mysql", - port: "3306", - dialect: 'mysql' - } + dbname: process.env.MYSQL_ENV_MYSQL_DATABASE, + username: process.env.MYSQL_ENV_MYSQL_USER, + password: process.env.MYSQL_ENV_MYSQL_PASSWORD, + params: { + host: process.env.MYSQL_HOST || 'mysql', + port: process.env.MYSQL_PORT || '3306', + dialect: 'mysql', + dialectModule: require('mysql2'), + logging: false + } }; From bf73e6ef53580b98bc67e8e8f6afd9a90ad63307 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 11:29:06 +0100 Subject: [PATCH 09/45] Update package.json poenemos la seccion scripts --- todoapp/nodejs_api/package.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index b92de1d6b9..9e3e05156d 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -1,10 +1,14 @@ { "name": "todo", - "version": "0.0.2", + "version": "0.0.1", "private": true, "dependencies": { - "restify": "^11.1.0", - "sequelize": "^6.37.2", - "mysql2": "^3.6.0" + "restify": "4.0.3", + "sequelize": "3.14.2", + "mysql": "2.9.0" + }, + "scripts": { + "start": "node app.js" } } + From 097d7cce01d8a56939f815668eb981585599dd72 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 12:57:24 +0100 Subject: [PATCH 10/45] Update package.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit añadimos el middware --- todoapp/nodejs_api/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index 9e3e05156d..b29c921caa 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -5,10 +5,13 @@ "dependencies": { "restify": "4.0.3", "sequelize": "3.14.2", - "mysql": "2.9.0" + "mysql": "2.9.0", + "restify-cors-middleware": "^1.1.1" }, "scripts": { - "start": "node app.js" + "start": "node app.js", + "install": "npm install" } } + From 73229bf38f1d3203d98a289fc4136dadd852e359 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 12:58:46 +0100 Subject: [PATCH 11/45] Update app.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit añadimos el middware --- todoapp/nodejs_api/app.js | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/todoapp/nodejs_api/app.js b/todoapp/nodejs_api/app.js index 9a38bcc978..cc106c5ba1 100644 --- a/todoapp/nodejs_api/app.js +++ b/todoapp/nodejs_api/app.js @@ -1,37 +1,44 @@ const restify = require('restify'); const corsMiddleware = require('restify-cors-middleware'); + const controller = require('./controllers/items'); const serverinfo = require('./controllers/serverinfo'); + const db = require('./models/db'); const model = require('./models/items'); const cors = corsMiddleware({ - origins: ['*'], - allowHeaders: ['Authorization'], - exposeHeaders: ['Authorization'] + origins: ['*'], + allowHeaders: ['Authorization'], + exposeHeaders: ['Authorization'] }); -model.connect(db.params, (err) => { - if (err) throw err; +model.connect(db.params, function(err) { + if (err) throw err; }); const server = restify.createServer(); server.pre(cors.preflight); server.use(cors.actual); -server.use(restify.plugins.queryParser()); -server.use(restify.plugins.bodyParser()); + +server.use(restify.fullResponse()); +server.use(restify.queryParser()); +server.use(restify.bodyParser()); controller.context(server, '/todo/api', model); serverinfo.context(server, '/todo/api'); const port = process.env.PORT || 30080; -server.listen(port, () => { - console.log(`App is ready at: ${port}`); +server.listen(port, function(err) { + if (err) { + console.error(err); + } else { + console.log('App is ready at : ' + port); + } }); if (process.env.environment === 'production') { - process.on('uncaughtException', (err) => { - console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))); - }); + process.on('uncaughtException', function(err) { + console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))); + }); } - From 2fed545c13dca23f034bfd004486cbc782870bbf Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 13:17:09 +0100 Subject: [PATCH 12/45] Update package.json problemas con el nmp --- todoapp/nodejs_api/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index b29c921caa..a312f636fd 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -9,9 +9,9 @@ "restify-cors-middleware": "^1.1.1" }, "scripts": { - "start": "node app.js", - "install": "npm install" + "start": "node app.js" } } + From bb9da7309c44b8b82f98ba2921f0b7f649e88024 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 13:22:08 +0100 Subject: [PATCH 13/45] Update package.json cambio version de mysql --- todoapp/nodejs_api/package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index a312f636fd..4b20f6cc62 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -5,13 +5,10 @@ "dependencies": { "restify": "4.0.3", "sequelize": "3.14.2", - "mysql": "2.9.0", + "mysql2": "^3.0.0", "restify-cors-middleware": "^1.1.1" }, "scripts": { "start": "node app.js" } } - - - From 9ca51828a22bc13ff9015582286549eab74cb40d Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 17:12:44 +0100 Subject: [PATCH 14/45] Update items.js actaualizacion de varios parametros --- todoapp/nodejs_api/models/items.js | 127 ++++++++++++++--------------- 1 file changed, 62 insertions(+), 65 deletions(-) diff --git a/todoapp/nodejs_api/models/items.js b/todoapp/nodejs_api/models/items.js index 5301bbb379..4a676c80d9 100644 --- a/todoapp/nodejs_api/models/items.js +++ b/todoapp/nodejs_api/models/items.js @@ -1,126 +1,123 @@ var Sequelize = require("sequelize"); +var mysql2 = require("mysql2"); -var Item = undefined; +let sequelize; +let Item; module.exports.connect = function(params, callback) { - var sequlz = new Sequelize( + sequelize = new Sequelize( params.dbname, params.username, params.password, - params.params); - Item = sequlz.define('Item', { - id: { type: Sequelize.BIGINT, - primaryKey: true, unique: true, allowNull: false, - autoIncrement: true }, - description: { type: Sequelize.STRING, - allowNull: true }, - done: { type: Sequelize.BOOLEAN, - allowNull: true } + Object.assign({}, params.params, { dialect: 'mysql', dialectModule: mysql2 }) + ); + + Item = sequelize.define('Item', { + id: { + type: Sequelize.BIGINT, + primaryKey: true, + unique: true, + allowNull: false, + autoIncrement: true + }, + description: { + type: Sequelize.STRING, + allowNull: true + }, + done: { + type: Sequelize.BOOLEAN, + allowNull: true + } }, { timestamps: false, freezeTableName: true }); - // drop and create tables, better done globally - /* - Item.sync({ force: true }).then(function() { - callback(); - }).error(function(err) { - callback(err); - }); - */ + + sequelize.authenticate() + .then(() => callback()) + .catch(err => callback(err)); } exports.disconnect = function(callback) { - //XXX shouln'd to something to close or release the db connection? - callback(); + if (sequelize) { + sequelize.close().then(() => callback()).catch(err => callback(err)); + } else { + callback(); + } } exports.create = function(description, done, callback) { Item.create({ - //id: id, description: description, - done: (done) ? true : false - }).then(function(item) { + done: !!done + }).then(item => { callback(null, item); - }).error(function(err) { + }).catch(err => { callback(err); }); } exports.update = function(key, description, done, callback) { - Item.find({ where:{ id: key } }).then(function(item) { + Item.findOne({ where: { id: key } }).then(item => { if (!item) { callback(new Error("Nothing found for key " + key)); - } - else { - item.updateAttributes({ + } else { + item.update({ description: description, - done: (done) ? true : false - }).then(function() { + done: !!done + }).then(() => { callback(null, item); - }).error(function(err) { + }).catch(err => { callback(err); }); } - }).error(function(err) { + }).catch(err => { callback(err); }); } - exports.read = function(key, callback) { - Item.find({ where:{ id: key } }).then(function(item) { + Item.findOne({ where: { id: key } }).then(item => { if (!item) { callback(new Error("Nothing found for key " + key)); + } else { + callback(null, item); } - else { - //XXX why recreating the item object? - callback(null, { - id: item.id, - description: item.description, - done: item.done - }); - } - }).error(function(err) { + }).catch(err => { callback(err); }); } exports.destroy = function(key, callback) { - Item.find({ where:{ id: key } }).then(function(item) { + Item.findOne({ where: { id: key } }).then(item => { if (!item) { - callback(new Error("Nothing found for " + key)); - } - else { - item.destroy().then(function() { + callback(new Error("Nothing found for key " + key)); + } else { + item.destroy().then(() => { callback(null, item); - }).error(function(err) { + }).catch(err => { callback(err); }); } - }).error(function(err) { + }).catch(err => { callback(err); }); } exports.countAll = function(callback) { - Item.findAll({ attributes: [[Sequelize.fn('COUNT', Sequelize.col('id')), 'no_items']] } ).then(function(n) { - callback(null, n[0].get('no_items')); - }).error(function(err) { + Item.count().then(count => { + callback(null, count); + }).catch(err => { callback(err); }); - //callback(null, 100); } exports.listAll = function(page, sortField, sortDirection, callback) { - Item.findAll({ offset: 10 * (page - 1), limit: 10, order: [[sortField, sortDirection]] }).then(function(items) { - var theitems = []; - items.forEach(function(item) { - //XXX why recreating the item objects for theitems? - theitems.push({ - id: item.id, description: item.description, done: item.done }); - }); - callback(null, theitems); - }).error(function(err) { + Item.findAll({ + offset: 10 * (page - 1), + limit: 10, + order: [[sortField, sortDirection]] + }).then(items => { + callback(null, items); + }).catch(err => { callback(err); }); } - From 5712394804592786de4e7a6805d3f57986b3ac78 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 17:36:13 +0100 Subject: [PATCH 15/45] Update serverinfo.js nuevo --- todoapp/nodejs_api/controllers/serverinfo.js | 48 +++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/todoapp/nodejs_api/controllers/serverinfo.js b/todoapp/nodejs_api/controllers/serverinfo.js index 00f4b58d71..0efd83d402 100644 --- a/todoapp/nodejs_api/controllers/serverinfo.js +++ b/todoapp/nodejs_api/controllers/serverinfo.js @@ -1,29 +1,33 @@ -var os = require('os'); +const os = require('os'); +const pkg = require('../package.json'); -exports.context = function(server, path) { - if (!server) - done('has to provide a restify server object'); - - server.get(path + '/host', this.serverInfo); -}; - -exports.serverInfo = function(req, res, next) { - var address; - var ifaces = os.networkInterfaces(); +exports.context = function (server, path) { + if (!server) { + throw new Error('You must provide a restify server instance'); + } - for (var dev in ifaces) { - var iface = ifaces[dev].filter(function(details) { - return details.family === 'IPv4' && details.internal === false; - }); - if (iface.length > 0) - address = iface[0].address; + let context = "/serverinfo"; + if (path) { + context = path + context; } - var reply = { - ip: address, - hostname: os.hostname() + server.get(context, this.info); +}; + +exports.info = function (req, res, next) { + const info = { + appName: pkg.name, + version: pkg.version, + description: pkg.description || 'ToDo API service', + hostname: os.hostname(), + platform: os.platform(), + uptime: `${os.uptime()} seconds`, + memory: { + total: `${(os.totalmem() / (1024 ** 2)).toFixed(2)} MB`, + free: `${(os.freemem() / (1024 ** 2)).toFixed(2)} MB` + } }; - res.json(reply); - next(); + res.json(info); + return next(); }; From 07f5a44be24f5ce8bec1c74f94858721ce54055a Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 17:36:53 +0100 Subject: [PATCH 16/45] Update run.sh nuevo --- todoapp/nodejs_api/run.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/todoapp/nodejs_api/run.sh b/todoapp/nodejs_api/run.sh index b28269550d..c7b250cb7d 100644 --- a/todoapp/nodejs_api/run.sh +++ b/todoapp/nodejs_api/run.sh @@ -1,2 +1,16 @@ #!/bin/bash -npm install && node app.js + +# Configuración por defecto +export NODE_ENV=production +export PORT=8080 +export DB_NAME=todoapp +export DB_USER=root +export DB_PASSWORD=password +export DB_HOST=localhost +export DB_PORT=3306 + +echo "Iniciando aplicación ToDo API en modo $NODE_ENV..." +echo "Conectando a MySQL en $DB_HOST:$DB_PORT con usuario $DB_USER" + +# Ejecuta la aplicación +node app.js From 01e6c82e04c07af9ee1f5ef8910eeaf335e0bce5 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 17:42:18 +0100 Subject: [PATCH 17/45] Update serverinfo.js nuevo --- todoapp/nodejs_api/controllers/serverinfo.js | 44 +++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/todoapp/nodejs_api/controllers/serverinfo.js b/todoapp/nodejs_api/controllers/serverinfo.js index 0efd83d402..c17018c8aa 100644 --- a/todoapp/nodejs_api/controllers/serverinfo.js +++ b/todoapp/nodejs_api/controllers/serverinfo.js @@ -1,33 +1,17 @@ -const os = require('os'); -const pkg = require('../package.json'); +exports.context = function(server, path) { + if (!server) throw new Error('A restify server object must be provided'); -exports.context = function (server, path) { - if (!server) { - throw new Error('You must provide a restify server instance'); - } + const context = path ? `${path}/serverinfo` : '/serverinfo'; - let context = "/serverinfo"; - if (path) { - context = path + context; - } - - server.get(context, this.info); -}; - -exports.info = function (req, res, next) { - const info = { - appName: pkg.name, - version: pkg.version, - description: pkg.description || 'ToDo API service', - hostname: os.hostname(), - platform: os.platform(), - uptime: `${os.uptime()} seconds`, - memory: { - total: `${(os.totalmem() / (1024 ** 2)).toFixed(2)} MB`, - free: `${(os.freemem() / (1024 ** 2)).toFixed(2)} MB` - } - }; - res.json(info); - return next(); + server.get(context, (req, res, next) => { + const serverInfo = { + name: 'Todo API Server', + version: '1.0.0', + nodeVersion: process.version, + platform: process.platform, + uptime: process.uptime().toFixed(2) + ' seconds' + }; + res.json(serverInfo); + next(); + }); }; - From 6ba917188f2ad27cef16e3e168255207979bfa4c Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 18:19:44 +0100 Subject: [PATCH 18/45] nuevos nuevos --- todoapp/nodejs_api/controllers/items.js | 147 ++++++------------------ 1 file changed, 32 insertions(+), 115 deletions(-) diff --git a/todoapp/nodejs_api/controllers/items.js b/todoapp/nodejs_api/controllers/items.js index fc6993404a..ec6a49e62d 100644 --- a/todoapp/nodejs_api/controllers/items.js +++ b/todoapp/nodejs_api/controllers/items.js @@ -1,118 +1,35 @@ - -var model = undefined; - -exports.context = function(server, path, itemsModel) { - if (!server) - done('has to provide a restify server object'); - - var context = "/items"; - if (path) - context = path + context; - - server.get(context + '/', this.list); - server.get(context + '/:id', this.read); - server.post(context + '/', this.save); - server.del(context + '/:id', this.destroy); - - model = itemsModel; -}; - -exports.list = function(req, res, next) { - var page_no = req.query.page || 1; - var sortField = req.query.sortFields || "id"; - var sortDirection = req.query.sortDirections || "asc"; - - model.listAll(page_no, sortField, sortDirection, function(err, items) { - if (err) { - next(err); - } - else { - if (items) { - model.countAll(function(err, n) { - if (err) { - next(err); - } - else { - if (n) { - var page = { - "currentPage" : page_no, - "list" : items, - "pageSize" : 10, - "sortDirections" : sortDirection, - "sortFields" : sortField, - "totalResults" : n - }; - res.json(page); - next(); - } - else { - next(new Error("Can't count items")); - } - } - }); - } - else { - next(new Error("Can't retrieve items")); - } - } - }) -}; - -exports.read = function(req, res, next) { - var key = req.params.id; - model.read(key, function(err, item) { - if (err) { - next(err); - } - else { - if (item) { - res.json(item); - next(); - } - else { - next(new Error("Can't retrieve items")); - } - } - }) -}; - - -exports.save = function(req, res, next) { - if (req.params.id) { - model.update(req.params.id, req.params.description, req.params.done, function(err, item) { - if (err) { - next(err); - } - else { - res.json(item); - next(); - } - }); +const express = require('express'); +const router = express.Router(); +const Item = require('../models/items'); + +router.get('/', async (req, res) => { + const items = await Item.findAll(); + res.json(items); +}); + +router.post('/', async (req, res) => { + const newItem = await Item.create(req.body); + res.json(newItem); +}); + +router.put('/:id', async (req, res) => { + const item = await Item.findByPk(req.params.id); + if (item) { + await item.update(req.body); + res.json(item); + } else { + res.status(404).send('Item not found'); } - else { - model.create(req.params.description, req.params.done, function(err, item) { - if (err) { - next(err); - } - else { - res.json(item); - next(); - } - }); +}); + +router.delete('/:id', async (req, res) => { + const item = await Item.findByPk(req.params.id); + if (item) { + await item.destroy(); + res.send('Item deleted'); + } else { + res.status(404).send('Item not found'); } -}; +}); - -exports.destroy = function(req, res, next) { - if (req.params.id) { - model.destroy(req.params.id, function(err, item) { - if (err) { - next(err); - } - else { - //XXX jee_api does NOT return item on delete - res.json(item); - } - }); - } -} +module.exports = router; \ No newline at end of file From 83bcfcda884a5cfc312c16af9f5705f2462c5fef Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 18:21:23 +0100 Subject: [PATCH 19/45] nuevos nuevos --- todoapp/nodejs_api/models/db.js | 17 +--- todoapp/nodejs_api/models/items.js | 141 ++++------------------------- 2 files changed, 25 insertions(+), 133 deletions(-) diff --git a/todoapp/nodejs_api/models/db.js b/todoapp/nodejs_api/models/db.js index 38b3896d5a..4d024863e8 100644 --- a/todoapp/nodejs_api/models/db.js +++ b/todoapp/nodejs_api/models/db.js @@ -1,16 +1,9 @@ - const { Sequelize } = require('sequelize'); -module.exports.params = { - dbname: process.env.MYSQL_ENV_MYSQL_DATABASE, - username: process.env.MYSQL_ENV_MYSQL_USER, - password: process.env.MYSQL_ENV_MYSQL_PASSWORD, - params: { - host: process.env.MYSQL_HOST || 'mysql', - port: process.env.MYSQL_PORT || '3306', +const sequelize = new Sequelize(process.env.DB_NAME || 'todoapp', process.env.DB_USER || 'root', process.env.DB_PASSWORD || 'password', { + host: process.env.DB_HOST || 'localhost', dialect: 'mysql', - dialectModule: require('mysql2'), - logging: false - } -}; + port: process.env.DB_PORT || 3306 +}); +module.exports = sequelize; \ No newline at end of file diff --git a/todoapp/nodejs_api/models/items.js b/todoapp/nodejs_api/models/items.js index 4a676c80d9..bef9e36704 100644 --- a/todoapp/nodejs_api/models/items.js +++ b/todoapp/nodejs_api/models/items.js @@ -1,123 +1,22 @@ -var Sequelize = require("sequelize"); -var mysql2 = require("mysql2"); - -let sequelize; -let Item; - -module.exports.connect = function(params, callback) { - sequelize = new Sequelize( - params.dbname, params.username, params.password, - Object.assign({}, params.params, { dialect: 'mysql', dialectModule: mysql2 }) - ); - - Item = sequelize.define('Item', { - id: { - type: Sequelize.BIGINT, - primaryKey: true, - unique: true, - allowNull: false, - autoIncrement: true - }, - description: { - type: Sequelize.STRING, - allowNull: true - }, - done: { - type: Sequelize.BOOLEAN, - allowNull: true - } - }, { - timestamps: false, - freezeTableName: true - }); - - sequelize.authenticate() - .then(() => callback()) - .catch(err => callback(err)); -} - -exports.disconnect = function(callback) { - if (sequelize) { - sequelize.close().then(() => callback()).catch(err => callback(err)); - } else { - callback(); +const { DataTypes } = require('sequelize'); +const sequelize = require('./db'); + +const Item = sequelize.define('Item', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true + }, + description: { + type: DataTypes.STRING, + allowNull: false + }, + done: { + type: DataTypes.BOOLEAN, + defaultValue: false } -} - -exports.create = function(description, done, callback) { - Item.create({ - description: description, - done: !!done - }).then(item => { - callback(null, item); - }).catch(err => { - callback(err); - }); -} - -exports.update = function(key, description, done, callback) { - Item.findOne({ where: { id: key } }).then(item => { - if (!item) { - callback(new Error("Nothing found for key " + key)); - } else { - item.update({ - description: description, - done: !!done - }).then(() => { - callback(null, item); - }).catch(err => { - callback(err); - }); - } - }).catch(err => { - callback(err); - }); -} - -exports.read = function(key, callback) { - Item.findOne({ where: { id: key } }).then(item => { - if (!item) { - callback(new Error("Nothing found for key " + key)); - } else { - callback(null, item); - } - }).catch(err => { - callback(err); - }); -} - -exports.destroy = function(key, callback) { - Item.findOne({ where: { id: key } }).then(item => { - if (!item) { - callback(new Error("Nothing found for key " + key)); - } else { - item.destroy().then(() => { - callback(null, item); - }).catch(err => { - callback(err); - }); - } - }).catch(err => { - callback(err); - }); -} - -exports.countAll = function(callback) { - Item.count().then(count => { - callback(null, count); - }).catch(err => { - callback(err); - }); -} +}, { + timestamps: false +}); -exports.listAll = function(page, sortField, sortDirection, callback) { - Item.findAll({ - offset: 10 * (page - 1), - limit: 10, - order: [[sortField, sortDirection]] - }).then(items => { - callback(null, items); - }).catch(err => { - callback(err); - }); -} +module.exports = Item; \ No newline at end of file From ec8aa32b9ed85bf09e2a4cd4b8561e0571317527 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 18:22:17 +0100 Subject: [PATCH 20/45] nuevos nuevos --- todoapp/nodejs_api/README.md | 20 ++----------- todoapp/nodejs_api/app.js | 52 +++++++++------------------------ todoapp/nodejs_api/compile.sh | 4 --- todoapp/nodejs_api/package.json | 20 ++++++------- todoapp/nodejs_api/run.sh | 16 +--------- 5 files changed, 26 insertions(+), 86 deletions(-) diff --git a/todoapp/nodejs_api/README.md b/todoapp/nodejs_api/README.md index f7f0fd4e3d..f843709f0a 100644 --- a/todoapp/nodejs_api/README.md +++ b/todoapp/nodejs_api/README.md @@ -1,18 +1,2 @@ -# DO276 JavaScript/Node.js To Do List App - -Based on Restify 4.0 and Sequelize 3.14. Tested on Node.js 0.10 from SCL with Mariadb 5.5. - -Do `npm install` do download dependencies. - -Run as `node app.js` - -* Don't do pagination yet. - -* Database connection parameters hardcoded (as a novice developer would usually do). - -* There is a lot of boiler plate code in the controller and the model. There should be a way to have more centralized error handling. - -* Have mysql database initialized and running, and front end deployed to apache and running - -* Access as http://localhost:30000/todo - +#DO276 JavaScript/Node.js To Do List App +Aplicación de ejemplo para gestionar tareas con Node.js y MySQL. \ No newline at end of file diff --git a/todoapp/nodejs_api/app.js b/todoapp/nodejs_api/app.js index cc106c5ba1..d684ccc28d 100644 --- a/todoapp/nodejs_api/app.js +++ b/todoapp/nodejs_api/app.js @@ -1,44 +1,18 @@ -const restify = require('restify'); -const corsMiddleware = require('restify-cors-middleware'); - -const controller = require('./controllers/items'); -const serverinfo = require('./controllers/serverinfo'); - +const express = require('express'); +const app = express(); const db = require('./models/db'); -const model = require('./models/items'); - -const cors = corsMiddleware({ - origins: ['*'], - allowHeaders: ['Authorization'], - exposeHeaders: ['Authorization'] -}); - -model.connect(db.params, function(err) { - if (err) throw err; -}); - -const server = restify.createServer(); -server.pre(cors.preflight); -server.use(cors.actual); - -server.use(restify.fullResponse()); -server.use(restify.queryParser()); -server.use(restify.bodyParser()); +const itemRoutes = require('./controllers/items'); -controller.context(server, '/todo/api', model); -serverinfo.context(server, '/todo/api'); +app.use(express.json()); +app.use('/items', itemRoutes); -const port = process.env.PORT || 30080; -server.listen(port, function(err) { - if (err) { - console.error(err); - } else { - console.log('App is ready at : ' + port); - } -}); +const PORT = process.env.PORT || 8080; -if (process.env.environment === 'production') { - process.on('uncaughtException', function(err) { - console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))); +db.sync().then(() => { + console.log("Database synced"); + app.listen(PORT, () => { + console.log(`Server is running on port ${PORT}`); }); -} +}).catch(err => { + console.error("Database sync failed:", err); +}); \ No newline at end of file diff --git a/todoapp/nodejs_api/compile.sh b/todoapp/nodejs_api/compile.sh index 1544bb24d7..3add1127d4 100644 --- a/todoapp/nodejs_api/compile.sh +++ b/todoapp/nodejs_api/compile.sh @@ -1,6 +1,2 @@ #!/bin/bash - -source /opt/rh/nodejs010/enable - npm install - diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index 4b20f6cc62..b87731a1d8 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -1,14 +1,14 @@ { - "name": "todo", - "version": "0.0.1", - "private": true, - "dependencies": { - "restify": "4.0.3", - "sequelize": "3.14.2", - "mysql2": "^3.0.0", - "restify-cors-middleware": "^1.1.1" - }, + "name": "todoapp", + "version": "1.0.0", + "description": "Simple Todo app with Node.js and MySQL", + "main": "app.js", "scripts": { "start": "node app.js" + }, + "dependencies": { + "express": "^4.18.2", + "mysql2": "^3.9.2", + "sequelize": "^6.35.1" } -} +} \ No newline at end of file diff --git a/todoapp/nodejs_api/run.sh b/todoapp/nodejs_api/run.sh index c7b250cb7d..9b12715ba0 100644 --- a/todoapp/nodejs_api/run.sh +++ b/todoapp/nodejs_api/run.sh @@ -1,16 +1,2 @@ #!/bin/bash - -# Configuración por defecto -export NODE_ENV=production -export PORT=8080 -export DB_NAME=todoapp -export DB_USER=root -export DB_PASSWORD=password -export DB_HOST=localhost -export DB_PORT=3306 - -echo "Iniciando aplicación ToDo API en modo $NODE_ENV..." -echo "Conectando a MySQL en $DB_HOST:$DB_PORT con usuario $DB_USER" - -# Ejecuta la aplicación -node app.js +npm start From e221203d237d574368e53fc6d7e67e277d9bd845 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 18:29:58 +0100 Subject: [PATCH 21/45] Update serverinfo.js nuevo --- todoapp/nodejs_api/controllers/serverinfo.js | 27 +++++++++----------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/todoapp/nodejs_api/controllers/serverinfo.js b/todoapp/nodejs_api/controllers/serverinfo.js index c17018c8aa..9c5ff867a6 100644 --- a/todoapp/nodejs_api/controllers/serverinfo.js +++ b/todoapp/nodejs_api/controllers/serverinfo.js @@ -1,17 +1,14 @@ -exports.context = function(server, path) { - if (!server) throw new Error('A restify server object must be provided'); - const context = path ? `${path}/serverinfo` : '/serverinfo'; +const express = require('express'); +const router = express.Router(); +const os = require('os'); - server.get(context, (req, res, next) => { - const serverInfo = { - name: 'Todo API Server', - version: '1.0.0', - nodeVersion: process.version, - platform: process.platform, - uptime: process.uptime().toFixed(2) + ' seconds' - }; - res.json(serverInfo); - next(); - }); -}; +router.get('/', (req, res) => { + res.json({ + hostname: os.hostname(), + platform: os.platform(), + uptime: os.uptime() + }); +}); + +module.exports = router; From 8a04b3a1a6d005e90bf60df4043a68b236e1ad98 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 18:31:12 +0100 Subject: [PATCH 22/45] Update serverinfo.js nuevo --- todoapp/nodejs_api/controllers/serverinfo.js | 23 ++++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/todoapp/nodejs_api/controllers/serverinfo.js b/todoapp/nodejs_api/controllers/serverinfo.js index 9c5ff867a6..801c69a755 100644 --- a/todoapp/nodejs_api/controllers/serverinfo.js +++ b/todoapp/nodejs_api/controllers/serverinfo.js @@ -1,14 +1,13 @@ +module.exports = function (server) { + server.get('/info', function (req, res, next) { + const info = { + name: 'TodoApp', + version: '1.0.0', + description: 'Simple To-Do application API built with Node.js and Express', + author: 'Generated by ChatGPT' + }; -const express = require('express'); -const router = express.Router(); -const os = require('os'); - -router.get('/', (req, res) => { - res.json({ - hostname: os.hostname(), - platform: os.platform(), - uptime: os.uptime() + res.status(200).json(info); + next(); }); -}); - -module.exports = router; +}; From 51813a04495dbcc24c013c0bddaf830e62f7cdc0 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 19:09:03 +0100 Subject: [PATCH 23/45] Update README.md update --- todoapp/nodejs_api/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/todoapp/nodejs_api/README.md b/todoapp/nodejs_api/README.md index f843709f0a..e699865890 100644 --- a/todoapp/nodejs_api/README.md +++ b/todoapp/nodejs_api/README.md @@ -1,2 +1,2 @@ -#DO276 JavaScript/Node.js To Do List App -Aplicación de ejemplo para gestionar tareas con Node.js y MySQL. \ No newline at end of file +# DO276 JavaScript/Node.js To Do List App +Aplicación de ejemplo para gestionar tareas con Node.js y MySQL. From 9973db334cf999adb97375c547aa3cd3aca9d3b6 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 16 Mar 2025 19:39:42 +0100 Subject: [PATCH 24/45] todo --- todoapp/api_node | 1 - todoapp/node_api/README.md | 18 +++ todoapp/node_api/app.js | 37 +++++ todoapp/node_api/compile.sh | 6 + todoapp/node_api/controllers/items.js | 118 ++++++++++++++++ todoapp/node_api/controllers/serverinfo.js | 29 ++++ todoapp/node_api/models/db.js | 15 +++ todoapp/node_api/models/items.js | 126 ++++++++++++++++++ todoapp/node_api/package.json | 10 ++ todoapp/node_api/run.sh | 3 + todoapp/nodejs_api/README.md | 4 +- todoapp/nodejs_api/app.js | 25 ++-- todoapp/nodejs_api/controllers/items.js | 40 ++---- todoapp/nodejs_api/controllers/serverinfo.js | 18 +-- todoapp/nodejs_api/models/db.js | 26 +++- todoapp/nodejs_api/openshift/deployment.yaml | 120 +++++++++++++++++ todoapp/nodejs_api/package.json | 9 +- todoapp/todoapp_nodejs.zip | Bin 0 -> 3287 bytes todoapp/todoapp_nodejs/README.md | 2 + todoapp/todoapp_nodejs/app.js | 18 +++ todoapp/todoapp_nodejs/compile.sh | 2 + todoapp/todoapp_nodejs/controllers/items.js | 35 +++++ .../todoapp_nodejs/controllers/serverinfo.js | 15 +++ todoapp/todoapp_nodejs/models/db.js | 9 ++ todoapp/todoapp_nodejs/models/items.js | 22 +++ todoapp/todoapp_nodejs/package.json | 14 ++ todoapp/todoapp_nodejs/run.sh | 2 + 27 files changed, 662 insertions(+), 62 deletions(-) delete mode 100644 todoapp/api_node create mode 100644 todoapp/node_api/README.md create mode 100644 todoapp/node_api/app.js create mode 100644 todoapp/node_api/compile.sh create mode 100644 todoapp/node_api/controllers/items.js create mode 100644 todoapp/node_api/controllers/serverinfo.js create mode 100644 todoapp/node_api/models/db.js create mode 100644 todoapp/node_api/models/items.js create mode 100644 todoapp/node_api/package.json create mode 100644 todoapp/node_api/run.sh create mode 100644 todoapp/nodejs_api/openshift/deployment.yaml create mode 100644 todoapp/todoapp_nodejs.zip create mode 100644 todoapp/todoapp_nodejs/README.md create mode 100644 todoapp/todoapp_nodejs/app.js create mode 100644 todoapp/todoapp_nodejs/compile.sh create mode 100644 todoapp/todoapp_nodejs/controllers/items.js create mode 100644 todoapp/todoapp_nodejs/controllers/serverinfo.js create mode 100644 todoapp/todoapp_nodejs/models/db.js create mode 100644 todoapp/todoapp_nodejs/models/items.js create mode 100644 todoapp/todoapp_nodejs/package.json create mode 100644 todoapp/todoapp_nodejs/run.sh diff --git a/todoapp/api_node b/todoapp/api_node deleted file mode 100644 index 8b13789179..0000000000 --- a/todoapp/api_node +++ /dev/null @@ -1 +0,0 @@ - diff --git a/todoapp/node_api/README.md b/todoapp/node_api/README.md new file mode 100644 index 0000000000..f7f0fd4e3d --- /dev/null +++ b/todoapp/node_api/README.md @@ -0,0 +1,18 @@ +# DO276 JavaScript/Node.js To Do List App + +Based on Restify 4.0 and Sequelize 3.14. Tested on Node.js 0.10 from SCL with Mariadb 5.5. + +Do `npm install` do download dependencies. + +Run as `node app.js` + +* Don't do pagination yet. + +* Database connection parameters hardcoded (as a novice developer would usually do). + +* There is a lot of boiler plate code in the controller and the model. There should be a way to have more centralized error handling. + +* Have mysql database initialized and running, and front end deployed to apache and running + +* Access as http://localhost:30000/todo + diff --git a/todoapp/node_api/app.js b/todoapp/node_api/app.js new file mode 100644 index 0000000000..78da6dea9d --- /dev/null +++ b/todoapp/node_api/app.js @@ -0,0 +1,37 @@ + +const restify = require('restify'); +const corsMiddleware = require('restify-cors-middleware'); +const controller = require('./controllers/items'); +const serverinfo = require('./controllers/serverinfo'); +const db = require('./models/db'); +const model = require('./models/items'); + +const cors = corsMiddleware({ + origins: ['*'], + allowHeaders: ['Authorization'], + exposeHeaders: ['Authorization'] +}); + +model.connect(db.params, (err) => { + if (err) throw err; +}); + +const server = restify.createServer(); +server.pre(cors.preflight); +server.use(cors.actual); +server.use(restify.plugins.queryParser()); +server.use(restify.plugins.bodyParser()); + +controller.context(server, '/todo/api', model); +serverinfo.context(server, '/todo/api'); + +const port = process.env.PORT || 30080; +server.listen(port, () => { + console.log(`App is ready at: ${port}`); +}); + +if (process.env.environment === 'production') { + process.on('uncaughtException', (err) => { + console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))); + }); +} \ No newline at end of file diff --git a/todoapp/node_api/compile.sh b/todoapp/node_api/compile.sh new file mode 100644 index 0000000000..1544bb24d7 --- /dev/null +++ b/todoapp/node_api/compile.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +source /opt/rh/nodejs010/enable + +npm install + diff --git a/todoapp/node_api/controllers/items.js b/todoapp/node_api/controllers/items.js new file mode 100644 index 0000000000..fc6993404a --- /dev/null +++ b/todoapp/node_api/controllers/items.js @@ -0,0 +1,118 @@ + +var model = undefined; + +exports.context = function(server, path, itemsModel) { + if (!server) + done('has to provide a restify server object'); + + var context = "/items"; + if (path) + context = path + context; + + server.get(context + '/', this.list); + server.get(context + '/:id', this.read); + server.post(context + '/', this.save); + server.del(context + '/:id', this.destroy); + + model = itemsModel; +}; + +exports.list = function(req, res, next) { + var page_no = req.query.page || 1; + var sortField = req.query.sortFields || "id"; + var sortDirection = req.query.sortDirections || "asc"; + + model.listAll(page_no, sortField, sortDirection, function(err, items) { + if (err) { + next(err); + } + else { + if (items) { + model.countAll(function(err, n) { + if (err) { + next(err); + } + else { + if (n) { + var page = { + "currentPage" : page_no, + "list" : items, + "pageSize" : 10, + "sortDirections" : sortDirection, + "sortFields" : sortField, + "totalResults" : n + }; + res.json(page); + next(); + } + else { + next(new Error("Can't count items")); + } + } + }); + } + else { + next(new Error("Can't retrieve items")); + } + } + }) +}; + +exports.read = function(req, res, next) { + var key = req.params.id; + model.read(key, function(err, item) { + if (err) { + next(err); + } + else { + if (item) { + res.json(item); + next(); + } + else { + next(new Error("Can't retrieve items")); + } + } + }) +}; + + +exports.save = function(req, res, next) { + if (req.params.id) { + model.update(req.params.id, req.params.description, req.params.done, function(err, item) { + if (err) { + next(err); + } + else { + res.json(item); + next(); + } + }); + } + else { + model.create(req.params.description, req.params.done, function(err, item) { + if (err) { + next(err); + } + else { + res.json(item); + next(); + } + }); + } +}; + + +exports.destroy = function(req, res, next) { + if (req.params.id) { + model.destroy(req.params.id, function(err, item) { + if (err) { + next(err); + } + else { + //XXX jee_api does NOT return item on delete + res.json(item); + } + }); + } +} diff --git a/todoapp/node_api/controllers/serverinfo.js b/todoapp/node_api/controllers/serverinfo.js new file mode 100644 index 0000000000..00f4b58d71 --- /dev/null +++ b/todoapp/node_api/controllers/serverinfo.js @@ -0,0 +1,29 @@ +var os = require('os'); + +exports.context = function(server, path) { + if (!server) + done('has to provide a restify server object'); + + server.get(path + '/host', this.serverInfo); +}; + +exports.serverInfo = function(req, res, next) { + var address; + var ifaces = os.networkInterfaces(); + + for (var dev in ifaces) { + var iface = ifaces[dev].filter(function(details) { + return details.family === 'IPv4' && details.internal === false; + }); + if (iface.length > 0) + address = iface[0].address; + } + + var reply = { + ip: address, + hostname: os.hostname() + }; + res.json(reply); + next(); +}; + diff --git a/todoapp/node_api/models/db.js b/todoapp/node_api/models/db.js new file mode 100644 index 0000000000..cc1a33558d --- /dev/null +++ b/todoapp/node_api/models/db.js @@ -0,0 +1,15 @@ + +const { Sequelize } = require('sequelize'); + +module.exports.params = { + dbname: process.env.MYSQL_ENV_MYSQL_DATABASE, + username: process.env.MYSQL_ENV_MYSQL_USER, + password: process.env.MYSQL_ENV_MYSQL_PASSWORD, + params: { + host: process.env.MYSQL_HOST || 'mysql', + port: process.env.MYSQL_PORT || '3306', + dialect: 'mysql', + dialectModule: require('mysql2'), + logging: false + } +}; diff --git a/todoapp/node_api/models/items.js b/todoapp/node_api/models/items.js new file mode 100644 index 0000000000..5301bbb379 --- /dev/null +++ b/todoapp/node_api/models/items.js @@ -0,0 +1,126 @@ +var Sequelize = require("sequelize"); + +var Item = undefined; + +module.exports.connect = function(params, callback) { + var sequlz = new Sequelize( + params.dbname, params.username, params.password, + params.params); + Item = sequlz.define('Item', { + id: { type: Sequelize.BIGINT, + primaryKey: true, unique: true, allowNull: false, + autoIncrement: true }, + description: { type: Sequelize.STRING, + allowNull: true }, + done: { type: Sequelize.BOOLEAN, + allowNull: true } + }, { + timestamps: false, + freezeTableName: true + }); + // drop and create tables, better done globally + /* + Item.sync({ force: true }).then(function() { + callback(); + }).error(function(err) { + callback(err); + }); + */ +} + +exports.disconnect = function(callback) { + //XXX shouln'd to something to close or release the db connection? + callback(); +} + +exports.create = function(description, done, callback) { + Item.create({ + //id: id, + description: description, + done: (done) ? true : false + }).then(function(item) { + callback(null, item); + }).error(function(err) { + callback(err); + }); +} + +exports.update = function(key, description, done, callback) { + Item.find({ where:{ id: key } }).then(function(item) { + if (!item) { + callback(new Error("Nothing found for key " + key)); + } + else { + item.updateAttributes({ + description: description, + done: (done) ? true : false + }).then(function() { + callback(null, item); + }).error(function(err) { + callback(err); + }); + } + }).error(function(err) { + callback(err); + }); +} + + +exports.read = function(key, callback) { + Item.find({ where:{ id: key } }).then(function(item) { + if (!item) { + callback(new Error("Nothing found for key " + key)); + } + else { + //XXX why recreating the item object? + callback(null, { + id: item.id, + description: item.description, + done: item.done + }); + } + }).error(function(err) { + callback(err); + }); +} + +exports.destroy = function(key, callback) { + Item.find({ where:{ id: key } }).then(function(item) { + if (!item) { + callback(new Error("Nothing found for " + key)); + } + else { + item.destroy().then(function() { + callback(null, item); + }).error(function(err) { + callback(err); + }); + } + }).error(function(err) { + callback(err); + }); +} + +exports.countAll = function(callback) { + Item.findAll({ attributes: [[Sequelize.fn('COUNT', Sequelize.col('id')), 'no_items']] } ).then(function(n) { + callback(null, n[0].get('no_items')); + }).error(function(err) { + callback(err); + }); + //callback(null, 100); +} + +exports.listAll = function(page, sortField, sortDirection, callback) { + Item.findAll({ offset: 10 * (page - 1), limit: 10, order: [[sortField, sortDirection]] }).then(function(items) { + var theitems = []; + items.forEach(function(item) { + //XXX why recreating the item objects for theitems? + theitems.push({ + id: item.id, description: item.description, done: item.done }); + }); + callback(null, theitems); + }).error(function(err) { + callback(err); + }); +} + diff --git a/todoapp/node_api/package.json b/todoapp/node_api/package.json new file mode 100644 index 0000000000..2a7513fe63 --- /dev/null +++ b/todoapp/node_api/package.json @@ -0,0 +1,10 @@ +{ + "name": "todo", + "version": "0.0.2", + "private": true, + "dependencies": { + "restify": "^11.1.0", + "sequelize": "^6.37.2", + "mysql2": "^3.6.0" + } +} \ No newline at end of file diff --git a/todoapp/node_api/run.sh b/todoapp/node_api/run.sh new file mode 100644 index 0000000000..d27878942e --- /dev/null +++ b/todoapp/node_api/run.sh @@ -0,0 +1,3 @@ + +#!/bin/bash +npm install && node app.js diff --git a/todoapp/nodejs_api/README.md b/todoapp/nodejs_api/README.md index e699865890..cdbba7c02d 100644 --- a/todoapp/nodejs_api/README.md +++ b/todoapp/nodejs_api/README.md @@ -1,2 +1,2 @@ -# DO276 JavaScript/Node.js To Do List App -Aplicación de ejemplo para gestionar tareas con Node.js y MySQL. +# TodoApp OpenShift +Aplicación TodoApp con Node.js y MySQL lista para desplegar en OpenShift. diff --git a/todoapp/nodejs_api/app.js b/todoapp/nodejs_api/app.js index d684ccc28d..e630001f34 100644 --- a/todoapp/nodejs_api/app.js +++ b/todoapp/nodejs_api/app.js @@ -1,18 +1,21 @@ const express = require('express'); +const bodyParser = require('body-parser'); const app = express(); const db = require('./models/db'); -const itemRoutes = require('./controllers/items'); +const itemsController = require('./controllers/items'); +const serverInfoController = require('./controllers/serverinfo'); -app.use(express.json()); -app.use('/items', itemRoutes); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); -const PORT = process.env.PORT || 8080; +itemsController(app); +serverInfoController(app); -db.sync().then(() => { - console.log("Database synced"); - app.listen(PORT, () => { - console.log(`Server is running on port ${PORT}`); - }); +const port = process.env.PORT || 8080; +db.sequelize.sync().then(() => { + app.listen(port, () => { + console.log(`TodoApp listening on port ${port}`); + }); }).catch(err => { - console.error("Database sync failed:", err); -}); \ No newline at end of file + console.error('Database sync failed:', err); +}); diff --git a/todoapp/nodejs_api/controllers/items.js b/todoapp/nodejs_api/controllers/items.js index ec6a49e62d..a5aa6bb07d 100644 --- a/todoapp/nodejs_api/controllers/items.js +++ b/todoapp/nodejs_api/controllers/items.js @@ -1,35 +1,19 @@ -const express = require('express'); -const router = express.Router(); -const Item = require('../models/items'); +module.exports = function(app) { + const db = require('../models/db'); + const Item = db.Item; -router.get('/', async (req, res) => { + app.get('/items', async (req, res) => { const items = await Item.findAll(); res.json(items); -}); + }); -router.post('/', async (req, res) => { + app.post('/items', async (req, res) => { const newItem = await Item.create(req.body); res.json(newItem); -}); + }); -router.put('/:id', async (req, res) => { - const item = await Item.findByPk(req.params.id); - if (item) { - await item.update(req.body); - res.json(item); - } else { - res.status(404).send('Item not found'); - } -}); - -router.delete('/:id', async (req, res) => { - const item = await Item.findByPk(req.params.id); - if (item) { - await item.destroy(); - res.send('Item deleted'); - } else { - res.status(404).send('Item not found'); - } -}); - -module.exports = router; \ No newline at end of file + app.delete('/items/:id', async (req, res) => { + await Item.destroy({ where: { id: req.params.id }}); + res.json({ message: 'Item deleted' }); + }); +}; diff --git a/todoapp/nodejs_api/controllers/serverinfo.js b/todoapp/nodejs_api/controllers/serverinfo.js index 801c69a755..cca4c078ec 100644 --- a/todoapp/nodejs_api/controllers/serverinfo.js +++ b/todoapp/nodejs_api/controllers/serverinfo.js @@ -1,13 +1,9 @@ -module.exports = function (server) { - server.get('/info', function (req, res, next) { - const info = { - name: 'TodoApp', - version: '1.0.0', - description: 'Simple To-Do application API built with Node.js and Express', - author: 'Generated by ChatGPT' - }; - - res.status(200).json(info); - next(); +module.exports = function(app) { + app.get('/info', (req, res) => { + res.json({ + uptime: process.uptime(), + message: 'OK', + timestamp: Date.now() + }); }); }; diff --git a/todoapp/nodejs_api/models/db.js b/todoapp/nodejs_api/models/db.js index 4d024863e8..16d90d9dfb 100644 --- a/todoapp/nodejs_api/models/db.js +++ b/todoapp/nodejs_api/models/db.js @@ -1,9 +1,25 @@ -const { Sequelize } = require('sequelize'); +const { Sequelize, DataTypes } = require('sequelize'); -const sequelize = new Sequelize(process.env.DB_NAME || 'todoapp', process.env.DB_USER || 'root', process.env.DB_PASSWORD || 'password', { +const sequelize = new Sequelize( + process.env.DB_NAME || 'todoapp', + process.env.DB_USER || 'root', + process.env.DB_PASSWORD || 'password', + { host: process.env.DB_HOST || 'localhost', - dialect: 'mysql', - port: process.env.DB_PORT || 3306 + port: process.env.DB_PORT || 3306, + dialect: 'mysql' + } +); + +const Item = sequelize.define('Item', { + description: { + type: DataTypes.STRING, + allowNull: false + }, + done: { + type: DataTypes.BOOLEAN, + defaultValue: false + } }); -module.exports = sequelize; \ No newline at end of file +module.exports = { sequelize, Item }; diff --git a/todoapp/nodejs_api/openshift/deployment.yaml b/todoapp/nodejs_api/openshift/deployment.yaml new file mode 100644 index 0000000000..d0f270804e --- /dev/null +++ b/todoapp/nodejs_api/openshift/deployment.yaml @@ -0,0 +1,120 @@ +apiVersion: v1 +kind: Secret +metadata: + name: mysql-secret +type: Opaque +data: + MYSQL_ROOT_PASSWORD: cGFzc3dvcmQ= # "password" base64 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql +spec: + replicas: 1 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - name: mysql + image: mysql:5.7 + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-secret + key: MYSQL_ROOT_PASSWORD + - name: MYSQL_DATABASE + value: todoapp + ports: + - containerPort: 3306 + volumeMounts: + - name: mysql-data + mountPath: /var/lib/mysql + volumes: + - name: mysql-data + emptyDir: {} + +--- +apiVersion: v1 +kind: Service +metadata: + name: mysql +spec: + ports: + - port: 3306 + targetPort: 3306 + selector: + app: mysql + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todoapp +spec: + replicas: 1 + selector: + matchLabels: + app: todoapp + template: + metadata: + labels: + app: todoapp + spec: + containers: + - name: todoapp + image: /todoapp:latest + ports: + - containerPort: 8080 + env: + - name: DB_HOST + value: mysql + - name: DB_PORT + value: "3306" + - name: DB_USER + value: root + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-secret + key: MYSQL_ROOT_PASSWORD + - name: DB_NAME + value: todoapp + resources: + limits: + memory: "512Mi" + requests: + memory: "256Mi" + +--- +apiVersion: v1 +kind: Service +metadata: + name: todoapp +spec: + selector: + app: todoapp + ports: + - port: 80 + targetPort: 8080 + +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: todoapp +spec: + to: + kind: Service + name: todoapp + port: + targetPort: 8080 + tls: + termination: edge diff --git a/todoapp/nodejs_api/package.json b/todoapp/nodejs_api/package.json index b87731a1d8..6efad75e58 100644 --- a/todoapp/nodejs_api/package.json +++ b/todoapp/nodejs_api/package.json @@ -1,14 +1,15 @@ { "name": "todoapp", "version": "1.0.0", - "description": "Simple Todo app with Node.js and MySQL", + "description": "Todo application with Node.js and MySQL for OpenShift", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": { "express": "^4.18.2", - "mysql2": "^3.9.2", - "sequelize": "^6.35.1" + "mysql2": "^3.9.4", + "sequelize": "^6.35.1", + "body-parser": "^1.20.2" } -} \ No newline at end of file +} diff --git a/todoapp/todoapp_nodejs.zip b/todoapp/todoapp_nodejs.zip new file mode 100644 index 0000000000000000000000000000000000000000..b1be3d54404d0c279de3ccec74b8b0d98496f7d4 GIT binary patch literal 3287 zcmc&%&2Jk;6nC5OWg#I@K^%}6TvV^6XzVnh3a*0WC{`P#`M?e!aVQ<{PLgSNXSOr5 z4Q^_r+~7apPNk{`PQ6sUazls_hxs!_Bus5AdzTfYv%pld-HoA^Srw` zH-Djmf6u;-KTm%D^F|-O<9Y>FuiIJQ>e48;UhmsKnleOOx@hw>Ft4;SSufh zq+H&kZtKAVveH^mPbt z>shB@Q|XdhWS>Fd1?}1bfn%rQ>U7w@divd)J9Cu^F6xDjKXn&(X%YvgxI05qrffu@Sowq|WD**eO^mnPT5eDS zP0Fh~R;03IUnMfYGDU?WNLZ++jAkf%4m|xow}xI0tz?+zLw?-}?^E{*-~WS)L#s=m zSwP)DJ-goKs-skZkFRh2)PbIh3!kiUgB%y$G3n<`oQx)mXWZLeV@#`bya$4idj-^+ zYp)bX(+BoHj*J^DCfL~bhA})x&u4p*SfuwD->XfRT~moPsAlqWOc%e!&r-m>ER|HrYC7JW<(c5&A%D! z@AWpeuN5j`MpH-INf@@_MS+emrBX?7HjVme&adt4+~{_;3uQn6OG5i83ljiN=&O$M z?6D$(ie*u3ask&$W+IIoLXgj$zcBaw!51R!{vMv-$9N1b!^%@@3aV88IJpmBiy5|z zD^IHh?iqYdXV)^OJg4TEhbMo**U721j4Y371+sZQAKJ>8@*7`ZF3q3*;+Hj)n^d9U p(M!`UtBfqyT!DN8ew1X*F0a7d%@=U=th@~WKSGiIjlUi${{RubtF8b5 literal 0 HcmV?d00001 diff --git a/todoapp/todoapp_nodejs/README.md b/todoapp/todoapp_nodejs/README.md new file mode 100644 index 0000000000..f843709f0a --- /dev/null +++ b/todoapp/todoapp_nodejs/README.md @@ -0,0 +1,2 @@ +#DO276 JavaScript/Node.js To Do List App +Aplicación de ejemplo para gestionar tareas con Node.js y MySQL. \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/app.js b/todoapp/todoapp_nodejs/app.js new file mode 100644 index 0000000000..d684ccc28d --- /dev/null +++ b/todoapp/todoapp_nodejs/app.js @@ -0,0 +1,18 @@ +const express = require('express'); +const app = express(); +const db = require('./models/db'); +const itemRoutes = require('./controllers/items'); + +app.use(express.json()); +app.use('/items', itemRoutes); + +const PORT = process.env.PORT || 8080; + +db.sync().then(() => { + console.log("Database synced"); + app.listen(PORT, () => { + console.log(`Server is running on port ${PORT}`); + }); +}).catch(err => { + console.error("Database sync failed:", err); +}); \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/compile.sh b/todoapp/todoapp_nodejs/compile.sh new file mode 100644 index 0000000000..3add1127d4 --- /dev/null +++ b/todoapp/todoapp_nodejs/compile.sh @@ -0,0 +1,2 @@ +#!/bin/bash +npm install diff --git a/todoapp/todoapp_nodejs/controllers/items.js b/todoapp/todoapp_nodejs/controllers/items.js new file mode 100644 index 0000000000..ec6a49e62d --- /dev/null +++ b/todoapp/todoapp_nodejs/controllers/items.js @@ -0,0 +1,35 @@ +const express = require('express'); +const router = express.Router(); +const Item = require('../models/items'); + +router.get('/', async (req, res) => { + const items = await Item.findAll(); + res.json(items); +}); + +router.post('/', async (req, res) => { + const newItem = await Item.create(req.body); + res.json(newItem); +}); + +router.put('/:id', async (req, res) => { + const item = await Item.findByPk(req.params.id); + if (item) { + await item.update(req.body); + res.json(item); + } else { + res.status(404).send('Item not found'); + } +}); + +router.delete('/:id', async (req, res) => { + const item = await Item.findByPk(req.params.id); + if (item) { + await item.destroy(); + res.send('Item deleted'); + } else { + res.status(404).send('Item not found'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/controllers/serverinfo.js b/todoapp/todoapp_nodejs/controllers/serverinfo.js new file mode 100644 index 0000000000..0acbe20598 --- /dev/null +++ b/todoapp/todoapp_nodejs/controllers/serverinfo.js @@ -0,0 +1,15 @@ +```js +const express = require('express'); +const router = express.Router(); +const os = require('os'); + +router.get('/', (req, res) => { + res.json({ + hostname: os.hostname(), + platform: os.platform(), + uptime: os.uptime() + }); +}); + +module.exports = router; +``` \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/models/db.js b/todoapp/todoapp_nodejs/models/db.js new file mode 100644 index 0000000000..4d024863e8 --- /dev/null +++ b/todoapp/todoapp_nodejs/models/db.js @@ -0,0 +1,9 @@ +const { Sequelize } = require('sequelize'); + +const sequelize = new Sequelize(process.env.DB_NAME || 'todoapp', process.env.DB_USER || 'root', process.env.DB_PASSWORD || 'password', { + host: process.env.DB_HOST || 'localhost', + dialect: 'mysql', + port: process.env.DB_PORT || 3306 +}); + +module.exports = sequelize; \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/models/items.js b/todoapp/todoapp_nodejs/models/items.js new file mode 100644 index 0000000000..bef9e36704 --- /dev/null +++ b/todoapp/todoapp_nodejs/models/items.js @@ -0,0 +1,22 @@ +const { DataTypes } = require('sequelize'); +const sequelize = require('./db'); + +const Item = sequelize.define('Item', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true + }, + description: { + type: DataTypes.STRING, + allowNull: false + }, + done: { + type: DataTypes.BOOLEAN, + defaultValue: false + } +}, { + timestamps: false +}); + +module.exports = Item; \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/package.json b/todoapp/todoapp_nodejs/package.json new file mode 100644 index 0000000000..b87731a1d8 --- /dev/null +++ b/todoapp/todoapp_nodejs/package.json @@ -0,0 +1,14 @@ +{ + "name": "todoapp", + "version": "1.0.0", + "description": "Simple Todo app with Node.js and MySQL", + "main": "app.js", + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "express": "^4.18.2", + "mysql2": "^3.9.2", + "sequelize": "^6.35.1" + } +} \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/run.sh b/todoapp/todoapp_nodejs/run.sh new file mode 100644 index 0000000000..9b12715ba0 --- /dev/null +++ b/todoapp/todoapp_nodejs/run.sh @@ -0,0 +1,2 @@ +#!/bin/bash +npm start From a68c39defc81e8cd70dc76e4d834455a304f216f Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 16 Mar 2025 19:50:48 +0100 Subject: [PATCH 25/45] cambios nuevos para actualizar la version1 --- todoapp/node_api/README.md | 18 --- todoapp/node_api/app.js | 37 ----- todoapp/node_api/compile.sh | 6 - todoapp/node_api/controllers/items.js | 118 ---------------- todoapp/node_api/controllers/serverinfo.js | 29 ---- todoapp/node_api/models/db.js | 15 --- todoapp/node_api/models/items.js | 126 ------------------ todoapp/node_api/package.json | 10 -- todoapp/node_api/run.sh | 3 - todoapp/todoapp-openshift.zip | Bin 0 -> 5318 bytes todoapp/todoapp-openshift/README.md | 2 + todoapp/todoapp-openshift/app.js | 21 +++ .../compile.sh | 0 .../todoapp-openshift/controllers/items.js | 19 +++ .../controllers/serverinfo.js | 9 ++ todoapp/todoapp-openshift/models/db.js | 25 ++++ .../openshift/deployment.yaml | 120 +++++++++++++++++ .../package.json | 9 +- .../run.sh | 0 todoapp/todoapp_nodejs.zip | Bin 3287 -> 0 bytes todoapp/todoapp_nodejs/README.md | 2 - todoapp/todoapp_nodejs/app.js | 18 --- todoapp/todoapp_nodejs/controllers/items.js | 35 ----- .../todoapp_nodejs/controllers/serverinfo.js | 15 --- todoapp/todoapp_nodejs/models/db.js | 9 -- todoapp/todoapp_nodejs/models/items.js | 22 --- 26 files changed, 201 insertions(+), 467 deletions(-) delete mode 100644 todoapp/node_api/README.md delete mode 100644 todoapp/node_api/app.js delete mode 100644 todoapp/node_api/compile.sh delete mode 100644 todoapp/node_api/controllers/items.js delete mode 100644 todoapp/node_api/controllers/serverinfo.js delete mode 100644 todoapp/node_api/models/db.js delete mode 100644 todoapp/node_api/models/items.js delete mode 100644 todoapp/node_api/package.json delete mode 100644 todoapp/node_api/run.sh create mode 100644 todoapp/todoapp-openshift.zip create mode 100644 todoapp/todoapp-openshift/README.md create mode 100644 todoapp/todoapp-openshift/app.js rename todoapp/{todoapp_nodejs => todoapp-openshift}/compile.sh (100%) create mode 100644 todoapp/todoapp-openshift/controllers/items.js create mode 100644 todoapp/todoapp-openshift/controllers/serverinfo.js create mode 100644 todoapp/todoapp-openshift/models/db.js create mode 100644 todoapp/todoapp-openshift/openshift/deployment.yaml rename todoapp/{todoapp_nodejs => todoapp-openshift}/package.json (50%) rename todoapp/{todoapp_nodejs => todoapp-openshift}/run.sh (100%) delete mode 100644 todoapp/todoapp_nodejs.zip delete mode 100644 todoapp/todoapp_nodejs/README.md delete mode 100644 todoapp/todoapp_nodejs/app.js delete mode 100644 todoapp/todoapp_nodejs/controllers/items.js delete mode 100644 todoapp/todoapp_nodejs/controllers/serverinfo.js delete mode 100644 todoapp/todoapp_nodejs/models/db.js delete mode 100644 todoapp/todoapp_nodejs/models/items.js diff --git a/todoapp/node_api/README.md b/todoapp/node_api/README.md deleted file mode 100644 index f7f0fd4e3d..0000000000 --- a/todoapp/node_api/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# DO276 JavaScript/Node.js To Do List App - -Based on Restify 4.0 and Sequelize 3.14. Tested on Node.js 0.10 from SCL with Mariadb 5.5. - -Do `npm install` do download dependencies. - -Run as `node app.js` - -* Don't do pagination yet. - -* Database connection parameters hardcoded (as a novice developer would usually do). - -* There is a lot of boiler plate code in the controller and the model. There should be a way to have more centralized error handling. - -* Have mysql database initialized and running, and front end deployed to apache and running - -* Access as http://localhost:30000/todo - diff --git a/todoapp/node_api/app.js b/todoapp/node_api/app.js deleted file mode 100644 index 78da6dea9d..0000000000 --- a/todoapp/node_api/app.js +++ /dev/null @@ -1,37 +0,0 @@ - -const restify = require('restify'); -const corsMiddleware = require('restify-cors-middleware'); -const controller = require('./controllers/items'); -const serverinfo = require('./controllers/serverinfo'); -const db = require('./models/db'); -const model = require('./models/items'); - -const cors = corsMiddleware({ - origins: ['*'], - allowHeaders: ['Authorization'], - exposeHeaders: ['Authorization'] -}); - -model.connect(db.params, (err) => { - if (err) throw err; -}); - -const server = restify.createServer(); -server.pre(cors.preflight); -server.use(cors.actual); -server.use(restify.plugins.queryParser()); -server.use(restify.plugins.bodyParser()); - -controller.context(server, '/todo/api', model); -serverinfo.context(server, '/todo/api'); - -const port = process.env.PORT || 30080; -server.listen(port, () => { - console.log(`App is ready at: ${port}`); -}); - -if (process.env.environment === 'production') { - process.on('uncaughtException', (err) => { - console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2))); - }); -} \ No newline at end of file diff --git a/todoapp/node_api/compile.sh b/todoapp/node_api/compile.sh deleted file mode 100644 index 1544bb24d7..0000000000 --- a/todoapp/node_api/compile.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -source /opt/rh/nodejs010/enable - -npm install - diff --git a/todoapp/node_api/controllers/items.js b/todoapp/node_api/controllers/items.js deleted file mode 100644 index fc6993404a..0000000000 --- a/todoapp/node_api/controllers/items.js +++ /dev/null @@ -1,118 +0,0 @@ - -var model = undefined; - -exports.context = function(server, path, itemsModel) { - if (!server) - done('has to provide a restify server object'); - - var context = "/items"; - if (path) - context = path + context; - - server.get(context + '/', this.list); - server.get(context + '/:id', this.read); - server.post(context + '/', this.save); - server.del(context + '/:id', this.destroy); - - model = itemsModel; -}; - -exports.list = function(req, res, next) { - var page_no = req.query.page || 1; - var sortField = req.query.sortFields || "id"; - var sortDirection = req.query.sortDirections || "asc"; - - model.listAll(page_no, sortField, sortDirection, function(err, items) { - if (err) { - next(err); - } - else { - if (items) { - model.countAll(function(err, n) { - if (err) { - next(err); - } - else { - if (n) { - var page = { - "currentPage" : page_no, - "list" : items, - "pageSize" : 10, - "sortDirections" : sortDirection, - "sortFields" : sortField, - "totalResults" : n - }; - res.json(page); - next(); - } - else { - next(new Error("Can't count items")); - } - } - }); - } - else { - next(new Error("Can't retrieve items")); - } - } - }) -}; - -exports.read = function(req, res, next) { - var key = req.params.id; - model.read(key, function(err, item) { - if (err) { - next(err); - } - else { - if (item) { - res.json(item); - next(); - } - else { - next(new Error("Can't retrieve items")); - } - } - }) -}; - - -exports.save = function(req, res, next) { - if (req.params.id) { - model.update(req.params.id, req.params.description, req.params.done, function(err, item) { - if (err) { - next(err); - } - else { - res.json(item); - next(); - } - }); - } - else { - model.create(req.params.description, req.params.done, function(err, item) { - if (err) { - next(err); - } - else { - res.json(item); - next(); - } - }); - } -}; - - -exports.destroy = function(req, res, next) { - if (req.params.id) { - model.destroy(req.params.id, function(err, item) { - if (err) { - next(err); - } - else { - //XXX jee_api does NOT return item on delete - res.json(item); - } - }); - } -} diff --git a/todoapp/node_api/controllers/serverinfo.js b/todoapp/node_api/controllers/serverinfo.js deleted file mode 100644 index 00f4b58d71..0000000000 --- a/todoapp/node_api/controllers/serverinfo.js +++ /dev/null @@ -1,29 +0,0 @@ -var os = require('os'); - -exports.context = function(server, path) { - if (!server) - done('has to provide a restify server object'); - - server.get(path + '/host', this.serverInfo); -}; - -exports.serverInfo = function(req, res, next) { - var address; - var ifaces = os.networkInterfaces(); - - for (var dev in ifaces) { - var iface = ifaces[dev].filter(function(details) { - return details.family === 'IPv4' && details.internal === false; - }); - if (iface.length > 0) - address = iface[0].address; - } - - var reply = { - ip: address, - hostname: os.hostname() - }; - res.json(reply); - next(); -}; - diff --git a/todoapp/node_api/models/db.js b/todoapp/node_api/models/db.js deleted file mode 100644 index cc1a33558d..0000000000 --- a/todoapp/node_api/models/db.js +++ /dev/null @@ -1,15 +0,0 @@ - -const { Sequelize } = require('sequelize'); - -module.exports.params = { - dbname: process.env.MYSQL_ENV_MYSQL_DATABASE, - username: process.env.MYSQL_ENV_MYSQL_USER, - password: process.env.MYSQL_ENV_MYSQL_PASSWORD, - params: { - host: process.env.MYSQL_HOST || 'mysql', - port: process.env.MYSQL_PORT || '3306', - dialect: 'mysql', - dialectModule: require('mysql2'), - logging: false - } -}; diff --git a/todoapp/node_api/models/items.js b/todoapp/node_api/models/items.js deleted file mode 100644 index 5301bbb379..0000000000 --- a/todoapp/node_api/models/items.js +++ /dev/null @@ -1,126 +0,0 @@ -var Sequelize = require("sequelize"); - -var Item = undefined; - -module.exports.connect = function(params, callback) { - var sequlz = new Sequelize( - params.dbname, params.username, params.password, - params.params); - Item = sequlz.define('Item', { - id: { type: Sequelize.BIGINT, - primaryKey: true, unique: true, allowNull: false, - autoIncrement: true }, - description: { type: Sequelize.STRING, - allowNull: true }, - done: { type: Sequelize.BOOLEAN, - allowNull: true } - }, { - timestamps: false, - freezeTableName: true - }); - // drop and create tables, better done globally - /* - Item.sync({ force: true }).then(function() { - callback(); - }).error(function(err) { - callback(err); - }); - */ -} - -exports.disconnect = function(callback) { - //XXX shouln'd to something to close or release the db connection? - callback(); -} - -exports.create = function(description, done, callback) { - Item.create({ - //id: id, - description: description, - done: (done) ? true : false - }).then(function(item) { - callback(null, item); - }).error(function(err) { - callback(err); - }); -} - -exports.update = function(key, description, done, callback) { - Item.find({ where:{ id: key } }).then(function(item) { - if (!item) { - callback(new Error("Nothing found for key " + key)); - } - else { - item.updateAttributes({ - description: description, - done: (done) ? true : false - }).then(function() { - callback(null, item); - }).error(function(err) { - callback(err); - }); - } - }).error(function(err) { - callback(err); - }); -} - - -exports.read = function(key, callback) { - Item.find({ where:{ id: key } }).then(function(item) { - if (!item) { - callback(new Error("Nothing found for key " + key)); - } - else { - //XXX why recreating the item object? - callback(null, { - id: item.id, - description: item.description, - done: item.done - }); - } - }).error(function(err) { - callback(err); - }); -} - -exports.destroy = function(key, callback) { - Item.find({ where:{ id: key } }).then(function(item) { - if (!item) { - callback(new Error("Nothing found for " + key)); - } - else { - item.destroy().then(function() { - callback(null, item); - }).error(function(err) { - callback(err); - }); - } - }).error(function(err) { - callback(err); - }); -} - -exports.countAll = function(callback) { - Item.findAll({ attributes: [[Sequelize.fn('COUNT', Sequelize.col('id')), 'no_items']] } ).then(function(n) { - callback(null, n[0].get('no_items')); - }).error(function(err) { - callback(err); - }); - //callback(null, 100); -} - -exports.listAll = function(page, sortField, sortDirection, callback) { - Item.findAll({ offset: 10 * (page - 1), limit: 10, order: [[sortField, sortDirection]] }).then(function(items) { - var theitems = []; - items.forEach(function(item) { - //XXX why recreating the item objects for theitems? - theitems.push({ - id: item.id, description: item.description, done: item.done }); - }); - callback(null, theitems); - }).error(function(err) { - callback(err); - }); -} - diff --git a/todoapp/node_api/package.json b/todoapp/node_api/package.json deleted file mode 100644 index 2a7513fe63..0000000000 --- a/todoapp/node_api/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "todo", - "version": "0.0.2", - "private": true, - "dependencies": { - "restify": "^11.1.0", - "sequelize": "^6.37.2", - "mysql2": "^3.6.0" - } -} \ No newline at end of file diff --git a/todoapp/node_api/run.sh b/todoapp/node_api/run.sh deleted file mode 100644 index d27878942e..0000000000 --- a/todoapp/node_api/run.sh +++ /dev/null @@ -1,3 +0,0 @@ - -#!/bin/bash -npm install && node app.js diff --git a/todoapp/todoapp-openshift.zip b/todoapp/todoapp-openshift.zip new file mode 100644 index 0000000000000000000000000000000000000000..4be1be1187d2f0c7c93dd236bf67a1969e19feaf GIT binary patch literal 5318 zcmc&&&u<(_6`pJY%eFWmv><*+sBjQ7mh2w?NJ8k4WhdAhOk$6B#=9sW;gq|}p5AnK zb-H_OCSD`uvJy9hgv1}P65_yV;lPCp5}XnL0$OQr2rdYL#P_PYs%L5@5S9ZYl{~I` z@6~&+-uJz#*}r%B%F8YK{P{=ucSe8w=ZlB~Iqbo7Suyebybxu{ZnHu>9>;~~wCkz%@-0ux9LZ?1&x=wN z(_%Ec3NJ9-h{7~vY6~4}Av&7Y^t&lSO3H3@)M&<)NXu`?tSV%Z%Av6CIk=TX+uF{H_YN0}IxqSHi(#K^3(jKu|O<027R2;Za5IfAT2hOYsuim_l9 zq~keJbYKM2i+rq?>J;a)sF0$(kReXP7ul)5-ya;Xx8G(r*KV%e@}eWZ!~uyUej@yG zl7*dRzZ!|G(^+P>Ut#ASW8^T^1}4ee3Tu`aqmz`0@Dq8`d1z`+OUKy>LzyWTzI0B1 zE*`>ZhLCP~7t4Ogt8mm21x{aYWNcwd7M=DMulNx!1tYiEF^>}@rM<$itPI?8%JJ`C z{_Y>XeyP=>@o|)6&cjFigi2gy6vtA=Q?V4Vr3w&1P)jQ`i9;@9nbG{Zzvi#$SpXm` z;=HO?C@{(c0g2|=SzL`QfOraacO>SEo}N<^{<(Ed(dj>hQE2; zUpH%0s8g%!{>BOsBQ&(S6b*8BMQE- z!q0fDP5Q@i7WI;ZxQt2wTACu1sD(+rTQ1B0X1h$B)oxF17#4z8f_(Jpu-$!Y9d~E& zseo1;YBz`@An@7YPVEN>fmY1ZthdAT`>bdQ4jSal|f&3ufX!XDOHpxD8la z1))8N+KM)6@^GR5>u>#K<5#E$8lQFQqM_#JD-Hr`eY!;Fpt}XfYL80;n6WXqB8AU} zY4!h|WdbmLnxOjk+GdheQ08eKFp!<_GkMloRth>TiYVP!fBe_q|MGL_xHO37Y|le@ zy0FjL&`|mc8RiF*T$Jnr1&B~|Gqzly`jytRa}Y#1G*&wB$pl6%Wb4l1UT=4sx=6bw zQx%gV^Tu#{pkxXut3?9)z2WfN{lS(J%6VCy$pZC--E>+d_ z^(IfoP_Q=8MB(-v-<>n-{EDWp3%7>)e|qQf7e3Z%(IC7?G?ALp_q!pkpz$KNJii$_5t^fg0YYmu6=xV8#bwvG~<96X0x!ni2X&w&x z{eweu_yG&=zV;;Cj84P!_1lbHWlN?MmKgQ_8`nH^@n z5t5??MA5{{fUV=d66_XMvY-`UlrALq`4O&=dO}fs9Tp@|0C@tO*3whqlXfzr=%`|= z+5r-!wuNf}5^MHZoz9?ghUDT@@t{g;aNYlkT>un}CSyi-L2j)AW2aO+uN5+F6ln{6 zSog$aAdY8O79J|8G@nOe60m=_?W}8Cy@TGJ-f-LX3O8MSBeM&tbvN#;HW}MjASX0i z;ZvE6Q?V<@S!MItWJT8`)t^lEK;)aN>G!y=8^#T&6RR0&an4>WD`e6WLY}y=Bq)wn| z+M0nVak`?6y!KPe&Upq1n{HT%B8@Zk{tcLjP6QrjmtJ`J^0R-I!p%Z`-hE1c?2lBg zn)^GFR%*50efkc*>W8zd<39Eqoljk!efqna?(4PD{K1v!x2&t@zFHf--#|~lVO<^f zz1ryfP3`6U`h*+2Yr%clG!{Pb;_Ul(=AGl3aUTthnSa2{^b^9>bgzny=Bs%7+X{6r Zj{EmMLQi}AI{8xT^LVNJ { + app.listen(port, () => { + console.log(`TodoApp listening on port ${port}`); + }); +}).catch(err => { + console.error('Database sync failed:', err); +}); diff --git a/todoapp/todoapp_nodejs/compile.sh b/todoapp/todoapp-openshift/compile.sh similarity index 100% rename from todoapp/todoapp_nodejs/compile.sh rename to todoapp/todoapp-openshift/compile.sh diff --git a/todoapp/todoapp-openshift/controllers/items.js b/todoapp/todoapp-openshift/controllers/items.js new file mode 100644 index 0000000000..a5aa6bb07d --- /dev/null +++ b/todoapp/todoapp-openshift/controllers/items.js @@ -0,0 +1,19 @@ +module.exports = function(app) { + const db = require('../models/db'); + const Item = db.Item; + + app.get('/items', async (req, res) => { + const items = await Item.findAll(); + res.json(items); + }); + + app.post('/items', async (req, res) => { + const newItem = await Item.create(req.body); + res.json(newItem); + }); + + app.delete('/items/:id', async (req, res) => { + await Item.destroy({ where: { id: req.params.id }}); + res.json({ message: 'Item deleted' }); + }); +}; diff --git a/todoapp/todoapp-openshift/controllers/serverinfo.js b/todoapp/todoapp-openshift/controllers/serverinfo.js new file mode 100644 index 0000000000..cca4c078ec --- /dev/null +++ b/todoapp/todoapp-openshift/controllers/serverinfo.js @@ -0,0 +1,9 @@ +module.exports = function(app) { + app.get('/info', (req, res) => { + res.json({ + uptime: process.uptime(), + message: 'OK', + timestamp: Date.now() + }); + }); +}; diff --git a/todoapp/todoapp-openshift/models/db.js b/todoapp/todoapp-openshift/models/db.js new file mode 100644 index 0000000000..16d90d9dfb --- /dev/null +++ b/todoapp/todoapp-openshift/models/db.js @@ -0,0 +1,25 @@ +const { Sequelize, DataTypes } = require('sequelize'); + +const sequelize = new Sequelize( + process.env.DB_NAME || 'todoapp', + process.env.DB_USER || 'root', + process.env.DB_PASSWORD || 'password', + { + host: process.env.DB_HOST || 'localhost', + port: process.env.DB_PORT || 3306, + dialect: 'mysql' + } +); + +const Item = sequelize.define('Item', { + description: { + type: DataTypes.STRING, + allowNull: false + }, + done: { + type: DataTypes.BOOLEAN, + defaultValue: false + } +}); + +module.exports = { sequelize, Item }; diff --git a/todoapp/todoapp-openshift/openshift/deployment.yaml b/todoapp/todoapp-openshift/openshift/deployment.yaml new file mode 100644 index 0000000000..d0f270804e --- /dev/null +++ b/todoapp/todoapp-openshift/openshift/deployment.yaml @@ -0,0 +1,120 @@ +apiVersion: v1 +kind: Secret +metadata: + name: mysql-secret +type: Opaque +data: + MYSQL_ROOT_PASSWORD: cGFzc3dvcmQ= # "password" base64 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql +spec: + replicas: 1 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - name: mysql + image: mysql:5.7 + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-secret + key: MYSQL_ROOT_PASSWORD + - name: MYSQL_DATABASE + value: todoapp + ports: + - containerPort: 3306 + volumeMounts: + - name: mysql-data + mountPath: /var/lib/mysql + volumes: + - name: mysql-data + emptyDir: {} + +--- +apiVersion: v1 +kind: Service +metadata: + name: mysql +spec: + ports: + - port: 3306 + targetPort: 3306 + selector: + app: mysql + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todoapp +spec: + replicas: 1 + selector: + matchLabels: + app: todoapp + template: + metadata: + labels: + app: todoapp + spec: + containers: + - name: todoapp + image: /todoapp:latest + ports: + - containerPort: 8080 + env: + - name: DB_HOST + value: mysql + - name: DB_PORT + value: "3306" + - name: DB_USER + value: root + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-secret + key: MYSQL_ROOT_PASSWORD + - name: DB_NAME + value: todoapp + resources: + limits: + memory: "512Mi" + requests: + memory: "256Mi" + +--- +apiVersion: v1 +kind: Service +metadata: + name: todoapp +spec: + selector: + app: todoapp + ports: + - port: 80 + targetPort: 8080 + +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: todoapp +spec: + to: + kind: Service + name: todoapp + port: + targetPort: 8080 + tls: + termination: edge diff --git a/todoapp/todoapp_nodejs/package.json b/todoapp/todoapp-openshift/package.json similarity index 50% rename from todoapp/todoapp_nodejs/package.json rename to todoapp/todoapp-openshift/package.json index b87731a1d8..6efad75e58 100644 --- a/todoapp/todoapp_nodejs/package.json +++ b/todoapp/todoapp-openshift/package.json @@ -1,14 +1,15 @@ { "name": "todoapp", "version": "1.0.0", - "description": "Simple Todo app with Node.js and MySQL", + "description": "Todo application with Node.js and MySQL for OpenShift", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": { "express": "^4.18.2", - "mysql2": "^3.9.2", - "sequelize": "^6.35.1" + "mysql2": "^3.9.4", + "sequelize": "^6.35.1", + "body-parser": "^1.20.2" } -} \ No newline at end of file +} diff --git a/todoapp/todoapp_nodejs/run.sh b/todoapp/todoapp-openshift/run.sh similarity index 100% rename from todoapp/todoapp_nodejs/run.sh rename to todoapp/todoapp-openshift/run.sh diff --git a/todoapp/todoapp_nodejs.zip b/todoapp/todoapp_nodejs.zip deleted file mode 100644 index b1be3d54404d0c279de3ccec74b8b0d98496f7d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3287 zcmc&%&2Jk;6nC5OWg#I@K^%}6TvV^6XzVnh3a*0WC{`P#`M?e!aVQ<{PLgSNXSOr5 z4Q^_r+~7apPNk{`PQ6sUazls_hxs!_Bus5AdzTfYv%pld-HoA^Srw` zH-Djmf6u;-KTm%D^F|-O<9Y>FuiIJQ>e48;UhmsKnleOOx@hw>Ft4;SSufh zq+H&kZtKAVveH^mPbt z>shB@Q|XdhWS>Fd1?}1bfn%rQ>U7w@divd)J9Cu^F6xDjKXn&(X%YvgxI05qrffu@Sowq|WD**eO^mnPT5eDS zP0Fh~R;03IUnMfYGDU?WNLZ++jAkf%4m|xow}xI0tz?+zLw?-}?^E{*-~WS)L#s=m zSwP)DJ-goKs-skZkFRh2)PbIh3!kiUgB%y$G3n<`oQx)mXWZLeV@#`bya$4idj-^+ zYp)bX(+BoHj*J^DCfL~bhA})x&u4p*SfuwD->XfRT~moPsAlqWOc%e!&r-m>ER|HrYC7JW<(c5&A%D! z@AWpeuN5j`MpH-INf@@_MS+emrBX?7HjVme&adt4+~{_;3uQn6OG5i83ljiN=&O$M z?6D$(ie*u3ask&$W+IIoLXgj$zcBaw!51R!{vMv-$9N1b!^%@@3aV88IJpmBiy5|z zD^IHh?iqYdXV)^OJg4TEhbMo**U721j4Y371+sZQAKJ>8@*7`ZF3q3*;+Hj)n^d9U p(M!`UtBfqyT!DN8ew1X*F0a7d%@=U=th@~WKSGiIjlUi${{RubtF8b5 diff --git a/todoapp/todoapp_nodejs/README.md b/todoapp/todoapp_nodejs/README.md deleted file mode 100644 index f843709f0a..0000000000 --- a/todoapp/todoapp_nodejs/README.md +++ /dev/null @@ -1,2 +0,0 @@ -#DO276 JavaScript/Node.js To Do List App -Aplicación de ejemplo para gestionar tareas con Node.js y MySQL. \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/app.js b/todoapp/todoapp_nodejs/app.js deleted file mode 100644 index d684ccc28d..0000000000 --- a/todoapp/todoapp_nodejs/app.js +++ /dev/null @@ -1,18 +0,0 @@ -const express = require('express'); -const app = express(); -const db = require('./models/db'); -const itemRoutes = require('./controllers/items'); - -app.use(express.json()); -app.use('/items', itemRoutes); - -const PORT = process.env.PORT || 8080; - -db.sync().then(() => { - console.log("Database synced"); - app.listen(PORT, () => { - console.log(`Server is running on port ${PORT}`); - }); -}).catch(err => { - console.error("Database sync failed:", err); -}); \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/controllers/items.js b/todoapp/todoapp_nodejs/controllers/items.js deleted file mode 100644 index ec6a49e62d..0000000000 --- a/todoapp/todoapp_nodejs/controllers/items.js +++ /dev/null @@ -1,35 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const Item = require('../models/items'); - -router.get('/', async (req, res) => { - const items = await Item.findAll(); - res.json(items); -}); - -router.post('/', async (req, res) => { - const newItem = await Item.create(req.body); - res.json(newItem); -}); - -router.put('/:id', async (req, res) => { - const item = await Item.findByPk(req.params.id); - if (item) { - await item.update(req.body); - res.json(item); - } else { - res.status(404).send('Item not found'); - } -}); - -router.delete('/:id', async (req, res) => { - const item = await Item.findByPk(req.params.id); - if (item) { - await item.destroy(); - res.send('Item deleted'); - } else { - res.status(404).send('Item not found'); - } -}); - -module.exports = router; \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/controllers/serverinfo.js b/todoapp/todoapp_nodejs/controllers/serverinfo.js deleted file mode 100644 index 0acbe20598..0000000000 --- a/todoapp/todoapp_nodejs/controllers/serverinfo.js +++ /dev/null @@ -1,15 +0,0 @@ -```js -const express = require('express'); -const router = express.Router(); -const os = require('os'); - -router.get('/', (req, res) => { - res.json({ - hostname: os.hostname(), - platform: os.platform(), - uptime: os.uptime() - }); -}); - -module.exports = router; -``` \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/models/db.js b/todoapp/todoapp_nodejs/models/db.js deleted file mode 100644 index 4d024863e8..0000000000 --- a/todoapp/todoapp_nodejs/models/db.js +++ /dev/null @@ -1,9 +0,0 @@ -const { Sequelize } = require('sequelize'); - -const sequelize = new Sequelize(process.env.DB_NAME || 'todoapp', process.env.DB_USER || 'root', process.env.DB_PASSWORD || 'password', { - host: process.env.DB_HOST || 'localhost', - dialect: 'mysql', - port: process.env.DB_PORT || 3306 -}); - -module.exports = sequelize; \ No newline at end of file diff --git a/todoapp/todoapp_nodejs/models/items.js b/todoapp/todoapp_nodejs/models/items.js deleted file mode 100644 index bef9e36704..0000000000 --- a/todoapp/todoapp_nodejs/models/items.js +++ /dev/null @@ -1,22 +0,0 @@ -const { DataTypes } = require('sequelize'); -const sequelize = require('./db'); - -const Item = sequelize.define('Item', { - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - description: { - type: DataTypes.STRING, - allowNull: false - }, - done: { - type: DataTypes.BOOLEAN, - defaultValue: false - } -}, { - timestamps: false -}); - -module.exports = Item; \ No newline at end of file From 0fb250c83625897da124271452845d8b243ca155 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 16 Mar 2025 20:02:51 +0100 Subject: [PATCH 26/45] cambio nombre directorio --- todoapp/{todoapp-openshift => todoapp_openshift}/README.md | 0 todoapp/{todoapp-openshift => todoapp_openshift}/app.js | 0 todoapp/{todoapp-openshift => todoapp_openshift}/compile.sh | 0 .../{todoapp-openshift => todoapp_openshift}/controllers/items.js | 0 .../controllers/serverinfo.js | 0 todoapp/{todoapp-openshift => todoapp_openshift}/models/db.js | 0 .../openshift/deployment.yaml | 0 todoapp/{todoapp-openshift => todoapp_openshift}/package.json | 0 todoapp/{todoapp-openshift => todoapp_openshift}/run.sh | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename todoapp/{todoapp-openshift => todoapp_openshift}/README.md (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/app.js (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/compile.sh (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/controllers/items.js (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/controllers/serverinfo.js (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/models/db.js (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/openshift/deployment.yaml (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/package.json (100%) rename todoapp/{todoapp-openshift => todoapp_openshift}/run.sh (100%) diff --git a/todoapp/todoapp-openshift/README.md b/todoapp/todoapp_openshift/README.md similarity index 100% rename from todoapp/todoapp-openshift/README.md rename to todoapp/todoapp_openshift/README.md diff --git a/todoapp/todoapp-openshift/app.js b/todoapp/todoapp_openshift/app.js similarity index 100% rename from todoapp/todoapp-openshift/app.js rename to todoapp/todoapp_openshift/app.js diff --git a/todoapp/todoapp-openshift/compile.sh b/todoapp/todoapp_openshift/compile.sh similarity index 100% rename from todoapp/todoapp-openshift/compile.sh rename to todoapp/todoapp_openshift/compile.sh diff --git a/todoapp/todoapp-openshift/controllers/items.js b/todoapp/todoapp_openshift/controllers/items.js similarity index 100% rename from todoapp/todoapp-openshift/controllers/items.js rename to todoapp/todoapp_openshift/controllers/items.js diff --git a/todoapp/todoapp-openshift/controllers/serverinfo.js b/todoapp/todoapp_openshift/controllers/serverinfo.js similarity index 100% rename from todoapp/todoapp-openshift/controllers/serverinfo.js rename to todoapp/todoapp_openshift/controllers/serverinfo.js diff --git a/todoapp/todoapp-openshift/models/db.js b/todoapp/todoapp_openshift/models/db.js similarity index 100% rename from todoapp/todoapp-openshift/models/db.js rename to todoapp/todoapp_openshift/models/db.js diff --git a/todoapp/todoapp-openshift/openshift/deployment.yaml b/todoapp/todoapp_openshift/openshift/deployment.yaml similarity index 100% rename from todoapp/todoapp-openshift/openshift/deployment.yaml rename to todoapp/todoapp_openshift/openshift/deployment.yaml diff --git a/todoapp/todoapp-openshift/package.json b/todoapp/todoapp_openshift/package.json similarity index 100% rename from todoapp/todoapp-openshift/package.json rename to todoapp/todoapp_openshift/package.json diff --git a/todoapp/todoapp-openshift/run.sh b/todoapp/todoapp_openshift/run.sh similarity index 100% rename from todoapp/todoapp-openshift/run.sh rename to todoapp/todoapp_openshift/run.sh From 9e8e08e10dc0716aa7d85e115727375c82ea9a46 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 22:46:05 +0100 Subject: [PATCH 27/45] Create openshift-deploy.yaml nuevo deployment --- todoapp/todoapp_openshift/openshift-deploy.yaml | 1 + 1 file changed, 1 insertion(+) create mode 100644 todoapp/todoapp_openshift/openshift-deploy.yaml diff --git a/todoapp/todoapp_openshift/openshift-deploy.yaml b/todoapp/todoapp_openshift/openshift-deploy.yaml new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/todoapp/todoapp_openshift/openshift-deploy.yaml @@ -0,0 +1 @@ + From b15a543f0796a3172c14cac00eed8d2d00538444 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Sun, 16 Mar 2025 22:46:36 +0100 Subject: [PATCH 28/45] Update openshift-deploy.yaml nuevo --- .../todoapp_openshift/openshift-deploy.yaml | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/todoapp/todoapp_openshift/openshift-deploy.yaml b/todoapp/todoapp_openshift/openshift-deploy.yaml index 8b13789179..25c614b418 100644 --- a/todoapp/todoapp_openshift/openshift-deploy.yaml +++ b/todoapp/todoapp_openshift/openshift-deploy.yaml @@ -1 +1,151 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todoapp + labels: + app: todoapp +spec: + replicas: 1 + selector: + matchLabels: + app: todoapp + template: + metadata: + labels: + app: todoapp + spec: + containers: + - name: todoapp + image: image-registry.openshift-image-registry.svc:5000/superlinuxec-dev/todoapp:latest + ports: + - containerPort: 8080 + env: + - name: NODE_ENV + value: "production" + - name: DB_NAME + value: "todoapp" + - name: DB_USER + value: "todo" + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: todoapp-db-secret + key: DB_PASSWORD + - name: DB_HOST + value: "mysql" + - name: DB_PORT + value: "3306" + resources: + limits: + memory: "512Mi" + requests: + memory: "256Mi" + livenessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 30 + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 5 + periodSeconds: 10 +--- +apiVersion: v1 +kind: Service +metadata: + name: todoapp + labels: + app: todoapp +spec: + selector: + app: todoapp + ports: + - protocol: TCP + port: 80 + targetPort: 8080 +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: todoapp + labels: + app: todoapp +spec: + to: + kind: Service + name: todoapp + port: + targetPort: 8080 + tls: + termination: edge +--- +apiVersion: v1 +kind: Secret +metadata: + name: todoapp-db-secret + labels: + app: todoapp +type: Opaque +data: + DB_PASSWORD: dG9kbzEyMw== # "todo123" base64 encoded +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql + labels: + app: mysql +spec: + replicas: 1 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - name: mysql + image: mysql:5.7 + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: todoapp-db-secret + key: DB_PASSWORD + - name: MYSQL_DATABASE + value: "todoapp" + - name: MYSQL_USER + value: "todo" + - name: MYSQL_PASSWORD + valueFrom: + secretKeyRef: + name: todoapp-db-secret + key: DB_PASSWORD + ports: + - containerPort: 3306 + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + volumes: + - name: mysql-persistent-storage + emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: mysql + labels: + app: mysql +spec: + ports: + - port: 3306 + targetPort: 3306 + selector: + app: mysql + clusterIP: None # Para permitir descubrimiento DNS estable entre pods From f139b19872838bb0e17fedb3e1834976dfd2f1eb Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 00:12:00 +0100 Subject: [PATCH 29/45] Update app.js nuevo --- todoapp/todoapp_openshift/app.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/todoapp/todoapp_openshift/app.js b/todoapp/todoapp_openshift/app.js index e630001f34..5c239d1166 100644 --- a/todoapp/todoapp_openshift/app.js +++ b/todoapp/todoapp_openshift/app.js @@ -5,17 +5,27 @@ const db = require('./models/db'); const itemsController = require('./controllers/items'); const serverInfoController = require('./controllers/serverinfo'); +// Middleware para parsear JSON y datos de formularios app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); +// Controladores itemsController(app); serverInfoController(app); +// Ruta principal para verificar que el servidor responde +app.get('/', (req, res) => { + res.send('✅ TodoApp está corriendo correctamente.'); +}); + +// Puerto de escucha const port = process.env.PORT || 8080; + +// Sincronización con la base de datos y arranque del servidor db.sequelize.sync().then(() => { app.listen(port, () => { - console.log(`TodoApp listening on port ${port}`); + console.log(`✅ TodoApp escuchando en el puerto ${port}`); }); }).catch(err => { - console.error('Database sync failed:', err); + console.error('❌ Fallo al sincronizar con la base de datos:', err); }); From 2cda4d9d42c9caaaeedf503b388d22ff6477b305 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 00:21:27 +0100 Subject: [PATCH 30/45] Update openshift-deploy.yaml nuevo --- .../todoapp_openshift/openshift-deploy.yaml | 205 ++++++++++-------- 1 file changed, 109 insertions(+), 96 deletions(-) diff --git a/todoapp/todoapp_openshift/openshift-deploy.yaml b/todoapp/todoapp_openshift/openshift-deploy.yaml index 25c614b418..9a5704ace5 100644 --- a/todoapp/todoapp_openshift/openshift-deploy.yaml +++ b/todoapp/todoapp_openshift/openshift-deploy.yaml @@ -1,8 +1,96 @@ - +apiVersion: v1 +kind: Secret +metadata: + name: todoapp-db-secret + namespace: leonardokrk-dev +stringData: + DB_PASSWORD: password123 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql + namespace: leonardokrk-dev + labels: + app: mysql +spec: + replicas: 1 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - name: mysql + image: mysql:5.7 + ports: + - containerPort: 3306 + env: + - name: MYSQL_DATABASE + value: todoapp + - name: MYSQL_USER + value: todo + - name: MYSQL_PASSWORD + valueFrom: + secretKeyRef: + name: todoapp-db-secret + key: DB_PASSWORD + - name: MYSQL_ROOT_PASSWORD + value: rootpassword + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + volumes: + - name: mysql-persistent-storage + emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: mysql + namespace: leonardokrk-dev +spec: + ports: + - port: 3306 + targetPort: 3306 + selector: + app: mysql +--- +apiVersion: build.openshift.io/v1 +kind: BuildConfig +metadata: + name: todoapp + namespace: leonardokrk-dev +spec: + source: + git: + uri: https://github.com/superlinuxex/DO180-apps.git + contextDir: todoapp/todoapp_openshift + strategy: + sourceStrategy: + from: + kind: ImageStreamTag + name: 'nodejs:20' + namespace: openshift + output: + to: + kind: ImageStreamTag + name: 'todoapp:latest' +--- +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: todoapp + namespace: leonardokrk-dev +--- apiVersion: apps/v1 kind: Deployment metadata: name: todoapp + namespace: leonardokrk-dev labels: app: todoapp spec: @@ -17,63 +105,55 @@ spec: spec: containers: - name: todoapp - image: image-registry.openshift-image-registry.svc:5000/superlinuxec-dev/todoapp:latest + image: image-registry.openshift-image-registry.svc:5000/leonardokrk-dev/todoapp:latest ports: - containerPort: 8080 env: - name: NODE_ENV - value: "production" + value: production - name: DB_NAME - value: "todoapp" + value: todoapp - name: DB_USER - value: "todo" + value: todo - name: DB_PASSWORD valueFrom: - secretKeyRef: - name: todoapp-db-secret - key: DB_PASSWORD + secretKeyRef: + name: todoapp-db-secret + key: DB_PASSWORD - name: DB_HOST - value: "mysql" + value: mysql - name: DB_PORT - value: "3306" - resources: - limits: - memory: "512Mi" - requests: - memory: "256Mi" - livenessProbe: - httpGet: - path: / - port: 8080 - initialDelaySeconds: 10 - periodSeconds: 30 + value: '3306' readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 10 + livenessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 30 --- apiVersion: v1 kind: Service metadata: name: todoapp - labels: - app: todoapp + namespace: leonardokrk-dev spec: + ports: + - port: 80 + targetPort: 8080 selector: app: todoapp - ports: - - protocol: TCP - port: 80 - targetPort: 8080 --- apiVersion: route.openshift.io/v1 kind: Route metadata: name: todoapp - labels: - app: todoapp + namespace: leonardokrk-dev spec: to: kind: Service @@ -82,70 +162,3 @@ spec: targetPort: 8080 tls: termination: edge ---- -apiVersion: v1 -kind: Secret -metadata: - name: todoapp-db-secret - labels: - app: todoapp -type: Opaque -data: - DB_PASSWORD: dG9kbzEyMw== # "todo123" base64 encoded ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: mysql - labels: - app: mysql -spec: - replicas: 1 - selector: - matchLabels: - app: mysql - template: - metadata: - labels: - app: mysql - spec: - containers: - - name: mysql - image: mysql:5.7 - env: - - name: MYSQL_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: todoapp-db-secret - key: DB_PASSWORD - - name: MYSQL_DATABASE - value: "todoapp" - - name: MYSQL_USER - value: "todo" - - name: MYSQL_PASSWORD - valueFrom: - secretKeyRef: - name: todoapp-db-secret - key: DB_PASSWORD - ports: - - containerPort: 3306 - volumeMounts: - - name: mysql-persistent-storage - mountPath: /var/lib/mysql - volumes: - - name: mysql-persistent-storage - emptyDir: {} ---- -apiVersion: v1 -kind: Service -metadata: - name: mysql - labels: - app: mysql -spec: - ports: - - port: 3306 - targetPort: 3306 - selector: - app: mysql - clusterIP: None # Para permitir descubrimiento DNS estable entre pods From 84125402d309398029cf6c2e297382815773746b Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 00:34:13 +0100 Subject: [PATCH 31/45] Update openshift-deploy.yaml mas mas --- todoapp/todoapp_openshift/openshift-deploy.yaml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/todoapp/todoapp_openshift/openshift-deploy.yaml b/todoapp/todoapp_openshift/openshift-deploy.yaml index 9a5704ace5..10e9eccbf2 100644 --- a/todoapp/todoapp_openshift/openshift-deploy.yaml +++ b/todoapp/todoapp_openshift/openshift-deploy.yaml @@ -1,4 +1,4 @@ -apiVersion: v1 +""apiVersion: v1 kind: Secret metadata: name: todoapp-db-secret @@ -72,13 +72,12 @@ spec: strategy: sourceStrategy: from: - kind: ImageStreamTag - name: 'nodejs:20' - namespace: openshift + kind: DockerImage + name: node:20 output: to: kind: ImageStreamTag - name: 'todoapp:latest' + name: todoapp:latest --- apiVersion: image.openshift.io/v1 kind: ImageStream @@ -161,4 +160,4 @@ spec: port: targetPort: 8080 tls: - termination: edge + termination: edge"" From fcad3449234d9954561b9e9aa3e0f6a5bcbe2401 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 00:39:54 +0100 Subject: [PATCH 32/45] Update openshift-deploy.yaml hola --- todoapp/todoapp_openshift/openshift-deploy.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/todoapp/todoapp_openshift/openshift-deploy.yaml b/todoapp/todoapp_openshift/openshift-deploy.yaml index 10e9eccbf2..d5ec2efa45 100644 --- a/todoapp/todoapp_openshift/openshift-deploy.yaml +++ b/todoapp/todoapp_openshift/openshift-deploy.yaml @@ -1,4 +1,4 @@ -""apiVersion: v1 +apiVersion: v1 kind: Secret metadata: name: todoapp-db-secret @@ -73,7 +73,7 @@ spec: sourceStrategy: from: kind: DockerImage - name: node:20 + name: docker.io/library/node:20 output: to: kind: ImageStreamTag @@ -160,4 +160,4 @@ spec: port: targetPort: 8080 tls: - termination: edge"" + termination: edge From c644e68051a1938c16dbfbb4c83bc33674fbe25b Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 00:59:19 +0100 Subject: [PATCH 33/45] Create Dockerfile hola --- todoapp/todoapp_openshift/Dockerfile | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 todoapp/todoapp_openshift/Dockerfile diff --git a/todoapp/todoapp_openshift/Dockerfile b/todoapp/todoapp_openshift/Dockerfile new file mode 100644 index 0000000000..4b3390e30c --- /dev/null +++ b/todoapp/todoapp_openshift/Dockerfile @@ -0,0 +1,20 @@ +# Imagen base oficial de Node.js +FROM node:20-alpine + +# Crear el directorio de la app +WORKDIR /usr/src/app + +# Copiar archivos de configuración +COPY package*.json ./ + +# Instalar dependencias +RUN npm install --production + +# Copiar el resto del código +COPY . . + +# Exponer el puerto de la app +EXPOSE 8080 + +# Comando de arranque +CMD ["node", "aplicación.js"] From 52b80e86e85e2a851cca87a41ae920fea4a8f8ec Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 01:01:14 +0100 Subject: [PATCH 34/45] Update Dockerfile mas --- todoapp/todoapp_openshift/Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/todoapp/todoapp_openshift/Dockerfile b/todoapp/todoapp_openshift/Dockerfile index 4b3390e30c..90a6cd198b 100644 --- a/todoapp/todoapp_openshift/Dockerfile +++ b/todoapp/todoapp_openshift/Dockerfile @@ -1,20 +1,20 @@ # Imagen base oficial de Node.js FROM node:20-alpine -# Crear el directorio de la app +# Crear directorio de la app WORKDIR /usr/src/app -# Copiar archivos de configuración +# Copiar archivos de dependencias COPY package*.json ./ -# Instalar dependencias +# Instalar dependencias de producción RUN npm install --production -# Copiar el resto del código +# Copiar el resto del código fuente COPY . . -# Exponer el puerto de la app +# Exponer el puerto de la aplicación EXPOSE 8080 -# Comando de arranque +# Comando para arrancar la aplicación CMD ["node", "aplicación.js"] From 0ba8004a54839467e26e005bd32fc0916a0f98fb Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 01:10:24 +0100 Subject: [PATCH 35/45] Update Dockerfile mas --- todoapp/todoapp_openshift/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/todoapp/todoapp_openshift/Dockerfile b/todoapp/todoapp_openshift/Dockerfile index 90a6cd198b..72a49b44d7 100644 --- a/todoapp/todoapp_openshift/Dockerfile +++ b/todoapp/todoapp_openshift/Dockerfile @@ -17,4 +17,4 @@ COPY . . EXPOSE 8080 # Comando para arrancar la aplicación -CMD ["node", "aplicación.js"] +CMD ["node", "app.js"] From 77623a01277bfec92a767eebad0879e8f1824307 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 01:12:30 +0100 Subject: [PATCH 36/45] Update openshift-deploy.yaml mas --- todoapp/todoapp_openshift/openshift-deploy.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/todoapp/todoapp_openshift/openshift-deploy.yaml b/todoapp/todoapp_openshift/openshift-deploy.yaml index d5ec2efa45..2035badf04 100644 --- a/todoapp/todoapp_openshift/openshift-deploy.yaml +++ b/todoapp/todoapp_openshift/openshift-deploy.yaml @@ -70,10 +70,7 @@ spec: uri: https://github.com/superlinuxex/DO180-apps.git contextDir: todoapp/todoapp_openshift strategy: - sourceStrategy: - from: - kind: DockerImage - name: docker.io/library/node:20 + dockerStrategy: {} output: to: kind: ImageStreamTag From aeaa041dc4a1525d0bbefbc5688e160f0a3cbe7a Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 01:18:52 +0100 Subject: [PATCH 37/45] Update openshift-deploy.yaml OK,,,,, From efc2f84ada22cf7d3645c07f34161d3539849db5 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 17:07:34 +0100 Subject: [PATCH 38/45] Update items.js hola --- .../todoapp_openshift/controllers/items.js | 59 +++++++++++++++---- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/todoapp/todoapp_openshift/controllers/items.js b/todoapp/todoapp_openshift/controllers/items.js index a5aa6bb07d..20e3d70bb4 100644 --- a/todoapp/todoapp_openshift/controllers/items.js +++ b/todoapp/todoapp_openshift/controllers/items.js @@ -1,19 +1,56 @@ +const { Item } = require('../models/db'); + module.exports = function(app) { - const db = require('../models/db'); - const Item = db.Item; + // Obtener todas las tareas + app.get('/api/items', async (req, res) => { + try { + const items = await Item.findAll(); + res.json(items); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); - app.get('/items', async (req, res) => { - const items = await Item.findAll(); - res.json(items); + // Crear una nueva tarea + app.post('/api/items', async (req, res) => { + try { + const newItem = await Item.create({ + description: req.body.description, + done: req.body.done || false + }); + res.status(201).json(newItem); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); - app.post('/items', async (req, res) => { - const newItem = await Item.create(req.body); - res.json(newItem); + // Actualizar una tarea por ID + app.put('/api/items/:id', async (req, res) => { + try { + const item = await Item.findByPk(req.params.id); + if (!item) return res.status(404).json({ error: 'Item not found' }); + + item.description = req.body.description ?? item.description; + item.done = req.body.done ?? item.done; + await item.save(); + + res.json(item); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); - app.delete('/items/:id', async (req, res) => { - await Item.destroy({ where: { id: req.params.id }}); - res.json({ message: 'Item deleted' }); + // Eliminar una tarea por ID + app.delete('/api/items/:id', async (req, res) => { + try { + const deleted = await Item.destroy({ where: { id: req.params.id } }); + if (deleted) { + res.json({ message: 'Item deleted' }); + } else { + res.status(404).json({ error: 'Item not found' }); + } + } catch (err) { + res.status(500).json({ error: err.message }); + } }); }; From 4d731289707ca68b366392af2774da6a39fc8343 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 17:08:10 +0100 Subject: [PATCH 39/45] Update serverinfo.js hola --- todoapp/todoapp_openshift/controllers/serverinfo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/todoapp/todoapp_openshift/controllers/serverinfo.js b/todoapp/todoapp_openshift/controllers/serverinfo.js index cca4c078ec..4d5a50c926 100644 --- a/todoapp/todoapp_openshift/controllers/serverinfo.js +++ b/todoapp/todoapp_openshift/controllers/serverinfo.js @@ -1,5 +1,5 @@ module.exports = function(app) { - app.get('/info', (req, res) => { + app.get('/api/serverinfo', (req, res) => { res.json({ uptime: process.uptime(), message: 'OK', From 97d74caf0c9af9d7dd0fee30c8e9361409e68551 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 17:09:42 +0100 Subject: [PATCH 40/45] Update items.js oTRO --- todoapp/todoapp_openshift/controllers/items.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/todoapp/todoapp_openshift/controllers/items.js b/todoapp/todoapp_openshift/controllers/items.js index 20e3d70bb4..a744acf36b 100644 --- a/todoapp/todoapp_openshift/controllers/items.js +++ b/todoapp/todoapp_openshift/controllers/items.js @@ -1,7 +1,6 @@ const { Item } = require('../models/db'); module.exports = function(app) { - // Obtener todas las tareas app.get('/api/items', async (req, res) => { try { const items = await Item.findAll(); @@ -11,7 +10,6 @@ module.exports = function(app) { } }); - // Crear una nueva tarea app.post('/api/items', async (req, res) => { try { const newItem = await Item.create({ @@ -24,7 +22,6 @@ module.exports = function(app) { } }); - // Actualizar una tarea por ID app.put('/api/items/:id', async (req, res) => { try { const item = await Item.findByPk(req.params.id); @@ -40,7 +37,6 @@ module.exports = function(app) { } }); - // Eliminar una tarea por ID app.delete('/api/items/:id', async (req, res) => { try { const deleted = await Item.destroy({ where: { id: req.params.id } }); From 4eccd6b5aa4611c0524e923d88b8d863219f8dce Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 22:01:57 +0100 Subject: [PATCH 41/45] Update db.js mas mmas --- todoapp/todoapp_openshift/models/db.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/todoapp/todoapp_openshift/models/db.js b/todoapp/todoapp_openshift/models/db.js index 16d90d9dfb..cbb1143980 100644 --- a/todoapp/todoapp_openshift/models/db.js +++ b/todoapp/todoapp_openshift/models/db.js @@ -1,13 +1,14 @@ const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize( - process.env.DB_NAME || 'todoapp', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD || 'password', + process.env.DB_NAME, + process.env.DB_USER, + process.env.DB_PASSWORD, { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql' + host: process.env.DB_HOST, + port: process.env.DB_PORT, + dialect: 'mysql', + logging: false } ); From 01b79033517019d902406ab7e5c2732eb0b0b797 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 22:02:59 +0100 Subject: [PATCH 42/45] Update items.js mas mas From 81da3b758ff22710399288e8e736bfe6822b8dff Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 22:07:11 +0100 Subject: [PATCH 43/45] Update README.md mas mas --- todoapp/todoapp_openshift/README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/todoapp/todoapp_openshift/README.md b/todoapp/todoapp_openshift/README.md index cdbba7c02d..73ae5173b3 100644 --- a/todoapp/todoapp_openshift/README.md +++ b/todoapp/todoapp_openshift/README.md @@ -1,2 +1,19 @@ -# TodoApp OpenShift -Aplicación TodoApp con Node.js y MySQL lista para desplegar en OpenShift. +# TodoApp (OpenShift + Node.js + MySQL) + +Aplicación simple para gestionar tareas (To-Do) desarrollada con **Node.js**, **Express** y **MySQL**, desplegada en **OpenShift**. + +--- + +## 📅 Características +- Rutas RESTful para CRUD de tareas +- Persistencia con Sequelize ORM y MySQL +- Despliegue automatizado con OpenShift + +--- + +## 🚀 Despliegue en OpenShift + +### 1. Clonar el repositorio +```bash +git clone https://github.com/superlinuxex/DO180-apps.git +cd DO180-apps/todoapp/todoapp_openshift From 3c8573bd12dd668529a6044e5342b3ba3111d386 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 22:09:46 +0100 Subject: [PATCH 44/45] Update README.md mas mas --- todoapp/todoapp_openshift/README.md | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/todoapp/todoapp_openshift/README.md b/todoapp/todoapp_openshift/README.md index 73ae5173b3..626db33d9a 100644 --- a/todoapp/todoapp_openshift/README.md +++ b/todoapp/todoapp_openshift/README.md @@ -17,3 +17,64 @@ Aplicación simple para gestionar tareas (To-Do) desarrollada con **Node.js**, * ```bash git clone https://github.com/superlinuxex/DO180-apps.git cd DO180-apps/todoapp/todoapp_openshift +``` + +### 2. Aplicar los recursos YAML +```bash +oc apply -f openshift-deploy.yaml -n TU_PROYECTO +``` + +### 3. Lanzar el build de la app +```bash +oc start-build todoapp -n TU_PROYECTO --wait --follow +``` + +### 4. Verificar despliegue +```bash +oc get pods -n TU_PROYECTO +oc get route todoapp -n TU_PROYECTO +``` +Accede vía navegador a la URL de la **route**. + +--- + +## 🔄 API Endpoints + +| Método | Ruta | Descripción | +|---------|-------------------|---------------------------------| +| GET | `/api/items` | Listar todas las tareas | +| POST | `/api/items` | Crear nueva tarea | +| PUT | `/api/items/:id` | Actualizar tarea por ID | +| DELETE | `/api/items/:id` | Eliminar tarea por ID | +| GET | `/info` | Info del servidor (uptime etc.) | + +--- + +## 💪 Requisitos +- OpenShift 4+ +- Node.js 20 (ya incluido en la imagen base `node:20-alpine`) +- MySQL 5.7 (provisionado por el despliegue YAML) + +--- + +## 📒 Estructura del Proyecto +``` +todoapp_openshift/ +├── controladores/ +│ ├── items.js +│ └── serverinfo.js +├── modelos/ +│ └── db.js +├── Dockerfile +├── openshift-deploy.yaml +├── aplicación.js +├── package.json +``` + +--- + +## 🚜 Contacto +Superlinuxec ✨ +Email: superlinuxec@gmail.com +GitHub: [superlinuxex](https://github.com/superlinuxex) + From 2bb60070f4b4a23f66de73c7abae8229686523e4 Mon Sep 17 00:00:00 2001 From: Superlinuxec Date: Mon, 17 Mar 2025 22:13:39 +0100 Subject: [PATCH 45/45] Update README.md mas mas --- todoapp/todoapp_openshift/README.md | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/todoapp/todoapp_openshift/README.md b/todoapp/todoapp_openshift/README.md index 626db33d9a..20fc883753 100644 --- a/todoapp/todoapp_openshift/README.md +++ b/todoapp/todoapp_openshift/README.md @@ -50,6 +50,41 @@ Accede vía navegador a la URL de la **route**. --- +## 📦 Ejemplos de uso con `curl` + +### Crear una nueva tarea +```bash +curl -X POST http://URL_ROUTE/api/items \ + -H "Content-Type: application/json" \ + -d '{"description": "Aprender OpenShift"}' +``` + +### Listar tareas +```bash +curl http://URL_ROUTE/api/items +``` + +### Marcar tarea como realizada +```bash +curl -X PUT http://URL_ROUTE/api/items/1 \ + -H "Content-Type: application/json" \ + -d '{"done": true}' +``` + +### Eliminar tarea +```bash +curl -X DELETE http://URL_ROUTE/api/items/1 +``` + +### Ver info del servidor +```bash +curl http://URL_ROUTE/info +``` + +> 🔄 Reemplaza `URL_ROUTE` por la URL obtenida con `oc get route`. + +--- + ## 💪 Requisitos - OpenShift 4+ - Node.js 20 (ya incluido en la imagen base `node:20-alpine`)