/* ----------------------------------------------------------------- */

!!! 5
html
  head
    title #{title}
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    h1 #{title}
    p Enter the name to search for.

    form(action='/search-result', method='get')
      label Name
      input(type='text', name='name')
      input(type='hidden', name='source', value='web')
      input(type='submit', value='Search')

/* ----------------------------------------------------------------- */

app.get('/search-result', function(req, res) {
  var name = req.query.name;
  var source = req.query.source;
  console.log('Searching for: ' + name);
  console.log('From: ' + source);
  res.send(name + ' : ' + source);
});

/* ----------------------------------------------------------------- */

app.get('/search-result', function(req, res) {
  var q = req.query.q;
  var l = req.query.l;
  var e = req.query.e;
  console.log('Query:' + q);
  console.log('Location:' + l);
  console.log('Experience:' + e);
  res.json(req.query);
});

/* ----------------------------------------------------------------- */

!!! 5
html
  head
    title #{title}
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    h1 #{title}
    p Select the skills to search for.

    form(action='/skills-search-result', method='get')
      h3 Skills
      ul
        li
          input(type='checkbox', name='skills', value='Nunchucks')
          label Nunchucks
        li
          input(type='checkbox', name='skills', value='Hacking')
          label Hacking
        li
          input(type='checkbox', name='skills', value='Dancing')
          label Dancing
        li
          input(type='checkbox', name='skills', value='Shooting')
          label Shooting

      input(type='submit', value='Search')

/* ----------------------------------------------------------------- */

app.get('/skills-search-result', function(req, res) {
  var skills = req.query.skills;
  console.log('Skills: ');
  skills.forEach(function(skill, i) {
    console.log((i+1) +'. '+ skill);
  });
  res.json(req.query.skills);
});

/* ----------------------------------------------------------------- */

app.use(express.bodyParser({
  keepExtensions: true,
  uploadDir: './uploads'
}));

/* ----------------------------------------------------------------- */

!!! 5
html
  head
    title #{title}
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    h1 #{title}
    p Enter your name and email address to become a member.

    form(action='/signup', method='post')
      div
        label Name
        input(type='text', name='name')
      div
        label Email
        input(type='text', name='email')
      div
        input(type='submit')

/* ----------------------------------------------------------------- */

app.post('/signup', function(req, res) {
  var name = req.body.name;
  var email = req.body.email;
  console.log('Name: ' + name);
  console.log('Email: ' + email);
  res.json(req.body);
});

/* ----------------------------------------------------------------- */

!!! 5
html
  head
    title #{title}
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    h1 #{title}
    p Enter your name and email address to become a member.

    form(action='/signup', method='post', enctype='multipart/form-data')
      div
        label Name
        input(type='text', name='name')
      div
        label Email
        input(type='text', name='email')
      div
        label Profile Image
        input(type='file', name='profile_image')
      div
        input(type='submit')

/* ----------------------------------------------------------------- */

app.post('/signup', function(req, res) {
  var name = req.body.name;
  var email = req.body.email;
  console.log(req.files);
  res.json(req.files);
});

/* ----------------------------------------------------------------- */

var fs = require('fs');

/* ----------------------------------------------------------------- */

app.post('/signup', function(req, res, next) {

  var name = req.body.name;
  var email = req.body.email;

  // Reference to the profile_image object
  var profile_image = req.files.profile_image;

  // Temporary location of the uploaded file
  var tmp_path = profile_image.path;
  // New location of the file
  var target_path = './public/images/' + profile_image.name;
  // Move the file from the new location
  // fs.rename() will create the necessary directory
  fs.rename(tmp_path, target_path, function(err) {
      // If an error is encountered, pass it to the next handler
      if (err) { next(err); }
      // Delete the temporary file
      fs.unlink(tmp_path, function() {
        // If an error is encountered, pass it to the next handler
          if (err) { next(err); }
          console.log('File uploaded to: ' + target_path + ' - ' + profile_image.size + ' bytes');
          res.redirect('/images/' + profile_image.name);
      });
  });

});

/* ----------------------------------------------------------------- */

req.files.forEach(function(file) {
  // Code to handle the file
  ...
});

/* ----------------------------------------------------------------- */

var upload_dir = './uploads';
var exists = fs.existsSync(upload_dir);
if (!exists) {
  fs.mkdirSync(upload_dir);
}

app.use(express.bodyParser({uploadDir: upload_dir}));

/* ----------------------------------------------------------------- */

app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);

/* ----------------------------------------------------------------- */

form(action='/request', method='post')
    label Name
    input(type='text', name='name')
    input(type='hidden', name='_method', value='put')
    br
    input(type='submit')

/* ----------------------------------------------------------------- */

app.put('/request', function(req, res) {
  console.log('PUT: ' + req.body.name);
  res.send('PUT: ' + req.body.name);
});

/* ----------------------------------------------------------------- */

app.get('/user/:id', function(req, res) {
  console.log('User ID: '+ req.params.id);
  res.send('User ID: '+ req.params.id);
});

/* ----------------------------------------------------------------- */

// This example will fail if the file name has a dot in it
app.get('/file/:name.:ext', function(req, res) {

  var name = req.params.name;
  var ext = req.params.ext;

  console.log('File: ' + name);
  console.log('Ext: ' + ext);

  var log = 'Name: ' + name + '<br>' + 'Ext: ' + ext;
  res.send(log);

});

/* ----------------------------------------------------------------- */

app.get('/route/:from-:to', function(req, res) {

  var from = req.params.from;
  var to = req.params.to;

  console.log('From: ' + from);
  console.log('To: ' + to);

  var log = 'From: ' + from + '<br>' + 'To: ' + to;
  res.send(log);

});

/* ----------------------------------------------------------------- */

app.use(express.cookieParser());

/* ----------------------------------------------------------------- */

app.get('/counter', function(req, res) {

  var count = req.cookies.count || 0;
  count++;
  res.cookie('count', count);
  res.send('Count: ' + count);

});

/* ----------------------------------------------------------------- */

res.cookie('count', count, {
  path: '/counter',
  maxAge: 2000
});

/* ----------------------------------------------------------------- */

res.cookie('counter', new_value);

/* ----------------------------------------------------------------- */

res.cookie('name', 'Napoleon');

/* ----------------------------------------------------------------- */

res.cookie('name', 'Napoleon', {expires: 0});

/* ----------------------------------------------------------------- */

app.use(express.cookieParser('S3CRE7'));

/* ----------------------------------------------------------------- */

app.get('/counter', function(req, res) {

  var count = req.signedCookies.count || 0;
  count++;
  res.cookie('count', count, { signed: true });
  res.send('Count: ' + count);
  
});

/* ----------------------------------------------------------------- */

res.cookie('count', 99);
res.cookie('count', 99, {path: '/counter'});
res.cookie('count', 99, {sign: true});

/* ----------------------------------------------------------------- */

app.use(express.cookieSession({
  key: 'app.sess',
  secret: 'SUPERsekret'
}));

/* ----------------------------------------------------------------- */

app.use(express.cookieParser('S3CRE7'));
app.use(express.session());
app.use(app.router);

/* ----------------------------------------------------------------- */

app.use(express.session({
  key: 'app.sess',
  store: new RedisStore,
  secret: 'SEKR37'
}));

/* ----------------------------------------------------------------- */

var express = require('express');
var RedisStore = require('connect-redis')(express);

/* ----------------------------------------------------------------- */

app.use(express.session({ store: new RedisStore({
  host:'127.0.0.1',
  port:6380,
  prefix:'sess'
}), secret: 'SEKR37' }));

/* ----------------------------------------------------------------- */

var express = require('express');
var MongoStore = require('connect-mongo')(express);
…
app.use(express.session({
  store: new MongoStore({
    db: 'myapp',
    host: '127.0.0.1',
    port: 3355
  })
}));

/* ----------------------------------------------------------------- */

req.session.name = 'Napoleon';

/* ----------------------------------------------------------------- */

req.session['primary skill'] = 'Dancing';

/* ----------------------------------------------------------------- */

var name = req.session.name;
var primary_skill = req.session['primary skill'];

/* ----------------------------------------------------------------- */

// Assuming req.session.skills and req.session.name were already defined
req.session.skills.push('Baking');
req.session.name = 'Pedro';

/* ----------------------------------------------------------------- */

delete req.session.name
delete req.session['primary skill'];

/* ----------------------------------------------------------------- */

delete req.session;
req.session = null;

/* ----------------------------------------------------------------- */

req.session.destroy();

/* ----------------------------------------------------------------- */

req.session.destroy(function() {
  res.send('Session deleted');
});

