diff --git a/README.md b/README.md index 3945c152..67a02b53 100755 --- a/README.md +++ b/README.md @@ -1,93 +1,9 @@ -Assignment 2 - Short Stack: Basic Two-tier Web Application using HTML/CSS/JS and Node.js -=== - -Due: September 16th, by 11:59 PM. - -This assignment aims to introduce you to the concepts and practice involved in creating a prototype (i.e. not deployment ready) two-tiered web application. The baseline aims of this assignment involve creating an application that demonstrates the use of several specific pieces of HTML, CSS, JavaScript, and Node.js functionality. - -Baseline Requirements ---- - -Note that there is a very large range of application areas and possibilities that meet these baseline requirements. Make your application do something useful! A todo list, storing / retrieving high scores for a very simple game, have a little fun with it. - -Your application is required to implement the following functionalities: - -- a `Server` which not only serves files, but also maintains a tabular dataset with 3 or more fields related to your application -- a `Results` functionality which shows the entire dataset residing in the server's memory -- a `Form/Entry` functionality which allows a user to add, modify, or delete data items residing in the server's memory -- a `Server Logic` which, upon receiving new or modified "incoming" data, includes and uses a function that adds at least one additional derived field to this incoming data before integrating it with the existing dataset -- the `Derived field` for a new row of data must be computed based on fields already existing in the row. For example, a `todo` dataset with `task`, `priority`, and `creation_date` may generate a new field `deadline` by looking at `creation_date` and `priority` - -Your application is required to demonstrate the use of the following concepts: - -HTML: -- One or more [HTML Forms](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms), with any combination of form tags appropriate for the user input portion of the application -- A results page displaying all data currently available on the server. You will most likely use a `` tag for this, but `
+ + + + + + + + + +
NicknameUsernamePasswordSSNAdmin StatusDate addedDelete
+ + + + + diff --git a/server.improved.js b/server.improved.js index 26673fc0..e671c87f 100644 --- a/server.improved.js +++ b/server.improved.js @@ -6,11 +6,23 @@ const http = require( 'http' ), dir = 'public/', port = 3000 -const appdata = [ - { 'model': 'toyota', 'year': 1999, 'mpg': 23 }, - { 'model': 'honda', 'year': 2004, 'mpg': 30 }, - { 'model': 'ford', 'year': 1987, 'mpg': 14} -] +let appdata = [ + {id: 0, username: "Test", password: "password" , ssn : "123456789", admin: false, dateAdded: '1991-8-21', nick: 'T'}, + {id: 1, username: "n0Passw0rdMan123", password: "password123" , ssn : "987654321", admin: false, dateAdded: '2000-2-24', nick: 'PM'} +]; + +let wasLastAnAdmin = false; + +let resultsPage = null; +fs.readFile('public/results.html', function(err, content){ + resultsPage = content; +}); + +let headerFile; +fs.readFile('public/header.html', function(err, content){ + headerFile = content; +}); + const server = http.createServer( function( request,response ) { if( request.method === 'GET' ) { @@ -20,36 +32,103 @@ const server = http.createServer( function( request,response ) { } }) + + const handleGet = function( request, response ) { const filename = dir + request.url.slice( 1 ) - if( request.url === '/' ) { - sendFile( response, 'public/index.html' ) + sendFile( response, 'public/index.html' ); + }else if (request.url === '/users'){ + sendFile( response, 'public/results.html' ); + }else if (request.url === '/style.css') { + sendFile( response, 'public/css/style.css'); }else{ sendFile( response, filename ) } } const handlePost = function( request, response ) { - let dataString = '' - - request.on( 'data', function( data ) { - dataString += data - }) - - request.on( 'end', function() { - console.log( JSON.parse( dataString ) ) - - // ... do something with the data here!!! + if( request.url === '/delete' ) { + let toDelete = ''; + + request.on('data', function( data ) { + toDelete += data; + toDelete = JSON.parse(toDelete).id; + }); + + request.on('end', function(){ + appdata = appdata.filter(function(val){ + return val.id !== toDelete; + }) + }); + response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }); + response.end(); + } else if (request.url === '/userList'){ + let redactedData = []; + if (wasLastAnAdmin){ + appdata.forEach(function(element){ + redactedData.push({id: element.id, + username: element.username, + password: element.password , + ssn : -1, + admin: element.admin, + dateAdded: element.dateAdded, + nick: element.nick}) + }); + } else { + appdata.forEach(function(element){ + redactedData.push({id: element.id, + username: element.username, + password: -1 , + ssn : -1, + admin: element.admin, + dateAdded: element.dateAdded, + nick: element.nick}) + }); + } + response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }); + response.end(JSON.stringify(redactedData)); + } else { + let dataString = ''; + let nick = ''; + request.on( 'data', function( data ) { + dataString += data; + data = JSON.parse(dataString); + wasLastAnAdmin = data.admin; + let dateAdded = new Date(); + dateAdded = `${dateAdded.getFullYear()}-${dateAdded.getMonth()}-${dateAdded.getDate()} ${dateAdded.getHours()}:${dateAdded.getMinutes()}`; + data.dateAdded = dateAdded; + let upperCase = ''; + for (let i = 0; i < data.username.length; i++){ + if (data.username.charAt(i) === data.username.charAt(i).toUpperCase()){ + upperCase += data.username.charAt(i); + } + } + if (upperCase.length > 0){ + data.nick = upperCase; + } else{ + if (data.username.length === 0){ + data.nick = 'Blank'; + } else { + data.nick = data.username.charAt(0); + } + } + response.end(data.nick); + if (appdata.length === 0){ + data.id = 0 + } else { + data.id = parseInt(appdata[appdata.length - 1].id) + 1; + } + appdata.push(data); + }) + response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }); + + } - response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) - response.end() - }) } const sendFile = function( response, filename ) { const type = mime.getType( filename ) - fs.readFile( filename, function( err, content ) { // if the error = null, then we've loaded the file successfully