Skip to content
Open

alex #392

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
cd33548
Update package.json
superlinuxex Mar 15, 2025
18fbf03
Update package.json
superlinuxex Mar 15, 2025
fd8c7be
Update package.json
superlinuxex Mar 15, 2025
8058057
Create api_node
superlinuxex Mar 16, 2025
36f2e50
Update run.sh
superlinuxex Mar 16, 2025
4203b47
Update package.json
superlinuxex Mar 16, 2025
7a92345
Update app.js
superlinuxex Mar 16, 2025
c118dc9
Update db.js
superlinuxex Mar 16, 2025
bf73e6e
Update package.json
superlinuxex Mar 16, 2025
097d7cc
Update package.json
superlinuxex Mar 16, 2025
73229bf
Update app.js
superlinuxex Mar 16, 2025
2fed545
Update package.json
superlinuxex Mar 16, 2025
bb9da73
Update package.json
superlinuxex Mar 16, 2025
9ca5182
Update items.js
superlinuxex Mar 16, 2025
5712394
Update serverinfo.js
superlinuxex Mar 16, 2025
07f5a44
Update run.sh
superlinuxex Mar 16, 2025
01e6c82
Update serverinfo.js
superlinuxex Mar 16, 2025
6ba9171
nuevos
superlinuxex Mar 16, 2025
83bcfcd
nuevos
superlinuxex Mar 16, 2025
ec8aa32
nuevos
superlinuxex Mar 16, 2025
e221203
Update serverinfo.js
superlinuxex Mar 16, 2025
8a04b3a
Update serverinfo.js
superlinuxex Mar 16, 2025
51813a0
Update README.md
superlinuxex Mar 16, 2025
9973db3
todo
superlinuxex Mar 16, 2025
a68c39d
cambios nuevos para actualizar
superlinuxex Mar 16, 2025
0fb250c
cambio nombre directorio
superlinuxex Mar 16, 2025
9e8e08e
Create openshift-deploy.yaml
superlinuxex Mar 16, 2025
b15a543
Update openshift-deploy.yaml
superlinuxex Mar 16, 2025
f139b19
Update app.js
superlinuxex Mar 16, 2025
2cda4d9
Update openshift-deploy.yaml
superlinuxex Mar 16, 2025
8412540
Update openshift-deploy.yaml
superlinuxex Mar 16, 2025
fcad344
Update openshift-deploy.yaml
superlinuxex Mar 16, 2025
c644e68
Create Dockerfile
superlinuxex Mar 16, 2025
52b80e8
Update Dockerfile
superlinuxex Mar 17, 2025
0ba8004
Update Dockerfile
superlinuxex Mar 17, 2025
77623a0
Update openshift-deploy.yaml
superlinuxex Mar 17, 2025
aeaa041
Update openshift-deploy.yaml
superlinuxex Mar 17, 2025
efc2f84
Update items.js
superlinuxex Mar 17, 2025
4d73128
Update serverinfo.js
superlinuxex Mar 17, 2025
97d74ca
Update items.js
superlinuxex Mar 17, 2025
4eccd6b
Update db.js
superlinuxex Mar 17, 2025
01b7903
Update items.js
superlinuxex Mar 17, 2025
81da3b7
Update README.md
superlinuxex Mar 17, 2025
3c8573b
Update README.md
superlinuxex Mar 17, 2025
2bb6007
Update README.md
superlinuxex Mar 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion nodejs-helloworld/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +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.14.2"
"express": "^4.18.2"
}
}
20 changes: 2 additions & 18 deletions todoapp/nodejs_api/README.md
Original file line number Diff line number Diff line change
@@ -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

# TodoApp OpenShift
Aplicación TodoApp con Node.js y MySQL lista para desplegar en OpenShift.
48 changes: 17 additions & 31 deletions todoapp/nodejs_api/app.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,21 @@
var restify = require('restify');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const db = require('./models/db');
const itemsController = require('./controllers/items');
const serverInfoController = require('./controllers/serverinfo');

var controller = require('./controllers/items');
var serverinfo = require('./controllers/serverinfo');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

var db = require('./models/db');
var model = require('./models/items');
itemsController(app);
serverInfoController(app);

model.connect(db.params, function(err) {
if (err) throw err;
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);
});

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');

var port = process.env.PORT || 30080;
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', function (err) {
console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2)))
});


4 changes: 0 additions & 4 deletions todoapp/nodejs_api/compile.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
#!/bin/bash

source /opt/rh/nodejs010/enable

npm install

135 changes: 18 additions & 117 deletions todoapp/nodejs_api/controllers/items.js
Original file line number Diff line number Diff line change
@@ -1,118 +1,19 @@

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();
}
});
}
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' });
});
};


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);
}
});
}
}
36 changes: 8 additions & 28 deletions todoapp/nodejs_api/controllers/serverinfo.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,9 @@
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);
module.exports = function(app) {
app.get('/info', (req, res) => {
res.json({
uptime: process.uptime(),
message: 'OK',
timestamp: Date.now()
});
});
};

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();
};

33 changes: 23 additions & 10 deletions todoapp/nodejs_api/models/db.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
const { Sequelize, DataTypes } = 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'
}
};
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 };
Loading