| @@ -0,0 +1,3 @@ | |||
| @API_URL = "http://vapor.prelub.com/api/v1.0" | |||
| GET {{API_URL}}/users | |||
| @@ -0,0 +1,112 @@ | |||
| /* | |||
| This uses json-server, but with the module approach: https://github.com/typicode/json-server#module | |||
| Downside: You can't pass the json-server command line options. | |||
| Instead, can override some defaults by passing a config object to jsonServer.defaults(); | |||
| You have to check the source code to set some items. | |||
| Examples: | |||
| Validation/Customization: https://github.com/typicode/json-server/issues/266 | |||
| Delay: https://github.com/typicode/json-server/issues/534 | |||
| ID: https://github.com/typicode/json-server/issues/613#issuecomment-325393041 | |||
| Relevant source code: https://github.com/typicode/json-server/blob/master/src/cli/run.js | |||
| */ | |||
| /* eslint-disable no-console */ | |||
| const jsonServer = require("json-server"); | |||
| const server = jsonServer.create(); | |||
| const path = require("path"); | |||
| const router = jsonServer.router(path.join(__dirname, "db.json")); | |||
| // Can pass a limited number of options to this to override (some) defaults. See https://github.com/typicode/json-server#api | |||
| const middlewares = jsonServer.defaults({ | |||
| // Display json-server's built in homepage when json-server starts. | |||
| static: "node_modules/json-server/dist", | |||
| }); | |||
| // Set default middlewares (logger, static, cors and no-cache) | |||
| server.use(middlewares); | |||
| // To handle POST, PUT and PATCH you need to use a body-parser. Using JSON Server's bodyParser | |||
| server.use(jsonServer.bodyParser); | |||
| // Simulate delay on all requests | |||
| server.use(function (req, res, next) { | |||
| setTimeout(next, 0); | |||
| }); | |||
| // Declaring custom routes below. Add custom routes before JSON Server router | |||
| // Add createdAt to all POSTS | |||
| server.use((req, res, next) => { | |||
| if (req.method === "POST") { | |||
| req.body.createdAt = Date.now(); | |||
| } | |||
| // Continue to JSON Server router | |||
| next(); | |||
| }); | |||
| server.post("/courses/", function (req, res, next) { | |||
| const error = validateCourse(req.body); | |||
| if (error) { | |||
| res.status(400).send(error); | |||
| } else { | |||
| req.body.slug = createSlug(req.body.title); // Generate a slug for new courses. | |||
| next(); | |||
| } | |||
| }); | |||
| server.post("/users/", function (req, res, next) { | |||
| const error = validateUser(req.body); | |||
| if (error) { | |||
| res.status(400).send(error); | |||
| } else { | |||
| req.body.slug = createSlug(req.body.title); // Generate a slug for new users. | |||
| next(); | |||
| } | |||
| }); | |||
| /*********************************************** | |||
| * bpapiServerSnipppet at the above this line * | |||
| * There will be 2 tab stops that need changed * | |||
| *********************************************** | |||
| */ | |||
| // Use default router | |||
| server.use(router); | |||
| // Start server | |||
| const port = 3001; | |||
| server.listen(port, () => { | |||
| console.log(`JSON Server is running on port ${port}`); | |||
| }); | |||
| // Centralized logic | |||
| // Returns a URL friendly slug | |||
| function createSlug(value) { | |||
| return value | |||
| .replace(/[^a-z0-9_]+/gi, "-") | |||
| .replace(/^-|-$/g, "") | |||
| .toLowerCase(); | |||
| } | |||
| function validateCourse(course) { | |||
| if (!course.title) return "Title is required."; | |||
| if (!course.authorId) return "Author is required."; | |||
| if (!course.category) return "Category is required."; | |||
| return ""; | |||
| } | |||
| function validateUser(user) { | |||
| if (!user.firstname) return "First name is required."; | |||
| if (!user.lastname) return "Last name is required."; | |||
| if (!user.username) return "Username is required."; | |||
| if (!user.password) return "Password is required."; | |||
| if (!user.emil) return "Email is required."; | |||
| if (!user.isactive) return "Is active is required."; | |||
| return ""; | |||
| } | |||
| /*********************************************** | |||
| * bpapiServerValidation at the above this line* | |||
| * There will be 2 tab stops that need changed * | |||
| *********************************************** | |||
| */ | |||
| @@ -0,0 +1,16 @@ | |||
| /* eslint-disable no-console */ | |||
| const fs = require("fs"); | |||
| const path = require("path"); | |||
| const mockData = require("./mockData"); | |||
| const { courses, authors, users /* , Add aditional models here */ } = mockData; | |||
| const data = JSON.stringify({ | |||
| courses, | |||
| authors, | |||
| users /* , Add additional models here */, | |||
| }); | |||
| const filepath = path.join(__dirname, "db.json"); | |||
| fs.writeFile(filepath, data, function (err) { | |||
| err ? console.log(err) : console.log("Mock DB created."); | |||
| }); | |||
| @@ -0,0 +1 @@ | |||
| {"courses":[{"id":1,"title":"Securing React Apps with Auth0","slug":"react-auth0-authentication-security","authorId":1,"category":"JavaScript"},{"id":2,"title":"React: The Big Picture","slug":"react-big-picture","authorId":1,"category":"JavaScript"},{"id":3,"title":"Creating Reusable React Components","slug":"react-creating-reusable-components","authorId":1,"category":"JavaScript"},{"id":4,"title":"Building a JavaScript Development Environment","slug":"javascript-development-environment","authorId":1,"category":"JavaScript"},{"id":5,"title":"Building Applications with React and Redux","slug":"react-redux-react-router-es6","authorId":1,"category":"JavaScript"},{"id":6,"title":"Building Applications in React and Flux","slug":"react-flux-building-applications","authorId":1,"category":"JavaScript"},{"id":7,"title":"Clean Code: Writing Code for Humans","slug":"writing-clean-code-humans","authorId":1,"category":"Software Practices"},{"id":8,"title":"Architecting Applications for the Real World","slug":"architecting-applications-dotnet","authorId":1,"category":"Software Architecture"},{"id":9,"title":"Becoming an Outlier: Reprogramming the Developer Mind","slug":"career-reboot-for-developer-mind","authorId":1,"category":"Career"},{"id":10,"title":"Web Component Fundamentals","slug":"web-components-shadow-dom","authorId":1,"category":"HTML5"}],"authors":[{"id":1,"name":"Cory House"},{"id":2,"name":"Scott Allen"},{"id":3,"name":"Dan Wahlin"}],"users":[{"firstname":"George","email":"ghorensky@rpmindustries.com","lastname":"Horensky","username":"ghorensky","password":"ghorensky","isactive":true,"id":2},{"firstname":"George","email":"gwilhelm@rpmindustries.com","lastname":"Wilhelm","username":"gwilhelm","password":"gwilhelm","isactive":true,"id":3},{"firstname":"John","email":"jmccosby@rpmindustries.com","lastname":"McCosby","username":"jmccosby","password":"jmccosby","isactive":true,"id":4},{"firstname":"John","email":"jzwicker@rpmindustries.com","lastname":"Zwicker","username":"jzwicker","password":"jzwicker","isactive":true,"id":5},{"firstname":"Bill","email":"bryckman@rpmindustries.com","lastname":"Ryckman","username":"bryckman","password":"bryckman","isactive":true,"id":6},{"firstname":"Justin","email":"jkieffer@rpmindustries.com","lastname":"Kieffer","username":"jkieffer","password":"jkieffer","isactive":true,"id":7},{"firstname":"Patrick","email":"pbuono@rpmindustries.com","lastname":"Buono","username":"pbuono","password":"pbuono","isactive":false,"id":8},{"firstname":"Josh","email":"jmorgan@rpmindustries.com","lastname":"Morgan","username":"jmorgan","password":"jmorgan","isactive":true,"id":9},{"firstname":"Anthony","email":"aguzzi@rpmindustries.com","lastname":"Guzzi","username":"aguzzi","password":"aguzzi","isactive":false,"id":10},{"firstname":"Art","email":"aschrage@rpmindustries.com","lastname":"Schrage","username":"aschrage","password":"ascharge","isactive":false,"id":11}]} | |||
| @@ -0,0 +1,214 @@ | |||
| const courses = [ | |||
| { | |||
| id: 1, | |||
| title: "Securing React Apps with Auth0", | |||
| slug: "react-auth0-authentication-security", | |||
| authorId: 1, | |||
| category: "JavaScript", | |||
| }, | |||
| { | |||
| id: 2, | |||
| title: "React: The Big Picture", | |||
| slug: "react-big-picture", | |||
| authorId: 1, | |||
| category: "JavaScript", | |||
| }, | |||
| { | |||
| id: 3, | |||
| title: "Creating Reusable React Components", | |||
| slug: "react-creating-reusable-components", | |||
| authorId: 1, | |||
| category: "JavaScript", | |||
| }, | |||
| { | |||
| id: 4, | |||
| title: "Building a JavaScript Development Environment", | |||
| slug: "javascript-development-environment", | |||
| authorId: 1, | |||
| category: "JavaScript", | |||
| }, | |||
| { | |||
| id: 5, | |||
| title: "Building Applications with React and Redux", | |||
| slug: "react-redux-react-router-es6", | |||
| authorId: 1, | |||
| category: "JavaScript", | |||
| }, | |||
| { | |||
| id: 6, | |||
| title: "Building Applications in React and Flux", | |||
| slug: "react-flux-building-applications", | |||
| authorId: 1, | |||
| category: "JavaScript", | |||
| }, | |||
| { | |||
| id: 7, | |||
| title: "Clean Code: Writing Code for Humans", | |||
| slug: "writing-clean-code-humans", | |||
| authorId: 1, | |||
| category: "Software Practices", | |||
| }, | |||
| { | |||
| id: 8, | |||
| title: "Architecting Applications for the Real World", | |||
| slug: "architecting-applications-dotnet", | |||
| authorId: 1, | |||
| category: "Software Architecture", | |||
| }, | |||
| { | |||
| id: 9, | |||
| title: "Becoming an Outlier: Reprogramming the Developer Mind", | |||
| slug: "career-reboot-for-developer-mind", | |||
| authorId: 1, | |||
| category: "Career", | |||
| }, | |||
| { | |||
| id: 10, | |||
| title: "Web Component Fundamentals", | |||
| slug: "web-components-shadow-dom", | |||
| authorId: 1, | |||
| category: "HTML5", | |||
| }, | |||
| ]; | |||
| const authors = [ | |||
| { id: 1, name: "Cory House" }, | |||
| { id: 2, name: "Scott Allen" }, | |||
| { id: 3, name: "Dan Wahlin" }, | |||
| ]; | |||
| const users = [ | |||
| { | |||
| firstname: "George", | |||
| email: "ghorensky@rpmindustries.com", | |||
| lastname: "Horensky", | |||
| username: "ghorensky", | |||
| password: "ghorensky", | |||
| isactive: true, | |||
| id: 2, | |||
| }, | |||
| { | |||
| firstname: "George", | |||
| email: "gwilhelm@rpmindustries.com", | |||
| lastname: "Wilhelm", | |||
| username: "gwilhelm", | |||
| password: "gwilhelm", | |||
| isactive: true, | |||
| id: 3, | |||
| }, | |||
| { | |||
| firstname: "John", | |||
| email: "jmccosby@rpmindustries.com", | |||
| lastname: "McCosby", | |||
| username: "jmccosby", | |||
| password: "jmccosby", | |||
| isactive: true, | |||
| id: 4, | |||
| }, | |||
| { | |||
| firstname: "John", | |||
| email: "jzwicker@rpmindustries.com", | |||
| lastname: "Zwicker", | |||
| username: "jzwicker", | |||
| password: "jzwicker", | |||
| isactive: true, | |||
| id: 5, | |||
| }, | |||
| { | |||
| firstname: "Bill", | |||
| email: "bryckman@rpmindustries.com", | |||
| lastname: "Ryckman", | |||
| username: "bryckman", | |||
| password: "bryckman", | |||
| isactive: true, | |||
| id: 6, | |||
| }, | |||
| { | |||
| firstname: "Justin", | |||
| email: "jkieffer@rpmindustries.com", | |||
| lastname: "Kieffer", | |||
| username: "jkieffer", | |||
| password: "jkieffer", | |||
| isactive: true, | |||
| id: 7, | |||
| }, | |||
| { | |||
| firstname: "Patrick", | |||
| email: "pbuono@rpmindustries.com", | |||
| lastname: "Buono", | |||
| username: "pbuono", | |||
| password: "pbuono", | |||
| isactive: false, | |||
| id: 8, | |||
| }, | |||
| { | |||
| firstname: "Josh", | |||
| email: "jmorgan@rpmindustries.com", | |||
| lastname: "Morgan", | |||
| username: "jmorgan", | |||
| password: "jmorgan", | |||
| isactive: true, | |||
| id: 9, | |||
| }, | |||
| { | |||
| firstname: "Anthony", | |||
| email: "aguzzi@rpmindustries.com", | |||
| lastname: "Guzzi", | |||
| username: "aguzzi", | |||
| password: "aguzzi", | |||
| isactive: false, | |||
| id: 10, | |||
| }, | |||
| { | |||
| firstname: "Art", | |||
| email: "aschrage@rpmindustries.com", | |||
| lastname: "Schrage", | |||
| username: "aschrage", | |||
| password: "ascharge", | |||
| isactive: false, | |||
| id: 11, | |||
| }, | |||
| ]; | |||
| //TODO | |||
| /****************************************** | |||
| * Add new databodels above these comments* | |||
| * const model = [ object ] * | |||
| * bpmockDataNewObject * | |||
| * bpmockDataNewObjectLine * | |||
| * **************************************** | |||
| */ | |||
| const newUser = { | |||
| firstname: "", | |||
| email: "", | |||
| lastname: "", | |||
| username: "", | |||
| password: "", | |||
| isactive: true, | |||
| id: null, | |||
| }; | |||
| const newCourse = { | |||
| id: null, | |||
| title: "", | |||
| authorId: null, | |||
| category: "", | |||
| }; | |||
| //TODO | |||
| /******************************************************** | |||
| * Add newmodel constants above this block of comments * | |||
| * ****************************************************** | |||
| */ | |||
| // Using CommonJS style export so we can consume via Node (without using Babel-node) | |||
| module.exports = { | |||
| newCourse, | |||
| newUser, | |||
| /** Add newObject construct reference here */ | |||
| courses, | |||
| authors, | |||
| users, | |||
| /** Add objects(list) reference here */ | |||
| }; | |||