From 039c1d20eac40ef89a4462865aec343b99fa4e5c Mon Sep 17 00:00:00 2001 From: Andreas Drivenes Date: Tue, 20 Sep 2016 15:19:18 +0200 Subject: [PATCH 1/4] Refactor server to ES6 Create a new server package.json Add babel and eslint Todo: Refactor import folder. --- server/.babelrc | 3 + server/.eslintignore | 3 + server/.eslintrc | 13 ++++ server/.gitignore | 1 + server/controllers/auth.js | 25 ++++--- server/controllers/event.js | 142 ++++++++++++++++++------------------ server/controllers/image.js | 43 ++++++----- server/controllers/user.js | 51 +++++++------ server/controllers/venue.js | 56 +++++++------- server/models/Event.js | 29 ++++---- server/models/User.js | 48 ++---------- server/models/Venue.js | 15 ++-- server/models/fixtures.js | 21 +++--- server/package.json | 64 ++++++++++++++++ server/router.js | 63 ++++++++-------- server/server.js | 35 ++++----- 16 files changed, 336 insertions(+), 276 deletions(-) create mode 100644 server/.babelrc create mode 100644 server/.eslintignore create mode 100644 server/.eslintrc create mode 100644 server/.gitignore create mode 100644 server/package.json diff --git a/server/.babelrc b/server/.babelrc new file mode 100644 index 0000000..5e7caa1 --- /dev/null +++ b/server/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["latest"] +} diff --git a/server/.eslintignore b/server/.eslintignore new file mode 100644 index 0000000..2174542 --- /dev/null +++ b/server/.eslintignore @@ -0,0 +1,3 @@ +dist +node_modules +import diff --git a/server/.eslintrc b/server/.eslintrc new file mode 100644 index 0000000..4bb085a --- /dev/null +++ b/server/.eslintrc @@ -0,0 +1,13 @@ +{ + "extends": "airbnb-base", + "parser": "babel-eslint", + "rules": { + "indent": ["error", 4], + "new-cap": "off", + "array-callback-return": "off", + "no-underscore-dangle": ["error", { "allow": ["_id"] }] + }, + "env": { + "node": true + } +} diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..1521c8b --- /dev/null +++ b/server/.gitignore @@ -0,0 +1 @@ +dist diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 1c354f6..85390ce 100644 --- a/server/controllers/auth.js +++ b/server/controllers/auth.js @@ -1,31 +1,32 @@ -var passport = require('passport'); -var BasicStrategy = require('passport-http').BasicStrategy; -var User = require('../models/User'); +import passport from 'passport'; +import { BasicStrategy } from 'passport-http'; +import User from '../models/User'; passport.use(new BasicStrategy( - function(username, password, callback){ - User.findOne({ username: username }, function(err, user){ - if (err) { - return callback(err); + (username, password, callback) => { + User.findOne({ username }, (findErr, user) => { + if (findErr) { + return callback(findErr); } if (!user) { return callback(null, false); } - user.verifyPassword(password, function(err, isMatch){ - if (err) { - return callback(err); + user.verifyPassword(password, (verErr, isMatch) => { + if (verErr) { + return callback(verErr); } if (!isMatch) { return callback(null, false); } return callback(null, user); }); + return callback('Something went wrong'); }); } )); -exports.isAuthenticated = passport.authenticate('basic', {session: false}); +export const isAuthenticated = passport.authenticate('basic', { session: false }); -exports.login = function(req, res) { +export const login = (req, res) => { res.send(); }; diff --git a/server/controllers/event.js b/server/controllers/event.js index 9437697..85a25e5 100644 --- a/server/controllers/event.js +++ b/server/controllers/event.js @@ -1,109 +1,109 @@ -var Event = require('../models/Event'); -var _ = require('lodash'); -var moment = require('moment'); +import _ from 'lodash'; +import moment from 'moment'; +import Event from '../models/Event'; // POST /api/events -exports.postEvents = function(req, res){ - var evnt = new Event(req.body); +export const postEvents = (req, res) => { + const evnt = new Event(req.body); - evnt.save(function(err){ - if (err) + evnt.save((err) => { + if (err) { res.send(err); - - res.json({message: 'Event added.', data: evnt}); - }) -} + } + res.json({ message: 'Event added.', data: evnt }); + }); +}; // GET /api/events -exports.getEvents = function(req, res){ - var time = moment().subtract(6, 'hours').valueOf(); - var findEvents = Event.find().where('startAt').gt(time); +export const getEvents = (req, res) => { + const time = moment().subtract(6, 'hours').valueOf(); + const findEvents = Event.find().where('startAt').gt(time); if (req.query.published === 'all') { findEvents - .exec(function(err, events) { - if(err) + .exec((err, events) => { + if (err) { res.send(err); + } res.json(events); }); - } - else { + } else { findEvents .where('isPublished').equals(true) - .exec(function(err, events) { - if(err) + .exec((err, events) => { + if (err) { res.send(err); + } res.json(events); }); } - }; // GET /api/events/:event_id -exports.getEvent = function(req, res){ - Event.findById(req.params.event_id, function(err, evnt){ - if(err) +export const getEvent = (req, res) => { + Event.findById(req.params.event_id, (err, evnt) => { + if (err) { res.send(err); + } res.json(evnt); }); }; // PUT /api/events/:event_id -exports.putEvent = function(req, res){ - Event.update({_id:req.params.event_id}, +export const putEvent = (req, res) => { + Event.update({ _id: req.params.event_id }, req.body, - function(err, raw){ - if (err) + (err) => { + if (err) { res.send(err); - - res.json({message: 'Event updated.'}); + } + res.json({ message: 'Event updated.' }); }); }; // DELETE /api/events/:event_id -exports.deleteEvent = function(req, res){ - Event.remove({_id: req.params.event_id}, - function(err){ - if (err) +export const deleteEvent = (req, res) => { + Event.remove({ _id: req.params.event_id }, + (err) => { + if (err) { res.send(err); - res.json({message: 'Event removed.'}); + } + res.json({ message: 'Event removed.' }); }); }; // GET /api/v1/events -exports.oldEvents = function(req, res) { - var time = new Date().getTime(); - Event.find() - .where('startAt').gt(time) - .exec(function(err, events) { - if(err) - res.send(err); - var events_old = - _.map(events, function(evt) { - return { - "eventID": evt._id, - "title": evt.title, - "startAt": evt.startAt, - "placeName": evt.venue.name, - "address": evt.venue.address, - "latitude": evt.venue.latitude, - "longitude": evt.venue.longitude, - "ageLimit": evt.ageLimit, - "price": evt.price, - "categoryID": evt.category, - "descriptions": [{ - "language":"nb", - "text": Boolean(evt.description) ? evt.description.replace(/\s+/g, " ") - : "" - }], - "isRecommended": evt.isPromoted || false, - "imageURL": evt.imageUrl, - "eventURL": evt.eventUrl - }; - }); - res.json({ - "events": events_old - }); - }); - -} +export const oldEvents = (req, res) => { + const time = new Date().getTime(); + Event.find() + .where('startAt').gt(time) + .exec((err, events) => { + if (err) { + res.send(err); + } + const eventsOld = + _.map(events, evt => ({ + eventID: evt._id, + title: evt.title, + startAt: evt.startAt, + placeName: evt.venue.name, + address: evt.venue.address, + latitude: evt.venue.latitude, + longitude: evt.venue.longitude, + ageLimit: evt.ageLimit, + price: evt.price, + categoryID: evt.category, + descriptions: [{ + language: 'nb', + text: Boolean(evt.description) ? evt.description.replace(/\s+/g, ' ') + : '', + }], + isRecommended: evt.isPromoted || false, + imageURL: evt.imageUrl, + eventURL: evt.eventUrl, + })); + res.json({ + events: eventsOld, + }); + }); +}; diff --git a/server/controllers/image.js b/server/controllers/image.js index 05c1361..3e02d4f 100644 --- a/server/controllers/image.js +++ b/server/controllers/image.js @@ -1,36 +1,35 @@ -var path = require('path'), - fs = require('fs'); - im = require('imagemagick-stream'); +import path from 'path'; +import fs from 'fs'; +import im from 'imagemagick-stream'; -var FOLDERNAME = './uploads/' +const FOLDERNAME = './uploads/'; -function genFilename() { - var n1 = Math.floor(Math.random() * 1e15); - var n2 = Math.floor(Math.random() * 1e15); - return n1.toString() + '_' + n2.toString(); -} +const genFilename = () => { + const n1 = Math.floor(Math.random() * 1e15); + const n2 = Math.floor(Math.random() * 1e15); + return `${n1.toString()}_${n2.toString()}`; +}; -exports.postImage = function(req, res){ - var fstream; +export const postImage = (req, res) => { + let fstream; req.pipe(req.busboy); - req.busboy.on('file', function(fieldname, file, filename) { - var fname = genFilename() + path.extname(filename); + req.busboy.on('file', (fieldname, file, filename) => { + const fname = genFilename() + path.extname(filename); fstream = fs.createWriteStream(path.resolve(FOLDERNAME + fname)); - var resize = im().resize('x350').quality('80'); + const resize = im().resize('x350').quality('80'); file.pipe(resize).pipe(fstream); - fstream.on('close', function() { - var port = req.app.settings.port || ''; - var url = path.join(req.get('host'), + fstream.on('close', () => { + let url = path.join(req.get('host'), req.originalUrl, fname); - url = req.protocol + '://' + url; - res.json({url: url}); + url = `${req.protocol}://${url}`; + res.json({ url }); }); }); }; -exports.getImage = function(req, res){ - var p = path.resolve(FOLDERNAME); - p += '/' + req.params['0']; +export const getImage = (req, res) => { + let p = path.resolve(FOLDERNAME); + p += `/${req.params['0']}`; res.sendFile(p); }; diff --git a/server/controllers/user.js b/server/controllers/user.js index 7395312..c817f21 100644 --- a/server/controllers/user.js +++ b/server/controllers/user.js @@ -1,54 +1,57 @@ -var User = require('../models/User'); +import User from '../models/User'; // POST /api/users -exports.postUser = function(req, res){ - var user = new User({ +export const postUser = (req, res) => { + const user = new User({ username: req.body.username, password: req.body.password, }); - user.save(function(err){ - if (err) + user.save((err) => { + if (err) { res.send(err); - - res.json({message: 'New user added.'}); + } + res.json({ message: 'New user added.' }); }); }; // GET /api/users/ -exports.getUsers = function(req, res){ - User.find(function(err, users){ - if (err) +export const getUsers = (req, res) => { + User.find((err, users) => { + if (err) { res.send(err); - + } res.json(users); }); }; // GET /api/users/:user_id -exports.getUser = function(req, res){ - User.findById(req.params.user_id, function(err, users){ - if (err) +export const getUser = (req, res) => { + User.findById(req.params.user_id, (err, users) => { + if (err) { res.send(err); + } res.json(users); }); }; // PUT /api/users/:user_id -exports.putUser = function(req, res){ - User.update({_id:req.params.user_id}, - function(err, raw){ - if (err) +export const putUser = (req, res) => { + User.update({ _id: req.params.user_id }, + (err) => { + if (err) { res.send(err); - res.json({message: 'Event updated.'}); + } + res.json({ message: 'Event updated.' }); }); }; // DELETE /api/users/:user_id -exports.deleteUser = function(req, res){ - User.remove({_id: req.params.user_id}, - function(err){ - if (err) +export const deleteUser = (req, res) => { + User.remove({ _id: req.params.user_id }, + (err) => { + if (err) { res.send(err); - res.json({message: 'Event removed.'}); + } + res.json({ message: 'Event removed.' }); }); }; diff --git a/server/controllers/venue.js b/server/controllers/venue.js index b75795d..d456fb2 100644 --- a/server/controllers/venue.js +++ b/server/controllers/venue.js @@ -1,54 +1,56 @@ -var Venue = require('../models/Venue') +import Venue from '../models/Venue'; // POST /api/venues -exports.postVenues = function(req, res){ - var venue = new Venue(req.body); +export const postVenues = (req, res) => { + const venue = new Venue(req.body); - venue.save(function(err){ - if (err) + venue.save((err) => { + if (err) { res.send(err); - - res.json({message: 'Venue added.', data: venue}); - }) -} + } + res.json({ message: 'Venue added.', data: venue }); + }); +}; // GET /api/venues -exports.getVenues = function(req, res){ - Venue.find(function(err, venues){ - if (err) +export const getVenues = (req, res) => { + Venue.find((err, venues) => { + if (err) { res.send(err); - + } res.json(venues); }); }; // GET /api/venues/:venue_id -exports.getVenue = function(req, res){ - Venue.findById(req.params.venue_id, function(err, venue){ - if(err) +export const getVenue = (req, res) => { + Venue.findById(req.params.venue_id, (err, venue) => { + if (err) { res.send(err); + } res.json(venue); }); }; // PUT /api/venues/:venue_id -exports.putVenue = function(req, res){ - Venue.update({_id:req.params.venue_id}, +export const putVenue = (req, res) => { + Venue.update({ _id: req.params.venue_id }, req.body, - function(err, raw){ - if (err) + (err) => { + if (err) { res.send(err); - - res.json({message: 'Venue updated.'}); + } + res.json({ message: 'Venue updated.' }); }); }; // DELETE /api/venues/:venue_id -exports.deleteVenue = function(req, res){ - Venue.remove({_id: req.params.venue_id}, - function(err){ - if (err) +export const deleteVenue = (req, res) => { + Venue.remove({ _id: req.params.venue_id }, + (err) => { + if (err) { res.send(err); - res.json({message: 'Venue removed.'}); + } + res.json({ message: 'Venue removed.' }); }); }; diff --git a/server/models/Event.js b/server/models/Event.js index 7dbabd0..f4007c8 100644 --- a/server/models/Event.js +++ b/server/models/Event.js @@ -1,26 +1,25 @@ -var mongoose = require('mongoose'); +import mongoose from 'mongoose'; - -var EventSchema = new mongoose.Schema({ - title: {type: String, trim: true}, +const EventSchema = new mongoose.Schema({ + title: { type: String, trim: true }, externalId: Number, - description: {type: String, trim: true}, + description: { type: String, trim: true }, startAt: Date, endAt: Date, venue: { - name: {type: String, trim: true}, - address: {type: String, trim: true}, + name: { type: String, trim: true }, + address: { type: String, trim: true }, longitude: Number, - latitude: Number + latitude: Number, }, ageLimit: Number, price: Number, - category: {type: String, trim: true}, + category: { type: String, trim: true }, tags: [String], - imageUrl: {type: String, trim: true}, - eventUrl: {type: String, trim: true}, - isPromoted: {type: Boolean, default: false}, - isPublished: {type: Boolean, default: false} -}, {timestamps: true}) + imageUrl: { type: String, trim: true }, + eventUrl: { type: String, trim: true }, + isPromoted: { type: Boolean, default: false }, + isPublished: { type: Boolean, default: false }, +}, { timestamps: true }); -module.exports = mongoose.model('Event', EventSchema); +export default mongoose.model('Event', EventSchema); diff --git a/server/models/User.js b/server/models/User.js index 356f0af..7fbcd14 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -1,51 +1,19 @@ -var mongoose = require('mongoose'); -var bcrypt = require('bcrypt-nodejs'); +import mongoose from 'mongoose'; +import mongooseBcrypt from 'mongoose-bcrypt'; -var UserSchema = new mongoose.Schema({ +const UserSchema = new mongoose.Schema({ username: { type: String, unique: true, - required: true + required: true, }, password: { type: String, - required: true + required: true, + bcrypt: true, }, - /*type: String*/ // What is this for? }); -/** - * Runs before a user is saved. This function - * takes care of hashing and salting the password. - */ -UserSchema.pre('save', function(callback){ - var user = this; - if (!user.isModified('password')) - return callback(); +UserSchema.plugin(mongooseBcrypt); - bcrypt.genSalt(5, function(err, salt) { - if (err) - return callback(err); - - bcrypt.hash(user.password, salt, null, function(err, hash){ - if (err) - return callback(err); - user.password = hash; - callback(); - }); - }); -}); - -/** - * Verifies the password (duh). - */ -UserSchema.methods.verifyPassword = function(password, callback){ - bcrypt.compare(password, this.password, function(err, isMatch){ - if (err) { - return callback(err); - } - callback(null, isMatch); - }, null) -}; - -module.exports = mongoose.model('User', UserSchema); +export default mongoose.model('User', UserSchema); diff --git a/server/models/Venue.js b/server/models/Venue.js index 222e7e2..77a0cb5 100644 --- a/server/models/Venue.js +++ b/server/models/Venue.js @@ -1,11 +1,10 @@ -var mongoose = require('mongoose'); +import mongoose from 'mongoose'; - -var VenueSchema = new mongoose.Schema({ - name: {type: String, trim: true}, - address: {type: String, trim: true}, +const VenueSchema = new mongoose.Schema({ + name: { type: String, trim: true }, + address: { type: String, trim: true }, latitude: Number, - longitude: Number -}) + longitude: Number, +}); -module.exports = mongoose.model('Venue', VenueSchema); +export default mongoose.model('Venue', VenueSchema); diff --git a/server/models/fixtures.js b/server/models/fixtures.js index 1eafe55..37ccdbd 100644 --- a/server/models/fixtures.js +++ b/server/models/fixtures.js @@ -1,17 +1,18 @@ -var User = require('../models/User'); +/* eslint-disable import/prefer-default-export */ +import User from '../models/User'; -exports.addTestUsers = function() { - if(process.env.NODE_ENV === 'development') { - User.find(function(err, users) { - if(err || users.length === 0) { // add test user if users is empty - var user = new User({ +export function addTestUsers() { + if (process.env.NODE_ENV === 'development') { + User.find((err, users) => { + if (err || users.length === 0) { // add test user if users is empty + const user = new User({ username: 'test', password: 'test', - role: 'admin' + role: 'admin', }); user.save(); - console.log("Added test user!"); + console.log('Added test user!'); } - }) + }); } -}; +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..ddd8bd1 --- /dev/null +++ b/server/package.json @@ -0,0 +1,64 @@ +{ + "name": "Barteguiden-Server", + "version": "0.0.5", + "description": "Barteguiden server", + "main": "server.js", + "dependencies": { + "body-parser": "~1.13.0", + "busboy": "~0.2.9", + "connect-busboy": "~0.0.2", + "cors": "~2.7.1", + "cron": "~1.0.9", + "csv": "~0.3.5", + "express": "~4.13.0", + "facebook-node-sdk": "0.2.0", + "imagemagick-stream": "~2.0.0", + "jsdom": "~7.0.0", + "lodash": "~3.10.1", + "moment": "~2.10.6", + "mongoose": "4.1.3", + "mongoose-bcrypt": "^1.4.2", + "object-mapper": "~2.1.0", + "passport": "~0.3.0", + "passport-http": "~0.3.0", + "q": "~1.4.1", + "request": "~2.61.0", + "xml2js": "~0.4.10", + "xtend": "~4.0.0" + }, + "devDependencies": { + "babel-cli": "^6.14.0", + "babel-core": "^6.14.0", + "babel-eslint": "^6.1.2", + "babel-preset-latest": "^6.14.0", + "eslint": "^3.5.0", + "eslint-config-airbnb-base": "^7.1.0", + "eslint-plugin-import": "^1.15.0", + "nodemon": "^1.10.2" + }, + "engines": { + "node": ">=5.0.0" + }, + "scripts": { + "start": "nodemon server.js --exec babel-node", + "build": "rm -rf dist/ && babel . --out-dir dist", + "lint": "eslint ." + }, + "private": true, + "author": "Studentmediene i Trondheim AS", + "contributors": [ + { + "name": "martinhath" + }, + { + "name": "andybb" + }, + { + "name": "EirikRogno" + }, + { + "name": "AnnaKastet" + } + ], + "license": "Apache-2.0" +} diff --git a/server/router.js b/server/router.js index bb3c649..b6fa85f 100644 --- a/server/router.js +++ b/server/router.js @@ -1,50 +1,53 @@ -var express = require('express'); -var router = express.Router(); -var eventController = require('./controllers/event'); -var userController = require('./controllers/user'); -var authController = require('./controllers/auth'); -var imageController = require('./controllers/image'); -var venueController = require('./controllers/venue'); -var auth = authController.isAuthenticated; +import express from 'express'; +import { postEvents, getEvent, getEvents, + putEvent, deleteEvent, oldEvents } from './controllers/event'; +import { postUser, getUser, putUser, deleteUser, getUsers } from './controllers/user'; +import { isAuthenticated, login } from './controllers/auth'; +import { postImage, getImage } from './controllers/image'; +import { postVenues, getVenues, getVenue, + putVenue, deleteVenue } from './controllers/venue'; + +const auth = isAuthenticated; +const router = express.Router(); + router.route('/events') - .post(auth, eventController.postEvents) - .get(eventController.getEvents); + .post(auth, postEvents) + .get(getEvents); router.route('/events/:event_id') - .get(eventController.getEvent) - .put(auth, eventController.putEvent) - .delete(auth, eventController.deleteEvent); + .get(getEvent) + .put(auth, putEvent) + .delete(auth, deleteEvent); router.route('/v1/events') - .get(eventController.oldEvents); + .get(oldEvents); router.route('/users') - .post(auth, userController.postUser) - .get(auth, userController.getUsers); + .post(auth, postUser) + .get(auth, getUsers); router.route('/users/:user_id') - .put(auth, userController.putUser) - .get(auth, userController.getUser) - .delete(auth, userController.deleteUser); + .put(auth, putUser) + .get(auth, getUser) + .delete(auth, deleteUser); router.route('/images') - .post(auth, imageController.postImage); + .post(auth, postImage); router.route('/images/*') - .get(imageController.getImage); + .get(getImage); router.route('/venues') - .post(venueController.postVenues) - .get(venueController.getVenues); + .post(postVenues) + .get(getVenues); router.route('/venues/:venue_id') - .get(venueController.getVenue) - .put(venueController.putVenue) - .delete(venueController.deleteVenue); - -router.route('/login', userController.getUser) - .get(auth, authController.login); + .get(getVenue) + .put(putVenue) + .delete(deleteVenue); -module.exports = router; +router.route('/login', getUser) + .get(auth, login); +export default router; diff --git a/server/server.js b/server/server.js index 138f282..f40e730 100644 --- a/server/server.js +++ b/server/server.js @@ -1,31 +1,32 @@ -var mongoose = require('mongoose'); -var bodyParser = require('body-parser'); -var express = require('express'); -var app = express(); -var router = require('./router.js'); -var passport = require('passport'); -var cors = require('cors') -var busboy = require('connect-busboy'); -var jobs = require('./import/jobs'); -var fixtures = require('./models/fixtures.js'); +import mongoose from 'mongoose'; +import bodyParser from 'body-parser'; +import express from 'express'; +import passport from 'passport'; +import cors from 'cors'; +import busboy from 'connect-busboy'; +import router from './router.js'; +import jobs from './import/jobs'; +import { addTestUsers } from './models/fixtures.js'; -var WHITELIST = [ +const app = express(); + +const WHITELIST = [ 'http://localhost:9000', - /\.barteguiden\.no$/ + /\.barteguiden\.no$/, ]; app.use(bodyParser.json()); app.use(busboy()); app.use(passport.initialize()); -app.use(cors({origin: WHITELIST})); +app.use(cors({ origin: WHITELIST })); -port = process.env.PORT || 4004; +const port = process.env.PORT || 4004; mongoose.connect('mongodb://127.0.0.1:27018/eventdb'); app.use('/api', router); -app.listen(port, function() { - console.log("Serving on port " + port); +app.listen(port, () => { + console.log(`Serving on port ${port}`); jobs.start(); - fixtures.addTestUsers(); + addTestUsers(); }); From 274fc7109e000e10b7a2195425a658c10afe223e Mon Sep 17 00:00:00 2001 From: Andreas Drivenes Date: Wed, 21 Sep 2016 13:04:29 +0200 Subject: [PATCH 2/4] Move files to a src folder --- server/package.json | 6 +++--- server/{ => src}/controllers/auth.js | 0 server/{ => src}/controllers/event.js | 0 server/{ => src}/controllers/image.js | 0 server/{ => src}/controllers/user.js | 0 server/{ => src}/controllers/venue.js | 0 server/{ => src}/import/import_scripts/category_mapping.js | 0 server/{ => src}/import/import_scripts/facebook.js | 0 server/{ => src}/import/import_scripts/google_drive.js | 0 server/{ => src}/import/import_scripts/samfundet.js | 0 server/{ => src}/import/import_scripts/trdevents.js | 0 server/{ => src}/import/import_scripts/uka.js | 0 server/{ => src}/import/jobs.js | 0 server/{ => src}/import/server_sync.js | 0 server/{ => src}/models/Event.js | 0 server/{ => src}/models/User.js | 0 server/{ => src}/models/Venue.js | 0 server/{ => src}/models/fixtures.js | 0 server/{ => src}/router.js | 0 server/{ => src}/server.js | 0 20 files changed, 3 insertions(+), 3 deletions(-) rename server/{ => src}/controllers/auth.js (100%) rename server/{ => src}/controllers/event.js (100%) rename server/{ => src}/controllers/image.js (100%) rename server/{ => src}/controllers/user.js (100%) rename server/{ => src}/controllers/venue.js (100%) rename server/{ => src}/import/import_scripts/category_mapping.js (100%) rename server/{ => src}/import/import_scripts/facebook.js (100%) rename server/{ => src}/import/import_scripts/google_drive.js (100%) rename server/{ => src}/import/import_scripts/samfundet.js (100%) rename server/{ => src}/import/import_scripts/trdevents.js (100%) rename server/{ => src}/import/import_scripts/uka.js (100%) rename server/{ => src}/import/jobs.js (100%) rename server/{ => src}/import/server_sync.js (100%) rename server/{ => src}/models/Event.js (100%) rename server/{ => src}/models/User.js (100%) rename server/{ => src}/models/Venue.js (100%) rename server/{ => src}/models/fixtures.js (100%) rename server/{ => src}/router.js (100%) rename server/{ => src}/server.js (100%) diff --git a/server/package.json b/server/package.json index ddd8bd1..f4ca199 100644 --- a/server/package.json +++ b/server/package.json @@ -2,7 +2,7 @@ "name": "Barteguiden-Server", "version": "0.0.5", "description": "Barteguiden server", - "main": "server.js", + "main": "src/server.js", "dependencies": { "body-parser": "~1.13.0", "busboy": "~0.2.9", @@ -40,9 +40,9 @@ "node": ">=5.0.0" }, "scripts": { - "start": "nodemon server.js --exec babel-node", + "start": "nodemon src/server.js --exec babel-node", "build": "rm -rf dist/ && babel . --out-dir dist", - "lint": "eslint ." + "lint": "eslint .", }, "private": true, "author": "Studentmediene i Trondheim AS", diff --git a/server/controllers/auth.js b/server/src/controllers/auth.js similarity index 100% rename from server/controllers/auth.js rename to server/src/controllers/auth.js diff --git a/server/controllers/event.js b/server/src/controllers/event.js similarity index 100% rename from server/controllers/event.js rename to server/src/controllers/event.js diff --git a/server/controllers/image.js b/server/src/controllers/image.js similarity index 100% rename from server/controllers/image.js rename to server/src/controllers/image.js diff --git a/server/controllers/user.js b/server/src/controllers/user.js similarity index 100% rename from server/controllers/user.js rename to server/src/controllers/user.js diff --git a/server/controllers/venue.js b/server/src/controllers/venue.js similarity index 100% rename from server/controllers/venue.js rename to server/src/controllers/venue.js diff --git a/server/import/import_scripts/category_mapping.js b/server/src/import/import_scripts/category_mapping.js similarity index 100% rename from server/import/import_scripts/category_mapping.js rename to server/src/import/import_scripts/category_mapping.js diff --git a/server/import/import_scripts/facebook.js b/server/src/import/import_scripts/facebook.js similarity index 100% rename from server/import/import_scripts/facebook.js rename to server/src/import/import_scripts/facebook.js diff --git a/server/import/import_scripts/google_drive.js b/server/src/import/import_scripts/google_drive.js similarity index 100% rename from server/import/import_scripts/google_drive.js rename to server/src/import/import_scripts/google_drive.js diff --git a/server/import/import_scripts/samfundet.js b/server/src/import/import_scripts/samfundet.js similarity index 100% rename from server/import/import_scripts/samfundet.js rename to server/src/import/import_scripts/samfundet.js diff --git a/server/import/import_scripts/trdevents.js b/server/src/import/import_scripts/trdevents.js similarity index 100% rename from server/import/import_scripts/trdevents.js rename to server/src/import/import_scripts/trdevents.js diff --git a/server/import/import_scripts/uka.js b/server/src/import/import_scripts/uka.js similarity index 100% rename from server/import/import_scripts/uka.js rename to server/src/import/import_scripts/uka.js diff --git a/server/import/jobs.js b/server/src/import/jobs.js similarity index 100% rename from server/import/jobs.js rename to server/src/import/jobs.js diff --git a/server/import/server_sync.js b/server/src/import/server_sync.js similarity index 100% rename from server/import/server_sync.js rename to server/src/import/server_sync.js diff --git a/server/models/Event.js b/server/src/models/Event.js similarity index 100% rename from server/models/Event.js rename to server/src/models/Event.js diff --git a/server/models/User.js b/server/src/models/User.js similarity index 100% rename from server/models/User.js rename to server/src/models/User.js diff --git a/server/models/Venue.js b/server/src/models/Venue.js similarity index 100% rename from server/models/Venue.js rename to server/src/models/Venue.js diff --git a/server/models/fixtures.js b/server/src/models/fixtures.js similarity index 100% rename from server/models/fixtures.js rename to server/src/models/fixtures.js diff --git a/server/router.js b/server/src/router.js similarity index 100% rename from server/router.js rename to server/src/router.js diff --git a/server/server.js b/server/src/server.js similarity index 100% rename from server/server.js rename to server/src/server.js From d8f56a85bc3b54a78c7b7771e5eec6c6017d89b7 Mon Sep 17 00:00:00 2001 From: Andreas Drivenes Date: Wed, 21 Sep 2016 14:00:21 +0200 Subject: [PATCH 3/4] Add test setup and example test --- server/.eslintrc | 6 ++++-- server/package.json | 13 ++++++++++++- server/src/server.js | 2 ++ server/test/example.test.js | 12 ++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 server/test/example.test.js diff --git a/server/.eslintrc b/server/.eslintrc index 4bb085a..9518d59 100644 --- a/server/.eslintrc +++ b/server/.eslintrc @@ -1,5 +1,6 @@ { - "extends": "airbnb-base", + "plugins": ["ava"], + "extends": ["airbnb-base", "plugin:ava/recommended"], "parser": "babel-eslint", "rules": { "indent": ["error", 4], @@ -8,6 +9,7 @@ "no-underscore-dangle": ["error", { "allow": ["_id"] }] }, "env": { - "node": true + "node": true, + "es6": true } } diff --git a/server/package.json b/server/package.json index f4ca199..3dc4dba 100644 --- a/server/package.json +++ b/server/package.json @@ -27,14 +27,18 @@ "xtend": "~4.0.0" }, "devDependencies": { + "ava": "^0.16.0", "babel-cli": "^6.14.0", "babel-core": "^6.14.0", "babel-eslint": "^6.1.2", "babel-preset-latest": "^6.14.0", "eslint": "^3.5.0", "eslint-config-airbnb-base": "^7.1.0", + "eslint-plugin-ava": "^3.0.0", "eslint-plugin-import": "^1.15.0", - "nodemon": "^1.10.2" + "nodemon": "^1.10.2", + "supertest": "^2.0.0", + "supertest-as-promised": "^4.0.0" }, "engines": { "node": ">=5.0.0" @@ -43,6 +47,13 @@ "start": "nodemon src/server.js --exec babel-node", "build": "rm -rf dist/ && babel . --out-dir dist", "lint": "eslint .", + "test": "ava" + }, + "ava": { + "require": [ + "babel-register" + ], + "babel": "inherit" }, "private": true, "author": "Studentmediene i Trondheim AS", diff --git a/server/src/server.js b/server/src/server.js index f40e730..dc0c573 100644 --- a/server/src/server.js +++ b/server/src/server.js @@ -30,3 +30,5 @@ app.listen(port, () => { jobs.start(); addTestUsers(); }); + +export default app; diff --git a/server/test/example.test.js b/server/test/example.test.js new file mode 100644 index 0000000..582b873 --- /dev/null +++ b/server/test/example.test.js @@ -0,0 +1,12 @@ +/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */ +import test from 'ava'; +import request from 'supertest-as-promised'; +import app from '../src/server.js'; + +test('Can get events', (t) => { + request(app).get('/api/events') + .expect(200) + .then((res) => { + t.is(Array.isArray(res.body), true); + }); +}); From 5c85c0e19c2626259e48b5eac0425ffe2995581c Mon Sep 17 00:00:00 2001 From: Andreas Drivenes Date: Sun, 30 Oct 2016 20:19:30 +0100 Subject: [PATCH 4/4] Fix lint error after rebase --- server/src/controllers/event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/controllers/event.js b/server/src/controllers/event.js index 85a25e5..0da7ef5 100644 --- a/server/src/controllers/event.js +++ b/server/src/controllers/event.js @@ -95,7 +95,7 @@ export const oldEvents = (req, res) => { categoryID: evt.category, descriptions: [{ language: 'nb', - text: Boolean(evt.description) ? evt.description.replace(/\s+/g, ' ') + text: evt.description ? evt.description.replace(/\s+/g, ' ') : '', }], isRecommended: evt.isPromoted || false,