diff --git a/.gitignore b/.gitignore index 57195033..68770caf 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.DS_Store node_modules/ package-lock.json +my_db/ diff --git a/README.md b/README.md index 3945c152..97f509b3 100755 --- a/README.md +++ b/README.md @@ -1,93 +1,16 @@ -Assignment 2 - Short Stack: Basic Two-tier Web Application using HTML/CSS/JS and Node.js -=== +https://glitch.com/~a2-shortstack +https://glitch.com/edit/#!/join/5a913488-40d8-4d25-9210-5a42e41fd157 -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 `
+ + + + + + + + +
IDNameGame NameGame CostHours PlayedCost/h
+ + + + \ No newline at end of file diff --git a/public/js/scripts.js b/public/js/scripts.js index de052eae..e69de29b 100755 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -1,3 +0,0 @@ -// Add some Javascript code here, to run on the front end. - -console.log("Welcome to assignment 2!") \ No newline at end of file diff --git a/server.improved.js b/server.improved.js index 26673fc0..697c45eb 100644 --- a/server.improved.js +++ b/server.improved.js @@ -1,72 +1,86 @@ -const http = require( 'http' ), - fs = require( 'fs' ), - // IMPORTANT: you must run `npm install` in the directory for this assignment - // to install the mime library used in the following line of code - mime = require( 'mime' ), - dir = 'public/', - port = 3000 - -const appdata = [ - { 'model': 'toyota', 'year': 1999, 'mpg': 23 }, - { 'model': 'honda', 'year': 2004, 'mpg': 30 }, - { 'model': 'ford', 'year': 1987, 'mpg': 14} -] - -const server = http.createServer( function( request,response ) { - if( request.method === 'GET' ) { - handleGet( request, response ) - }else if( request.method === 'POST' ){ - handlePost( request, response ) - } -}) - -const handleGet = function( request, response ) { - const filename = dir + request.url.slice( 1 ) - - if( request.url === '/' ) { - sendFile( response, 'public/index.html' ) - }else{ - sendFile( response, filename ) - } -} +let PouchDb = require("pouchdb"); -const handlePost = function( request, response ) { - let dataString = '' +let db = new PouchDb("my_db"); - request.on( 'data', function( data ) { - dataString += data - }) +var entry_id = 0; - request.on( 'end', function() { - console.log( JSON.parse( dataString ) ) +const statusCode = 200; +const errorCode = 404; - // ... do something with the data here!!! +const appdata = []; - response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) - response.end() - }) -} +const http = require("http"), + fs = require("fs"), + // IMPORTANT: you must run `npm install` in the directory for this assignment + // to install the mime library used in the following line of code + mime = require("mime"), + dir = "public/", + port = 3000; -const sendFile = function( response, filename ) { - const type = mime.getType( filename ) +const server = http.createServer(function(request, response) { + if (request.method === "GET") { + handleGet(request, response); + } else if (request.method === "POST") { + handlePost(request, response); + } +}); - fs.readFile( filename, function( err, content ) { +const handleGet = function(request, response) { + const filename = dir + request.url.slice(1); - // if the error = null, then we've loaded the file successfully - if( err === null ) { + if (request.url === "/") { + sendFile(response, "public/index.html"); + } else { + sendFile(response, filename); + } +}; - // status code: https://httpstatuses.com - response.writeHeader( 200, { 'Content-Type': type }) - response.end( content ) +const handlePost = function(request, response) { + let dataString = ""; - }else{ + request.on("data", function(data) { + dataString += data; + }); - // file not found, error code 404 - response.writeHeader( 404 ) - response.end( '404 Error: File Not Found' ) + request.on("end", function() { + console.log(JSON.parse(dataString)); - } - }) -} + // ... do something with the data here!!! -server.listen( process.env.PORT || port ) + const json = JSON.parse(dataString); + entry_id++; + let entry = { id: entry_id }; + + // parse in the table entries + db.put({ + _id: JSON.stringify(entry_id), + name: JSON.stringify(json.name), + favarite_game: JSON.stringify(json.favarite_game), + game_cost: JSON.stringify(json.game_cost), + hours_played: JSON.stringify(json.hours_played), + cost_per_hour: JSON.stringify(json.cost_per_hour) + }); + + response.writeHead(statusCode, "OK", { "Content-Type": "text/plain" }); + response.end(JSON.stringify(entry)); + }); +}; + +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 + if (err === null) { + // status code: https://httpstatuses.com + response.writeHeader(statusCode, { "Content-Type": type }); + response.end(content); + } else { + // file not found, error code 404 + response.writeHeader(errorCode); + response.end("404 Error: File Not Found"); + } + }); +}; + +server.listen(process.env.PORT || port); diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml new file mode 100644 index 00000000..f6d7ea4f --- /dev/null +++ b/shrinkwrap.yaml @@ -0,0 +1,15 @@ +dependencies: + mime: 2.4.6 +packages: + /mime/2.4.6: + dev: false + engines: + node: '>=4.0.0' + hasBin: true + resolution: + integrity: sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== +registry: 'https://registry.npmjs.org/' +shrinkwrapMinorVersion: 9 +shrinkwrapVersion: 3 +specifiers: + mime: ^2.4.4