Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
179 changes: 169 additions & 10 deletions app/server.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,172 @@
var http = require('http');
var fs = require('fs');
var finalHandler = require('finalhandler');
var queryString = require('querystring');
var Router = require('router');
var bodyParser = require('body-parser');
var uid = require('rand-token').uid;
var http = require("http");
var fs = require("fs");
var finalHandler = require("finalhandler");
var queryString = require("querystring");
var Router = require("router");
var bodyParser = require("body-parser");
var uid = require("rand-token").uid;
const url = require("url");

const PORT = 3001;
let brands = [];
let products = [];
let users = [];

http.createServer(function (request, response) {
let accessTokens = ["nZQ3lxORlCvXbLcE","cdH7Xhjw9tjwwXvz"];

}).listen(PORT);
const PORT = 8000;
const hostname = "localhost";

let myRouter = Router();
myRouter.use(bodyParser.json());

let server = http
.createServer(function (request, response) {
myRouter(request, response, finalHandler(request, response));
})
.listen(PORT, () => {
fs.readFile("./initial-data/brands.json", "utf8", function (error, data) {
if (error) throw error;
brands = JSON.parse(data);
});
fs.readFile("./initial-data/products.json", "utf8", function (error, data) {
if (error) throw error;
products = JSON.parse(data);
});
fs.readFile("./initial-data/users.json", "utf8", function (error, data) {
if (error) throw error;
users = JSON.parse(data);
});
console.log(`Server is listening on http://${hostname}:${PORT}`);
});

myRouter.get("/api/brands", (request, response) => {
response.writeHead(200, { "Content-Type": "application/json" });
return response.end(JSON.stringify(brands));
});

myRouter.get("/api/brands/:id/products", (request, response) => {
let brandId = request.params.id;

let requestedProduct = products.find((item) => {
return item.id == brandId;
});

response.writeHead(200, { "Content-Type": "application/json" });
return response.end(JSON.stringify(requestedProduct));
});

myRouter.get("/api/products", (request, response) => {
response.writeHead(200, { "Content-Type": "application/json" });
return response.end(JSON.stringify(products));
});

myRouter.post("/api/login", (request, response) => {
if (request.body.username && request.body.password) {
let user = users.find((user) => {
return (
user.login.username == request.body.username &&
user.login.password == request.body.password
);
});
if (user) {
let newToken = uid(16)
user.login.accessToken = newToken;
accessTokens.push(newToken)
response.writeHead(200, "You have sucessfully logged in!");
response.end()
} else {
response.writeHead(401, "Username or password is incorrect");
response.end();
}
} else {
response.writeHead(400, "You must have both fields filled out");
return response.end();
}
});

myRouter.get("/api/me/cart", (request, response) => {
let user = users.find((user) => {
let match = accessTokens.find((token) => {
return token == user.login.accessToken
})
return match
})

if(user){
response.writeHead(200, { 'Content-Type':'application/json' })
response.end(JSON.stringify(user.cart))
} else {
response.writeHead(401, "You need to be logged in to access this")
response.end()
}
});

myRouter.post("/api/me/cart", (request, response) => {
let user = users.find((user) => {
let match = accessTokens.find((token) => {
return token == user.login.accessToken
})
return match
})

if(user){
response.writeHead(200, { 'Content-Type':'application/json' });
let foundItem = products.find((item) => {
return item.id == request.body.productId
})
user.cart.push(foundItem)
response.end(JSON.stringify(user.cart))
}else {
response.writeHead(401, "You need to be logged in to access this")
response.end()
}
});

myRouter.delete("/api/me/cart/:productId", (request, response) => {
response.writeHead(200, {'Content-Type':'application/json'})
let user = users.find((user) => {
let match = accessTokens.find((token) => {
return token == user.login.accessToken
})
return match
})

user.cart.push(products[1]);
user.cart.push(products[2]);
user.cart.push(products[3]);

let newCart = user.cart.filter((item) => {
return item.id !== request.params.productId
})

response.end(JSON.stringify(newCart));
});

myRouter.put("/api/me/cart/:productId", (request, response) => {
response.writeHead(200, {'Content-Type':'application/json'})
let user = users.find((user) => {
let match = accessTokens.find((token) => {
return token == user.login.accessToken
})
return match
})

if(user){
response.writeHead(200, { 'Content-Type':'application/json' });
let foundItem = products.find((item) => {
return item.id == request.body.productId
})
let qty = request.body.qty
for(let i = 0; i < qty; i++) {
user.cart.push(foundItem)
}
response.end(JSON.stringify(user.cart))
}else {
response.writeHead(401, "You need to be logged in to access this")
response.end()
}

response.end();
})

module.exports = server;
194 changes: 194 additions & 0 deletions app/swagger.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
swagger: "2.0"
info:
title: Sunglasses-io API
description: You've got a bright future with our sunglasses API
version: 1.0.0
host: api.sunglasses.com
schemes:
- http
basePath: /v1
produces:
- application/json
paths:
/api/brands:
get:
tags:
- brands
summary: Returns sunglasses brand names
description: |
Returns a list of items of sunglasses brand names
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: Unexpected error
schema:
$ref: '#/components/schemas/Brands'
/api/brands/:id/products:
get:
tags:
- brands
summary: Returns brand product by matching id
description: |
Returns sunglasses products by matching brand name id
responses:
'200':
description: successful operation
content:
applciation/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: Unexpected error
schema:
$ref: '#/components/schemas/Brands'
/api/products:
get:
tags:
- brands
summary: Returns sunglasses products
description: |
Returns all products of sunglasses
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: Unexpected error
schema:
$ref: '/components/schemas/Brands'
/api/login:
post:
tags:
- user
summary: Log into API user account
description: |
Challenges a user for their login username and password
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: Unexpected error
schema:
$ref: '#/components/schemas/User'
/api/me/cart:
get:
tags:
- user
summary: Shows what items are inside a users cart
description: |
This endpoint brings a user, who is successfully logged into their account, to their shopping cart and displays what items are currently inside of it. From here the user can either checkout or continue shopping
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: Unexpected error
schema:
$ref: '#/components/schemas/User'
post:
tags:
- user
summary: Add a product to the cart
description: |
How a user will add new items to their cart
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: Unexpected error
schema:
$ref: '#/components/schemas/User'
/api/me/cart/:productId:
delete:
tags:
- user
summary: remove a product from the cart
description: |
How a user will remove a product from their cart
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: unexpected error
schema:
$ref: '#/components/schemas/User'
post:
tags:
- user
summary: Modifies the quantity of a product inside the user's cart
description: |
With this endpoint a user can modify the quantity of an item in their shopping cart by adding more or taking away the same product
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
additionalProperties:
type: integer
format: int32
default:
description: unexpected error
schema:
$ref: '#/components/schemas/User'
components:
schemas:
Brands:
type: object
properties:
id:
type: integer
format: int64
example: 1
name:
type: string
example: 'Oakley'
User:
type: object
properties:
id:
Loading