I am also active at:
Sunday, September 17, 2017
Saturday, September 16, 2017
Understanding POINTERS in C
Pointers is a very easy concept, the confusion arises because the declaration and de-referencing look very similar
you declare a pointer as : int * p // DECLARING p as a pointer to a data of type int
you de-refernce it as : *p // Is a VALUE , achieved by DE-referncing the pointer p ( ' Data type' int not )
you use it as : p // the * is absent when you use it ( * is not written when actually using pointer)
They appear to be same, only the 'int' ie data type is absent in the second case. So , when ever a * operator is preceded by a data type like int, char , struct etc its a DECLARTION , else its a VALUE ( ie got by de-referencing the pointer).
And further confusion is added, because when you use the pointer, it does not have the * operator before it , so the pointer is only 'p',
Thanks
Ashutosh
Thursday, September 14, 2017
Tuesday, September 5, 2017
article.js by Tanmai
// Eg: coco98.imad.hasura-app.io/articles/article-one will result in article-one
var currentArticleTitle = window.location.pathname.split('/')[2];
function loadCommentForm () {
var commentFormHtml = `
<h5>Submit a comment</h5>
<textarea id="comment_text" rows="5" cols="100" placeholder="Enter your comment here..."></textarea>
<br/>
<input type="submit" id="submit" value="Submit" />
<br/>
`;
document.getElementById('comment_form').innerHTML = commentFormHtml;
// Submit username/password to login
var submit = document.getElementById('submit');
submit.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
// clear the form & reload all the comments
document.getElementById('comment_text').value = '';
loadComments();
} else {
alert('Error! Could not submit comment');
}
submit.value = 'Submit';
}
};
// Make the request
var comment = document.getElementById('comment_text').value;
request.open('POST', '/submit-comment/' + currentArticleTitle, true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({comment: comment}));
submit.value = 'Submitting...';
};
}
function loadLogin () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
loadCommentForm(this.responseText);
}
}
};
request.open('GET', '/check-login', true);
request.send(null);
}
function escapeHTML (text)
{
var $text = document.createTextNode(text);
var $div = document.createElement('div');
$div.appendChild($text);
return $div.innerHTML;
}
function loadComments () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
var comments = document.getElementById('comments');
if (request.status === 200) {
var content = '';
var commentsData = JSON.parse(this.responseText);
for (var i=0; i< commentsData.length; i++) {
var time = new Date(commentsData[i].timestamp);
content += `<div class="comment">
<p>${escapeHTML(commentsData[i].comment)}</p>
<div class="commenter">
${commentsData[i].username} - ${time.toLocaleTimeString()} on ${time.toLocaleDateString()}
</div>
</div>`;
}
comments.innerHTML = content;
} else {
comments.innerHTML('Oops! Could not load comments!');
}
}
};
request.open('GET', '/get-comments/' + currentArticleTitle, true);
request.send(null);
}
// The first thing to do is to check if the user is logged in!
loadLogin();
loadComments();
var currentArticleTitle = window.location.pathname.split('/')[2];
function loadCommentForm () {
var commentFormHtml = `
<h5>Submit a comment</h5>
<textarea id="comment_text" rows="5" cols="100" placeholder="Enter your comment here..."></textarea>
<br/>
<input type="submit" id="submit" value="Submit" />
<br/>
`;
document.getElementById('comment_form').innerHTML = commentFormHtml;
// Submit username/password to login
var submit = document.getElementById('submit');
submit.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
// clear the form & reload all the comments
document.getElementById('comment_text').value = '';
loadComments();
} else {
alert('Error! Could not submit comment');
}
submit.value = 'Submit';
}
};
// Make the request
var comment = document.getElementById('comment_text').value;
request.open('POST', '/submit-comment/' + currentArticleTitle, true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({comment: comment}));
submit.value = 'Submitting...';
};
}
function loadLogin () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
loadCommentForm(this.responseText);
}
}
};
request.open('GET', '/check-login', true);
request.send(null);
}
function escapeHTML (text)
{
var $text = document.createTextNode(text);
var $div = document.createElement('div');
$div.appendChild($text);
return $div.innerHTML;
}
function loadComments () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
var comments = document.getElementById('comments');
if (request.status === 200) {
var content = '';
var commentsData = JSON.parse(this.responseText);
for (var i=0; i< commentsData.length; i++) {
var time = new Date(commentsData[i].timestamp);
content += `<div class="comment">
<p>${escapeHTML(commentsData[i].comment)}</p>
<div class="commenter">
${commentsData[i].username} - ${time.toLocaleTimeString()} on ${time.toLocaleDateString()}
</div>
</div>`;
}
comments.innerHTML = content;
} else {
comments.innerHTML('Oops! Could not load comments!');
}
}
};
request.open('GET', '/get-comments/' + currentArticleTitle, true);
request.send(null);
}
// The first thing to do is to check if the user is logged in!
loadLogin();
loadComments();
article.js by Tanmai
/ui/article.js
// Eg: coco98.imad.hasura-app.io/articles/article-one will result in article-one
var currentArticleTitle = window.location.pathname.split('/')[2];
function loadCommentForm () {
var commentFormHtml = `
<h5>Submit a comment</h5>
<textarea id="comment_text" rows="5" cols="100" placeholder="Enter your comment here..."></textarea>
<br/>
<input type="submit" id="submit" value="Submit" />
<br/>
`;
document.getElementById('comment_form').innerHTML = commentFormHtml;
// Submit username/password to login
var submit = document.getElementById('submit');
submit.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
// clear the form & reload all the comments
document.getElementById('comment_text').value = '';
loadComments();
} else {
alert('Error! Could not submit comment');
}
submit.value = 'Submit';
}
};
// Make the request
var comment = document.getElementById('comment_text').value;
request.open('POST', '/submit-comment/' + currentArticleTitle, true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({comment: comment}));
submit.value = 'Submitting...';
};
}
function loadLogin () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
loadCommentForm(this.responseText);
}
}
};
request.open('GET', '/check-login', true);
request.send(null);
}
function escapeHTML (text)
{
var $text = document.createTextNode(text);
var $div = document.createElement('div');
$div.appendChild($text);
return $div.innerHTML;
}
function loadComments () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
var comments = document.getElementById('comments');
if (request.status === 200) {
var content = '';
var commentsData = JSON.parse(this.responseText);
for (var i=0; i< commentsData.length; i++) {
var time = new Date(commentsData[i].timestamp);
content += `<div class="comment">
<p>${escapeHTML(commentsData[i].comment)}</p>
<div class="commenter">
${commentsData[i].username} - ${time.toLocaleTimeString()} on ${time.toLocaleDateString()}
</div>
</div>`;
}
comments.innerHTML = content;
} else {
comments.innerHTML('Oops! Could not load comments!');
}
}
};
request.open('GET', '/get-comments/' + currentArticleTitle, true);
request.send(null);
}
// The first thing to do is to check if the user is logged in!
loadLogin();
loadComments();
// Eg: coco98.imad.hasura-app.io/articles/article-one will result in article-one
var currentArticleTitle = window.location.pathname.split('/')[2];
function loadCommentForm () {
var commentFormHtml = `
<h5>Submit a comment</h5>
<textarea id="comment_text" rows="5" cols="100" placeholder="Enter your comment here..."></textarea>
<br/>
<input type="submit" id="submit" value="Submit" />
<br/>
`;
document.getElementById('comment_form').innerHTML = commentFormHtml;
// Submit username/password to login
var submit = document.getElementById('submit');
submit.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
// clear the form & reload all the comments
document.getElementById('comment_text').value = '';
loadComments();
} else {
alert('Error! Could not submit comment');
}
submit.value = 'Submit';
}
};
// Make the request
var comment = document.getElementById('comment_text').value;
request.open('POST', '/submit-comment/' + currentArticleTitle, true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({comment: comment}));
submit.value = 'Submitting...';
};
}
function loadLogin () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
loadCommentForm(this.responseText);
}
}
};
request.open('GET', '/check-login', true);
request.send(null);
}
function escapeHTML (text)
{
var $text = document.createTextNode(text);
var $div = document.createElement('div');
$div.appendChild($text);
return $div.innerHTML;
}
function loadComments () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
var comments = document.getElementById('comments');
if (request.status === 200) {
var content = '';
var commentsData = JSON.parse(this.responseText);
for (var i=0; i< commentsData.length; i++) {
var time = new Date(commentsData[i].timestamp);
content += `<div class="comment">
<p>${escapeHTML(commentsData[i].comment)}</p>
<div class="commenter">
${commentsData[i].username} - ${time.toLocaleTimeString()} on ${time.toLocaleDateString()}
</div>
</div>`;
}
comments.innerHTML = content;
} else {
comments.innerHTML('Oops! Could not load comments!');
}
}
};
request.open('GET', '/get-comments/' + currentArticleTitle, true);
request.send(null);
}
// The first thing to do is to check if the user is logged in!
loadLogin();
loadComments();
SQL schema by Tanmai
Name: article; Type: TABLE; Schema: public; Owner: coco98
--
CREATE TABLE article (
id integer NOT NULL,
title text NOT NULL,
heading text NOT NULL,
date date NOT NULL,
content text NOT NULL
);
--
-- Name: article_id_seq; Type: SEQUENCE; Schema: public; Owner: coco98
--
CREATE SEQUENCE article_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: comment; Type: TABLE; Schema: public; Owner: coco98
--
CREATE TABLE comment (
id integer NOT NULL,
article_id integer NOT NULL,
user_id integer NOT NULL,
comment text NOT NULL,
"timestamp" timestamp with time zone DEFAULT now() NOT NULL
);
--
-- Name: comment_id_seq; Type: SEQUENCE; Schema: public; Owner: coco98
--
CREATE SEQUENCE comment_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: user; Type: TABLE; Schema: public; Owner: coco98
--
CREATE TABLE "user" (
id integer NOT NULL,
username text NOT NULL,
password text NOT NULL
);
--
-- Name: user_id_seq; Type: SEQUENCE; Schema: public; Owner: coco98
--
CREATE SEQUENCE user_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY article ALTER COLUMN id SET DEFAULT nextval('article_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment ALTER COLUMN id SET DEFAULT nextval('comment_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY "user" ALTER COLUMN id SET DEFAULT nextval('user_id_seq'::regclass);
--
-- Name: article_id; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY article
ADD CONSTRAINT article_id PRIMARY KEY (id);
--
-- Name: article_title; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY article
ADD CONSTRAINT article_title UNIQUE (title);
--
-- Name: comment_id; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment
ADD CONSTRAINT comment_id PRIMARY KEY (id);
--
-- Name: user_id; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY "user"
ADD CONSTRAINT user_id PRIMARY KEY (id);
--
-- Name: user_username; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY "user"
ADD CONSTRAINT user_username UNIQUE (username);
--
-- Name: comment_article_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment
ADD CONSTRAINT comment_article_id_fkey FOREIGN KEY (article_id) REFERENCES article(id);
--
-- Name: comment_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment
ADD CONSTRAINT comment_user_id_fkey FOREIGN KEY (user_id) REFERENCES "user"(id);
Contact GitHub API Training Shop Blog About
--
CREATE TABLE article (
id integer NOT NULL,
title text NOT NULL,
heading text NOT NULL,
date date NOT NULL,
content text NOT NULL
);
--
-- Name: article_id_seq; Type: SEQUENCE; Schema: public; Owner: coco98
--
CREATE SEQUENCE article_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: comment; Type: TABLE; Schema: public; Owner: coco98
--
CREATE TABLE comment (
id integer NOT NULL,
article_id integer NOT NULL,
user_id integer NOT NULL,
comment text NOT NULL,
"timestamp" timestamp with time zone DEFAULT now() NOT NULL
);
--
-- Name: comment_id_seq; Type: SEQUENCE; Schema: public; Owner: coco98
--
CREATE SEQUENCE comment_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: user; Type: TABLE; Schema: public; Owner: coco98
--
CREATE TABLE "user" (
id integer NOT NULL,
username text NOT NULL,
password text NOT NULL
);
--
-- Name: user_id_seq; Type: SEQUENCE; Schema: public; Owner: coco98
--
CREATE SEQUENCE user_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY article ALTER COLUMN id SET DEFAULT nextval('article_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment ALTER COLUMN id SET DEFAULT nextval('comment_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY "user" ALTER COLUMN id SET DEFAULT nextval('user_id_seq'::regclass);
--
-- Name: article_id; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY article
ADD CONSTRAINT article_id PRIMARY KEY (id);
--
-- Name: article_title; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY article
ADD CONSTRAINT article_title UNIQUE (title);
--
-- Name: comment_id; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment
ADD CONSTRAINT comment_id PRIMARY KEY (id);
--
-- Name: user_id; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY "user"
ADD CONSTRAINT user_id PRIMARY KEY (id);
--
-- Name: user_username; Type: CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY "user"
ADD CONSTRAINT user_username UNIQUE (username);
--
-- Name: comment_article_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment
ADD CONSTRAINT comment_article_id_fkey FOREIGN KEY (article_id) REFERENCES article(id);
--
-- Name: comment_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: coco98
--
ALTER TABLE ONLY comment
ADD CONSTRAINT comment_user_id_fkey FOREIGN KEY (user_id) REFERENCES "user"(id);
Contact GitHub API Training Shop Blog About
server.js by Tanmai
var express = require('express');
var morgan = require('morgan');
var path = require('path');
var Pool = require('pg').Pool;
var crypto = require('crypto');
var bodyParser = require('body-parser');
var session = require('express-session');
var config = {
user: 'coco98',
database: 'coco98',
host: 'db.imad.hasura-app.io',
port: '5432',
password: process.env.DB_PASSWORD
};
var app = express();
app.use(morgan('combined'));
app.use(bodyParser.json());
app.use(session({
secret: 'someRandomSecretValue',
cookie: { maxAge: 1000 * 60 * 60 * 24 * 30}
}));
function createTemplate (data) {
var title = data.title;
var date = data.date;
var heading = data.heading;
var content = data.content;
var htmlTemplate = `
<html>
<head>
<title>
${title}
</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="/ui/style.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<div>
<a href="/">Home</a>
</div>
<hr/>
<h3>
${heading}
</h3>
<div>
${date.toDateString()}
</div>
<div>
${content}
</div>
<hr/>
<h4>Comments</h4>
<div id="comment_form">
</div>
<div id="comments">
<center>Loading comments...</center>
</div>
</div>
<script type="text/javascript" src="/ui/article.js"></script>
</body>
</html>
`;
return htmlTemplate;
}
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, 'ui', 'index.html'));
});
function hash (input, salt) {
// How do we create a hash?
var hashed = crypto.pbkdf2Sync(input, salt, 10000, 512, 'sha512');
return ["pbkdf2", "10000", salt, hashed.toString('hex')].join('$');
}
app.get('/hash/:input', function(req, res) {
var hashedString = hash(req.params.input, 'this-is-some-random-string');
res.send(hashedString);
});
app.post('/create-user', function (req, res) {
// username, password
// {"username": "tanmai", "password": "password"}
// JSON
var username = req.body.username;
var password = req.body.password;
var salt = crypto.randomBytes(128).toString('hex');
var dbString = hash(password, salt);
pool.query('INSERT INTO "user" (username, password) VALUES ($1, $2)', [username, dbString], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send('User successfully created: ' + username);
}
});
});
app.post('/login', function (req, res) {
var username = req.body.username;
var password = req.body.password;
pool.query('SELECT * FROM "user" WHERE username = $1', [username], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
if (result.rows.length === 0) {
res.status(403).send('username/password is invalid');
} else {
// Match the password
var dbString = result.rows[0].password;
var salt = dbString.split('$')[2];
var hashedPassword = hash(password, salt); // Creating a hash based on the password submitted and the original salt
if (hashedPassword === dbString) {
// Set the session
req.session.auth = {userId: result.rows[0].id};
// set cookie with a session id
// internally, on the server side, it maps the session id to an object
// { auth: {userId }}
res.send('credentials correct!');
} else {
res.status(403).send('username/password is invalid');
}
}
}
});
});
app.get('/check-login', function (req, res) {
if (req.session && req.session.auth && req.session.auth.userId) {
// Load the user object
pool.query('SELECT * FROM "user" WHERE id = $1', [req.session.auth.userId], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send(result.rows[0].username);
}
});
} else {
res.status(400).send('You are not logged in');
}
});
app.get('/logout', function (req, res) {
delete req.session.auth;
res.send('<html><body>Logged out!<br/><br/><a href="/">Back to home</a></body></html>');
});
var pool = new Pool(config);
app.get('/get-articles', function (req, res) {
// make a select request
// return a response with the results
pool.query('SELECT * FROM article ORDER BY date DESC', function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send(JSON.stringify(result.rows));
}
});
});
app.get('/get-comments/:articleName', function (req, res) {
// make a select request
// return a response with the results
pool.query('SELECT comment.*, "user".username FROM article, comment, "user" WHERE article.title = $1 AND article.id = comment.article_id AND comment.user_id = "user".id ORDER BY comment.timestamp DESC', [req.params.articleName], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send(JSON.stringify(result.rows));
}
});
});
app.post('/submit-comment/:articleName', function (req, res) {
// Check if the user is logged in
if (req.session && req.session.auth && req.session.auth.userId) {
// First check if the article exists and get the article-id
pool.query('SELECT * from article where title = $1', [req.params.articleName], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
if (result.rows.length === 0) {
res.status(400).send('Article not found');
} else {
var articleId = result.rows[0].id;
// Now insert the right comment for this article
pool.query(
"INSERT INTO comment (comment, article_id, user_id) VALUES ($1, $2, $3)",
[req.body.comment, articleId, req.session.auth.userId],
function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.status(200).send('Comment inserted!')
}
});
}
}
});
} else {
res.status(403).send('Only logged in users can comment');
}
});
app.get('/articles/:articleName', function (req, res) {
// SELECT * FROM article WHERE title = '\'; DELETE WHERE a = \'asdf'
pool.query("SELECT * FROM article WHERE title = $1", [req.params.articleName], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
if (result.rows.length === 0) {
res.status(404).send('Article not found');
} else {
var articleData = result.rows[0];
res.send(createTemplate(articleData));
}
}
});
});
app.get('/ui/:fileName', function (req, res) {
res.sendFile(path.join(__dirname, 'ui', req.params.fileName));
});
var port = 8080; // Use 8080 for local development because you might already have apache running on 80
app.listen(8080, function () {
console.log(`IMAD course app listening on port ${port}!`);
});
var morgan = require('morgan');
var path = require('path');
var Pool = require('pg').Pool;
var crypto = require('crypto');
var bodyParser = require('body-parser');
var session = require('express-session');
var config = {
user: 'coco98',
database: 'coco98',
host: 'db.imad.hasura-app.io',
port: '5432',
password: process.env.DB_PASSWORD
};
var app = express();
app.use(morgan('combined'));
app.use(bodyParser.json());
app.use(session({
secret: 'someRandomSecretValue',
cookie: { maxAge: 1000 * 60 * 60 * 24 * 30}
}));
function createTemplate (data) {
var title = data.title;
var date = data.date;
var heading = data.heading;
var content = data.content;
var htmlTemplate = `
<html>
<head>
<title>
${title}
</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="/ui/style.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<div>
<a href="/">Home</a>
</div>
<hr/>
<h3>
${heading}
</h3>
<div>
${date.toDateString()}
</div>
<div>
${content}
</div>
<hr/>
<h4>Comments</h4>
<div id="comment_form">
</div>
<div id="comments">
<center>Loading comments...</center>
</div>
</div>
<script type="text/javascript" src="/ui/article.js"></script>
</body>
</html>
`;
return htmlTemplate;
}
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, 'ui', 'index.html'));
});
function hash (input, salt) {
// How do we create a hash?
var hashed = crypto.pbkdf2Sync(input, salt, 10000, 512, 'sha512');
return ["pbkdf2", "10000", salt, hashed.toString('hex')].join('$');
}
app.get('/hash/:input', function(req, res) {
var hashedString = hash(req.params.input, 'this-is-some-random-string');
res.send(hashedString);
});
app.post('/create-user', function (req, res) {
// username, password
// {"username": "tanmai", "password": "password"}
// JSON
var username = req.body.username;
var password = req.body.password;
var salt = crypto.randomBytes(128).toString('hex');
var dbString = hash(password, salt);
pool.query('INSERT INTO "user" (username, password) VALUES ($1, $2)', [username, dbString], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send('User successfully created: ' + username);
}
});
});
app.post('/login', function (req, res) {
var username = req.body.username;
var password = req.body.password;
pool.query('SELECT * FROM "user" WHERE username = $1', [username], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
if (result.rows.length === 0) {
res.status(403).send('username/password is invalid');
} else {
// Match the password
var dbString = result.rows[0].password;
var salt = dbString.split('$')[2];
var hashedPassword = hash(password, salt); // Creating a hash based on the password submitted and the original salt
if (hashedPassword === dbString) {
// Set the session
req.session.auth = {userId: result.rows[0].id};
// set cookie with a session id
// internally, on the server side, it maps the session id to an object
// { auth: {userId }}
res.send('credentials correct!');
} else {
res.status(403).send('username/password is invalid');
}
}
}
});
});
app.get('/check-login', function (req, res) {
if (req.session && req.session.auth && req.session.auth.userId) {
// Load the user object
pool.query('SELECT * FROM "user" WHERE id = $1', [req.session.auth.userId], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send(result.rows[0].username);
}
});
} else {
res.status(400).send('You are not logged in');
}
});
app.get('/logout', function (req, res) {
delete req.session.auth;
res.send('<html><body>Logged out!<br/><br/><a href="/">Back to home</a></body></html>');
});
var pool = new Pool(config);
app.get('/get-articles', function (req, res) {
// make a select request
// return a response with the results
pool.query('SELECT * FROM article ORDER BY date DESC', function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send(JSON.stringify(result.rows));
}
});
});
app.get('/get-comments/:articleName', function (req, res) {
// make a select request
// return a response with the results
pool.query('SELECT comment.*, "user".username FROM article, comment, "user" WHERE article.title = $1 AND article.id = comment.article_id AND comment.user_id = "user".id ORDER BY comment.timestamp DESC', [req.params.articleName], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.send(JSON.stringify(result.rows));
}
});
});
app.post('/submit-comment/:articleName', function (req, res) {
// Check if the user is logged in
if (req.session && req.session.auth && req.session.auth.userId) {
// First check if the article exists and get the article-id
pool.query('SELECT * from article where title = $1', [req.params.articleName], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
if (result.rows.length === 0) {
res.status(400).send('Article not found');
} else {
var articleId = result.rows[0].id;
// Now insert the right comment for this article
pool.query(
"INSERT INTO comment (comment, article_id, user_id) VALUES ($1, $2, $3)",
[req.body.comment, articleId, req.session.auth.userId],
function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
res.status(200).send('Comment inserted!')
}
});
}
}
});
} else {
res.status(403).send('Only logged in users can comment');
}
});
app.get('/articles/:articleName', function (req, res) {
// SELECT * FROM article WHERE title = '\'; DELETE WHERE a = \'asdf'
pool.query("SELECT * FROM article WHERE title = $1", [req.params.articleName], function (err, result) {
if (err) {
res.status(500).send(err.toString());
} else {
if (result.rows.length === 0) {
res.status(404).send('Article not found');
} else {
var articleData = result.rows[0];
res.send(createTemplate(articleData));
}
}
});
});
app.get('/ui/:fileName', function (req, res) {
res.sendFile(path.join(__dirname, 'ui', req.params.fileName));
});
var port = 8080; // Use 8080 for local development because you might already have apache running on 80
app.listen(8080, function () {
console.log(`IMAD course app listening on port ${port}!`);
});
indexhtml by Tanmai
<!doctype html>
<html>
<head>
<link href="/ui/style.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<div class="center">
<img id='madi' src="https://pbs.twimg.com/profile_images/794285789240623104/Cyio02cd_400x400.jpg" class="img-medium"/>
</div>
<h3>About Me</h3>
<div>
Hi. My name is Tanmai Gopal<br/>
I work at Hasura
</div>
<hr/>
<div id="login_area">
<center>Loading login status...</center>
</div>
<hr/>
<h3>My Articles</h3>
<div id="articles">
<center>Loading articles...</center>
</div>
<div class="footer">
</div>
</div>
<script type="text/javascript" src="/ui/main.js">
</script>
</body>
</html>
<html>
<head>
<link href="/ui/style.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<div class="center">
<img id='madi' src="https://pbs.twimg.com/profile_images/794285789240623104/Cyio02cd_400x400.jpg" class="img-medium"/>
</div>
<h3>About Me</h3>
<div>
Hi. My name is Tanmai Gopal<br/>
I work at Hasura
</div>
<hr/>
<div id="login_area">
<center>Loading login status...</center>
</div>
<hr/>
<h3>My Articles</h3>
<div id="articles">
<center>Loading articles...</center>
</div>
<div class="footer">
</div>
</div>
<script type="text/javascript" src="/ui/main.js">
</script>
</body>
</html>
Main.js by Tanmai
function loadLoginForm () { /////////////////////loadLoginForm() DEFINED
var loginHtml = `
<h3>Login/Register to unlock awesome features</h3>
<input type="text" id="username" placeholder="username" />
<input type="password" id="password" />
<br/><br/>
<input type="submit" id="login_btn" value="Login" />
<input type="submit" id="register_btn" value="Register" />
`;
document.getElementById('login_area').innerHTML = loginHtml;
// Submit username/password to login
var submit = document.getElementById('login_btn'); ////Login button action
submit.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
submit.value = 'Sucess!';
} else if (request.status === 403) {
submit.value = 'Invalid credentials. Try again?';
} else if (request.status === 500) {
alert('Something went wrong on the server');
submit.value = 'Login';
} else {
alert('Something went wrong on the server');
submit.value = 'Login';
}
loadLogin();//////////////////////////////////////////////////loadLogin() CALLED
}
// Not done yet
};
// Make the request
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
console.log(username);
console.log(password);
request.open('POST', '/login', true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({username: username, password: password}));
submit.value = 'Logging in...';
};
var register = document.getElementById('register_btn'); ////////////registration button action
register.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
alert('User created successfully');
register.value = 'Registered!';
} else {
alert('Could not register the user');
register.value = 'Register';
}
}
};
// Make the request
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
console.log(username);
console.log(password);
request.open('POST', '/create-user', true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({username: username, password: password}));
register.value = 'Registering...';
};
}
function loadLoggedInUser (username) { //////////////loadLoggedInUser
var loginArea = document.getElementById('login_area');
loginArea.innerHTML = `
<h3> Hi <i>${username}</i></h3>
<a href="/logout">Logout</a> ////////////////LINK to call the logout function on server-side code
`;
}
function loadLogin () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
loadLoggedInUser(this.responseText);
} else {
loadLoginForm();
}
}
};
request.open('GET', '/check-login', true); ////////////////////call to the check-login function of server-side code
request.send(null);
}
SERVER-SIDE FUNCTIONS can be called by the client side in two ways
1. CLICKING on a LINK for that END-POINT
2. By invoking the OPEN('method =GET/PUT', 'END-POINT's (containing the function) route', true); function and
the XMLHttpRequest object i.e. by making an AJAX request object...call
///////////////////////////////////////////////////////////////////////////////////////////////////////////
function loadArticles () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
var articles = document.getElementById('articles');
if (request.status === 200) {
var content = '<ul>';
var articleData = JSON.parse(this.responseText);
for (var i=0; i< articleData.length; i++) {
content += `<li>
<a href="/articles/${articleData[i].title}">${articleData[i].heading}</a>
(${articleData[i].date.split('T')[0]})</li>`;
}
content += "</ul>"
articles.innerHTML = content;
} else {
articles.innerHTML('Oops! Could not load all articles!')
}
}
};
request.open('GET', '/get-articles', true);
request.send(null);
}
// The first thing to do is to check if the user is logged in!
loadLogin();
// Now this is something that we could have directly done on the server-side using templating too!
loadArticles();
Contact GitHub API Training Shop Blog About
var loginHtml = `
<h3>Login/Register to unlock awesome features</h3>
<input type="text" id="username" placeholder="username" />
<input type="password" id="password" />
<br/><br/>
<input type="submit" id="login_btn" value="Login" />
<input type="submit" id="register_btn" value="Register" />
`;
document.getElementById('login_area').innerHTML = loginHtml;
// Submit username/password to login
var submit = document.getElementById('login_btn'); ////Login button action
submit.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
submit.value = 'Sucess!';
} else if (request.status === 403) {
submit.value = 'Invalid credentials. Try again?';
} else if (request.status === 500) {
alert('Something went wrong on the server');
submit.value = 'Login';
} else {
alert('Something went wrong on the server');
submit.value = 'Login';
}
loadLogin();//////////////////////////////////////////////////loadLogin() CALLED
}
// Not done yet
};
// Make the request
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
console.log(username);
console.log(password);
request.open('POST', '/login', true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({username: username, password: password}));
submit.value = 'Logging in...';
};
var register = document.getElementById('register_btn'); ////////////registration button action
register.onclick = function () {
// Create a request object
var request = new XMLHttpRequest();
// Capture the response and store it in a variable
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
// Take some action
if (request.status === 200) {
alert('User created successfully');
register.value = 'Registered!';
} else {
alert('Could not register the user');
register.value = 'Register';
}
}
};
// Make the request
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
console.log(username);
console.log(password);
request.open('POST', '/create-user', true);
request.setRequestHeader('Content-Type', 'application/json');
request.send(JSON.stringify({username: username, password: password}));
register.value = 'Registering...';
};
}
function loadLoggedInUser (username) { //////////////loadLoggedInUser
var loginArea = document.getElementById('login_area');
loginArea.innerHTML = `
<h3> Hi <i>${username}</i></h3>
<a href="/logout">Logout</a> ////////////////LINK to call the logout function on server-side code
`;
}
function loadLogin () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
loadLoggedInUser(this.responseText);
} else {
loadLoginForm();
}
}
};
request.open('GET', '/check-login', true); ////////////////////call to the check-login function of server-side code
request.send(null);
}
SERVER-SIDE FUNCTIONS can be called by the client side in two ways
1. CLICKING on a LINK for that END-POINT
2. By invoking the OPEN('method =GET/PUT', 'END-POINT's (containing the function) route', true); function and
the XMLHttpRequest object i.e. by making an AJAX request object...call
///////////////////////////////////////////////////////////////////////////////////////////////////////////
function loadArticles () {
// Check if the user is already logged in
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE) {
var articles = document.getElementById('articles');
if (request.status === 200) {
var content = '<ul>';
var articleData = JSON.parse(this.responseText);
for (var i=0; i< articleData.length; i++) {
content += `<li>
<a href="/articles/${articleData[i].title}">${articleData[i].heading}</a>
(${articleData[i].date.split('T')[0]})</li>`;
}
content += "</ul>"
articles.innerHTML = content;
} else {
articles.innerHTML('Oops! Could not load all articles!')
}
}
};
request.open('GET', '/get-articles', true);
request.send(null);
}
// The first thing to do is to check if the user is logged in!
loadLogin();
// Now this is something that we could have directly done on the server-side using templating too!
loadArticles();
Contact GitHub API Training Shop Blog About
CSS code :
body {
|
font-family:
sans-serif;
|
background-color:
white;
|
margin-top:
5px;
|
}
|
.center
{
|
text-align:
center;
|
}
|
.text-big
{
|
font-size:
300%;
|
}
|
.text-medium{
|
font-size:200%;
|
}
|
.text-table{
|
font-size:150%;
|
}
|
.bold {
|
font-weight:
bold;
|
}
|
.img-medium
{
|
height:
150px;
|
}
|
.fontcolor1
{
|
color:white;
|
}
|
.container
{
|
margin:auto;
|
padding-left:10px;
|
padding-right:10px;
|
}
|
.blink_me
{
|
animation-duration:
800ms;
|
animation-name:
blink;
|
animation-iteration-count:
infinite;
|
animation-direction:
alternate;
|
}
|
@keyframes
blink {
|
from {
|
opacity:
1;
|
}
|
to {
|
opacity:
0.6;
|
}
|
}
|
/*
|
@keyframes
blink {
|
0% {
|
opacity:
1;
|
color:
white;
|
}
|
25% {
|
color:
green;
|
opacity:
0;
|
}
|
50% {
|
opacity:
1;
|
color:
green;
|
}
|
75% {
|
opacity:
1;
|
color:
green;
|
}
|
100% {
|
opacity:
0;
|
color:
white;
|
}
|
}
|
*/
|
#background
{ background-image: url("/ui/Taj.jpg") ;}
|
#black
{color: black}
|
#blue
{color: blue}
|
#logo
{background-color:#123456; padding:5px; height:275px;}
|
#feedback
{background-color:#123456;}
|
#t
{color:white;}
|
#main
{background-color:#fdc;}
|
#d
{background-color:#fdc;}
|
#h
{background-color:#fdc;}
|
#h1
{color:white;}
|
#h2
{color:white;}
|
#h3 {color:white;}
|
#sub
{background-color:white; }
|
#p
{color:white;}
|
#p1
{color:white;}
|
#p2
{color:white;}
|
#p3
{color:white;}
|
#p4
{color:white;}
|
#p5
{color:white;}
|
#links
{color:white;}
|
#c
{color:black}
|
Subscribe to:
Posts (Atom)
Derivatives stock list at NSE
Complete FNO stock list at NSE. ABB India Ltd ACC Ltd APL Apollo Tubes Ltd AU Small Finance Bank Ltd Aarti Industries Ltd Abbott India Ltd A...
-
Acronym Full Form AJAX Asynchronous JavaScript and XML API Application Programming Interface APK Android Application Package ASP Activ...
-
//The HTML index page <!DOCTYPE html> <!-- To change this license header, choose License Headers in Project Properties. To change ...
-
The sequence of topics to be learnt to become a full stack developer is a minimum of : I. Front-end Developer/ Web Designer: -----------...