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)
इश्क में ग़ैरत-ए-जज़्बात ने रोने ना दिया - सुदर्शन फ़ाकिर
इश्क में ग़ैरत-ए-जज़्बात ने रोने ना दिया वरना क्या बात थी किस बात ने रोने ना दिया आप कहते थे कि रोने से ना बदलेंगे नसीब उमर भर आप की इस बात...
-
Acronym Full Form AJAX Asynchronous JavaScript and XML API Application Programming Interface APK Android Application Package ASP Activ...
-
#include<stdio.h> int main() { int M,N,q; scanf("%i %i",&M, &N); if((M%N)!=0) {printf("0...
-
"A good company understands that problem solving ability and the ability to learn new things are far more important than knowledge o...