mirror of
				https://github.com/KevinMidboe/leifsbackend.git
				synced 2025-10-29 17:50:20 +00:00 
			
		
		
		
	Working backend setup with endpoints and database setup for adventures.
This commit is contained in:
		
							
								
								
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,12 @@ | |||||||
|  | #  --- Javascript ignore --- | ||||||
|  |  | ||||||
|  | node_modules | ||||||
|  | .env | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #  --- Python ignore --- | ||||||
|  |  | ||||||
| # Byte-compiled / optimized / DLL files | # Byte-compiled / optimized / DLL files | ||||||
| __pycache__/ | __pycache__/ | ||||||
| *.py[cod] | *.py[cod] | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								.sequelizerc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.sequelizerc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | const path = require('path'); | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   "config": path.resolve('./src/db/config', 'config.json'), | ||||||
|  |   "models-path": path.resolve('./src/db/models'), | ||||||
|  |   "seeders-path": path.resolve('./src/db/seeders'), | ||||||
|  |   "migrations-path": path.resolve('./src/db/migrations') | ||||||
|  | }; | ||||||
							
								
								
									
										19
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | { | ||||||
|  |   "name": "postgres", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "main": "index.js", | ||||||
|  |   "license": "MIT", | ||||||
|  |   "dependencies": { | ||||||
|  |     "body-parser": "^1.18.3", | ||||||
|  |     "dotenv": "^6.2.0", | ||||||
|  |     "express": "^4.16.4", | ||||||
|  |     "morgan": "^1.9.1", | ||||||
|  |     "pg": "^7.8.0", | ||||||
|  |     "pg-hstore": "^2.3.2" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "sequelize": "^4.42.0", | ||||||
|  |     "sequelize-auto": "^0.4.29", | ||||||
|  |     "sequelize-cli": "^5.4.0" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								server.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								server.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | require('dotenv').config() | ||||||
|  |  | ||||||
|  | // console.log(process.env) | ||||||
|  |  | ||||||
|  | const { Client } = require('pg') | ||||||
|  | const client = new Client() | ||||||
|  |  | ||||||
|  | client.connect() | ||||||
|  |  | ||||||
|  | client.query('SELECT $1::text as message', ['Hello world!'], (err, res) => { | ||||||
|  |   console.log(res.rows[0].message) // Yello world! | ||||||
|  |   client.end() | ||||||
|  | }) | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										16
									
								
								src/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/app.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | const express = require('express') | ||||||
|  | const logger = require('morgan') | ||||||
|  | const bodyParser = require('body-parser') | ||||||
|  |  | ||||||
|  | const app = express(); | ||||||
|  | app.use(logger('dev')); | ||||||
|  | app.use(bodyParser.json()); | ||||||
|  | app.use(bodyParser.urlencoded({ extended: false })); | ||||||
|  |  | ||||||
|  | require('./routes')(app); | ||||||
|  |  | ||||||
|  | app.get('*', (req, res) => res.status(200).send({ | ||||||
|  |   message: 'Welcome to the beginning of nothingness', | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | module.exports = app; | ||||||
							
								
								
									
										67
									
								
								src/controllers/adventure.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/controllers/adventure.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | const Adventure = require('../db/models').adventure; | ||||||
|  | const Location = require('../db/models').location; | ||||||
|  | const Image = require('../db/models').image; | ||||||
|  |  | ||||||
|  | // const { Adventure, Image, Location } = require('../db/sequelize') | ||||||
|  |  | ||||||
|  | const Op = require('sequelize').Op; | ||||||
|  |  | ||||||
|  | // module.exports = { | ||||||
|  |  | ||||||
|  | function location(req, res) { | ||||||
|  |   return Adventure | ||||||
|  |     .findAll({ | ||||||
|  |       where: { | ||||||
|  |         'locationName': req.query.name | ||||||
|  |       }, | ||||||
|  |       attributes: ['id', 'title', 'subtext', 'dateStart', 'dateEnd', 'locationName'] | ||||||
|  |       // order: [['title', 'ASC']] | ||||||
|  |     }) | ||||||
|  |     .then(adventure => res.status(200).send(adventure)) | ||||||
|  |     .catch(error => res.status(400).send(error)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function list(req, res) { | ||||||
|  |   return Adventure | ||||||
|  |     .findAll({ | ||||||
|  |       attributes: ['id', 'title', 'subtext', 'dateStart', 'dateEnd', 'locationName'] | ||||||
|  |     }) | ||||||
|  |     .then(adventure => res.status(200).send(adventure)) | ||||||
|  |     .catch(error => res.status(400).send(error)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function get(req, res) { | ||||||
|  |   return Adventure | ||||||
|  |     .findByPk(req.params.id, { | ||||||
|  |       attributes: ['id', 'title', 'subtext', 'dateStart', 'dateEnd', 'locationName'] | ||||||
|  |     }) | ||||||
|  |     .then(adventure => res.status(200).send(adventure)) | ||||||
|  |     .catch(error => res.status(400).send(error)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function createLocation(req, res) { | ||||||
|  |   return Location | ||||||
|  |     .create({ | ||||||
|  |       name: req.body.locationName, | ||||||
|  |       geoposition: req.body.geoposition | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // get form elements | ||||||
|  | function create(req, res) { | ||||||
|  |   console.log('adventure', Adventure) | ||||||
|  |   return createLocation(req, res) | ||||||
|  |     .then(() => Adventure | ||||||
|  |     .create({ | ||||||
|  |       title: req.body.title, | ||||||
|  |       subtext: req.body.subtext, | ||||||
|  |       dateStart: req.body.dateStart, | ||||||
|  |       dateEnd: req.body.dateEnd, | ||||||
|  |       locationName: req.body.locationName, | ||||||
|  |     }, {})) | ||||||
|  |     .then(adventure => res.status(201).send(adventure)) | ||||||
|  |     .catch(error => res.status(400).send(error)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | module.exports = { location, list, get, create }; | ||||||
							
								
								
									
										47
									
								
								src/controllers/calendar.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/controllers/calendar.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | const Adventure = require('../db/models').adventure; | ||||||
|  | // const { Adventure } = require('../db/sequelize') | ||||||
|  |  | ||||||
|  | const Op = require('sequelize').Op; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |  | ||||||
|  |   location(req, res) { | ||||||
|  |     return Adventure | ||||||
|  |       .findAll({ | ||||||
|  |         where: { [Op.not]: { locationName: null } } | ||||||
|  |       }) | ||||||
|  |       .then(adventure => res.status(200).send(adventure)) | ||||||
|  |       .catch(error => res.status(400).send(error)) | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   list(req, res) { | ||||||
|  |     return Adventure | ||||||
|  |       .findAll({ | ||||||
|  |         attributes: ['id', 'title', 'subtext', 'dateStart', 'dateEnd', 'locationName'] | ||||||
|  |       }) | ||||||
|  |       .then(adventure => res.status(200).send(adventure)) | ||||||
|  |       .catch(error => res.status(400).send(error)) | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   get(req, res) { | ||||||
|  |     return Adventure | ||||||
|  |       .findById(req.params.id) | ||||||
|  |       .then(adventure => res.status(200).send(adventure)) | ||||||
|  |       .catch(error => res.status(400).send(error)); | ||||||
|  |   }, | ||||||
|  |    | ||||||
|  |   // get form elements | ||||||
|  |   create(req, res) { | ||||||
|  |     console.log('adventure', Adventure) | ||||||
|  |     return Adventure | ||||||
|  |       .create({ | ||||||
|  |         title: req.body.title, | ||||||
|  |         subtext: req.body.subtext, | ||||||
|  |         dateStart: req.body.dateStart, | ||||||
|  |         dateEnd: req.body.dateEnd, | ||||||
|  |         locationName: req.body.locationName | ||||||
|  |       }) | ||||||
|  |       .then(adventure => res.status(201).send(adventure)) | ||||||
|  |       .catch(error => res.status(400).send(error)) | ||||||
|  |   } | ||||||
|  | }; | ||||||
							
								
								
									
										23
									
								
								src/controllers/image.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/controllers/image.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | const Image = require('../db/models').image; | ||||||
|  |  | ||||||
|  | // const { Image } = require('../db/sequelize') | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |  | ||||||
|  |   all(req, res) { | ||||||
|  |     console.log('here') | ||||||
|  |     return Image | ||||||
|  |       .findAll() | ||||||
|  |       .then(images => res.status(200).send(images)) | ||||||
|  |       .catch(error => res.status(400).send(error)) | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   list(req, res) { | ||||||
|  |     return Image | ||||||
|  |       .findAll({ | ||||||
|  |         where: { 'adventure_id': req.params.adventureId } | ||||||
|  |       }) | ||||||
|  |       .then(images => res.status(200).send(images)) | ||||||
|  |       .catch(error => res.status(400).send(error)) | ||||||
|  |   }, | ||||||
|  | }; | ||||||
							
								
								
									
										9
									
								
								src/controllers/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/controllers/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | const Adventure = require('./adventure'); | ||||||
|  | const Location = require('./location'); | ||||||
|  | const Image = require('./image'); | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   Adventure, | ||||||
|  |   Location, | ||||||
|  |   Image | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								src/controllers/location.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/controllers/location.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | const Location = require('../db/models').location; | ||||||
|  | const Adventure = require('../db/models').adventure; | ||||||
|  |  | ||||||
|  | // const { Adventure, Location } = require('../db/sequelize') | ||||||
|  |  | ||||||
|  | const Op = require('sequelize').Op; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |  | ||||||
|  |   list(req, res) { | ||||||
|  |     return Location | ||||||
|  |       .findAll({ | ||||||
|  |         attributes: ['name', 'geoposition', 'mapboxData'] | ||||||
|  |       }) | ||||||
|  |       // .then(Location => Adventure.findAll({ | ||||||
|  |       //   where: { 'locationName': Location.name }, | ||||||
|  |       //   attributes: [ 'title', 'subtext', 'dateStart', 'dateEnd', 'location.geoposition' ] | ||||||
|  |       // })) | ||||||
|  |       .then(Location => res.status(200).send(Location)) | ||||||
|  |       .catch(error => res.status(400).send(error)) | ||||||
|  |   }, | ||||||
|  | }; | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/db/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/db/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										27
									
								
								src/db/config/config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/db/config/config.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | { | ||||||
|  |   "development": { | ||||||
|  |     "username": "kevinmidboe", | ||||||
|  |     "password": null, | ||||||
|  |     "database": "postgres", | ||||||
|  |     "host": "localhost", | ||||||
|  |     "port": 5432, | ||||||
|  |     "dialect": "postgres", | ||||||
|  |     "operatorsAliases": false | ||||||
|  |   }, | ||||||
|  |   "test": { | ||||||
|  |     "username": "root", | ||||||
|  |     "password": null, | ||||||
|  |     "database": "database_test", | ||||||
|  |     "host": "127.0.0.1", | ||||||
|  |     "dialect": "postgres", | ||||||
|  |     "operatorsAliases": false | ||||||
|  |   }, | ||||||
|  |   "production": { | ||||||
|  |     "username": "root", | ||||||
|  |     "password": null, | ||||||
|  |     "database": "database_production", | ||||||
|  |     "host": "127.0.0.1", | ||||||
|  |     "dialect": "postgres", | ||||||
|  |     "operatorsAliases": false | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										61
									
								
								src/db/models/adventure.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/db/models/adventure.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | |||||||
|  | 'use strict'; | ||||||
|  | module.exports = (sequelize, DataTypes) => { | ||||||
|  |   const Adventure = sequelize.define('adventure', { | ||||||
|  |     id: { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |       primaryKey: true, | ||||||
|  |       autoIncrement: true | ||||||
|  |     }, | ||||||
|  |     // imageIds: { | ||||||
|  |     //   type: DataTypes.INTEGER, | ||||||
|  |     //   allowNull: false, | ||||||
|  |     //   references: { | ||||||
|  |     //     model: 'images', | ||||||
|  |     //     key: 'id', | ||||||
|  |     //     as: 'imageKey' | ||||||
|  |     //   } | ||||||
|  |     // }, | ||||||
|  |     title: { | ||||||
|  |       type: DataTypes.STRING, | ||||||
|  |       notNull: true | ||||||
|  |     }, | ||||||
|  |     subtext: { | ||||||
|  |       type: DataTypes.STRING, | ||||||
|  |       notNull: false, | ||||||
|  |       default: null | ||||||
|  |     }, | ||||||
|  |     dateStart: { | ||||||
|  |       type: DataTypes.DATE, | ||||||
|  |       notNull: true | ||||||
|  |     }, | ||||||
|  |     dateEnd: { | ||||||
|  |       type: DataTypes.DATE, | ||||||
|  |       notNull: true | ||||||
|  |     }, | ||||||
|  |     locationName: { | ||||||
|  |       type: DataTypes.STRING, | ||||||
|  |       notnull: false, | ||||||
|  |       default: null, | ||||||
|  |       // onDelete: 'SET NULL', | ||||||
|  |       // references: { | ||||||
|  |       //   model: 'locations', | ||||||
|  |       //   key: 'name', | ||||||
|  |       //   as: 'locationKey', | ||||||
|  |       // }, | ||||||
|  |     } | ||||||
|  |   }, {}); | ||||||
|  |  | ||||||
|  |   Adventure.associate = (models) => { | ||||||
|  |     Adventure.hasMany(models.image, { | ||||||
|  |       foreignKey: 'adventure_id', | ||||||
|  |       as: 'images' | ||||||
|  |     }); | ||||||
|  |     // associations can be defined here | ||||||
|  |     // Adventure.hasZeroOrOne(models.location) | ||||||
|  |  | ||||||
|  |   }; | ||||||
|  |    | ||||||
|  |   // Adventure.sync({ force: false }) | ||||||
|  |    | ||||||
|  |   return Adventure; | ||||||
|  | }; | ||||||
							
								
								
									
										51
									
								
								src/db/models/image.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/db/models/image.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | module.exports = (sequelize, DataTypes) => { | ||||||
|  |   const Image = sequelize.define('image', { | ||||||
|  |     id: { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |       primaryKey: true, | ||||||
|  |       autoIncrement: true | ||||||
|  |     }, | ||||||
|  |     filename: { | ||||||
|  |       type: DataTypes.TEXT, | ||||||
|  |       allowNull: false, | ||||||
|  |     }, | ||||||
|  |     adventure_id: { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |     }, | ||||||
|  |     // adventure_key: { | ||||||
|  |     //   type: DataTypes.INTEGER, | ||||||
|  |     //   allowNull: false, | ||||||
|  |     //   references: { | ||||||
|  |     //     model: 'adventures', | ||||||
|  |     //     key: 'id', | ||||||
|  |     //     as: 'adventureKey' | ||||||
|  |     //   } | ||||||
|  |     // }, | ||||||
|  |     description: { | ||||||
|  |       type: DataTypes.TEXT, | ||||||
|  |       allowNull: true | ||||||
|  |     }, | ||||||
|  |     size: { | ||||||
|  |       type: DataTypes.DOUBLE, | ||||||
|  |       allowNull: true | ||||||
|  |     }, | ||||||
|  |     album_order: { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |       allowNull: true | ||||||
|  |     } | ||||||
|  |   }, {}); | ||||||
|  |  | ||||||
|  |   Image.associate = (models) => { | ||||||
|  |     Image.belongsTo(models.adventure, { | ||||||
|  |       foreignKey: 'adventure_id' | ||||||
|  |     }); | ||||||
|  |     Image.hasOne(models.imagevariations, { | ||||||
|  |       foreignKey: 'image_id', | ||||||
|  |       as: 'imageVariations' | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Image.sync({ force: false }) | ||||||
|  |  | ||||||
|  |   return Image; | ||||||
|  | }; | ||||||
							
								
								
									
										44
									
								
								src/db/models/imagevariation.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/db/models/imagevariation.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | /* jshint indent: 2 */ | ||||||
|  |  | ||||||
|  | module.exports = function(sequelize, DataTypes) { | ||||||
|  |   const ImageVariation = sequelize.define('imagevariation', { | ||||||
|  |     'id': { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |       primaryKey: true, | ||||||
|  |       autoIncrement: true | ||||||
|  |     }, | ||||||
|  |     image_id: { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |     }, | ||||||
|  |     thumb: { | ||||||
|  |       type: DataTypes.BOOLEAN, | ||||||
|  |       allowNull: true, | ||||||
|  |       defaultValue: false | ||||||
|  |     }, | ||||||
|  |     sm: { | ||||||
|  |       type: DataTypes.BOOLEAN, | ||||||
|  |       allowNull: true, | ||||||
|  |       defaultValue: false | ||||||
|  |     }, | ||||||
|  |     md: { | ||||||
|  |       type: DataTypes.BOOLEAN, | ||||||
|  |       allowNull: true, | ||||||
|  |       defaultValue: false | ||||||
|  |     }, | ||||||
|  |     lg: { | ||||||
|  |       type: DataTypes.BOOLEAN, | ||||||
|  |       allowNull: true, | ||||||
|  |       defaultValue: false | ||||||
|  |     } | ||||||
|  |   }, {}); | ||||||
|  |  | ||||||
|  |   ImageVariation.associate = (models) => { | ||||||
|  |     ImageVariation.belongsTo(models.iamge, { | ||||||
|  |       foreignKey: 'image_id' | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // ImageVariation.sync({ force: false }) | ||||||
|  |  | ||||||
|  |   return ImageVariation; | ||||||
|  | }; | ||||||
							
								
								
									
										55
									
								
								src/db/models/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/db/models/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | 'use strict'; | ||||||
|  |  | ||||||
|  | const fs = require('fs'); | ||||||
|  | const path = require('path'); | ||||||
|  | const Sequelize = require('sequelize'); | ||||||
|  | const basename = path.basename(__filename); | ||||||
|  | const env = process.env.NODE_ENV || 'development'; | ||||||
|  | const config = require(__dirname + '/../config/config.json')[env]; | ||||||
|  | const db = {}; | ||||||
|  |  | ||||||
|  | let sequelize; | ||||||
|  | if (config.use_env_variable) { | ||||||
|  |   sequelize = new Sequelize(process.env[config.use_env_variable], config); | ||||||
|  | } else { | ||||||
|  |   sequelize = new Sequelize(config.database, config.username, config.password, config); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fs | ||||||
|  |   .readdirSync(__dirname) | ||||||
|  |   .filter(file =>  | ||||||
|  |     (file.indexOf('.') !== 0) && | ||||||
|  |     (file !== basename) && | ||||||
|  |     (file.slice(-3) === '.js')) | ||||||
|  |   .forEach(file => { | ||||||
|  |     console.log('file', file) | ||||||
|  |     const model = sequelize['import'](path.join(__dirname, file)); | ||||||
|  |     db[model.name] = model; | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  | // const AdventureModel = require('./adventure') | ||||||
|  |  | ||||||
|  | // db.adventure = require('./adventure.js')(sequelize, Sequelize); | ||||||
|  | // db.image = require('./image.js')(sequelize, Sequelize); | ||||||
|  | // db.imagevariation = require('./imagevariation.js')(sequelize, Sequelize); | ||||||
|  | // db.location = require('./location.js')(sequelize, Sequelize); | ||||||
|  |  | ||||||
|  | // db.location.sync({ force: false }); | ||||||
|  | // db.adventure.sync({ force: false }); | ||||||
|  | // db.image.sync({ force: false }); | ||||||
|  | // db.imagevariation.sync({ force: false }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Object.keys(db).forEach(modelName => { | ||||||
|  | //   console.log('modelName', modelName) | ||||||
|  | //   if (db[modelName].associate) { | ||||||
|  | //     console.log(`yes ${modelName} has an assocination`) | ||||||
|  | //     console.log(db[modelName]) | ||||||
|  | //     console.log(db) | ||||||
|  | //     db[modelName].associate(db); | ||||||
|  | //   } | ||||||
|  | // }); | ||||||
|  |  | ||||||
|  | db.sequelize = sequelize; | ||||||
|  |  | ||||||
|  | module.exports = db; | ||||||
							
								
								
									
										44
									
								
								src/db/models/location.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/db/models/location.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | 'use strict'; | ||||||
|  | module.exports = (sequelize, DataTypes) => { | ||||||
|  |   const Location = sequelize.define('location', { | ||||||
|  |  | ||||||
|  |     id: { | ||||||
|  |       type: DataTypes.INTEGER, | ||||||
|  |       primaryKey: true, | ||||||
|  |       autoIncrement: true | ||||||
|  |     }, | ||||||
|  |     name: {  | ||||||
|  |       type: DataTypes.STRING,  | ||||||
|  |       // primaryKey: true, | ||||||
|  |       allowNull: false  | ||||||
|  |     }, | ||||||
|  |     geoposition: {  | ||||||
|  |       type: DataTypes.STRING,  | ||||||
|  |       allowNull: true,  | ||||||
|  |       defaultValue: null | ||||||
|  |     }, | ||||||
|  |     mapboxData: { | ||||||
|  |       type: DataTypes.JSON, | ||||||
|  |       allowNull: true, | ||||||
|  |       defaultValue: null | ||||||
|  |     }, | ||||||
|  |     // adventureId: { | ||||||
|  |     //   type: DataTypes.INTEGER, | ||||||
|  |     //   onDelete: 'SET NULL', | ||||||
|  |     //   references: { | ||||||
|  |     //     model: 'adventures', | ||||||
|  |     //     key: 'id', | ||||||
|  |     //     as: 'adventureKey', | ||||||
|  |     //   }, | ||||||
|  |     // } | ||||||
|  |   }, {}); | ||||||
|  |  | ||||||
|  |   Location.associate = function(models) { | ||||||
|  |     // associations can be defined here | ||||||
|  |     // Location.belongsTo(models.adventure) | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   // Location.sync({ force: false }) | ||||||
|  |  | ||||||
|  |   return Location; | ||||||
|  | }; | ||||||
							
								
								
									
										36
									
								
								src/db/seeders/20190217205209-adventures.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/db/seeders/20190217205209-adventures.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | 'use strict'; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   up: (queryInterface, Sequelize) => { | ||||||
|  |     return queryInterface.bulkInsert('adventures', [{ | ||||||
|  |       title: 'Jul 2019', | ||||||
|  |       dateStart: '2019-12-24', | ||||||
|  |       dateEnd: '2019-12-24', | ||||||
|  |       locationName: 'Rosendalsveien 50b, 1166 Oslo, Norway', | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: 'Fisketur på Karmøy', | ||||||
|  |       subtext: 'Flott tur rundt påsketider 🌞', | ||||||
|  |       dateStart: '2019-04-12', | ||||||
|  |       dateEnd: '2019-04-16', | ||||||
|  |       locationName: 'Karmøy, Rogaland, Norge', | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: 'Havfiskeforeningen til karmøy!', | ||||||
|  |       subtext: 'Vi er her for å herje! :D', | ||||||
|  |       dateStart: '2019-05-01', | ||||||
|  |       dateEnd: '2019-05-04', | ||||||
|  |       locationName: 'Karmøy, Rogaland, Norge', | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }], {}); | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   down: (queryInterface, Sequelize) => {  | ||||||
|  |     return queryInterface.bulkDelete('adventures', null, {}); | ||||||
|  |   } | ||||||
|  | }; | ||||||
							
								
								
									
										23
									
								
								src/db/seeders/20190217205441-locations.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/db/seeders/20190217205441-locations.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | 'use strict'; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   up: (queryInterface, Sequelize) => { | ||||||
|  |     return queryInterface.bulkInsert('locations', [{ | ||||||
|  |       name: 'Rosendalsveien 50b, 1166 Oslo, Norway', | ||||||
|  |       geoposition: '59.853973, 10.799471', | ||||||
|  |       mapboxData: '{"id":"address.3598204582760676","type":"Feature","place_type":["address"],"relevance":1,"properties":{"accuracy":"point"},"text":"Rosendalsveien","place_name":"Rosendalsveien50b,1166Oslo,Norway","center":[10.799471,59.853973],"geometry":{"type":"Point","coordinates":[10.799471,59.853973]},"address":"50b","context":[{"id":"postcode.9489910510813950","text":"1166"},{"id":"place.17289044417596980","short_code":"NO-03","wikidata":"Q585","text":"Oslo"},{"id":"country.16020050790143780","short_code":"no","wikidata":"Q20","text":"Norway"}]}', | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       name: 'Karmøy, Rogaland, Norge', | ||||||
|  |       geoposition: '59.2744, 5.2884', | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }], {}); | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   down: (queryInterface, Sequelize) => { | ||||||
|  |     return queryInterface.bulkDelete('locations', null, {}); | ||||||
|  |   } | ||||||
|  | }; | ||||||
							
								
								
									
										52
									
								
								src/db/seeders/20190217211559-images.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/db/seeders/20190217211559-images.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | 'use strict'; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   up: (queryInterface, Sequelize) => { | ||||||
|  |     return queryInterface.bulkInsert('images', [{ | ||||||
|  |       filename: 'DSC_9029.png', | ||||||
|  |       adventure_id: 1, | ||||||
|  |       size: 2983546, | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       filename: 'DSC_0505.png', | ||||||
|  |       adventure_id: 1, | ||||||
|  |       description: 'Dancing around the christmas tree', | ||||||
|  |       size: 10032272, | ||||||
|  |       album_order: 1, | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       filename: 'DSC_0509.png', | ||||||
|  |       adventure_id: 2, | ||||||
|  |       description: 'Se på den fisken der!', | ||||||
|  |       size: 8032272, | ||||||
|  |       album_order: 2, | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       filename: 'DSC_0510.png', | ||||||
|  |       adventure_id: 2, | ||||||
|  |       description: 'Noe i garnet!', | ||||||
|  |       size: 6373234, | ||||||
|  |       album_order: 1, | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }], {}) | ||||||
|  |  | ||||||
|  |     // const adventure = await queryInterface.Sequelize.query( | ||||||
|  |     //   `SELECT id FROM adventure;` | ||||||
|  |     // ); | ||||||
|  |  | ||||||
|  |     // const adventure = images[0]; | ||||||
|  |  | ||||||
|  |     // return await queryInterface.bulkInsert('images') | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   down: (queryInterface, Sequelize) => {  | ||||||
|  |     return queryInterface.bulkDelete('images', null, {}); | ||||||
|  |   } | ||||||
|  | }; | ||||||
							
								
								
									
										18
									
								
								src/db/seeders/20190217221016-imagevariations.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/db/seeders/20190217221016-imagevariations.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | 'use strict'; | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   up: (queryInterface, Sequelize) => { | ||||||
|  |     return queryInterface.bulkInsert('imagevariations', [{ | ||||||
|  |       'image_id': 4, | ||||||
|  |       'thumb': false, | ||||||
|  |       'md': true, | ||||||
|  |       'lg': true, | ||||||
|  |       createdAt: new Date(), | ||||||
|  |       updatedAt: new Date() | ||||||
|  |     }]) | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   down: (queryInterface, Sequelize) => {  | ||||||
|  |     return queryInterface.bulkDelete('imagevariations', null, {}); | ||||||
|  |   } | ||||||
|  | }; | ||||||
							
								
								
									
										39
									
								
								src/db/sequelize.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/db/sequelize.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | const Sequelize = require('sequelize') | ||||||
|  | const env = process.env.NODE_ENV || 'development'; | ||||||
|  | const config = require(__dirname + '/config/config.json')[env]; | ||||||
|  |  | ||||||
|  | const AdventureModel = require('./models/adventure') | ||||||
|  | const ImageModel = require('./models/image') | ||||||
|  | const ImageVariationModel = require('./models/imagevariation') | ||||||
|  | const LocationModel = require('./models/location') | ||||||
|  |  | ||||||
|  | let sequelize; | ||||||
|  | if (config.use_env_variable) { | ||||||
|  |   sequelize = new Sequelize(process.env[config.use_env_variable], config); | ||||||
|  | } else { | ||||||
|  |   sequelize = new Sequelize(config.database, config.username, config.password, config); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const Adventure = AdventureModel(sequelize, Sequelize) | ||||||
|  | // BlogTag will be our way of tracking relationship between Blog and Tag models | ||||||
|  | // each Blog can have multiple tags and each Tag can have multiple blogs | ||||||
|  | const AdventureImages = sequelize.define('adventure_image', {}) | ||||||
|  | const Image = ImageModel(sequelize, Sequelize) | ||||||
|  | const ImageVariation = ImageVariationModel(sequelize, Sequelize) | ||||||
|  | const Location = LocationModel(sequelize, Sequelize) | ||||||
|  |  | ||||||
|  | // Adventure.hasMany(Image, { through: AdventureImages, unique: false }) | ||||||
|  | // Image.belongsTo(Adventure, { through: AdventureImages, unique: false }) | ||||||
|  | // Blog.belongsTo(User); | ||||||
|  |  | ||||||
|  | sequelize.sync({ force: false }) | ||||||
|  |   .then(() => { | ||||||
|  |     console.log(`Database & tables created!`) | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   Adventure, | ||||||
|  |   Image, | ||||||
|  |   ImageVariation, | ||||||
|  |   Location | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								src/routes/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/routes/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | const adventureController = require('../controllers').Adventure; | ||||||
|  | const locationController = require('../controllers').Location; | ||||||
|  | const imageController = require('../controllers').Image; | ||||||
|  |  | ||||||
|  | module.exports = (app) => { | ||||||
|  |   app.get('/api', (req, res) => res.status(200).send({ | ||||||
|  |     message: 'Welcome to Leifs Adventures!' | ||||||
|  |   })); | ||||||
|  |  | ||||||
|  |   // Adventures | ||||||
|  |   app.get('/api/adventure', adventureController.list) | ||||||
|  |   app.post('/api/adventure', adventureController.create) | ||||||
|  |    | ||||||
|  |   app.get('/api/adventure/location', adventureController.location); | ||||||
|  |   app.get('/api/adventure/:id', adventureController.get); | ||||||
|  |    | ||||||
|  |   // Location (map) | ||||||
|  |   app.get('/api/location', locationController.list) | ||||||
|  |    | ||||||
|  |   // images | ||||||
|  |   app.get('/api/images', imageController.all) | ||||||
|  |   app.get('/api/images/:adventureId', imageController.list) | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								src/server.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/server.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | const app = require('./app'); | ||||||
|  |  | ||||||
|  | const port = parseInt(process.env.PORT) || 5000; | ||||||
|  |  | ||||||
|  | module.exports = app.listen(port, () => { | ||||||
|  |    console.log('leifsBackend'); | ||||||
|  |    console.log(`Webserver is listening on ${port}`); | ||||||
|  | }); | ||||||
		Reference in New Issue
	
	Block a user