diff --git a/app/controllers/gardenSizes.js b/app/controllers/gardenSizes.js new file mode 100644 index 0000000..a449230 --- /dev/null +++ b/app/controllers/gardenSizes.js @@ -0,0 +1,23 @@ +const { currentRERequest } = require('../helpers/url'); +const { gardenSizes } = require('../helpers/enums'); + +const getGardenSize = (req,res) => { + const nextStep = req.query.nextStep; + res.render('gardenSize', { + nextStep, + gardenSizes + }); +}; + +const postGardenSize = async (req, res) => { + const request = await currentRERequest(req); + const nextStep = req.query.nextStep || `/cijena/${request.uniqueId}`; + request.gardenSize = req.body.gardensize; + await request.save(); + res.redirect(nextStep); +}; + +module.exports = { + getGardenSize, + postGardenSize +}; diff --git a/app/controllers/goAgain.js b/app/controllers/goAgain.js new file mode 100644 index 0000000..5261171 --- /dev/null +++ b/app/controllers/goAgain.js @@ -0,0 +1,7 @@ +const getGoAgain = async (req,res) => { + res.render('goAgain'); +}; + +module.exports = { + getGoAgain +}; diff --git a/app/controllers/municipalities.js b/app/controllers/municipalities.js index 46fb233..e471cfa 100644 --- a/app/controllers/municipalities.js +++ b/app/controllers/municipalities.js @@ -1,4 +1,4 @@ -const { currentRERequest } = require('../helpers/url'); +const { currentRERequest } = require('../helpers/url'); const { getMunicipalitiesForRegion } = require('../helpers/codes'); const getMunicipality = async (req,res) => { @@ -12,10 +12,11 @@ const getMunicipality = async (req,res) => { }; const postMunicipality = async (req, res) => { - let request = await currentRERequest(req); + const request = await currentRERequest(req); + const nextStep = req.query.nextStep || `/povrsina/${request.uniqueId}`; request.municipality = req.body.municipality; await request.save(); - res.send("Result is " + JSON.stringify(request)); + res.redirect(nextStep); }; module.exports = { diff --git a/app/controllers/prices.js b/app/controllers/prices.js new file mode 100644 index 0000000..58127bf --- /dev/null +++ b/app/controllers/prices.js @@ -0,0 +1,23 @@ +const { currentRERequest } = require('../helpers/url'); +const { prices } = require('../helpers/enums'); + +const getPrice = (req,res) => { + const nextStep = req.query.nextStep; + res.render('price', { + nextStep, + prices + }); +}; + +const postPrice = async (req, res) => { + const request = await currentRERequest(req); + const nextStep = req.query.nextStep || `/pregled/${request.uniqueId}`; + request.price = req.body.price; + await request.save(); + res.redirect(nextStep); +}; + +module.exports = { + getPrice, + postPrice +}; diff --git a/app/controllers/queryReview.js b/app/controllers/queryReview.js new file mode 100644 index 0000000..438848b --- /dev/null +++ b/app/controllers/queryReview.js @@ -0,0 +1,73 @@ +const { currentRERequest } = require('../helpers/url'); +const { getRegionName, getMunicipalityName } = require('../helpers/codes'); +const { realEstateTypes, sizes, gardenSizes, prices, getEnumTypeTitle } = require('../helpers/enums'); + +const getQueryReview = async (req,res) => { + const request = await currentRERequest(req); + const nextStep = req.query.nextStep; + + if (!request || !request.dataValues) { + return null; + } + + const { realEstateType, region, municipality, size, gardenSize, price } = request.dataValues; + + const realEstateTypeTitle = realEstateType ? getEnumTypeTitle(realEstateTypes, realEstateType) : null; + const regionName = region ? getRegionName(region) : null; + const municipalityName = (region && municipality) ? getMunicipalityName(region, municipality) : null; + const sizeTitle = size ? getEnumTypeTitle(sizes, size) : null; + const gardenSizeTitle = gardenSize ? getEnumTypeTitle(gardenSizes, gardenSize) : null; + const priceTitle = price ? getEnumTypeTitle(prices, price) : null; + + const uniqueId = request.dataValues.uniqueId ? request.dataValues.uniqueId : ''; + + const queryData = [ + { + id: 'realEstateType', + title: realEstateTypeTitle, + url: `/vrstanekretnine/${uniqueId}`, + }, + { + id: 'region', + title: regionName, + url: `/region/${uniqueId}`, + }, + { + id: 'municipality', + title: municipalityName, + url: `/mjesto/${uniqueId}`, + }, + { + id: 'size', + title: sizeTitle, + url: `/povrsina/${uniqueId}`, + }, + { + id: 'gardenSize', + title: gardenSizeTitle, + url: `/okucnica/${uniqueId}`, + }, + { + id: 'price', + title: priceTitle, + url: `/cijena/${uniqueId}` + } + ]; + + res.render('queryReview', { + nextStep, + queryData, + }); +}; + +const postQueryReview = async (req, res) => { + const request = await currentRERequest(req); + const nextStep = req.query.nextStep || `/posalji/${request.uniqueId}`; + + res.redirect(nextStep); +}; + +module.exports = { + getQueryReview, + postQueryReview +}; diff --git a/app/controllers/querySubmit.js b/app/controllers/querySubmit.js new file mode 100644 index 0000000..e8acc29 --- /dev/null +++ b/app/controllers/querySubmit.js @@ -0,0 +1,23 @@ +const { currentRERequest } = require('../helpers/url'); + +const getQuerySubmit = async (req,res) => { + const nextStep = req.query.nextStep; + + res.render('querySubmit', { + nextStep + }); +}; + +const postQuerySubmit = async (req, res) => { + const request = await currentRERequest(req); + const nextStep = req.query.nextStep || '/ponovo'; + //TODO: validate email + request.email = req.body.email; + await request.save(); + res.redirect(nextStep); +}; + +module.exports = { + getQuerySubmit, + postQuerySubmit +}; diff --git a/app/controllers/realEstateTypes.js b/app/controllers/realEstateTypes.js index 125cb5f..2d66170 100644 --- a/app/controllers/realEstateTypes.js +++ b/app/controllers/realEstateTypes.js @@ -1,10 +1,5 @@ const db = require('../models/index'); - -const realEstateTypes = [ - { ime: "Kuća", id: "kuca" }, - { ime: "Stan", id: "stan" }, - { ime: "Vikendica", id: "vikendica" } -]; +const { realEstateTypes } = require('../helpers/enums'); const getRealEstateTypes = (req,res) => { const nextStep = req.query.nextStep; diff --git a/app/controllers/sizes.js b/app/controllers/sizes.js new file mode 100644 index 0000000..d75dac9 --- /dev/null +++ b/app/controllers/sizes.js @@ -0,0 +1,23 @@ +const { currentRERequest } = require('../helpers/url'); +const { sizes } = require('../helpers/enums'); + +const getSize = (req,res) => { + const nextStep = req.query.nextStep; + res.render('size', { + nextStep, + sizes + }); +}; + +const postSize = async (req, res) => { + const request = await currentRERequest(req); + const nextStep = req.query.nextStep || `/okucnica/${request.uniqueId}`; + request.size = req.body.size; + await request.save(); + res.redirect(nextStep); +}; + +module.exports = { + getSize, + postSize +}; diff --git a/app/helpers/codes.js b/app/helpers/codes.js index 53272d0..5ec86cd 100644 --- a/app/helpers/codes.js +++ b/app/helpers/codes.js @@ -876,16 +876,37 @@ const getRegions = () => { return regions.map( (g) => ({ name: g.name, id: g.id, olxid: g.olxid }) ); }; +const getRegion = (regionId) => { + return regions.find(region => region.id === regionId); +}; + +const getRegionName = (regionId) => { + const region = getRegion(regionId); + return (region && region.name) ? region.name : null; +}; + const getMunicipalitiesForRegion = (regionId) => { - for (geo of regions) { - if(geo.id === regionId) { - return geo.municipalities; - } - } - return null; + const region = getRegion(regionId); + return (region && region.municipalities) ? region.municipalities : null; +}; + +const getMunicipalityName = (regionId, municipalityId) => { + const region = getRegion(regionId); + if (!region){ + return null; + } + + const municipality = region.municipalities.find(municipality => municipality.id === municipalityId); + if (!municipality) { + return null; + } + + return municipality.name; }; module.exports = { getRegions, - getMunicipalitiesForRegion + getRegionName, + getMunicipalitiesForRegion, + getMunicipalityName, }; diff --git a/app/helpers/enums.js b/app/helpers/enums.js new file mode 100644 index 0000000..738e222 --- /dev/null +++ b/app/helpers/enums.js @@ -0,0 +1,48 @@ +const realEstateTypes = [ + { title: "Kuća", id: "kuca" }, + { title: "Stan", id: "stan" }, + { title: "Vikendica", id: "vikendica" } +]; + +const sizes = [ + { title: "do 50 m2", id: "50m2" }, + { title: "do 75 m2", id: "75m2" }, + { title: "do 100 m2", id: "100m2" }, + { title: "do 150 m2", id: "150m2" }, + { title: "do 200 m2", id: "200m2" }, + { title: "preko 200 m2", id: "moreThan200m2" } +]; + +const gardenSizes = [ + { title: "do 100 m2", id: "100m2" }, + { title: "do 500 m2", id: "500m2" }, + { title: "do 1 dunum", id: "1000m2" }, + { title: "do 2 dunuma", id: "2000m2" }, + { title: "do 3 dunuma", id: "3000m2" }, + { title: "preko 3 dunuma", id: "moreThan3000m2" } +]; + +const prices = [ + { title: "do 50 000 KM", id: "50kKM" }, + { title: "do 100 000 KM", id: "100kKM" }, + { title: "do 150 000 KM", id: "150kKM" }, + { title: "do 200 000 KM", id: "200kKM" }, + { title: "do 250 000 KM", id: "250kKM" }, + { title: "preko 250 000 KM", id: "moreThan250kKM" } +]; + +const getEnumTypeTitle = (enumType, enumId) => { + const enumObject = enumType.find(enumValue => enumValue.id === enumId); + if (!enumObject){ + return null; + } + return enumObject.title; +}; + +module.exports = { + realEstateTypes, + sizes, + gardenSizes, + prices, + getEnumTypeTitle, +}; diff --git a/app/migrations/20190517072957-add-size-to-real-estate-request.js b/app/migrations/20190517072957-add-size-to-real-estate-request.js new file mode 100644 index 0000000..a41c12f --- /dev/null +++ b/app/migrations/20190517072957-add-size-to-real-estate-request.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn( + 'RealEstateRequests', + 'size', + { + type: Sequelize.ENUM, + values: ['50m2', '75m2', '100m2', '150m2', '200m2', 'moreThan200m2'] + } + ); + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeColumn( + 'RealEstateRequests', + 'size' + ); + } +}; diff --git a/app/migrations/20190517090015-add-gardenSize-to-real-estate-request.js b/app/migrations/20190517090015-add-gardenSize-to-real-estate-request.js new file mode 100644 index 0000000..e65f9d5 --- /dev/null +++ b/app/migrations/20190517090015-add-gardenSize-to-real-estate-request.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn( + 'RealEstateRequests', + 'gardenSize', + { + type: Sequelize.ENUM, + values: ['100m2', '500m2', '1000m2', '2000m2', '3000m2', 'moreThan3000m2'] + } + ); + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeColumn( + 'RealEstateRequests', + 'gardenSize' + ); + } +}; diff --git a/app/migrations/20190517092716-add-price-to-real-estate-request.js b/app/migrations/20190517092716-add-price-to-real-estate-request.js new file mode 100644 index 0000000..87b2d18 --- /dev/null +++ b/app/migrations/20190517092716-add-price-to-real-estate-request.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn( + 'RealEstateRequests', + 'price', + { + type: Sequelize.ENUM, + values: ['50kKM', '100kKM', '150kKM', '200kKM', '250kKM', 'moreThan250kKM'] + } + ); + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeColumn( + 'RealEstateRequests', + 'price' + ); + } +}; diff --git a/app/models/realestaterequest.js b/app/models/realestaterequest.js index 7162aee..08ed040 100644 --- a/app/models/realestaterequest.js +++ b/app/models/realestaterequest.js @@ -1,5 +1,13 @@ 'use strict'; +const {realEstateTypes, sizes, gardenSizes, prices } = require('../helpers/enums'); + module.exports = (sequelize, DataTypes) => { + + const realEstateTypeValues = realEstateTypes.map(realEstateType => realEstateType.id); + const sizeValues = sizes.map(size => size.id); + const gardenSizeValues = gardenSizes.map(gardenSize => gardenSize.id); + const priceValues = prices.map(price => price.id); + const RealEstateRequest = sequelize.define('RealEstateRequest', { uniqueId: { type: DataTypes.UUID, @@ -8,11 +16,23 @@ module.exports = (sequelize, DataTypes) => { }, realEstateType: { type: DataTypes.ENUM, - values: ['kuca','stan','vikendica','plac','poslovni_prostor','apartman','garaza'] + values: realEstateTypeValues, }, email: DataTypes.STRING, region: DataTypes.STRING, municipality: DataTypes.STRING, + size: { + type: DataTypes.ENUM, + values: sizeValues, + }, + gardenSize: { + type: DataTypes.ENUM, + values: gardenSizeValues, + }, + price: { + type: DataTypes.ENUM, + values: priceValues, + } }, {}); RealEstateRequest.associate = function(models) { // associations can be defined here diff --git a/app/views/gardenSize.ejs b/app/views/gardenSize.ejs new file mode 100644 index 0000000..1c541cc --- /dev/null +++ b/app/views/gardenSize.ejs @@ -0,0 +1,32 @@ + +