--------------------------------------------------------------------------------
/app/views/searchBar.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
39 |
40 |
--------------------------------------------------------------------------------
/app/views/searchBar/searchResults.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
{{room.venue}}
11 |
12 |
13 |
14 |
20 |
21 |
22 |
23 |

24 |

25 |
26 |
27 |

28 |
29 |
30 |
{{room.contactFullName}}
31 |
{{room.contactTitle}}
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/views/topnav.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |

6 |
7 |
8 |
9 |
10 |
14 |
15 |
19 |
20 |
23 |
24 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "private-table",
3 | "version": "0.0.0",
4 | "dependencies": {
5 | "angular": "~1.4.0",
6 | "angular-animate": "~1.4.0",
7 | "angular-aria": "^1.3.0",
8 | "angular-messages": "^1.3.0",
9 | "angular-resource": "^1.3.0",
10 | "angular-sanitize": "^1.3.0",
11 | "angular-touch": "^1.3.0",
12 | "angular-ui-router": "^0.2.15",
13 | "foundation": "~5.5.2",
14 | "datetimepicker": "^2.4.3",
15 | "angular-payments": "*",
16 | "angular-foundation": "~0.6.0",
17 | "ngModal": "~1.2.0",
18 | "angular-cookies": "~1.4.0"
19 | },
20 | "devDependencies": {
21 | "angular-mocks": "^1.3.0"
22 | },
23 | "appPath": "app",
24 | "moduleName": "privateTableApp",
25 | "resolutions": {
26 | "angular": "1.4.0"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "privatetable",
3 | "version": "0.0.0",
4 | "dependencies": {
5 | "bcrypt-nodejs": "0.0.3",
6 | "body-parser": "~1.5.0",
7 | "bower": "latest",
8 | "composable-middleware": "~0.3.0",
9 | "compression": "~1.0.1",
10 | "cookie-parser": "~1.0.1",
11 | "ejs": "~0.8.4",
12 | "errorhandler": "~1.0.0",
13 | "express": "~4.0.0",
14 | "express-jwt": "~3.0.0",
15 | "express-session": "~1.0.2",
16 | "jsonwebtoken": "~5.0.0",
17 | "lodash": "~2.4.1",
18 | "method-override": "~1.0.0",
19 | "morgan": "~1.0.0",
20 | "mysql": "^2.6.2",
21 | "passport": "~0.2.1",
22 | "passport-local": "~1.0.0",
23 | "pg": "^4.3.0",
24 | "pg-hstore": "^2.3.2",
25 | "readline": "0.0.7",
26 | "sequelize": "~3.0.0",
27 | "sequelize-heroku": "^1.0.0",
28 | "serve-favicon": "~2.0.1",
29 | "stripe": "^3.3.4"
30 | },
31 | "repository": {},
32 | "devDependencies": {
33 | "grunt": "^0.4.5",
34 | "grunt-autoprefixer": "^2.0.0",
35 | "grunt-concurrent": "^1.0.0",
36 | "grunt-contrib-clean": "^0.6.0",
37 | "grunt-contrib-compass": "^1.0.0",
38 | "grunt-contrib-concat": "^0.5.0",
39 | "grunt-contrib-connect": "^0.9.0",
40 | "grunt-contrib-copy": "^0.7.0",
41 | "grunt-contrib-cssmin": "^0.12.0",
42 | "grunt-contrib-htmlmin": "^0.4.0",
43 | "grunt-contrib-imagemin": "^0.9.2",
44 | "grunt-contrib-jshint": "^0.11.0",
45 | "grunt-contrib-uglify": "^0.7.0",
46 | "grunt-contrib-watch": "^0.6.1",
47 | "grunt-express-server": "^0.5.1",
48 | "grunt-filerev": "^2.1.2",
49 | "grunt-google-cdn": "^0.4.3",
50 | "grunt-karma": "*",
51 | "grunt-newer": "^1.1.0",
52 | "grunt-ng-annotate": "^0.9.2",
53 | "grunt-svgmin": "^2.0.0",
54 | "grunt-usemin": "^3.0.0",
55 | "grunt-wiredep": "^2.0.0",
56 | "jshint-stylish": "^1.0.0",
57 | "karma-jasmine": "*",
58 | "karma-phantomjs-launcher": "*",
59 | "load-grunt-tasks": "^3.1.0",
60 | "time-grunt": "^1.0.0"
61 | },
62 | "engines": {
63 | "node": ">=0.10.0"
64 | },
65 | "scripts": {
66 | "postinstall": "bower install"
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/repo_assets/pthomepage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/craigsmith24/Private-Table/916c484520d35f040fa0fae43c8a2f1ec695f9bf/repo_assets/pthomepage.png
--------------------------------------------------------------------------------
/repo_assets/roadmap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/craigsmith24/Private-Table/916c484520d35f040fa0fae43c8a2f1ec695f9bf/repo_assets/roadmap.png
--------------------------------------------------------------------------------
/repo_assets/schema.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/craigsmith24/Private-Table/916c484520d35f040fa0fae43c8a2f1ec695f9bf/repo_assets/schema.png
--------------------------------------------------------------------------------
/server/app.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var bodyParser = require('body-parser');
3 | var expressJwt = require('express-jwt');
4 | var jwt = require('jsonwebtoken');
5 | var helper = require('./models/helpers.js');
6 | var fs = require('fs');
7 | var port = process.env.PORT || 9000;
8 | var stripe = require('stripe')('pk_test_rT3gR317GZZ9QOG0D5uMaQWy');
9 |
10 | var app = express();
11 |
12 | app.use(bodyParser.json());
13 | app.use(bodyParser.urlencoded({ extended: true }));
14 |
15 | app.use(express.static(__dirname + '/../app'));
16 |
17 | if (process.env.S1_SECRET) {
18 | var secret = process.env.S1_SECRET;
19 | } else {
20 | var secret = String(fs.readFileSync(__dirname + '/config/secret'));
21 | }
22 |
23 | //refactor this to explicitly protect certain routes
24 | app.use('/api/users/bookings', expressJwt({secret: secret}));
25 | app.use('/api/users/favorites', expressJwt({secret: secret}));
26 | app.use('/api/users/bookings', expressJwt({secret: secret}));
27 | app.use('/api/payments', expressJwt({secret: secret}));
28 |
29 | //path for when users are created
30 | app.post('/api/users', function(req, res){
31 | helper.searchOrMake(req.body.username, req.body.email, req.body.password, res, secret);
32 | });
33 |
34 | //path for user's profile
35 | app.get('/api/users/me', function(req, res){
36 | var decoded = jwt.decode(req.headers.authorization.slice(7));
37 | helper.findAllInfo(decoded.username, res);
38 | });
39 |
40 | // path for when users are logging in
41 | app.post('/auth/local', function(req, res) {
42 | helper.authenticate(req.body.username, req.body.password, res, secret);
43 | });
44 |
45 | //path for obtaining menus for a selected room
46 | app.get('/api/menu/eventType?', function(req, res){
47 | helper.serveMenus(req.query, res);
48 | });
49 |
50 | //path for obtaining courses for a selected menu
51 | app.get('/api/menu/menuID?', function(req, res){
52 | helper.serveCourses(req.query.menuID, res);
53 | });
54 |
55 | // path for obtaining search results
56 | app.get('/api/searchresults?', function(req, res){
57 | helper.getSearchResults(req.query, res);
58 | });
59 |
60 | //path for obtaining detailed room info
61 | app.get('/api/room/:roomID', function(req, res){
62 | helper.findRoom(req.params.roomID, res);
63 | });
64 |
65 | //path for searching for available times
66 | app.get('/api/dates?', function(req, res){
67 | helper.findDates(req.query.roomID, req.query.startTime, req.query.endTime, res);
68 | });
69 |
70 | //path for adding a room to favorites
71 | app.post('/api/users/favorites/addfavorites', function(req, res){
72 | var decoded = jwt.decode(req.headers.authorization.slice(7));
73 | helper.addFavorite(decoded.username, req.body.roomID, res);
74 | });
75 |
76 | //path for fetching a user's favorites
77 | app.get('/api/users/favorites', function(req, res){
78 | var decoded = jwt.decode(req.headers.authorization.slice(7));
79 | console.log(decoded);
80 | helper.getFavorites(decoded.username, res);
81 | });
82 |
83 | //path for deleting a room from favorites
84 | app.post('/api/users/favorites/deletefavorites', function(req, res){
85 | var decoded = jwt.decode(req.headers.authorization.slice(7));
86 | helper.deleteFavorite(decoded.username, req.body.roomID, res);
87 | });
88 |
89 | //path for viewing a user's bookings
90 | app.get('/api/users/bookings', function(req, res){
91 | var decoded = jwt.decode(req.headers.authorization.slice(7));
92 | helper.getBookings(decoded.username, res);
93 | });
94 |
95 | //path for processing payments
96 | app.post('/api/payments', function(req, res){
97 | var decoded = jwt.decode(req.headers.authorization.slice(7));
98 | var stripeToken = req.body;
99 | var charge = stripe.charges.create({
100 | amount: stripeToken.price,
101 | currency: "usd",
102 | source: stripeToken.result,
103 | description: "Payment for venue booking"
104 | }, function(err, charge) {
105 | if (err && err.type === 'StripeCardError') {
106 | console.log(JSON.stringify(err, null, 2));
107 | }
108 | });
109 | helper.createBooking(decoded.username, req.body.roomID, req.body.menuID, req.body.startTime, req.body.endTime, req.body.eventType, req.body.guests, res);
110 | });
111 |
112 | app.listen(port);
113 |
--------------------------------------------------------------------------------
/server/config/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/craigsmith24/Private-Table/916c484520d35f040fa0fae43c8a2f1ec695f9bf/server/config/.DS_Store
--------------------------------------------------------------------------------
/server/config/dbConfig.js:
--------------------------------------------------------------------------------
1 | var Sequelize = require('sequelize');
2 | var fs = require('fs');
3 |
4 | if (process.env.DATABASE_URL) {
5 | var match = process.env.DATABASE_URL.match(/postgres:\/\/([^:]+):([^@]+)@([^:]+):(\d+)\/(.+)/);
6 | var sequelize = new Sequelize(match[5], match[1], match[2], {
7 | dialect: 'postgres',
8 | protocol: 'postgres',
9 | port: match[4],
10 | host: match[3],
11 | logging: console.log,
12 | dialectOptions: {
13 | ssl: true
14 | }
15 | });
16 | } else {
17 | var username = String(fs.readFileSync(__dirname + '/databaseusername'));
18 | var password = String(fs.readFileSync(__dirname + '/databasepassword'));
19 | var databaseName = String(fs.readFileSync(__dirname + '/databasename'));
20 | var host = String(fs.readFileSync(__dirname + '/host'));
21 | var sequelize = new Sequelize(databaseName, username, password, {
22 | dialect: 'postgres',
23 | protocol: 'postgres',
24 | port: '5432',
25 | host: host,
26 | logging: console.log,
27 | dialectOptions: {
28 | ssl: true
29 | }
30 | });
31 | }
32 |
33 | module.exports = sequelize;
34 |
35 |
36 |
--------------------------------------------------------------------------------
/server/models/amenities.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 |
4 | var Amenity = db.define('Amenity',
5 | {
6 | name: Sequelize.STRING
7 | }
8 | );
9 |
10 | db.sync();
11 |
12 | module.exports = Amenity;
--------------------------------------------------------------------------------
/server/models/associations.js:
--------------------------------------------------------------------------------
1 | var Booking = require('./bookings.js');
2 | var Images = require('./images.js');
3 | var Venue = require('./venues.js');
4 | var Room = require('./rooms.js');
5 | var Menu = require('./menus.js');
6 | var MenuItem = require('./menuItems.js');
7 | var db = require('../config/dbConfig.js');
8 | var CourseCombination = require('./courseCombinations.js');
9 | var CoursesInMenu = require('./coursesInMenus.js');
10 | var RoomAmenity = require('./roomAmenities.js');
11 | var Amenity = require('./amenities.js');
12 | var User = require('./users.js');
13 | var Favorite = require('./favorites.js');
14 | var Layout = require ('./layouts.js');
15 | var LayoutsOffered = require ('./layoutsOffered.js');
16 | var Service = require ('./services.js');
17 | var MenusOffered = require ('./menusOffered.js');
18 |
19 |
20 | //relationship between venue and room
21 | Venue.hasMany(Room, {foreignKey: 'parentVenue'});
22 | Room.belongsTo(Venue, {foreignKey: 'parentVenue'});
23 |
24 | // relationship between room and image
25 | Room.hasMany(Images, {foreignKey:'pictureOf'});
26 | Images.belongsTo(Room, {foreignKey: 'pictureOf'});
27 |
28 | // relationship between booking and room
29 | Room.hasMany(Booking, {foreignKey:'room'});
30 | Booking.belongsTo(Room, {foreignKey: 'room'});
31 |
32 | // relationship between room and roomAmenity
33 | Room.hasMany(RoomAmenity, {foreignKey:'room_ID'});
34 | RoomAmenity.belongsTo(Room, {foreignKey: 'room_ID'});
35 |
36 | // relationship between roomAmenity and amenity
37 | Amenity.hasMany(RoomAmenity, {foreignKey:'amenities_ID'});
38 | RoomAmenity.belongsTo(Amenity, {foreignKey: 'amenities_ID'});
39 |
40 | // relationship between coursesInMenu and courseCombination
41 | CourseCombination.hasMany(CoursesInMenu, {foreignKey:'courseCombination_ID'});
42 | CoursesInMenu.belongsTo(CourseCombination, {foreignKey: 'courseCombination_ID'});
43 |
44 | // relationship between coursesInMenu and menu
45 | Menu.hasMany(CoursesInMenu, {foreignKey:'menu_ID'});
46 | CoursesInMenu.belongsTo(Menu, {foreignKey: 'menu_ID'});
47 |
48 | // relationship between courseCombination and menuItem
49 | MenuItem.hasMany(CourseCombination, {foreignKey:'menuItem_ID'});
50 | CourseCombination.belongsTo(MenuItem, {foreignKey: 'menuItem_ID'});
51 |
52 | //relationship between user and booking
53 | User.hasMany(Booking, {foreignKey:'booker'});
54 | Booking.belongsTo(User, {foreignKey: 'booker'});
55 |
56 | // relationship between service and room
57 | Room.hasMany(Service, {foreignKey:'room_ID'});
58 | Service.belongsTo(Room, {foreignKey: 'room_ID'});
59 |
60 | // relationship between layoutsOffered and layout
61 | Layout.hasMany(LayoutsOffered, {foreignKey:'layout_ID'});
62 | LayoutsOffered.belongsTo(Layout, {foreignKey: 'layout_ID'});
63 |
64 | // relationship between layoutsOffered and room
65 | Room.hasMany(LayoutsOffered, {foreignKey:'room_ID'});
66 | LayoutsOffered.belongsTo(Room, {foreignKey: 'room_ID'});
67 |
68 | // relationship between menusOffered and menu
69 | Menu.hasMany(MenusOffered, {foreignKey:'menu_ID'});
70 | MenusOffered.belongsTo(Menu, {foreignKey: 'menu_ID'});
71 |
72 | // relationship between menusOffered and room
73 | Room.hasMany(MenusOffered, {foreignKey:'room_ID'});
74 | MenusOffered.belongsTo(Room, {foreignKey: 'room_ID'});
75 |
76 | // relationship between favorite and user
77 | User.hasMany(Favorite, {foreignKey:'user_ID'});
78 | Favorite.belongsTo(User, {foreignKey: 'user_ID'});
79 |
80 | // relationship between favorite and room
81 | Room.hasMany(Favorite, {foreignKey:'room_ID'});
82 | Favorite.belongsTo(Room, {foreignKey: 'room_ID'});
83 |
84 |
85 | db.sync();
86 |
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/server/models/bookings.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Room = require('./rooms.js');
4 | var User = require('./users.js');
5 |
6 | var Booking = db.define('Booking',
7 | {
8 | start: Sequelize.DATE,
9 | end: Sequelize.DATE,
10 | room: Sequelize.INTEGER,
11 | booker: Sequelize.INTEGER
12 | }
13 | );
14 |
15 | db.sync();
16 |
17 | module.exports = Booking;
--------------------------------------------------------------------------------
/server/models/courseCombinations.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var MenuItem = require('./menuItems.js');
4 |
5 | var CourseCombination = db.define('CourseCombination',
6 | {
7 | courseName: Sequelize.STRING,
8 | menuItem_ID: Sequelize.INTEGER
9 | }
10 | );
11 |
12 | db.sync();
13 |
14 | module.exports = CourseCombination;
--------------------------------------------------------------------------------
/server/models/coursesInMenus.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var CourseCombination = require('./courseCombinations.js');
4 | var Menu = require('./menus.js');
5 |
6 | var CoursesInMenu = db.define('CoursesInMenu',
7 | {
8 | courseCombination_ID: Sequelize.INTEGER,
9 | courseOrder: Sequelize.INTEGER,
10 | menu_ID: Sequelize.INTEGER
11 | }
12 | );
13 |
14 | db.sync();
15 |
16 | module.exports = CoursesInMenu;
17 |
18 |
--------------------------------------------------------------------------------
/server/models/favorites.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Room = require('./rooms.js');
4 | var User = require('./users.js');
5 |
6 |
7 |
8 | var Favorite = db.define('Favorite',
9 | {
10 | user_ID: Sequelize.INTEGER,
11 | room_ID: Sequelize.INTEGER
12 | }
13 | );
14 |
15 | db.sync();
16 |
17 | module.exports = Favorite;
--------------------------------------------------------------------------------
/server/models/images.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Room = require('./rooms.js');
4 |
5 | var Images = db.define('Images',
6 | {
7 | source: Sequelize.STRING,
8 | pictureOf: Sequelize.INTEGER
9 | }
10 | );
11 |
12 | db.sync();
13 |
14 | module.exports = Images;
--------------------------------------------------------------------------------
/server/models/layouts.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 |
4 |
5 |
6 | var Layout = db.define('Layout',
7 | {
8 | name: Sequelize.STRING,
9 | capacity: Sequelize.INTEGER
10 | }
11 | );
12 |
13 | db.sync();
14 |
15 | module.exports = Layout;
--------------------------------------------------------------------------------
/server/models/layoutsOffered.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Layout = require('./layouts.js');
4 | var Room = require('./rooms.js');
5 |
6 | var LayoutsOffered = db.define('LayoutsOffered',
7 | {
8 | layout_ID: Sequelize.INTEGER,
9 | room_ID: Sequelize.INTEGER
10 | }
11 | );
12 |
13 | db.sync();
14 |
15 | module.exports = LayoutsOffered;
--------------------------------------------------------------------------------
/server/models/menuItems.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 |
4 | var MenuItem = db.define('MenuItem',
5 | {
6 | name: Sequelize.STRING,
7 | description: Sequelize.TEXT,
8 | minGuests: Sequelize.INTEGER,
9 | serviceStyle: Sequelize.STRING
10 | }
11 | );
12 |
13 | db.sync();
14 |
15 | module.exports = MenuItem;
--------------------------------------------------------------------------------
/server/models/menus.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 |
4 | var Menu = db.define('Menu',
5 | {
6 | name: Sequelize.STRING,
7 | price: Sequelize.INTEGER,
8 | banquet: Sequelize.BOOLEAN,
9 | reception: Sequelize.BOOLEAN,
10 | }
11 | );
12 |
13 | db.sync();
14 |
15 | module.exports = Menu;
--------------------------------------------------------------------------------
/server/models/menusOffered.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Room = require('./rooms.js');
4 | var Menu = require('./menus.js');
5 |
6 | var MenusOffered = db.define('MenusOffered',
7 | {
8 | menu_ID: Sequelize.INTEGER,
9 | room_ID: Sequelize.INTEGER
10 | }
11 | );
12 |
13 | db.sync();
14 |
15 | module.exports = MenusOffered;
--------------------------------------------------------------------------------
/server/models/roomAmenities.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Room = require('./rooms.js');
4 | var Amenity = require('./amenities.js');
5 |
6 | var RoomAmenity = db.define('RoomAmenity',
7 | {
8 | amenities_ID: Sequelize.INTEGER,
9 | room_ID: Sequelize.INTEGER
10 | }
11 | );
12 |
13 | db.sync();
14 |
15 | module.exports = RoomAmenity;
--------------------------------------------------------------------------------
/server/models/rooms.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var Venue = require('./venues.js');
4 |
5 | var Room = db.define('Room',
6 | {
7 | roomName: Sequelize.STRING,
8 | type: Sequelize.STRING,
9 | size: Sequelize.INTEGER,
10 | description: Sequelize.TEXT,
11 | banquet: Sequelize.BOOLEAN,
12 | banquetCapacity: Sequelize.INTEGER,
13 | reception: Sequelize.BOOLEAN,
14 | receptionCapacity: Sequelize.INTEGER,
15 | minSpend: Sequelize.INTEGER,
16 | roomRentalFee: Sequelize.INTEGER,
17 | eventDuration: Sequelize.INTEGER,
18 | durationOverageFee: Sequelize.INTEGER,
19 | parentVenue: Sequelize.INTEGER,
20 | cleaningFee: Sequelize.INTEGER,
21 | houseRules: Sequelize.STRING,
22 | cancelPolicy: Sequelize.STRING,
23 | heroImage: Sequelize.STRING
24 | }
25 | );
26 |
27 | db.sync();
28 |
29 | module.exports = Room;
30 |
--------------------------------------------------------------------------------
/server/models/services.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 |
4 | var Service = db.define('Service',
5 | {
6 | name: Sequelize.STRING,
7 | room_ID: Sequelize.INTEGER,
8 | description: Sequelize.TEXT,
9 | price: Sequelize.INTEGER,
10 | pricedPer: Sequelize.STRING,
11 | limit: Sequelize.INTEGER,
12 | limitOverageFee: Sequelize.INTEGER,
13 | limitOveragePricedPer: Sequelize.STRING
14 | }
15 | );
16 |
17 | db.sync();
18 |
19 | module.exports = Service;
--------------------------------------------------------------------------------
/server/models/users.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 | var bcrypt = require('bcrypt-nodejs');
4 |
5 | var User = db.define('User',
6 | {
7 |
8 | username: Sequelize.STRING,
9 | email: Sequelize.STRING,
10 | password: Sequelize.STRING
11 |
12 |
13 | },
14 |
15 | {
16 | instanceMethods: {
17 |
18 | setPassword : function(newPassword, callback) {
19 | var self = this;
20 | bcrypt.hash(newPassword, null, null, function(err, hash){
21 | if (!err) {
22 | self.update({password: hash}).then(callback);
23 | }
24 | });
25 | },
26 |
27 | checkPassword: function(attemptedPassword) {
28 | return bcrypt.compareSync(attemptedPassword, this.get('password'));
29 | }
30 | }
31 | }
32 | )
33 |
34 | db.sync();
35 |
36 | module.exports = User;
37 |
--------------------------------------------------------------------------------
/server/models/venues.js:
--------------------------------------------------------------------------------
1 | var db = require('../config/dbConfig.js');
2 | var Sequelize = require('sequelize');
3 |
4 | var Venue = db.define('Venue',
5 | {
6 | venueName: Sequelize.STRING,
7 | address: Sequelize.STRING,
8 | city: Sequelize.STRING,
9 | state: Sequelize.STRING,
10 | zip: Sequelize.INTEGER,
11 | phone: Sequelize.STRING,
12 | fax: Sequelize.STRING,
13 | url: Sequelize.STRING,
14 | email: Sequelize.STRING,
15 | openTime: Sequelize.TIME,
16 | closeTime: Sequelize.TIME,
17 | contactFirstName: Sequelize.STRING,
18 | contactLastName: Sequelize.STRING,
19 | contactImage: Sequelize.STRING,
20 | contactTitle: Sequelize.STRING,
21 | taxRate: Sequelize.DECIMAL(10,2),
22 | autogratRate: Sequelize.DECIMAL,
23 | autogratMinGuests: Sequelize.INTEGER,
24 | cuisineType: Sequelize.STRING,
25 | houseRules: Sequelize.STRING,
26 | cancelPolicy: Sequelize.STRING,
27 | menuLeadTime: Sequelize.INTEGER
28 | }
29 | );
30 |
31 | db.sync();
32 |
33 | module.exports = Venue;
34 |
35 |
--------------------------------------------------------------------------------
/test/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "node": true,
3 | "browser": true,
4 | "esnext": true,
5 | "bitwise": true,
6 | "camelcase": true,
7 | "curly": true,
8 | "eqeqeq": true,
9 | "immed": true,
10 | "indent": 2,
11 | "latedef": true,
12 | "newcap": true,
13 | "noarg": true,
14 | "quotmark": "single",
15 | "regexp": true,
16 | "undef": true,
17 | "unused": true,
18 | "strict": true,
19 | "trailing": true,
20 | "smarttabs": true,
21 | "jasmine": true,
22 | "globals": {
23 | "angular": false,
24 | "browser": false,
25 | "inject": false
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/test/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration
2 | // http://karma-runner.github.io/0.12/config/configuration-file.html
3 | // Generated on 2015-05-19 using
4 | // generator-karma 1.0.0
5 |
6 | module.exports = function(config) {
7 | 'use strict';
8 |
9 | config.set({
10 | // enable / disable watching file and executing tests whenever any file changes
11 | autoWatch: true,
12 |
13 | // base path, that will be used to resolve files and exclude
14 | basePath: '../',
15 |
16 | // testing framework to use (jasmine/mocha/qunit/...)
17 | // as well as any additional frameworks (requirejs/chai/sinon/...)
18 | frameworks: [
19 | "jasmine"
20 | ],
21 |
22 | // list of files / patterns to load in the browser
23 | files: [
24 | // bower:js
25 | 'bower_components/modernizr/modernizr.js',
26 | 'bower_components/jquery/dist/jquery.js',
27 | 'bower_components/angular/angular.js',
28 | 'bower_components/angular-animate/angular-animate.js',
29 | 'bower_components/angular-aria/angular-aria.js',
30 | 'bower_components/angular-cookies/angular-cookies.js',
31 | 'bower_components/angular-messages/angular-messages.js',
32 | 'bower_components/angular-resource/angular-resource.js',
33 | 'bower_components/angular-route/angular-route.js',
34 | 'bower_components/angular-sanitize/angular-sanitize.js',
35 | 'bower_components/angular-touch/angular-touch.js',
36 | 'bower_components/angular-ui-router/release/angular-ui-router.js',
37 | 'bower_components/fastclick/lib/fastclick.js',
38 | 'bower_components/jquery.cookie/jquery.cookie.js',
39 | 'bower_components/jquery-placeholder/jquery.placeholder.js',
40 | 'bower_components/foundation/js/foundation.js',
41 | 'bower_components/datetimepicker/jquery.datetimepicker.js',
42 | 'bower_components/angular-mocks/angular-mocks.js',
43 | // endbower
44 | "app/scripts/**/*.js",
45 | "test/mock/**/*.js",
46 | "test/spec/**/*.js"
47 | ],
48 |
49 | // list of files / patterns to exclude
50 | exclude: [
51 | ],
52 |
53 | // web server port
54 | port: 8080,
55 |
56 | // Start these browsers, currently available:
57 | // - Chrome
58 | // - ChromeCanary
59 | // - Firefox
60 | // - Opera
61 | // - Safari (only Mac)
62 | // - PhantomJS
63 | // - IE (only Windows)
64 | browsers: [
65 | "PhantomJS"
66 | ],
67 |
68 | // Which plugins to enable
69 | plugins: [
70 | "karma-phantomjs-launcher",
71 | "karma-jasmine"
72 | ],
73 |
74 | // Continuous Integration mode
75 | // if true, it capture browsers, run tests and exit
76 | singleRun: false,
77 |
78 | colors: true,
79 |
80 | // level of logging
81 | // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
82 | logLevel: config.LOG_INFO,
83 |
84 | // Uncomment the following lines if you are using grunt's server to run the tests
85 | // proxies: {
86 | // '/': 'http://localhost:9000/'
87 | // },
88 | // URL root prevent conflicts with the site root
89 | // urlRoot: '_karma_'
90 | });
91 | };
92 |
--------------------------------------------------------------------------------
/test/spec/controllers/about.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | describe('Controller: AboutCtrl', function () {
4 |
5 | // load the controller's module
6 | beforeEach(module('privateTableApp'));
7 |
8 | var AboutCtrl,
9 | scope;
10 |
11 | // Initialize the controller and a mock scope
12 | beforeEach(inject(function ($controller, $rootScope) {
13 | scope = $rootScope.$new();
14 | AboutCtrl = $controller('AboutCtrl', {
15 | $scope: scope
16 | });
17 | }));
18 |
19 | it('should attach a list of awesomeThings to the scope', function () {
20 | expect(scope.awesomeThings.length).toBe(3);
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/test/spec/controllers/main.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | describe('Controller: MainCtrl', function () {
4 |
5 | // load the controller's module
6 | beforeEach(module('privateTableApp'));
7 |
8 | var MainCtrl,
9 | scope;
10 |
11 | // Initialize the controller and a mock scope
12 | beforeEach(inject(function ($controller, $rootScope) {
13 | scope = $rootScope.$new();
14 | MainCtrl = $controller('MainCtrl', {
15 | $scope: scope
16 | });
17 | }));
18 |
19 | it('should attach a list of awesomeThings to the scope', function () {
20 | expect(scope.awesomeThings.length).toBe(3);
21 | });
22 | });
23 |
--------------------------------------------------------------------------------