├── db ├── connection.js └── messages.js ├── package.json ├── index.js ├── README.md └── .gitignore /db/connection.js: -------------------------------------------------------------------------------- 1 | const monk = require('monk'); 2 | const connectionString = process.env.MONGODB_URI || 'localhost/messageboard'; 3 | const db = monk(connectionString); 4 | 5 | module.exports = db; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "nodemon index.js" 9 | }, 10 | "keywords": [], 11 | "author": "w3cj ", 12 | "license": "MIT", 13 | "dependencies": { 14 | "body-parser": "^1.18.2", 15 | "cors": "^2.8.4", 16 | "express": "^4.16.3", 17 | "joi": "^13.3.0", 18 | "monk": "^6.0.5", 19 | "morgan": "^1.9.0" 20 | }, 21 | "devDependencies": { 22 | "nodemon": "^1.17.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const cors = require('cors'); 3 | const bodyParser = require('body-parser'); 4 | const morgan = require('morgan'); 5 | 6 | const messages = require('./db/messages'); 7 | 8 | const app = express(); 9 | 10 | app.use(morgan('tiny')); 11 | app.use(cors()); 12 | app.use(bodyParser.json()); 13 | 14 | app.get('/', (req, res) => { 15 | res.json({ 16 | message: 'full stack message board! 🎉' 17 | }); 18 | }); 19 | 20 | app.get('/messages', (req, res) => { 21 | messages.getAll().then((messages) => { 22 | res.json(messages); 23 | }); 24 | }); 25 | 26 | app.post('/messages', (req, res) => { 27 | console.log(req.body); 28 | messages.create(req.body).then((message) => { 29 | res.json(message); 30 | }).catch((error) => { 31 | res.status(500); 32 | res.json(error); 33 | }); 34 | }); 35 | 36 | const port = process.env.PORT || 1234; 37 | app.listen(port, () => { 38 | console.log(`listening on ${port}`); 39 | }); 40 | -------------------------------------------------------------------------------- /db/messages.js: -------------------------------------------------------------------------------- 1 | const Joi = require('joi'); 2 | const db = require('./connection'); 3 | 4 | // * username - default to anonymous 5 | // * subject 6 | // * message 7 | // * imageURL 8 | // * created 9 | 10 | const schema = Joi.object().keys({ 11 | username: Joi.string().alphanum().required(), 12 | subject: Joi.string().required(), 13 | message: Joi.string().max(500).required(), 14 | imageURL: Joi.string().uri({ 15 | scheme: [ 16 | /https?/ 17 | ] 18 | }) 19 | }); 20 | 21 | const messages = db.get('messages'); 22 | 23 | function getAll() { 24 | return messages.find(); 25 | } 26 | 27 | function create(message) { 28 | if (!message.username) message.username = 'Anonymous'; 29 | 30 | const result = Joi.validate(message, schema); 31 | if (result.error == null) { 32 | message.created = new Date(); 33 | return messages.insert(message); 34 | } else { 35 | return Promise.reject(result.error); 36 | } 37 | } 38 | 39 | module.exports = { 40 | create, 41 | getAll 42 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Full Stack Message Board 2 | 3 | * [x] Create Server Folder 4 | * [x] Init npm 5 | * [x] Add express morgan cors body-parser 6 | * [x] Create Hello World Route 7 | * [ ] Create Client Folder 8 | * [x] vue create client 9 | * [x] Add bootswatch CSS 10 | * [x] Homepage Layout 11 | * [ ] Add DB to server 12 | * [x] Add monk joi 13 | * [x] Create message model 14 | * [x] Create route to add message to db 15 | * [x] validate message with joi 16 | * username - default to anonymous 17 | * subject 18 | * message 19 | * imageURL 20 | * created_at 21 | * [x] insert message into db 22 | * [x] respond with inserted message 23 | * [x] When page loads show all messages on page 24 | * [x] Server route to GET all messages 25 | * [x] Create new message form on client 26 | * [x] Submit form - fetch POST to server 27 | * [x] Show any errors 28 | * [x] Show new message on page 29 | * [ ] User can reply to a message 30 | * [ ] Reply appears under original message 31 | * [ ] Group messages into categories 32 | * [ ] Deploy! -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | --------------------------------------------------------------------------------