From d45441f4be2f34c84dc9e5c611e9b9e8bcfb666b Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Mon, 3 Feb 2020 13:11:40 +0100 Subject: [PATCH 01/43] WiP Changed welcome and input form for ad type --- app/common/enums.js | 3 +- app/controllers/publishRealEstateTypes.js | 95 +++++++++++++++++++ app/controllers/realEstateTypes.js | 2 + app/controllers/welcome.js | 67 +++++++++---- app/helpers/db/kiviOriginal.js | 11 +++ app/helpers/db/realEstate.js | 12 ++- app/helpers/url.js | 13 ++- .../20200203114630-add-kiviOriginal-table.js | 27 ++++++ app/models/kiviOriginal.js | 20 ++++ app/routes/index.js | 9 ++ app/views/realEstateType.ejs | 4 +- app/views/welcome.ejs | 24 ++++- 12 files changed, 264 insertions(+), 23 deletions(-) create mode 100644 app/controllers/publishRealEstateTypes.js create mode 100644 app/helpers/db/kiviOriginal.js create mode 100644 app/migrations/20200203114630-add-kiviOriginal-table.js create mode 100644 app/models/kiviOriginal.js diff --git a/app/common/enums.js b/app/common/enums.js index 20aa4dd..c89b21e 100644 --- a/app/common/enums.js +++ b/app/common/enums.js @@ -303,7 +303,8 @@ const AD_AGENCY = { OLX: "OLX", RENTAL: "RENTAL", PROSTOR: "PROSTOR", - AKTIDO: "AKTIDO" + AKTIDO: "AKTIDO", + KIVI: "KIVI" }; const CRAWLER_AD_TYPE = { diff --git a/app/controllers/publishRealEstateTypes.js b/app/controllers/publishRealEstateTypes.js new file mode 100644 index 0000000..7965add --- /dev/null +++ b/app/controllers/publishRealEstateTypes.js @@ -0,0 +1,95 @@ +const { currentRealEstate } = require("../helpers/url"); +const { createRealEstate } = require("../helpers/db/realEstate"); +const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); + +const { AD_CATEGORY, AD_TYPE, AD_AGENCY } = require("../common/enums"); + +const getPublishTypes = async (req, res) => { + const realEstate = await currentRealEstate(req); + + const title = "Koju nekretninu nudite?"; + let selectedAdType = AD_TYPE.AD_TYPE_SALE.id; + const labelAdType = ["Prodaj", "Iznajmi"]; + + if ( + realEstate && + realEstate.adType && + realEstate.adType === AD_TYPE.AD_TYPE_RENT.stringId + ) { + selectedAdType = AD_TYPE.AD_TYPE_RENT.id; + } + const realEstateTypes = Object.keys(AD_CATEGORY) + .map(category => AD_CATEGORY[category]) + .filter(category => category.title); + + res.render("realEstateType", { + selectedAdType, + labelAdType, + realEstateTypes, + title, + AD_TYPE + }); +}; + +const postPublishTypes = async (req, res) => { + const realEstate = await currentRealEstate(req); + + const adType = parseInt(req.body.adType); + + const adTypeStringIds = { + [AD_TYPE.AD_TYPE_SALE.id]: AD_TYPE.AD_TYPE_SALE.stringId, + [AD_TYPE.AD_TYPE_RENT.id]: AD_TYPE.AD_TYPE_RENT.stringId + }; + + const adTypeStringId = + adTypeStringIds[adType] || AD_TYPE.AD_TYPE_SALE.stringId; + + const validRealEstateTypes = Object.keys(AD_CATEGORY).filter( + category => !!AD_CATEGORY[category].title + ); + + const selectedRealEstateType = req.body.realEstateType || null; + if (validRealEstateTypes.indexOf(selectedRealEstateType) === -1) { + res.render("notFound", { title: " " }); + return; + } + // Sta je nextStepPage - treba napraviti !!!! + ///// + ///// + const nextStepPage = req.query.nextStep || "/lokacija"; + + let nextStepUrl = ""; + if (realEstate && realEstate.id) { + nextStepUrl = `/${nextStepPage}/${realEstate.id}`; + realEstate.adType = adTypeStringId; + realEstate.realEstateType = selectedRealEstateType; + + await realEstate.save(); + } else { + try { + const newKiviOriginal = await createKiviOriginal({ + email: "" + }); + + const newRealEstate = await createRealEstate({ + adType: adTypeStringId, + realEstateType: selectedRealEstateType, + url: "http://localhost:5000/", + originAgencyName: AD_AGENCY.KIVI, + agencyObjectId: newKiviOriginal.kiviAdId + }); + + //Da li ovaj id ili kivioriginal id + nextStepUrl = `/${nextStepPage}/${newRealEstate.id}`; + } catch (error) { + console.log(error); + nextStepUrl = `/`; + } + } + res.redirect(nextStepUrl); +}; + +module.exports = { + getPublishTypes, + postPublishTypes +}; diff --git a/app/controllers/realEstateTypes.js b/app/controllers/realEstateTypes.js index 8cc1638..bfc8a7f 100644 --- a/app/controllers/realEstateTypes.js +++ b/app/controllers/realEstateTypes.js @@ -8,6 +8,7 @@ const getRealEstateTypes = async (req, res) => { const title = "Koju nekretninu tražite?"; let selectedAdType = AD_TYPE.AD_TYPE_SALE.id; + const labelAdType = [AD_TYPE.AD_TYPE_SALE.title, AD_TYPE.AD_TYPE_RENT.title]; if ( searchRequest && searchRequest.adType && @@ -21,6 +22,7 @@ const getRealEstateTypes = async (req, res) => { res.render("realEstateType", { selectedAdType, + labelAdType, realEstateTypes, title, AD_TYPE diff --git a/app/controllers/welcome.js b/app/controllers/welcome.js index 3104d4e..bbb1057 100644 --- a/app/controllers/welcome.js +++ b/app/controllers/welcome.js @@ -1,6 +1,7 @@ const { createSearchRequest } = require("../helpers/db/searchRequest"); - -const { AD_TYPE, AD_CATEGORY } = require("../common/enums"); +const { createRealEstate } = require("../helpers/db/realEstate"); +const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); +const { AD_TYPE, AD_CATEGORY, AD_AGENCY } = require("../common/enums"); const getWelcome = (req, res) => { res.render("welcome", { @@ -11,7 +12,54 @@ const getWelcome = (req, res) => { const postWelcome = async (req, res) => { const adType = parseInt(req.body.adType); + const publishAdType = parseInt(req.body.publishAdType); + let nextStepUrl = ""; + + if (adType) { + const adTypeStringId = getAdTypeString(adType); + try { + const newSearchRequest = await createSearchRequest({ + adType: adTypeStringId, + realEstateType: AD_CATEGORY.FLAT.id + }); + + nextStepUrl = `/vrstanekretnine/${newSearchRequest.id}`; + } catch (error) { + console.log(error); + nextStepUrl = `/`; + } + } else if (publishAdType) { + const adTypeStringId = getAdTypeString(publishAdType); + + try { + //Firt we create new Kivi Ad Original object in db then new Real Estate + //Problem with id-s + const newKiviOriginal = await createKiviOriginal({ + email: "" + }); + + const newRealEstate = await createRealEstate({ + adType: adTypeStringId, + realEstateType: AD_CATEGORY.FLAT.id, + //Temp variables because of the not null constraints + url: "http://localhost:5000/", + originAgencyName: AD_AGENCY.KIVI, + agencyObjectId: newKiviOriginal.kiviAdId + }); + + nextStepUrl = `/objavinekretninu/${newRealEstate.id}`; + } catch (error) { + console.log(error); + nextStepUrl = `/`; + } + } + + res.redirect(nextStepUrl); +}; + +//--- Helper function +const getAdTypeString = adType => { const adTypeStringIds = { [AD_TYPE.AD_TYPE_SALE.id]: AD_TYPE.AD_TYPE_SALE.stringId, [AD_TYPE.AD_TYPE_RENT.id]: AD_TYPE.AD_TYPE_RENT.stringId @@ -20,20 +68,7 @@ const postWelcome = async (req, res) => { const adTypeStringId = adTypeStringIds[adType] || AD_TYPE.AD_TYPE_SALE.stringId; - let nextStepUrl = ""; - try { - const newSearchRequest = await createSearchRequest({ - adType: adTypeStringId, - realEstateType: AD_CATEGORY.FLAT.id - }); - - nextStepUrl = `/vrstanekretnine/${newSearchRequest.id}`; - } catch (error) { - console.log(error); - nextStepUrl = `/`; - } - - res.redirect(nextStepUrl); + return adTypeStringId; }; module.exports = { diff --git a/app/helpers/db/kiviOriginal.js b/app/helpers/db/kiviOriginal.js new file mode 100644 index 0000000..c1e7296 --- /dev/null +++ b/app/helpers/db/kiviOriginal.js @@ -0,0 +1,11 @@ +"use strict"; +const db = require("../../models/index"); +const sequelize = require("sequelize"); + +const createKiviOriginal = async (kiviAdFields = {}) => { + return await db.KiviOriginal.create(kiviAdFields); +}; + +module.exports = { + createKiviOriginal +}; diff --git a/app/helpers/db/realEstate.js b/app/helpers/db/realEstate.js index 0f77260..afd9bb9 100644 --- a/app/helpers/db/realEstate.js +++ b/app/helpers/db/realEstate.js @@ -77,7 +77,16 @@ const bulkUpsertRealEstates = async realEstateData => { }; const getRealEstateById = async id => { - return db.RealEstate.findByPk(id); + try { + return db.RealEstate.findByPk(id); + } catch (error) { + console.log("realEstate.js", error); + return null; + } +}; + +const createRealEstate = async (realEstateFields = {}) => { + return await db.RealEstate.create(realEstateFields); }; const findRealEstatesForSearchRequest = async (searchRequest, maxResults) => { @@ -344,5 +353,6 @@ const findRealEstatesForSearchRequest = async (searchRequest, maxResults) => { module.exports = { bulkUpsertRealEstates, getRealEstateById, + createRealEstate, findRealEstatesForSearchRequest }; diff --git a/app/helpers/url.js b/app/helpers/url.js index 9ed771f..7dc0108 100644 --- a/app/helpers/url.js +++ b/app/helpers/url.js @@ -1,4 +1,5 @@ const { getSearchRequest } = require("./db/searchRequest"); +const { getRealEstateById } = require("./db/realEstate"); const currentSearchRequest = async req => { const searchRequestId = @@ -7,6 +8,14 @@ const currentSearchRequest = async req => { return await getSearchRequest(searchRequestId); }; -module.exports = { - currentSearchRequest + +const currentRealEstate = async req => { + const realEstateId = req && req.params ? req.params["realEstateId"] : null; + if (!realEstateId) return null; + + return await getRealEstateById(realEstateId); +}; +module.exports = { + currentSearchRequest, + currentRealEstate }; diff --git a/app/migrations/20200203114630-add-kiviOriginal-table.js b/app/migrations/20200203114630-add-kiviOriginal-table.js new file mode 100644 index 0000000..dddd6e6 --- /dev/null +++ b/app/migrations/20200203114630-add-kiviOriginal-table.js @@ -0,0 +1,27 @@ +"use strict"; + +module.exports = { + up: (queryInterface, Sequelize) => { + const tableFields = { + kiviAdId: { + type: Sequelize.BIGINT, + autoIncrement: true, + primaryKey: true + }, + email: Sequelize.TEXT, + createdAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.literal("NOW()") + }, + updatedAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.literal("NOW()") + } + }; + return queryInterface.createTable("KiviOriginal", tableFields); + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable("KiviOriginal", {}); + } +}; diff --git a/app/models/kiviOriginal.js b/app/models/kiviOriginal.js new file mode 100644 index 0000000..54026e0 --- /dev/null +++ b/app/models/kiviOriginal.js @@ -0,0 +1,20 @@ +"use strict"; + +module.exports = (sequalize, DataTypes) => { + const KiviOriginal = sequalize.define( + "KiviOriginal", + { + kiviAdId: { + type: DataTypes.BIGINT, + autoIncrement: true, + primaryKey: true + }, + email: DataTypes.TEXT + }, + { + freezeTableName: true + } + ); + + return KiviOriginal; +}; diff --git a/app/routes/index.js b/app/routes/index.js index 9043bbf..65b67a2 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -7,6 +7,10 @@ const { getRealEstateTypes, postRealEstateTypes } = require("../controllers/realEstateTypes"); +const { + getPublishTypes, + postPublishTypes +} = require("../controllers/publishRealEstateTypes"); const { getQueryReview, postQueryReview @@ -28,6 +32,11 @@ router.get("/vrstanekretnine", getRealEstateTypes); router.post("/vrstanekretnine/:searchRequestId", postRealEstateTypes); router.post("/vrstanekretnine", postRealEstateTypes); +router.get("/objavinekretninu/:realEstateId", getPublishTypes); +router.get("/objavinekretninu", getPublishTypes); +router.post("/objavinekretninu/:realEstateId", postPublishTypes); +router.post("/objavinekretninu", postPublishTypes); + router.get("/lokacija/:searchRequestId", getLocation); router.post("/lokacija/:searchRequestId", postLocation); diff --git a/app/views/realEstateType.ejs b/app/views/realEstateType.ejs index 480478f..0610d27 100644 --- a/app/views/realEstateType.ejs +++ b/app/views/realEstateType.ejs @@ -9,7 +9,7 @@ <% if (selectedAdType === AD_TYPE.AD_TYPE_SALE.id) { %> checked <% } %>> - <%= AD_TYPE.AD_TYPE_SALE.title %> + <%= labelAdType[0] %> diff --git a/app/views/welcome.ejs b/app/views/welcome.ejs index 9ec6a94..845ec43 100644 --- a/app/views/welcome.ejs +++ b/app/views/welcome.ejs @@ -18,7 +18,20 @@ - +
+
Objavite svoj oglas.
+
+
+
+
+ Prodaj +
+
+ Iznajmi +
+
+ +
-- 2.47.3 From 7b97835e8b1d4435c9db8f4ce9c030ba83001ef5 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Mon, 3 Feb 2020 14:57:36 +0100 Subject: [PATCH 02/43] WiP Started input form. --- app/controllers/publishRealEstate.js | 34 +++++++++++++++++++++++ app/controllers/publishRealEstateTypes.js | 8 ++---- app/routes/index.js | 7 +++++ app/views/publishRealEstate.ejs | 4 +++ 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 app/controllers/publishRealEstate.js create mode 100644 app/views/publishRealEstate.ejs diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js new file mode 100644 index 0000000..90cf359 --- /dev/null +++ b/app/controllers/publishRealEstate.js @@ -0,0 +1,34 @@ +const { currentRealEstate } = require("../helpers/url"); +const { createRealEstate } = require("../helpers/db/realEstate"); +const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); + +const { AD_CATEGORY, AD_TYPE, AD_AGENCY } = require("../common/enums"); + +const getPublishInputs = async (req, res) => { + const realEstate = await currentRealEstate(req); + + if (!realEstate || !realEstate.dataValues) { + res.render("notFound", { title: " " }); + return; + } + + const title = "Podaci o nekretnini"; + + res.render("publishRealEstate", { + title + }); +}; + +const postPublishInputs = async (req, res) => { + const realEstate = await currentRealEstate(req); + + if (!realEstate || !realEstate.dataValues) { + res.render("notFound", { title: " " }); + return; + } +}; + +module.exports = { + getPublishInputs, + postPublishInputs +}; diff --git a/app/controllers/publishRealEstateTypes.js b/app/controllers/publishRealEstateTypes.js index 7965add..d38c3a3 100644 --- a/app/controllers/publishRealEstateTypes.js +++ b/app/controllers/publishRealEstateTypes.js @@ -53,10 +53,8 @@ const postPublishTypes = async (req, res) => { res.render("notFound", { title: " " }); return; } - // Sta je nextStepPage - treba napraviti !!!! - ///// - ///// - const nextStepPage = req.query.nextStep || "/lokacija"; + + const nextStepPage = req.query.nextStep || "podacionekretnini"; let nextStepUrl = ""; if (realEstate && realEstate.id) { @@ -79,7 +77,7 @@ const postPublishTypes = async (req, res) => { agencyObjectId: newKiviOriginal.kiviAdId }); - //Da li ovaj id ili kivioriginal id + //Da li ovaj id ili kivioriginal id ??? nextStepUrl = `/${nextStepPage}/${newRealEstate.id}`; } catch (error) { console.log(error); diff --git a/app/routes/index.js b/app/routes/index.js index 65b67a2..b068e32 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -11,6 +11,10 @@ const { getPublishTypes, postPublishTypes } = require("../controllers/publishRealEstateTypes"); +const { + getPublishInputs, + postPublishInputs +} = require("../controllers/publishRealEstate"); const { getQueryReview, postQueryReview @@ -37,6 +41,9 @@ router.get("/objavinekretninu", getPublishTypes); router.post("/objavinekretninu/:realEstateId", postPublishTypes); router.post("/objavinekretninu", postPublishTypes); +router.get("/podacionekretnini/:realEstateId", getPublishInputs); +router.post("/podacionekretnini/:realEstateId", postPublishInputs); + router.get("/lokacija/:searchRequestId", getLocation); router.post("/lokacija/:searchRequestId", postLocation); diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs new file mode 100644 index 0000000..c47862c --- /dev/null +++ b/app/views/publishRealEstate.ejs @@ -0,0 +1,4 @@ +
+
+ Work in progres... +
\ No newline at end of file -- 2.47.3 From 6429bb30c23e7ba0c33f7911139a3b78a866fe22 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Tue, 4 Feb 2020 01:02:32 +0100 Subject: [PATCH 03/43] WiP Added publish enums. --- app/common/publishEnums.js | 486 ++++++++++++++++++++++++++++ app/views/publishAdditionalData.ejs | 1 + app/views/publishBasicData.ejs | 2 + app/views/publishEnd.ejs | 5 + app/views/publishPrice.ejs | 1 + app/views/publishRealEstate.ejs | 41 ++- 6 files changed, 533 insertions(+), 3 deletions(-) create mode 100644 app/common/publishEnums.js create mode 100644 app/views/publishAdditionalData.ejs create mode 100644 app/views/publishBasicData.ejs create mode 100644 app/views/publishEnd.ejs create mode 100644 app/views/publishPrice.ejs diff --git a/app/common/publishEnums.js b/app/common/publishEnums.js new file mode 100644 index 0000000..85988d5 --- /dev/null +++ b/app/common/publishEnums.js @@ -0,0 +1,486 @@ +const { + AD_CATEGORY, + ACCESS_ROAD_TYPE, + HEATING_TYPE, + FURNISHING_TYPE +} = require("./enums"); + +const BASIC_BOOLEAN_PUBLISH = [ + { + dbField: "balcony", + title: "Balkon", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { + dbField: "newBuilding", + title: "Novogradnja", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "elevator", + title: "Lift", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "recentlyAdapted", + title: "Nedavno adaptirano", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + } +]; + +const BASIC_INPUT_PUBLISH_NO = [ + { + dbField: "price", + title: "Cijena (KM)", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "area", + title: "Površina (m\xB2)", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "gardenSize", + title: "Površina okućnice (m\xB2)", + categoriesToShow: [AD_CATEGORY.HOUSE, AD_CATEGORY.COTTAGE] + }, + { + dbField: "numberOfRooms", + title: "Broj soba", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "numberOfFloors", + title: "Broj spratova", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { + dbField: "floor", + title: "Sprat", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.OFFICE + ] + } +]; + +const BASIC_INPUT_PUBLISH = [ + { + dbField: "title", + title: "Naslov", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "shortDescription", + title: "Opis", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "streetName", + title: "Adresa", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + } +]; + +const BASIC_SEGMENT_PUBLISH = [ + { + dbField: "furnishingType", + title: "Namješten?", + values: Object.keys(FURNISHING_TYPE).map(key => FURNISHING_TYPE[key]), + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + } +]; + +const ADDITIONAL_BOOLEAN_PUBLISH = [ + { + dbField: "water", + title: "Voda", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "electricity", + title: "Struja", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "drainageSystem", + title: "Kanalizacija", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "registeredInZkBooks", + title: "Uknjiženo", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + + { + dbField: "parking", + title: "Parking", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "garage", + title: "Garaža", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "gas", + title: "Plin", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "antiTheftDoor", + title: "Blindirana vrata", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "airCondition", + title: "Klimatizirano", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "phoneConnection", + title: "Telefon", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "cableTV", + title: "Kablovska", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "internet", + title: "Internet", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + }, + { + dbField: "basementAttic", + title: "Podrum-Tavan", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { + dbField: "storeRoom", + title: "Ostava", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { + dbField: "videoSurveillance", + title: "Video nadzor", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "alarm", + title: "Alarm", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "suitableForStudents", + title: "Za studente", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { + dbField: "includingBills", + title: "Uključen trošak režija", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "animalsAllowed", + title: "Kućni ljubimci dozvoljeni", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { + dbField: "pool", + title: "Bazen", + categoriesToShow: [AD_CATEGORY.HOUSE, AD_CATEGORY.COTTAGE] + }, + { + dbField: "exchange", + title: "Zamjena", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "urbanPlanPermit", + title: "Urbanistička dozvola", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "buildingPermit", + title: "Građevinska dozvola", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + } +]; + +const ADDITIONAL_INPUT_PUBLISH = [ + { + dbField: "longDescription", + title: "Detaljan opis", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + } +]; + +const ADDITIONAL_SEGMENT_PUBLISH = [ + { + dbField: "accessRoadType", + title: "Pristupni put", + values: Object.keys(ACCESS_ROAD_TYPE).map(key => ACCESS_ROAD_TYPE[key]), + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ] + }, + { + dbField: "heatingType", + title: "Grijanje", + values: Object.keys(HEATING_TYPE).map(key => HEATING_TYPE[key]), + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE + ] + } +]; + +module.exports = { + BASIC_INPUT_PUBLISH, + BASIC_INPUT_PUBLISH_NO, + BASIC_SEGMENT_PUBLISH, + BASIC_BOOLEAN_PUBLISH, + ADDITIONAL_BOOLEAN_PUBLISH, + ADDITIONAL_INPUT_PUBLISH, + ADDITIONAL_SEGMENT_PUBLISH +}; diff --git a/app/views/publishAdditionalData.ejs b/app/views/publishAdditionalData.ejs new file mode 100644 index 0000000..b7b7b73 --- /dev/null +++ b/app/views/publishAdditionalData.ejs @@ -0,0 +1 @@ +Publish Additional Data \ No newline at end of file diff --git a/app/views/publishBasicData.ejs b/app/views/publishBasicData.ejs new file mode 100644 index 0000000..44618ee --- /dev/null +++ b/app/views/publishBasicData.ejs @@ -0,0 +1,2 @@ +
+Publish Basic Data \ No newline at end of file diff --git a/app/views/publishEnd.ejs b/app/views/publishEnd.ejs new file mode 100644 index 0000000..d751b37 --- /dev/null +++ b/app/views/publishEnd.ejs @@ -0,0 +1,5 @@ +
+
+ Vaš oglas je spreman za objavu. +
+
\ No newline at end of file diff --git a/app/views/publishPrice.ejs b/app/views/publishPrice.ejs new file mode 100644 index 0000000..34d2e61 --- /dev/null +++ b/app/views/publishPrice.ejs @@ -0,0 +1 @@ +Publish Price \ No newline at end of file diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index c47862c..587e88d 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -1,4 +1,39 @@
-
- Work in progres... -
\ No newline at end of file +
+
+ +
+ <%- include("./publishBasicData.ejs") %> +
+
+ <%- include("./publishAdditionalData.ejs") %> +
+
+ <%- include("./publishPrice.ejs") %> +
+
+ <%- include("./publishEnd.ejs") %> +
+ +
+
+
+ + +
+ + \ No newline at end of file -- 2.47.3 From 05062201bff45f48293dbd29ee22d389ef4e8a00 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Thu, 6 Feb 2020 01:57:29 +0100 Subject: [PATCH 04/43] WiP Added field to input form. --- app/common/publishEnums.js | 8 +- app/controllers/publishRealEstate.js | 213 ++++++++++++++++++++++++++- app/views/publishAdditionalData.ejs | 32 +++- app/views/publishBasicData.ejs | 49 +++++- 4 files changed, 293 insertions(+), 9 deletions(-) diff --git a/app/common/publishEnums.js b/app/common/publishEnums.js index 85988d5..fd481fb 100644 --- a/app/common/publishEnums.js +++ b/app/common/publishEnums.js @@ -50,7 +50,7 @@ const BASIC_BOOLEAN_PUBLISH = [ } ]; -const BASIC_INPUT_PUBLISH_NO = [ +const BASIC_INPUT_PUBLISH = [ { dbField: "price", title: "Cijena (KM)", @@ -111,10 +111,7 @@ const BASIC_INPUT_PUBLISH_NO = [ AD_CATEGORY.APARTMENT, AD_CATEGORY.OFFICE ] - } -]; - -const BASIC_INPUT_PUBLISH = [ + }, { dbField: "title", title: "Naslov", @@ -477,7 +474,6 @@ const ADDITIONAL_SEGMENT_PUBLISH = [ module.exports = { BASIC_INPUT_PUBLISH, - BASIC_INPUT_PUBLISH_NO, BASIC_SEGMENT_PUBLISH, BASIC_BOOLEAN_PUBLISH, ADDITIONAL_BOOLEAN_PUBLISH, diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 90cf359..baaf755 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -3,6 +3,13 @@ const { createRealEstate } = require("../helpers/db/realEstate"); const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); const { AD_CATEGORY, AD_TYPE, AD_AGENCY } = require("../common/enums"); +const { + BASIC_BOOLEAN_PUBLISH, + BASIC_SEGMENT_PUBLISH, + ADDITIONAL_BOOLEAN_PUBLISH, + ADDITIONAL_SEGMENT_PUBLISH, + BASIC_INPUT_PUBLISH +} = require("../common/publishEnums"); const getPublishInputs = async (req, res) => { const realEstate = await currentRealEstate(req); @@ -14,8 +21,133 @@ const getPublishInputs = async (req, res) => { const title = "Podaci o nekretnini"; + const { + price, + area, + adType, + realEstateType, + locationLat, + locationLong, + accessRoadType, + heatingType, + balcony, + newBuilding, + elevator, + recentlyAdapted, + gardenSize, + numberOfRooms, + numberOfFloors, + floor, + water, + electricity, + drainageSystem, + registeredInZkBooks, + parking, + garage, + gas, + antiTheftDoor, + airCondition, + phoneConnection, + cableTV, + internet, + basementAttic, + storeRoom, + videoSurveillance, + alarm, + suitableForStudents, + includingBills, + animalsAllowed, + pool, + exchange, + urbanPlanPermit, + buildingPermit, + furnishingType, + shortDescription, + streetName + } = realEstate; + const category = AD_CATEGORY[realEstateType] || AD_CATEGORY.FLAT; + + // TODO: Maybe this is slow, pay attention to this + const filterInputs = filterObject => { + const filterCategories = filterObject.categoriesToShow; + return filterCategories.indexOf(category) !== -1; + }; + //Boolean inputs to be shown on Basic Data tab + const basicBooleanPublishInputs = BASIC_BOOLEAN_PUBLISH.filter(filterInputs); + const basicBooleanPublishValues = { + balcony, + elevator, + newBuilding, + recentlyAdapted + }; + //Boolean inputs to be shown on Additional Data tab + const additionalBooleanPublishInputs = ADDITIONAL_BOOLEAN_PUBLISH.filter( + filterInputs + ); + const additionalBooleanPublishValues = { + water, + electricity, + drainageSystem, + registeredInZkBooks, + parking, + garage, + gas, + antiTheftDoor, + airCondition, + phoneConnection, + cableTV, + internet, + basementAttic, + storeRoom, + videoSurveillance, + alarm, + suitableForStudents, + includingBills, + animalsAllowed, + pool, + exchange, + urbanPlanPermit, + buildingPermit + }; + //Segment select inputs to be shown on Basic Data tab + const basicSegmentSelectInputs = BASIC_SEGMENT_PUBLISH.filter(filterInputs); + const basicSegmentSelectValues = { + furnishingType + }; + //Segment select inputs to be shown on Additional Data tab + const additionalSegmentSelectInputs = ADDITIONAL_SEGMENT_PUBLISH.filter( + filterInputs + ); + const additionalSegmentSelectValues = { + accessRoadType, + heatingType + }; + //Input text type inputs to be shown on Basic Data tab + const basicInputInputs = BASIC_INPUT_PUBLISH.filter(filterInputs); + const basicInputValues = { + price, + area, + gardenSize, + numberOfRooms, + numberOfFloors, + floor, + title, + shortDescription, + streetName + }; + res.render("publishRealEstate", { - title + title, + basicBooleanPublishInputs, + basicBooleanPublishValues, + additionalBooleanPublishInputs, + additionalBooleanPublishValues, + basicSegmentSelectInputs, + basicSegmentSelectValues, + additionalSegmentSelectInputs, + additionalSegmentSelectValues, + basicInputInputs, + basicInputValues }); }; @@ -26,6 +158,85 @@ const postPublishInputs = async (req, res) => { res.render("notFound", { title: " " }); return; } + + const balcony = req.body.balcony === "on"; + const elevator = req.body.elevator === "on"; + const newBuilding = req.body.newBuilding === "on"; + const recentlyAdapted = req.body.recentlyAdapted === "on"; + const water = req.body.water === "on"; + const electricity = req.body.electricity === "on"; + const drainageSystem = req.body.drainageSystem === "on"; + const registeredInZkBooks = req.body.registeredInZkBooks === "on"; + const parking = req.body.parking === "on"; + const garage = req.body.garage === "on"; + const gas = req.body.gas === "on"; + const antiTheftDoor = req.body.antiTheftDoor === "on"; + const airCondition = req.body.airCondition === "on"; + const phoneConnection = req.body.phoneConnection === "on"; + const cableTV = req.body.cableTV === "on"; + const internet = req.body.internet === "on"; + const basementAttic = req.body.basementAttic === "on"; + const storeRoom = req.body.storeRoom === "on"; + const videoSurveillance = req.body.videoSurveillance === "on"; + const alarm = req.body.alarm === "on"; + const suitableForStudents = req.body.suitableForStudents === "on"; + const includingBills = req.body.includingBills === "on"; + const animalsAllowed = req.body.animalsAllowed === "on"; + const pool = req.body.pool === "on"; + const exchange = req.body.exchange === "on"; + const urbanPlanPermit = req.body.urbanPlanPermit === "on"; + const buildingPermit = req.body.buildingPermit === "on"; + + const furnishingType = req.body.furnishingType; + if (!FURNISHING_TYPE[furnishingType]) { + res.render("notFound", { title: " Greška !" }); + return; + } + const accessRoadType = req.body.accessRoadType; + if (!ACCESS_ROAD_TYPE[accessRoadType]) { + res.render("notFound", { title: " Greška !" }); + return; + } + const heatingType = req.body.heatingType; + if (!HEATING_TYPE[heatingType]) { + res.render("notFound", { title: " Greška !" }); + return; + } + + realEstate.balcony = balcony; + realEstate.elevator = elevator; + realEstate.newBuilding = newBuilding; + realEstate.recentlyAdapted = recentlyAdapted; + realEstate.water = water; + realEstate.electricity = electricity; + realEstate.drainageSystem = drainageSystem; + realEstate.registeredInZkBooks = registeredInZkBooks; + realEstate.parking = parking; + realEstate.garage = garage; + realEstate.gas = gas; + realEstate.antiTheftDoor = antiTheftDoor; + realEstate.airCondition = airCondition; + realEstate.phoneConnection = phoneConnection; + realEstate.cableTV = cableTV; + realEstate.internet = internet; + realEstate.basementAttic = basementAttic; + realEstate.storeRoom = storeRoom; + realEstate.videoSurveillance = videoSurveillance; + realEstate.alarm = alarm; + realEstate.suitableForStudents = suitableForStudents; + realEstate.includingBills = includingBills; + realEstate.animalsAllowed = animalsAllowed; + realEstate.pool = pool; + realEstate.exchange = exchange; + realEstate.urbanPlanPermit = urbanPlanPermit; + realEstate.buildingPermit = buildingPermit; + + realEstate.furnishingType = furnishingType; + realEstate.accessRoadType = accessRoadType; + realEstate.heatingType = heatingType; + // + console.log("postPublishInputs"); + await realEstate.save(); }; module.exports = { diff --git a/app/views/publishAdditionalData.ejs b/app/views/publishAdditionalData.ejs index b7b7b73..39c7084 100644 --- a/app/views/publishAdditionalData.ejs +++ b/app/views/publishAdditionalData.ejs @@ -1 +1,31 @@ -Publish Additional Data \ No newline at end of file +
+ +<% for (const input of additionalBooleanPublishInputs){ %> +

+ +

+<% } %> + +
+<% for (const input of additionalSegmentSelectInputs){ %> +
+

+ + <% for (const segmentObject of input.values) { %> + + <% } %> + +
+<% } %> \ No newline at end of file diff --git a/app/views/publishBasicData.ejs b/app/views/publishBasicData.ejs index 44618ee..e1dd8fb 100644 --- a/app/views/publishBasicData.ejs +++ b/app/views/publishBasicData.ejs @@ -1,2 +1,49 @@
-Publish Basic Data \ No newline at end of file +
+<% for (const input of basicInputInputs){ %> +
+ " + > + +
+<% } %> +
+
+
+<% for (const input of basicBooleanPublishInputs){ %> +

+ +

+<% } %> +
+ +
+<% for (const input of basicSegmentSelectInputs){ %> +
+

+ + <% for (const segmentObject of input.values) { %> + + <% } %> + +
+<% } %> + + + \ No newline at end of file -- 2.47.3 From 6a957db1832a10d4f1f57f56f63d853280c39cbc Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 7 Feb 2020 00:27:09 +0100 Subject: [PATCH 05/43] WiP Added input fields. --- app/controllers/publishRealEstate.js | 43 ++++++++++++++++++++++++---- app/views/publishAdditionalData.ejs | 16 +++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index baaf755..9f0742f 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -8,7 +8,8 @@ const { BASIC_SEGMENT_PUBLISH, ADDITIONAL_BOOLEAN_PUBLISH, ADDITIONAL_SEGMENT_PUBLISH, - BASIC_INPUT_PUBLISH + BASIC_INPUT_PUBLISH, + ADDITIONAL_INPUT_PUBLISH } = require("../common/publishEnums"); const getPublishInputs = async (req, res) => { @@ -19,7 +20,7 @@ const getPublishInputs = async (req, res) => { return; } - const title = "Podaci o nekretnini"; + const pageTitle = "Podaci o nekretnini"; const { price, @@ -63,7 +64,9 @@ const getPublishInputs = async (req, res) => { buildingPermit, furnishingType, shortDescription, - streetName + streetName, + title, + longDescription } = realEstate; const category = AD_CATEGORY[realEstateType] || AD_CATEGORY.FLAT; @@ -135,9 +138,14 @@ const getPublishInputs = async (req, res) => { shortDescription, streetName }; + //Input type textare to be shown on Additional Data + const additionalInputInputs = ADDITIONAL_INPUT_PUBLISH.filter(filterInputs); + const additionalInputValues = { + longDescription + }; res.render("publishRealEstate", { - title, + title: pageTitle, basicBooleanPublishInputs, basicBooleanPublishValues, additionalBooleanPublishInputs, @@ -147,7 +155,9 @@ const getPublishInputs = async (req, res) => { additionalSegmentSelectInputs, additionalSegmentSelectValues, basicInputInputs, - basicInputValues + basicInputValues, + additionalInputInputs, + additionalInputValues }); }; @@ -203,6 +213,17 @@ const postPublishInputs = async (req, res) => { return; } + const price = parseFloat(req.body.price); + const area = parseFloat(req.body.area); + const gardenSize = parseFloat(req.body.gardenSize); + const numberOfRooms = parseInt(req.body.numberOfRooms); + const numberOfFloors = parseInt(req.body.numberOfFloors); + const floor = parseInt(req.body.floor); + const title = req.body.title; + const shortDescription = req.body.shortDescription; + const streetName = req.body.streetName; + const longDescription = req.body.longDescription; + realEstate.balcony = balcony; realEstate.elevator = elevator; realEstate.newBuilding = newBuilding; @@ -234,6 +255,18 @@ const postPublishInputs = async (req, res) => { realEstate.furnishingType = furnishingType; realEstate.accessRoadType = accessRoadType; realEstate.heatingType = heatingType; + + realEstate.price = price; + realEstate.area = area; + realEstate.gardenSize = gardenSize; + realEstate.numberOfRooms = numberOfRooms; + realEstate.numberOfFloors = numberOfFloors; + realEstate.floor = floor; + realEstate.title = title; + realEstate.shortDescription = shortDescription; + realEstate.streetName = streetName; + + realEstate.longDescription = longDescription; // console.log("postPublishInputs"); await realEstate.save(); diff --git a/app/views/publishAdditionalData.ejs b/app/views/publishAdditionalData.ejs index 39c7084..466980d 100644 --- a/app/views/publishAdditionalData.ejs +++ b/app/views/publishAdditionalData.ejs @@ -1,3 +1,19 @@ +
+
+<% for (const input of additionalInputInputs){ %> +
+ + +
+<% } %> +
+
<% for (const input of additionalBooleanPublishInputs){ %> -- 2.47.3 From 7777081c999c853f03c6d7d5726e3d6f23d3cd92 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 7 Feb 2020 12:26:29 +0100 Subject: [PATCH 06/43] WIP Form submit added. --- app/controllers/publishRealEstate.js | 49 +++++++++++++++++----------- app/controllers/realEstateFilters.js | 2 ++ app/helpers/url.js | 2 +- app/views/publishEnd.ejs | 8 +++++ app/views/publishRealEstate.ejs | 10 +++--- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 9f0742f..308d819 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -2,7 +2,12 @@ const { currentRealEstate } = require("../helpers/url"); const { createRealEstate } = require("../helpers/db/realEstate"); const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); -const { AD_CATEGORY, AD_TYPE, AD_AGENCY } = require("../common/enums"); +const { + AD_CATEGORY, + FURNISHING_TYPE, + ACCESS_ROAD_TYPE, + HEATING_TYPE +} = require("../common/enums"); const { BASIC_BOOLEAN_PUBLISH, BASIC_SEGMENT_PUBLISH, @@ -169,6 +174,10 @@ const postPublishInputs = async (req, res) => { return; } + //const nextStepPage = req.query.nextStep || "pregled"; + // const nextStepUrl = `/${nextStepPage}/${searchRequest.id}`; + const nextStepUrl = "/unsubscribe/"; + const balcony = req.body.balcony === "on"; const elevator = req.body.elevator === "on"; const newBuilding = req.body.newBuilding === "on"; @@ -198,31 +207,32 @@ const postPublishInputs = async (req, res) => { const buildingPermit = req.body.buildingPermit === "on"; const furnishingType = req.body.furnishingType; - if (!FURNISHING_TYPE[furnishingType]) { + //VALIDACIJA TAKO POTVRDITI DA JE ISPRAVNA VRIJEDNOST + /* if (!FURNISHING_TYPE[furnishingType]) { res.render("notFound", { title: " Greška !" }); return; - } + } */ const accessRoadType = req.body.accessRoadType; - if (!ACCESS_ROAD_TYPE[accessRoadType]) { + /*if (!ACCESS_ROAD_TYPE[accessRoadType]) { res.render("notFound", { title: " Greška !" }); return; - } + } */ const heatingType = req.body.heatingType; - if (!HEATING_TYPE[heatingType]) { + /*if (!HEATING_TYPE[heatingType]) { res.render("notFound", { title: " Greška !" }); return; - } + }*/ - const price = parseFloat(req.body.price); - const area = parseFloat(req.body.area); - const gardenSize = parseFloat(req.body.gardenSize); - const numberOfRooms = parseInt(req.body.numberOfRooms); - const numberOfFloors = parseInt(req.body.numberOfFloors); - const floor = parseInt(req.body.floor); - const title = req.body.title; - const shortDescription = req.body.shortDescription; - const streetName = req.body.streetName; - const longDescription = req.body.longDescription; + const price = parseFloat(req.body.price) || null; + const area = parseFloat(req.body.area) || null; + const gardenSize = parseFloat(req.body.gardenSize) || null; + const numberOfRooms = parseInt(req.body.numberOfRooms) || null; + const numberOfFloors = parseInt(req.body.numberOfFloors) || null; + const floor = parseInt(req.body.floor) || null; + const title = req.body.title || ""; + const shortDescription = req.body.shortDescription || ""; + const streetName = req.body.streetName || ""; + const longDescription = req.body.longDescription || ""; realEstate.balcony = balcony; realEstate.elevator = elevator; @@ -267,9 +277,10 @@ const postPublishInputs = async (req, res) => { realEstate.streetName = streetName; realEstate.longDescription = longDescription; - // - console.log("postPublishInputs"); + await realEstate.save(); + + res.redirect(nextStepUrl); }; module.exports = { diff --git a/app/controllers/realEstateFilters.js b/app/controllers/realEstateFilters.js index 252ac46..cff099f 100644 --- a/app/controllers/realEstateFilters.js +++ b/app/controllers/realEstateFilters.js @@ -122,6 +122,8 @@ const getFilters = async (req, res) => { }; const postFilters = async (req, res) => { + // + console.log("postFilters"); const searchRequest = await currentSearchRequest(req); if (!searchRequest || !searchRequest.dataValues) { diff --git a/app/helpers/url.js b/app/helpers/url.js index 7dc0108..b0669ca 100644 --- a/app/helpers/url.js +++ b/app/helpers/url.js @@ -13,7 +13,7 @@ const currentRealEstate = async req => { const realEstateId = req && req.params ? req.params["realEstateId"] : null; if (!realEstateId) return null; - return await getRealEstateById(realEstateId); + return await getRealEstateById(parseInt(realEstateId)); }; module.exports = { currentSearchRequest, diff --git a/app/views/publishEnd.ejs b/app/views/publishEnd.ejs index d751b37..1378dc8 100644 --- a/app/views/publishEnd.ejs +++ b/app/views/publishEnd.ejs @@ -1,5 +1,13 @@
Vaš oglas je spreman za objavu. +
+ +
+ +
+
\ No newline at end of file diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 587e88d..7b5093c 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -21,11 +21,6 @@
<%- include("./publishEnd.ejs") %> -
- -
@@ -35,5 +30,10 @@ \ No newline at end of file -- 2.47.3 From 9e06731c84c77d047b5693831401c0afa44eb517 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 7 Feb 2020 14:05:00 +0100 Subject: [PATCH 07/43] WiP Added location input. --- app/controllers/publishRealEstate.js | 6 + app/views/publishLocation.ejs | 192 +++++++++++++++++++++++++++ app/views/publishPrice.ejs | 1 - app/views/publishRealEstate.ejs | 26 +++- 4 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 app/views/publishLocation.ejs delete mode 100644 app/views/publishPrice.ejs diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 308d819..0dde499 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -234,6 +234,9 @@ const postPublishInputs = async (req, res) => { const streetName = req.body.streetName || ""; const longDescription = req.body.longDescription || ""; + const locationLat = req.body.lat || null; + const locationLong = req.body.lng || null; + realEstate.balcony = balcony; realEstate.elevator = elevator; realEstate.newBuilding = newBuilding; @@ -278,6 +281,9 @@ const postPublishInputs = async (req, res) => { realEstate.longDescription = longDescription; + realEstate.locationLat = locationLat; + realEstate.locationLong = locationLong; + await realEstate.save(); res.redirect(nextStepUrl); diff --git a/app/views/publishLocation.ejs b/app/views/publishLocation.ejs new file mode 100644 index 0000000..d2dfd01 --- /dev/null +++ b/app/views/publishLocation.ejs @@ -0,0 +1,192 @@ +
+

+ Izaberite lokaciju nekretnine na mapi. +

+
+ +
+
+ +
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + diff --git a/app/views/publishPrice.ejs b/app/views/publishPrice.ejs deleted file mode 100644 index 34d2e61..0000000 --- a/app/views/publishPrice.ejs +++ /dev/null @@ -1 +0,0 @@ -Publish Price \ No newline at end of file diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 7b5093c..b621e82 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -5,7 +5,7 @@ @@ -16,8 +16,8 @@
<%- include("./publishAdditionalData.ejs") %>
-
- <%- include("./publishPrice.ejs") %> +
+ <%- include("./publishLocation.ejs") %>
<%- include("./publishEnd.ejs") %> @@ -30,10 +30,26 @@ \ No newline at end of file -- 2.47.3 From 22c1982ef6da204d86d8993f4c3e3a31f2124738 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Sun, 9 Feb 2020 22:25:05 +0100 Subject: [PATCH 08/43] Added email input for KiviOriginals table. --- app/controllers/publishRealEstate.js | 18 +++++++++++++----- app/controllers/publishSuccess.js | 8 ++++++++ app/helpers/db/kiviOriginal.js | 13 +++++++++++-- app/routes/index.js | 3 +++ app/views/publishEnd.ejs | 16 +++++++++++++--- app/views/publishSuccess.ejs | 11 +++++++++++ 6 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 app/controllers/publishSuccess.js create mode 100644 app/views/publishSuccess.ejs diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 0dde499..ef822c7 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -1,6 +1,6 @@ const { currentRealEstate } = require("../helpers/url"); const { createRealEstate } = require("../helpers/db/realEstate"); -const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); +const { getKiviOriginalById } = require("../helpers/db/kiviOriginal"); const { AD_CATEGORY, @@ -174,9 +174,11 @@ const postPublishInputs = async (req, res) => { return; } - //const nextStepPage = req.query.nextStep || "pregled"; - // const nextStepUrl = `/${nextStepPage}/${searchRequest.id}`; - const nextStepUrl = "/unsubscribe/"; + const kiviOriginal = await getKiviOriginalById( + parseInt(realEstate.dataValues.agencyObjectId) + ); + + const nextStepPage = req.query.nextStep || "/uspjesnaobjava"; const balcony = req.body.balcony === "on"; const elevator = req.body.elevator === "on"; @@ -236,6 +238,8 @@ const postPublishInputs = async (req, res) => { const locationLat = req.body.lat || null; const locationLong = req.body.lng || null; + //Contact email saved in other table + const contactEmail = req.body.email || ""; realEstate.balcony = balcony; realEstate.elevator = elevator; @@ -284,9 +288,13 @@ const postPublishInputs = async (req, res) => { realEstate.locationLat = locationLat; realEstate.locationLong = locationLong; + kiviOriginal.email = contactEmail; + await realEstate.save(); - res.redirect(nextStepUrl); + await kiviOriginal.save(); + + res.redirect(nextStepPage); }; module.exports = { diff --git a/app/controllers/publishSuccess.js b/app/controllers/publishSuccess.js new file mode 100644 index 0000000..f444b9f --- /dev/null +++ b/app/controllers/publishSuccess.js @@ -0,0 +1,8 @@ +const publishSuccess = async (req, res) => { + const title = "Uspjeh!"; + res.render("publishSuccess", { title }); +}; + +module.exports = { + publishSuccess +}; diff --git a/app/helpers/db/kiviOriginal.js b/app/helpers/db/kiviOriginal.js index c1e7296..7e4d0f1 100644 --- a/app/helpers/db/kiviOriginal.js +++ b/app/helpers/db/kiviOriginal.js @@ -6,6 +6,15 @@ const createKiviOriginal = async (kiviAdFields = {}) => { return await db.KiviOriginal.create(kiviAdFields); }; -module.exports = { - createKiviOriginal +const getKiviOriginalById = async id => { + try { + return db.KiviOriginal.findByPk(id); + } catch (error) { + console.log("kiviOriginal.js", error); + return null; + } +}; +module.exports = { + createKiviOriginal, + getKiviOriginalById }; diff --git a/app/routes/index.js b/app/routes/index.js index b068e32..1be2cfc 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -20,6 +20,7 @@ const { postQueryReview } = require("../controllers/queryReview"); const { getGoAgain } = require("../controllers/goAgain"); +const { publishSuccess } = require("../controllers/publishSuccess"); const { getLocation, postLocation } = require("../controllers/location"); const { getUnsubscribe } = require("../controllers/unsubscribe"); const { getRealEstates } = require("../controllers/realEstates"); @@ -57,6 +58,8 @@ router.get("/odjava/:searchRequestId", getUnsubscribe); router.get("/ponovo", getGoAgain); +router.get("/uspjesnaobjava", publishSuccess); + router.get("/nekretnine/:searchRequestId", getRealEstates); router.get("/redirect/:id", getRedirect); diff --git a/app/views/publishEnd.ejs b/app/views/publishEnd.ejs index 1378dc8..654b32c 100644 --- a/app/views/publishEnd.ejs +++ b/app/views/publishEnd.ejs @@ -1,10 +1,20 @@
- Vaš oglas je spreman za objavu. +

Vaš oglas je spreman!

+ Unesite kontakt email i objavite oglas. +
+
+ +
- -
+
+
+
diff --git a/app/views/publishSuccess.ejs b/app/views/publishSuccess.ejs new file mode 100644 index 0000000..1696a01 --- /dev/null +++ b/app/views/publishSuccess.ejs @@ -0,0 +1,11 @@ +
+
+

Vaš oglas je spašen u Kivi bazu.

+
+
+ kivi logo +
+
+

Poslali smo potvrdni email sa detaljima oglasa na Vašu email adresu.

+ Nova pretraga +
\ No newline at end of file -- 2.47.3 From edb22266bdbe0e01c81c52106f3e5cc4b25157f4 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Wed, 12 Feb 2020 11:44:56 +0100 Subject: [PATCH 09/43] WiP Form validation --- app/common/publishEnums.js | 49 +- app/controllers/publishRealEstate.js | 5 +- app/public/main.css | 4 + app/views/layout.ejs | 1 + app/views/publishEnd.ejs | 3 +- app/views/publishRealEstate.ejs | 86 ++- help.js | 187 +++++++ help2.js | 112 ++++ index.js | 3 + package-lock.json | 5 + package.json | 3 +- sourcecode.txt | 804 +++++++++++++++++++++++++++ 12 files changed, 1248 insertions(+), 14 deletions(-) create mode 100644 help.js create mode 100644 help2.js create mode 100644 sourcecode.txt diff --git a/app/common/publishEnums.js b/app/common/publishEnums.js index fd481fb..d034faf 100644 --- a/app/common/publishEnums.js +++ b/app/common/publishEnums.js @@ -62,7 +62,10 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.OFFICE, AD_CATEGORY.LAND, AD_CATEGORY.GARAGE - ] + ], + constraint: { + numericality: true + } }, { dbField: "area", @@ -75,12 +78,19 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.OFFICE, AD_CATEGORY.LAND, AD_CATEGORY.GARAGE - ] + ], + constraint: { + numericality: true, + presence: true + } }, { dbField: "gardenSize", title: "Površina okućnice (m\xB2)", - categoriesToShow: [AD_CATEGORY.HOUSE, AD_CATEGORY.COTTAGE] + categoriesToShow: [AD_CATEGORY.HOUSE, AD_CATEGORY.COTTAGE], + constraint: { + numericality: true + } }, { dbField: "numberOfRooms", @@ -91,7 +101,13 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.APARTMENT, AD_CATEGORY.COTTAGE, AD_CATEGORY.OFFICE - ] + ], + constraint: { + numericality: { + onlyInteger: true, + greaterThanOrEqualTo: 0 + } + } }, { dbField: "numberOfFloors", @@ -101,7 +117,12 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.HOUSE, AD_CATEGORY.APARTMENT, AD_CATEGORY.COTTAGE - ] + ], + constraint: { + numericality: { + onlyInteger: true + } + } }, { dbField: "floor", @@ -110,7 +131,12 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.FLAT, AD_CATEGORY.APARTMENT, AD_CATEGORY.OFFICE - ] + ], + constraint: { + numericality: { + onlyInteger: true + } + } }, { dbField: "title", @@ -123,7 +149,10 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.OFFICE, AD_CATEGORY.LAND, AD_CATEGORY.GARAGE - ] + ], + constraint: { + presence: true + } }, { dbField: "shortDescription", @@ -136,7 +165,8 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.OFFICE, AD_CATEGORY.LAND, AD_CATEGORY.GARAGE - ] + ], + constraint: {} }, { dbField: "streetName", @@ -149,7 +179,8 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.OFFICE, AD_CATEGORY.LAND, AD_CATEGORY.GARAGE - ] + ], + constraint: {} } ]; diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index ef822c7..8db1537 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -2,6 +2,8 @@ const { currentRealEstate } = require("../helpers/url"); const { createRealEstate } = require("../helpers/db/realEstate"); const { getKiviOriginalById } = require("../helpers/db/kiviOriginal"); +const validate = require("validate.js"); + const { AD_CATEGORY, FURNISHING_TYPE, @@ -162,7 +164,8 @@ const getPublishInputs = async (req, res) => { basicInputInputs, basicInputValues, additionalInputInputs, - additionalInputValues + additionalInputValues, + validate: validate }); }; diff --git a/app/public/main.css b/app/public/main.css index 2258be6..39f0c07 100644 --- a/app/public/main.css +++ b/app/public/main.css @@ -158,3 +158,7 @@ h3 { .estates-link { color: rgba(0, 0, 0, 0.87); } + +.error { + color: #cc0033; +} diff --git a/app/views/layout.ejs b/app/views/layout.ejs index 7856ad6..2b89910 100644 --- a/app/views/layout.ejs +++ b/app/views/layout.ejs @@ -16,6 +16,7 @@ + diff --git a/app/views/publishEnd.ejs b/app/views/publishEnd.ejs index 654b32c..452d005 100644 --- a/app/views/publishEnd.ejs +++ b/app/views/publishEnd.ejs @@ -4,12 +4,13 @@ Unesite kontakt email i objavite oglas.
-
+
+
diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index b621e82..4f6c265 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -1,5 +1,5 @@
-
+
    @@ -28,13 +28,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Podaci o nekretnini - Kivi.ba + + + + + + + + +
    +
    +
    +
    + +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +
    +
    + +

    + +

    + +

    + +

    + +

    + +

    + +
    + +
    + +
    +

    + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    + + +
    + +
    + +
    + + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + + +
    + +
    +

    + + + + + + + + + + + + + +
    + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Izaberite lokaciju nekretnine na mapi. +

    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Vaš oglas je spreman!

    + Unesite kontakt email i objavite oglas. + +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + + +
    + + +
    + + + + + -- 2.47.3 From 9c234a85fd04daba73cbca843f993f320a33f8cf Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Wed, 12 Feb 2020 23:43:59 +0100 Subject: [PATCH 10/43] WiP Validation stil. --- app/common/publishEnums.js | 40 +++---------- app/views/publishBasicData.ejs | 2 +- app/views/publishRealEstate.ejs | 99 +++++++++++++++++++++++++++------ help.js | 50 +++++++++++++++++ 4 files changed, 142 insertions(+), 49 deletions(-) diff --git a/app/common/publishEnums.js b/app/common/publishEnums.js index d034faf..c78ebce 100644 --- a/app/common/publishEnums.js +++ b/app/common/publishEnums.js @@ -63,9 +63,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.LAND, AD_CATEGORY.GARAGE ], - constraint: { - numericality: true - } + constraint: ["numerical"] }, { dbField: "area", @@ -79,18 +77,13 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.LAND, AD_CATEGORY.GARAGE ], - constraint: { - numericality: true, - presence: true - } + constraint: ["numerical"] }, { dbField: "gardenSize", title: "Površina okućnice (m\xB2)", categoriesToShow: [AD_CATEGORY.HOUSE, AD_CATEGORY.COTTAGE], - constraint: { - numericality: true - } + constraint: ["numerical"] }, { dbField: "numberOfRooms", @@ -102,12 +95,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.COTTAGE, AD_CATEGORY.OFFICE ], - constraint: { - numericality: { - onlyInteger: true, - greaterThanOrEqualTo: 0 - } - } + constraint: ["integer"] }, { dbField: "numberOfFloors", @@ -118,11 +106,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.APARTMENT, AD_CATEGORY.COTTAGE ], - constraint: { - numericality: { - onlyInteger: true - } - } + constraint: ["integer"] }, { dbField: "floor", @@ -132,11 +116,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.APARTMENT, AD_CATEGORY.OFFICE ], - constraint: { - numericality: { - onlyInteger: true - } - } + constraint: ["integer"] }, { dbField: "title", @@ -150,9 +130,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.LAND, AD_CATEGORY.GARAGE ], - constraint: { - presence: true - } + constraint: ["required"] }, { dbField: "shortDescription", @@ -166,7 +144,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.LAND, AD_CATEGORY.GARAGE ], - constraint: {} + constraint: [] }, { dbField: "streetName", @@ -180,7 +158,7 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.LAND, AD_CATEGORY.GARAGE ], - constraint: {} + constraint: [] } ]; diff --git a/app/views/publishBasicData.ejs b/app/views/publishBasicData.ejs index e1dd8fb..322eeec 100644 --- a/app/views/publishBasicData.ejs +++ b/app/views/publishBasicData.ejs @@ -1,5 +1,5 @@
    -
    +
    <% for (const input of basicInputInputs){ %>
    { - const regexEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ - return regexEmail.test($email); - } + //Helper validation functions + const isValidEmail = $email => { + const simpleEmailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return $email && $email.length < 250 && simpleEmailRegex.test($email); + }; + + const isPresent = $input => { + return $input && $input!=="" && $input != null; + }; + + const isNumber = $input => { + const simpleNumberRegex = /([0-9]+[.|,][0-9])|([0-9][.|,][0-9]+)|([0-9]+)/; + return $input && $input.length <250 && simpleNumberRegex.test($input) && !isNaN($input); + }; + + const isInteger = $input => { + const simpleIntegerRegex = /^([+-]?[1-9]\d*|0)$/; + return $input && $input.length <250 && simpleIntegerRegex.test($input); + }; const form = document.querySelector("#publishForm"); @@ -64,6 +79,7 @@ $.each(errors, function(error) { addError(messages, errors[error]); }); + } else { // otherwise we simply mark it as success formGroup.classList.add("has-success"); @@ -100,6 +116,38 @@ messages.appendChild(block); } + const validate = (input) => { + + let valid=true; + let errorMsg =[]; + let constraint = input.constraint[0]; + + switch (constraint) { + case "required": + valid = isPresent ($(`#${input.dbField}`).val()); + errorMsg = ["Ovo je obavezno polje."]; + break; + case "numerical": + valid = isNumber ($(`#${input.dbField}`).val()); + errorMsg = ["Unesite brojcanu vrijednost."]; + break; + case "integer": + valid = isInteger ($(`#${input.dbField}`).val()); + errorMsg = ["Unesite cijeli broj."]; + break; + default : + valid = true; + } + if (!valid) { + const inputField = document.querySelector(`#${input.dbField}`); + showErrorsForInput( inputField, errorMsg); + return false; + } else { + return true; + } + +} + $("#submit").click( function () { const mapBounds = map.getBounds(); const currentLocation = marker.getPosition(); @@ -111,26 +159,43 @@ $("#west").val(mapBounds.getSouthWest().lng()); $("#lat").val(currentLocation.lat()); + $("#lng").val(currentLocation.lng()); $("#locationInput").val( document.getElementById("autocompleteInput").value ); + //Tag for checking of error presence + let hasErrors = false; + //Check if email is valid + const validEmail = isValidEmail($("#email").val()); + //Show messeges for invalid email is present + if (!validEmail) { + const errorMsgs = ["Unesite validan email."]; + const email = document.querySelector("#email"); + showErrorsForInput( email, errorMsgs) + hasErrors = true; + }; + //Check if other input fields are valid - vratiti se na ovo!! + //const basicInputInputs= document.getElementById("basic-inputs").getElementsByTagName("input"); + + //alert(JSON.stringify("")); + /* + $.each(basicInputInputs, function (input) { + alert(input); + validate (input); + }) + for (const input of basicInputInputs ) { + alert(input.getAttribute(name)); + + validate (input); + } */ + + if (!hasErrors) { + $("#publishForm").submit(); + }; - const errors = validateEmail($("#email").val()); - - if (errors) { - $("#publishForm").submit(); - } - else { - const errorMsgs = ["Unesite validan email."]; - const email = document.querySelector("#email"); - - showErrorsForInput( email, errorMsgs) - - - } }); }); diff --git a/help.js b/help.js index 58df1bf..cc0b55c 100644 --- a/help.js +++ b/help.js @@ -185,3 +185,53 @@ alert("Success!"); } })(); +///////////////////////////////////////////////// +const isPresent = $input => { + return $input && $input!=="" && $input != null; +} + +const isNumber = $input => { + const simpleNumberRegex = /[+-]?(?:\d*[.,])?\d+/; + return $input && $input.length <250 && simpleNumberRegex.test($input); + +} + +const isInteger = $input => { + const simpleIntegerRegex = /^([+-]?[1-9]\d*|0)$/; + return $input && $input.length <250 && simpleIntegerRegex.test($input); + +} + +const validate = (input) => { + + const valid; + const errorMsg; + const constraint = input.constraint[0]; + + switch (constraint) { + case "required": + valid = isPresent ($(`#${input.dbField}`).val()); + errorMsg = ["Ovo je obavezno polje."]; + break; + case "numerical": + valid = isNumber ($(`#${input.dbField}`).val()); + errorMsg = ["Unesite brojcanu vrijednost."]; + break; + case "integer": + valid = isInteger ($(`#${input.dbField}`).val()); + errorMsg = ["Unesite cijeli broj."]; + + break; + default : + valid = true; + } + if (!valid) { + const inputField = document.querySelector(`#${input.dbField}`); + showErrorsForInput( inputField, errorMsg); + return false; + } else { + return true; + } + + } + -- 2.47.3 From 9bcadffe9c63e695f722bd8790791ada9d44878f Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Thu, 13 Feb 2020 10:43:30 +0100 Subject: [PATCH 11/43] Changed id type to uuid. --- app/common/publishEnums.js | 2 +- app/controllers/publishRealEstate.js | 17 +++++++------ app/controllers/publishRealEstateTypes.js | 24 ++++++++++++------- app/controllers/welcome.js | 6 ++--- app/helpers/db/realEstate.js | 13 +++++++++- app/helpers/url.js | 12 +++++++++- .../20200203114630-add-kiviOriginal-table.js | 5 ++-- app/models/kiviOriginal.js | 5 ++-- app/routes/index.js | 8 +++---- app/views/publishAdditionalData.ejs | 2 ++ app/views/publishRealEstate.ejs | 17 ++++++------- 11 files changed, 72 insertions(+), 39 deletions(-) diff --git a/app/common/publishEnums.js b/app/common/publishEnums.js index c78ebce..93f6073 100644 --- a/app/common/publishEnums.js +++ b/app/common/publishEnums.js @@ -165,7 +165,7 @@ const BASIC_INPUT_PUBLISH = [ const BASIC_SEGMENT_PUBLISH = [ { dbField: "furnishingType", - title: "Namješten?", + title: "Namještaj", values: Object.keys(FURNISHING_TYPE).map(key => FURNISHING_TYPE[key]), categoriesToShow: [ AD_CATEGORY.FLAT, diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 8db1537..8bb66a5 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -1,6 +1,5 @@ -const { currentRealEstate } = require("../helpers/url"); -const { createRealEstate } = require("../helpers/db/realEstate"); -const { getKiviOriginalById } = require("../helpers/db/kiviOriginal"); +const { findRealEstateByAgencyId } = require("../helpers/db/realEstate"); +const { currentKiviRealEstate } = require("../helpers/url"); const validate = require("validate.js"); @@ -20,7 +19,9 @@ const { } = require("../common/publishEnums"); const getPublishInputs = async (req, res) => { - const realEstate = await currentRealEstate(req); + const kiviOriginal = await currentKiviRealEstate(req); + + const realEstate = await findRealEstateByAgencyId(kiviOriginal.kiviAdId); if (!realEstate || !realEstate.dataValues) { res.render("notFound", { title: " " }); @@ -170,17 +171,15 @@ const getPublishInputs = async (req, res) => { }; const postPublishInputs = async (req, res) => { - const realEstate = await currentRealEstate(req); + const kiviOriginal = await currentKiviRealEstate(req); + + const realEstate = await findRealEstateByAgencyId(kiviOriginal.kiviAdId); if (!realEstate || !realEstate.dataValues) { res.render("notFound", { title: " " }); return; } - const kiviOriginal = await getKiviOriginalById( - parseInt(realEstate.dataValues.agencyObjectId) - ); - const nextStepPage = req.query.nextStep || "/uspjesnaobjava"; const balcony = req.body.balcony === "on"; diff --git a/app/controllers/publishRealEstateTypes.js b/app/controllers/publishRealEstateTypes.js index d38c3a3..c053f1e 100644 --- a/app/controllers/publishRealEstateTypes.js +++ b/app/controllers/publishRealEstateTypes.js @@ -1,11 +1,16 @@ -const { currentRealEstate } = require("../helpers/url"); -const { createRealEstate } = require("../helpers/db/realEstate"); +const { currentKiviRealEstate } = require("../helpers/url"); +const { + createRealEstate, + findRealEstateByAgencyId +} = require("../helpers/db/realEstate"); const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); const { AD_CATEGORY, AD_TYPE, AD_AGENCY } = require("../common/enums"); const getPublishTypes = async (req, res) => { - const realEstate = await currentRealEstate(req); + const kiviOriginal = await currentKiviRealEstate(req); + + const realEstate = await findRealEstateByAgencyId(kiviOriginal.kiviAdId); const title = "Koju nekretninu nudite?"; let selectedAdType = AD_TYPE.AD_TYPE_SALE.id; @@ -32,7 +37,9 @@ const getPublishTypes = async (req, res) => { }; const postPublishTypes = async (req, res) => { - const realEstate = await currentRealEstate(req); + const kiviOriginal = await currentKiviRealEstate(req); + + const realEstate = await findRealEstateByAgencyId(kiviOriginal.kiviAdId); const adType = parseInt(req.body.adType); @@ -57,8 +64,10 @@ const postPublishTypes = async (req, res) => { const nextStepPage = req.query.nextStep || "podacionekretnini"; let nextStepUrl = ""; - if (realEstate && realEstate.id) { - nextStepUrl = `/${nextStepPage}/${realEstate.id}`; + if (kiviOriginal && kiviOriginal.kiviAdId && realEstate && realEstate.id) { + // + nextStepUrl = `/${nextStepPage}/${kiviOriginal.kiviAdId}`; + realEstate.adType = adTypeStringId; realEstate.realEstateType = selectedRealEstateType; @@ -77,8 +86,7 @@ const postPublishTypes = async (req, res) => { agencyObjectId: newKiviOriginal.kiviAdId }); - //Da li ovaj id ili kivioriginal id ??? - nextStepUrl = `/${nextStepPage}/${newRealEstate.id}`; + nextStepUrl = `/${nextStepPage}/${newKiviOriginal.kiviAdId}`; } catch (error) { console.log(error); nextStepUrl = `/`; diff --git a/app/controllers/welcome.js b/app/controllers/welcome.js index bbb1057..11b42b5 100644 --- a/app/controllers/welcome.js +++ b/app/controllers/welcome.js @@ -33,7 +33,7 @@ const postWelcome = async (req, res) => { const adTypeStringId = getAdTypeString(publishAdType); try { - //Firt we create new Kivi Ad Original object in db then new Real Estate + //First we create new Kivi Ad Original object in db then new Real Estate //Problem with id-s const newKiviOriginal = await createKiviOriginal({ email: "" @@ -42,13 +42,13 @@ const postWelcome = async (req, res) => { const newRealEstate = await createRealEstate({ adType: adTypeStringId, realEstateType: AD_CATEGORY.FLAT.id, - //Temp variables because of the not null constraints + //Temp variable because of the not null constraints url: "http://localhost:5000/", originAgencyName: AD_AGENCY.KIVI, agencyObjectId: newKiviOriginal.kiviAdId }); - nextStepUrl = `/objavinekretninu/${newRealEstate.id}`; + nextStepUrl = `/objavinekretninu/${newKiviOriginal.kiviAdId}`; } catch (error) { console.log(error); nextStepUrl = `/`; diff --git a/app/helpers/db/realEstate.js b/app/helpers/db/realEstate.js index afd9bb9..17392ef 100644 --- a/app/helpers/db/realEstate.js +++ b/app/helpers/db/realEstate.js @@ -89,6 +89,16 @@ const createRealEstate = async (realEstateFields = {}) => { return await db.RealEstate.create(realEstateFields); }; +const findRealEstateByAgencyId = async kiviId => { + try { + return db.RealEstate.findOne({ + where: { agencyObjectId: kiviId } + }); + } catch (error) { + console.log("realEstate.js", error); + return null; + } +}; const findRealEstatesForSearchRequest = async (searchRequest, maxResults) => { const { priceMin, @@ -354,5 +364,6 @@ module.exports = { bulkUpsertRealEstates, getRealEstateById, createRealEstate, - findRealEstatesForSearchRequest + findRealEstatesForSearchRequest, + findRealEstateByAgencyId }; diff --git a/app/helpers/url.js b/app/helpers/url.js index b0669ca..fcc1825 100644 --- a/app/helpers/url.js +++ b/app/helpers/url.js @@ -1,5 +1,6 @@ const { getSearchRequest } = require("./db/searchRequest"); const { getRealEstateById } = require("./db/realEstate"); +const { getKiviOriginalById } = require("./db/kiviOriginal"); const currentSearchRequest = async req => { const searchRequestId = @@ -15,7 +16,16 @@ const currentRealEstate = async req => { return await getRealEstateById(parseInt(realEstateId)); }; +const currentKiviRealEstate = async req => { + const kiviRealEstateId = + req && req.params ? req.params["kiviRealEstateId"] : null; + if (!kiviRealEstateId) return null; + + return await getKiviOriginalById(kiviRealEstateId); +}; + module.exports = { currentSearchRequest, - currentRealEstate + currentRealEstate, + currentKiviRealEstate }; diff --git a/app/migrations/20200203114630-add-kiviOriginal-table.js b/app/migrations/20200203114630-add-kiviOriginal-table.js index dddd6e6..1fc294b 100644 --- a/app/migrations/20200203114630-add-kiviOriginal-table.js +++ b/app/migrations/20200203114630-add-kiviOriginal-table.js @@ -4,8 +4,9 @@ module.exports = { up: (queryInterface, Sequelize) => { const tableFields = { kiviAdId: { - type: Sequelize.BIGINT, - autoIncrement: true, + type: Sequelize.UUID, + defaultValue: Sequelize.UUIDV4, + allowNull: false, primaryKey: true }, email: Sequelize.TEXT, diff --git a/app/models/kiviOriginal.js b/app/models/kiviOriginal.js index 54026e0..75cd136 100644 --- a/app/models/kiviOriginal.js +++ b/app/models/kiviOriginal.js @@ -5,8 +5,9 @@ module.exports = (sequalize, DataTypes) => { "KiviOriginal", { kiviAdId: { - type: DataTypes.BIGINT, - autoIncrement: true, + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + allowNull: false, primaryKey: true }, email: DataTypes.TEXT diff --git a/app/routes/index.js b/app/routes/index.js index 1be2cfc..68a40a3 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -37,13 +37,13 @@ router.get("/vrstanekretnine", getRealEstateTypes); router.post("/vrstanekretnine/:searchRequestId", postRealEstateTypes); router.post("/vrstanekretnine", postRealEstateTypes); -router.get("/objavinekretninu/:realEstateId", getPublishTypes); +router.get("/objavinekretninu/:kiviRealEstateId", getPublishTypes); router.get("/objavinekretninu", getPublishTypes); -router.post("/objavinekretninu/:realEstateId", postPublishTypes); +router.post("/objavinekretninu/:kiviRealEstateId", postPublishTypes); router.post("/objavinekretninu", postPublishTypes); -router.get("/podacionekretnini/:realEstateId", getPublishInputs); -router.post("/podacionekretnini/:realEstateId", postPublishInputs); +router.get("/podacionekretnini/:kiviRealEstateId", getPublishInputs); +router.post("/podacionekretnini/:kiviRealEstateId", postPublishInputs); router.get("/lokacija/:searchRequestId", getLocation); router.post("/lokacija/:searchRequestId", postLocation); diff --git a/app/views/publishAdditionalData.ejs b/app/views/publishAdditionalData.ejs index 466980d..6e57174 100644 --- a/app/views/publishAdditionalData.ejs +++ b/app/views/publishAdditionalData.ejs @@ -34,6 +34,7 @@

    <% for (const segmentObject of input.values) { %> + <% if (segmentObject.id!=="ANY") { %> + <% } %> <% } %>
    diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 5bd9243..463b4c8 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -149,14 +149,9 @@ } $("#submit").click( function () { - const mapBounds = map.getBounds(); - const currentLocation = marker.getPosition(); - - $("#north").val(mapBounds.getNorthEast().lat()); - $("#south").val(mapBounds.getSouthWest().lat()); - $("#east").val(mapBounds.getNorthEast().lng()); - $("#west").val(mapBounds.getSouthWest().lng()); + if (marker) { + const currentLocation = marker.getPosition(); $("#lat").val(currentLocation.lat()); @@ -164,7 +159,13 @@ $("#locationInput").val( document.getElementById("autocompleteInput").value - ); + ); + } else { + $("#lat").val(0); + + $("#lng").val(0); + } + //Tag for checking of error presence let hasErrors = false; -- 2.47.3 From 230ef6015840de8da4257930e3f505f8cdd4b9c3 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Thu, 13 Feb 2020 17:08:49 +0100 Subject: [PATCH 12/43] Started photo upload. --- app/views/publishPhotos.ejs | 24 + app/views/publishRealEstate.ejs | 6 +- development.env | 3 + index.js | 29 +- marketalarm-dd909e0aeef1.json | 12 + package-lock.json | 644 ++++++++++++++++++++++++- package.json | 1 + sourcecode.txt | 804 -------------------------------- 8 files changed, 713 insertions(+), 810 deletions(-) create mode 100644 app/views/publishPhotos.ejs create mode 100644 marketalarm-dd909e0aeef1.json delete mode 100644 sourcecode.txt diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs new file mode 100644 index 0000000..d8a32fc --- /dev/null +++ b/app/views/publishPhotos.ejs @@ -0,0 +1,24 @@ +
    + + +
    +your image + + \ No newline at end of file diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 463b4c8..658f307 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -1,11 +1,12 @@
    -
    +
    @@ -19,6 +20,9 @@
    <%- include("./publishLocation.ejs") %>
    +
    + <%- include("./publishPhotos.ejs") %> +
    <%- include("./publishEnd.ejs") %>
    diff --git a/development.env b/development.env index bbfda0e..18bf56f 100644 --- a/development.env +++ b/development.env @@ -21,6 +21,9 @@ GA_ID=Google Analytics ID #=============== GOOGLE MAPS =============# API_MAP_KEY=(your-key-here) +#=============== GOOGLE STORAGE =============# +GOOGLE_APPLICATION_CREDENTIALS="Path to json key file" + #=============== AWS SDK EMAIL SETTINGS =======# AWS_KEY_ID=(your-key-here) AWS_SECRET_ACCESS_KEY=(your-key-here) diff --git a/index.js b/index.js index 938ca3c..a5c92e0 100644 --- a/index.js +++ b/index.js @@ -5,9 +5,9 @@ const layout = require("express-layout"); const compression = require("compression"); const forceSSL = require("./app/helpers/forceSSL"); +const { Storage } = require("@google-cloud/storage"); const validate = require("validate.js"); - const { APP_PORT, CRAWLER_INTERVAL, @@ -53,3 +53,30 @@ const crawl = () => { setInterval(crawl, CRAWLER_INTERVAL * 1000); setInterval(checkUpNotify, 1000 * 60 * 60 * 24); + +//Google storage req +const storage = new Storage(); + +storage + .getBuckets() + .then(results => { + const buckets = results[0]; + + console.log("Buckets:"); + buckets.forEach(bucket => { + console.log(bucket.name); + }); + }) + .catch(err => { + console.error("GOOGLE ERROR:", err); + }); +/* + bucket = gcs.bucket('aBucket') + bucket.file('aFile').getSignedUrl({ + action: 'write', + expires: moment.utc().add(1, 'days').format(), +}, (error, signedUrl) => { + if (error == null) { + console.log(`Signed URL is ${signedUrl}`) + } +}) */ diff --git a/marketalarm-dd909e0aeef1.json b/marketalarm-dd909e0aeef1.json new file mode 100644 index 0000000..df7c80e --- /dev/null +++ b/marketalarm-dd909e0aeef1.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "marketalarm", + "private_key_id": "dd909e0aeef15920e7fc18229ce421246c143f90", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLedKH5aM2yOo5\nPh8XRl8HsGZOdq4RveBT8ulJw33KexMckvCkRctSJkRPdbXF3I+N25/WihiUKEXy\nBlVqmDOCEM4qo4/sLllN7hxsoGdIGhnMEAzf8vO1/+NBdErKdu6lRW84GY29gVTH\nQBv54gMcbr2jvBW9qGqmx0Tn0DI0w3BLDd45Sz/yqhE42jmYLDEZ96E1uOR1jlG7\nwdaVlv0r3xdgmV51SjeZevlJxbWFjYCO7UXzhkvldklAjEK2Bgf0hkx9GPUHlo8u\n4TAePLXw35vx7wfrFG8cfDoPPAcB3O5WEzxX9z9/bdG4OZchcTWhguUfEGQ9Oq8Y\n3qnRpg+HAgMBAAECggEAFUWtpGZ2Cz6y+fwMHQ9O1Qt0jqRqq1Ep+CzPhdYpuvbl\n9xlHjiz7xiFZB+Oa9s4Jtf9tdOzoB+kz8ssFuAikbeca3qtN2xe3X2XS0+prEcck\nxkgxSGJqZy8Sz598SDFp3p5lM7y8LEEun0wNALFHuPu82LbLoRHP4JK5mfCSpyBN\nztXE+WFTFsNubgE3kqhZopVXXfQ+Wl43Gfx9jnFkFvxonL23soPP8JLd/Px7rsIZ\nFcaxCGjw3YsuEc3vSO6M7HY2rSx9ho+uSX9XpEb50p6bHXBTAb0ESE4Xf/uslVA5\nCqCxkzf7wB4RzveR6gLrDeTlg4Y5zN+Ioxzq6+8vSQKBgQDlGrAghbfAN6NemR8n\naiYTZ+cvZMigYuy9jSNMnCLmTYDe66r9+PWfT0jQdwaUFmhSbC3939goBAUiZlB9\nAfP4ygFR/TLJXHSXAt6c/9+VpU78lRbGCqs/RGSvH7NyObwSd1wzRXOXtzegXtjf\nz0hSYcOAZljayTEt/RX3fpERzwKBgQDjXOuB6dFRqEmNtetmB4qxBk1stHaFstiG\nG2Rcis09IlCPb0uom7wOxo0CBq8J/3QZWOouwkiXzaMoy8X/UuSJWJ8g0hgGhtNl\n/zlwSnLxaxpWdrP1zQ4vltcdmwc0oDGCjoXbUsJ3L7K/quRfdM1vyEcfNWkdxCus\nY6ugQ7isyQKBgQDN/lcKhvCWxfAAaJEYcVrW6/90H5w8iXXvYO2yPlkq1djfluph\n/O1sVm9T8RFbKWKXaWlY8WF7aVHsgi4wmAbzVT4mqBB3+Mdj2FKsu2wfM0l31d1q\nJ8Gd2zLkOw6vz7WIrQWbnAC5EyXS7jT113xhhkGwO1X9MhUkEoEjzQtHBQKBgGAK\nzGEgiA9aa1e1VS7QWMHWy7XztW1c0yIzR/3flDsS17z/YpJi1tnW/ZGxiRdMFZrv\neF0wLMITV6zQB1+HgIqUKQQQO53mLj6TxYutp0hb2dBUbEiUyj1IFq6m4jBUyxU/\nZ0PyfbsjJvrYEYhRKsbhb0m7oh+00k4L/F/Cu6whAoGAK/lwGbnxx4b+2bHLizol\nC1SCWfehwopZ6+RJDlh+nmdotLHqoJUuywQ4w1+3IfR4gfzsDsOo4hctyNDZXvK/\n5xDR5WpCXNDi1xLDajU5DcHPu+IqltvXe/KUEnEQdogIwsQMigp/MTNDy4tqVbaf\nDDaHojsNuJRgD2iek9vuciw=\n-----END PRIVATE KEY-----\n", + "client_email": "kivi-original-photos-id@marketalarm.iam.gserviceaccount.com", + "client_id": "105188302286128652978", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/kivi-original-photos-id%40marketalarm.iam.gserviceaccount.com" +} diff --git a/package-lock.json b/package-lock.json index 966113e..58ecc85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,92 @@ "request": "2.x.x" } }, + "@google-cloud/common": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.3.0.tgz", + "integrity": "sha512-nmIyi3q/FL2j6ZJ61xK/863DoJEZayI2/W/iCgwrCYUYsem277XO45MBTAimjgiKBCA0c9InmQyfT48h/IK4jg==", + "requires": { + "@google-cloud/projectify": "^1.0.0", + "@google-cloud/promisify": "^1.0.0", + "arrify": "^2.0.0", + "duplexify": "^3.6.0", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^5.5.0", + "retry-request": "^4.0.0", + "teeny-request": "^6.0.0" + } + }, + "@google-cloud/paginator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz", + "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==", + "requires": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + } + }, + "@google-cloud/projectify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz", + "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==" + }, + "@google-cloud/promisify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz", + "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==" + }, + "@google-cloud/storage": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.3.1.tgz", + "integrity": "sha512-/i7tAcUZDQNDs8/+oN+U2mOXdWdP2eld0pFKLkpthmWmaD89JQlrgHAFL7uvlgCSbaD7YxgbSyJebgd6YBgMgQ==", + "requires": { + "@google-cloud/common": "^2.1.1", + "@google-cloud/paginator": "^2.0.0", + "@google-cloud/promisify": "^1.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "concat-stream": "^2.0.0", + "date-and-time": "^0.12.0", + "duplexify": "^3.5.0", + "extend": "^3.0.2", + "gaxios": "^2.0.1", + "gcs-resumable-upload": "^2.2.4", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^2.2.0", + "pumpify": "^2.0.0", + "readable-stream": "^3.4.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "through2": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + } + } + }, "@sendgrid/client": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.3.0.tgz", @@ -40,6 +126,11 @@ "@sendgrid/helpers": "^6.3.0" } }, + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==" + }, "@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", @@ -79,6 +170,14 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -88,6 +187,11 @@ "negotiator": "0.6.1" } }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -176,6 +280,11 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -320,6 +429,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -424,6 +538,16 @@ "isarray": "^1.0.0" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, "buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -671,6 +795,17 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", @@ -799,6 +934,11 @@ "assert-plus": "^1.0.0" } }, + "date-and-time": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.12.0.tgz", + "integrity": "sha512-n2RJIAp93AucgF/U/Rz5WRS2Hjg5Z+QxscaaMCi6pVZT1JpJKRH+C08vyH/lRR1kxNXnPxgo3lWfd+jCb/UcuQ==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -949,6 +1089,41 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -958,6 +1133,14 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", @@ -997,6 +1180,11 @@ "once": "^1.4.0" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", @@ -1074,6 +1262,11 @@ "es5-ext": "~0.10.14" } }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1289,6 +1482,11 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-text-encoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", + "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1947,6 +2145,117 @@ } } }, + "gaxios": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.0.tgz", + "integrity": "sha512-VgC4JKJQAAAGK5rFZbPcS5mXsdIYVMIUJOxMjSOkYdfhB74R0L6y8PFQDdS0r1ObG6hdP11e71EjHh3xbI+6fQ==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^4.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + } + } + }, + "gcp-metadata": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.3.1.tgz", + "integrity": "sha512-RrASg1HaVAxoB9Q/8sYfJ++v9PMiiqIgOrOxZeagMgS4osZtICT1lKBx2uvzYgwetxj8i6K99Z0iuKMg7WraTg==", + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "gcs-resumable-upload": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.2.tgz", + "integrity": "sha512-OPS0iAmPCV+r7PziOIhyxmQOzsazFCy76yYDOS/Z80O/7cuny1KMfqDQa2T0jLaL8EreTU7EMZG5pUuqBKgzHA==", + "requires": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "gaxios": "^2.0.0", + "google-auth-library": "^5.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "dependencies": { + "configstore": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", + "integrity": "sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ==", + "requires": { + "dot-prop": "^5.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2017,6 +2326,44 @@ "ini": "^1.3.4" } }, + "google-auth-library": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.9.2.tgz", + "integrity": "sha512-rBE1YTOZ3/Hu6Mojkr+UUmbdc/F28hyMGYEGxjyfVA9ZFmq12oqS3AeftX4h9XpdVIcxPooSo8hECYGT6B9XqQ==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.1.0", + "gcp-metadata": "^3.3.0", + "gtoken": "^4.1.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "google-p12-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "requires": { + "node-forge": "^0.9.0" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -2049,6 +2396,24 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, + "gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "requires": { + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2100,6 +2465,47 @@ } } }, + "hash-stream-validation": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz", + "integrity": "sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A==", + "requires": { + "through2": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2147,6 +2553,39 @@ "statuses": ">= 1.4.0 < 2" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2157,6 +2596,30 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -2185,8 +2648,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflection": { "version": "1.12.0", @@ -2480,6 +2942,14 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "json-bigint": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", + "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", + "requires": { + "bignumber.js": "^7.0.0" + } + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -2514,6 +2984,25 @@ "verror": "1.10.0" } }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -2801,6 +3290,11 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" }, + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" + }, "node-schedule": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.2.tgz", @@ -2962,6 +3456,14 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -3218,8 +3720,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "proto-list": { "version": "1.2.4", @@ -3260,6 +3761,29 @@ "once": "^1.3.1" } }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + }, + "dependencies": { + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + } + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3492,6 +4016,30 @@ "any-promise": "^1.3.0" } }, + "retry-request": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", + "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", + "requires": { + "debug": "^4.1.1", + "through2": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -3684,6 +4232,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -3880,6 +4433,19 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "requires": { + "stubs": "^3.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3926,6 +4492,11 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3934,6 +4505,50 @@ "has-flag": "^3.0.0" } }, + "teeny-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.2.tgz", + "integrity": "sha512-B6fxA0fSnY/bul06NggdN1nywtr5U5Uvt96pHfTi8pi4MNe6++VUWcAAFBrcMeha94s+gULwA5WvagoSZ+AcYg==", + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^3.3.2" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -3982,6 +4597,14 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -4107,6 +4730,19 @@ "mime-types": "~2.1.18" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "umzug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", diff --git a/package.json b/package.json index 3a63d09..0741340 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "2checkout-node": "0.0.1", + "@google-cloud/storage": "^4.3.1", "@sendgrid/mail": "^6.3.1", "aws-sdk": "^2.422.0", "bluebird": "^3.5.5", diff --git a/sourcecode.txt b/sourcecode.txt deleted file mode 100644 index 3249e8d..0000000 --- a/sourcecode.txt +++ /dev/null @@ -1,804 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Podaci o nekretnini - Kivi.ba - - - - - - - - -
    -
    - -
    - -
    -
    -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    -
    -
    - -

    - -

    - -

    - -

    - -

    - -

    - -
    - -
    - -
    -

    - - - - - - - - - -
    - - - - -
    -
    -
    -
    - -
    - - -
    - -
    - -
    - - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - - -
    - -
    -

    - - - - - - - - - - - - - -
    - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    - Izaberite lokaciju nekretnine na mapi. -

    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    Vaš oglas je spreman!

    - Unesite kontakt email i objavite oglas. - -
    -
    - -
    - -
    -
    -
    -
    - -
    - -
    -
    -
    - - - - - -
    - - - - - -- 2.47.3 From 34744613a7440fd506c6fff6cdc646e6804c1a05 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 14 Feb 2020 00:37:11 +0100 Subject: [PATCH 13/43] WiP File upload started. --- app/views/publishPhotos.ejs | 78 ++++++++++++++++++++++++++------- app/views/publishRealEstate.ejs | 2 +- index.js | 64 +++++++++++++++++---------- 3 files changed, 104 insertions(+), 40 deletions(-) diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index d8a32fc..651862f 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -1,24 +1,70 @@
    +
    + +
    - -
    -your image + - \ No newline at end of file diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 658f307..8db5468 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -1,7 +1,7 @@
    -
    +
    • Osnovni podaci
    • Dodatni podaci
    • diff --git a/index.js b/index.js index a5c92e0..f662853 100644 --- a/index.js +++ b/index.js @@ -56,27 +56,45 @@ setInterval(checkUpNotify, 1000 * 60 * 60 * 24); //Google storage req const storage = new Storage(); - -storage - .getBuckets() - .then(results => { - const buckets = results[0]; - - console.log("Buckets:"); - buckets.forEach(bucket => { - console.log(bucket.name); - }); - }) - .catch(err => { - console.error("GOOGLE ERROR:", err); - }); +const BUCKET_NAME = "kivi_original_photos"; +const bucket = storage.bucket(BUCKET_NAME); /* - bucket = gcs.bucket('aBucket') - bucket.file('aFile').getSignedUrl({ - action: 'write', - expires: moment.utc().add(1, 'days').format(), -}, (error, signedUrl) => { - if (error == null) { - console.log(`Signed URL is ${signedUrl}`) - } -}) */ +async function generateSignedUrl() { + const options = { + version: "v2", + action: "write", + expires: Date.now() + 86400000 + }; + + const [url] = bucket.file("aFile").getSignedUrl(options); + + console.log(`The signed url for aFile is ${url}.`); + return url; +}*/ + +//generateSignedUrl().catch(console.error); + +app.get("/generateSignedURL", (req, res) => { + console.log("Started server function!"); + + const options = { + version: "v2", + action: "write", + expires: Date.now() + 86400000 + }; + const filename = req.query.filename; + + console.log("Filename: ", filename); + console.log("Bucket name:", bucket.name); + + const url = bucket.file(filename).getSignedUrl(options, function(err, url) { + if (err) { + console.error(err); + return; + } + return url; + }); + + console.log(`The signed url for ${filename} is ${url}.`); + res.send(url); +}); -- 2.47.3 From f24abf62b248eb61f926abb3962df08e8c663eb9 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 14 Feb 2020 10:15:33 +0100 Subject: [PATCH 14/43] Small css change. --- app/public/main.css | 7 +++++++ app/views/publishRealEstate.ejs | 12 ++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/public/main.css b/app/public/main.css index 39f0c07..2f53359 100644 --- a/app/public/main.css +++ b/app/public/main.css @@ -162,3 +162,10 @@ h3 { .error { color: #cc0033; } + +.custom-col { + width: 18%; + margin-left: auto; + left: auto; + right: auto; +} diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 8db5468..78564e8 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -1,13 +1,13 @@
      -
      + -- 2.47.3 From 16d004c1abddb2d43388a272fc4d51cf3ea88a66 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 14 Feb 2020 13:38:31 +0100 Subject: [PATCH 15/43] WiP Started kivi original ad view. --- app/controllers/publishRealEstate.js | 8 ++ app/controllers/viewRealEstate.js | 170 +++++++++++++++++++++++++++ app/helpers/url.js | 3 +- app/routes/index.js | 3 + app/views/publishPhotos.ejs | 4 +- app/views/publishRealEstate.ejs | 5 +- app/views/viewRealEstate.ejs | 33 ++++++ package-lock.json | 11 +- package.json | 3 +- 9 files changed, 233 insertions(+), 7 deletions(-) create mode 100644 app/controllers/viewRealEstate.js create mode 100644 app/views/viewRealEstate.ejs diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 8bb66a5..3e1b159 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -173,6 +173,10 @@ const getPublishInputs = async (req, res) => { const postPublishInputs = async (req, res) => { const kiviOriginal = await currentKiviRealEstate(req); + if (!kiviOriginal || !kiviOriginal.kiviAdId) { + res.render("notFound", { title: " " }); + return; + } const realEstate = await findRealEstateByAgencyId(kiviOriginal.kiviAdId); if (!realEstate || !realEstate.dataValues) { @@ -181,6 +185,8 @@ const postPublishInputs = async (req, res) => { } const nextStepPage = req.query.nextStep || "/uspjesnaobjava"; + // + console.log("Req body:", req.body); const balcony = req.body.balcony === "on"; const elevator = req.body.elevator === "on"; @@ -292,6 +298,8 @@ const postPublishInputs = async (req, res) => { kiviOriginal.email = contactEmail; + //console.log("realEstate", realEstate); + await realEstate.save(); await kiviOriginal.save(); diff --git a/app/controllers/viewRealEstate.js b/app/controllers/viewRealEstate.js new file mode 100644 index 0000000..403e902 --- /dev/null +++ b/app/controllers/viewRealEstate.js @@ -0,0 +1,170 @@ +const { findRealEstateByAgencyId } = require("../helpers/db/realEstate"); +const { currentKiviRealEstate } = require("../helpers/url"); + +const { + BASIC_BOOLEAN_PUBLISH, + BASIC_SEGMENT_PUBLISH, + ADDITIONAL_BOOLEAN_PUBLISH, + ADDITIONAL_SEGMENT_PUBLISH, + BASIC_INPUT_PUBLISH, + ADDITIONAL_INPUT_PUBLISH +} = require("../common/publishEnums"); + +const getViewRealEstate = async (req, res) => { + const kiviOriginal = await currentKiviRealEstate(req); + + if (!kiviOriginal || !kiviOriginal.kiviAdId) { + res.render("notFound", { title: " " }); + return; + } + const realEstate = await findRealEstateByAgencyId(kiviOriginal.kiviAdId); + + if (!realEstate || !realEstate.dataValues) { + res.render("notFound", { title: " " }); + return; + } + + const pageTitle = "Pregled nekretnine"; + + const { + price, + area, + adType, + realEstateType, + locationLat, + locationLong, + accessRoadType, + heatingType, + balcony, + newBuilding, + elevator, + recentlyAdapted, + gardenSize, + numberOfRooms, + numberOfFloors, + floor, + water, + electricity, + drainageSystem, + registeredInZkBooks, + parking, + garage, + gas, + antiTheftDoor, + airCondition, + phoneConnection, + cableTV, + internet, + basementAttic, + storeRoom, + videoSurveillance, + alarm, + suitableForStudents, + includingBills, + animalsAllowed, + pool, + exchange, + urbanPlanPermit, + buildingPermit, + furnishingType, + shortDescription, + streetName, + title, + longDescription + } = realEstate; + //Categorize all database values by value type - input, boolean or segment selected + const allInputValues = { + price, + area, + gardenSize, + numberOfRooms, + numberOfFloors, + floor, + title, + shortDescription, + streetName, + longDescription + }; + const allBooleanValues = { + balcony, + elevator, + newBuilding, + recentlyAdapted, + water, + electricity, + drainageSystem, + registeredInZkBooks, + parking, + garage, + gas, + antiTheftDoor, + airCondition, + phoneConnection, + cableTV, + internet, + basementAttic, + storeRoom, + videoSurveillance, + alarm, + suitableForStudents, + includingBills, + animalsAllowed, + pool, + exchange, + urbanPlanPermit, + buildingPermit + }; + + const allSegmentSelectedValues = { + furnishingType, + accessRoadType, + heatingType + }; + + //We need titles of fields ex Balkon, Novogradnja + const ALL_BOOLEAN_FIELDS = [ + ...BASIC_BOOLEAN_PUBLISH, + ...ADDITIONAL_BOOLEAN_PUBLISH + ]; + const ALL_INPUT_FIELDS = [ + ...BASIC_INPUT_PUBLISH, + ...ADDITIONAL_INPUT_PUBLISH + ]; + const ALL_SEGMENT_FIELDS = [ + ...BASIC_SEGMENT_PUBLISH, + ...ADDITIONAL_SEGMENT_PUBLISH + ]; + // + console.log("ALL BOOLEAN FIELDS:", ALL_BOOLEAN_FIELDS); + console.log("All boolean values", allBooleanValues); + //On view add page we will show only values that are not - null, or "", or undefined + const forShowing = value => { + return value !== false && value !== null && value !== ""; + }; + //Filter all values to be shown on page or not + //For showing on page we also need title ex. "Balkon" + const booleanFields = ALL_BOOLEAN_FIELDS.filter(object => { + return forShowing(allBooleanValues[object.dbField]); + }); + const inputFields = ALL_INPUT_FIELDS.filter(object => { + return forShowing(allInputValues[object.dbField]); + }); + const segmentFields = ALL_SEGMENT_FIELDS.filter(object => { + return forShowing(allSegmentSelectedValues[object.dbField]); + }); + + //console.log("booleanFields", booleanFields); + + res.render("viewRealEstate", { + title: pageTitle, + booleanFields, + inputFields, + allInputValues, + segmentFields, + allSegmentSelectedValues + }); +}; + +module.exports = { + getViewRealEstate +}; diff --git a/app/helpers/url.js b/app/helpers/url.js index fcc1825..a59e2d9 100644 --- a/app/helpers/url.js +++ b/app/helpers/url.js @@ -1,6 +1,7 @@ const { getSearchRequest } = require("./db/searchRequest"); const { getRealEstateById } = require("./db/realEstate"); const { getKiviOriginalById } = require("./db/kiviOriginal"); +const validator = require("validator"); const currentSearchRequest = async req => { const searchRequestId = @@ -19,7 +20,7 @@ const currentRealEstate = async req => { const currentKiviRealEstate = async req => { const kiviRealEstateId = req && req.params ? req.params["kiviRealEstateId"] : null; - if (!kiviRealEstateId) return null; + if (!kiviRealEstateId || !validator.isUUID(kiviRealEstateId)) return null; return await getKiviOriginalById(kiviRealEstateId); }; diff --git a/app/routes/index.js b/app/routes/index.js index 68a40a3..e09c544 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -15,6 +15,7 @@ const { getPublishInputs, postPublishInputs } = require("../controllers/publishRealEstate"); +const { getViewRealEstate } = require("../controllers/viewRealEstate"); const { getQueryReview, postQueryReview @@ -45,6 +46,8 @@ router.post("/objavinekretninu", postPublishTypes); router.get("/podacionekretnini/:kiviRealEstateId", getPublishInputs); router.post("/podacionekretnini/:kiviRealEstateId", postPublishInputs); +router.get("/preglednekretnine/:kiviRealEstateId", getViewRealEstate); + router.get("/lokacija/:searchRequestId", getLocation); router.post("/lokacija/:searchRequestId", postLocation); diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index 651862f..bb41f73 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -9,7 +9,7 @@
      \ No newline at end of file diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 78564e8..9a863a5 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -1,5 +1,5 @@
      - +
        @@ -198,6 +198,9 @@ } */ if (!hasErrors) { + // + alert("Pokusavam submit formu!"); + $("#publishForm").submit(); }; diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs new file mode 100644 index 0000000..fb64c1a --- /dev/null +++ b/app/views/viewRealEstate.ejs @@ -0,0 +1,33 @@ +
        +
        +<% for (const field of booleanFields){ %> +

        + <%= field.title %> + +

        +<% } %> +
        + +
        +
        +<% for (const field of inputFields){ %> +

        + <%= field.title %> + <%= allInputValues[field.dbField] %> +

        +<% } %> +
        + +
        +
        +<% for (const field of segmentFields){ %> +

        + <%= field.title %> + <% for (const segmentObject of field.values) { %> + <% if (allSegmentSelectedValues[field.dbField] === segmentObject.id) { %> + <%= segmentObject.title %> + <% } %>> + <% } %> +

        +<% } %> +
        \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 58ecc85..6b29a04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4137,6 +4137,11 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" } } }, @@ -4951,9 +4956,9 @@ "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==" }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" }, "vary": { "version": "1.1.2", diff --git a/package.json b/package.json index 0741340..3ea2953 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "react-step-wizard": "^5.1.0", "sequelize": "^5.18.4", "sequelize-cli": "^5.5.0", - "validate.js": "^0.13.1" + "validate.js": "^0.13.1", + "validator": "^12.2.0" }, "devDependencies": { "nodemon": "^1.19.0" -- 2.47.3 From ba07b9311fecec471ad14ae5ec549f5823ec4c42 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 14 Feb 2020 15:34:33 +0100 Subject: [PATCH 16/43] WiP Signed url error. --- app/views/publishPhotos.ejs | 4 +++- index.js | 34 ++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index 651862f..5acef77 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -57,12 +57,14 @@ var c = ""; function uploadFile(file) { $("#status").html('Starting Upload...') - url = c + url = c; + console.log("RADIL" + file); fetch(url, { method: 'PUT', body: file }) .then(response => response.text()) + .then (console.log()) .catch(error => $("#status").html(error) ) .then(response => $("#status").html('File uploaded successfully: ' + filename)); diff --git a/index.js b/index.js index f662853..7742726 100644 --- a/index.js +++ b/index.js @@ -75,26 +75,24 @@ async function generateSignedUrl() { //generateSignedUrl().catch(console.error); app.get("/generateSignedURL", (req, res) => { - console.log("Started server function!"); + async function generateSignedUrl() { + console.log("Started server function!"); - const options = { - version: "v2", - action: "write", - expires: Date.now() + 86400000 - }; - const filename = req.query.filename; + const options = { + version: "v2", + action: "write", + expires: Date.now() + 86400000 + }; + const filename = req.query.filename; - console.log("Filename: ", filename); - console.log("Bucket name:", bucket.name); + console.log("Filename: ", filename); + console.log("Bucket name:", bucket.name); - const url = bucket.file(filename).getSignedUrl(options, function(err, url) { - if (err) { - console.error(err); - return; - } - return url; - }); + const [url] = await bucket.file(filename).getSignedUrl(options); - console.log(`The signed url for ${filename} is ${url}.`); - res.send(url); + console.log(`The signed url for ${filename} is ${url}.`); + res.send(url); + } + + generateSignedUrl().catch(console.error); }); -- 2.47.3 From cbb3c1f9545bd022a6cd0cdef2ad37951830cedc Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Fri, 14 Feb 2020 22:27:41 +0100 Subject: [PATCH 17/43] Signed URL change. --- app/views/publishPhotos.ejs | 12 ++++++++++-- index.js | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index 5acef77..39d956c 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -61,12 +61,20 @@ var c = ""; console.log("RADIL" + file); fetch(url, { method: 'PUT', + headers: { + "content-type": "image/png" + }, + mode: 'cors', body: file }) .then(response => response.text()) - .then (console.log()) + .then (response => { + console.log(response); + return response; + } + ) .catch(error => $("#status").html(error) ) - .then(response => $("#status").html('File uploaded successfully: ' + filename)); + .then(response => $("#status").html('File uploaded successfully: ' + filename + response.text())); } \ No newline at end of file diff --git a/index.js b/index.js index 7742726..f83e728 100644 --- a/index.js +++ b/index.js @@ -79,7 +79,10 @@ app.get("/generateSignedURL", (req, res) => { console.log("Started server function!"); const options = { - version: "v2", + GoogleAccessID: + " kivi-original-photos-id@marketalarm.iam.gserviceaccount.com", + PrivateKey: "dd909e0aeef15920e7fc18229ce421246c143f90", + version: "v4", action: "write", expires: Date.now() + 86400000 }; -- 2.47.3 From 57df42dd057ec76a9f58c7af6a48b73709b9a952 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Sun, 16 Feb 2020 01:06:53 +0100 Subject: [PATCH 18/43] WiP CORS Issue. --- index.js | 20 ++++++++++++++------ marketalarm-262e746e533c.json | 12 ++++++++++++ marketalarm-cors.json | 8 ++++++++ marketalarm-dd909e0aeef1.json | 12 ------------ 4 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 marketalarm-262e746e533c.json create mode 100644 marketalarm-cors.json delete mode 100644 marketalarm-dd909e0aeef1.json diff --git a/index.js b/index.js index f83e728..1495b4e 100644 --- a/index.js +++ b/index.js @@ -55,8 +55,15 @@ setInterval(crawl, CRAWLER_INTERVAL * 1000); setInterval(checkUpNotify, 1000 * 60 * 60 * 24); //Google storage req -const storage = new Storage(); -const BUCKET_NAME = "kivi_original_photos"; +const PROJECT_ID = "marketalarm"; +const KEY_FILENAME = "marketalarm-262e746e533c.json"; //relative path +const BUCKET_NAME = "marketalarm-photos"; + +const storage = new Storage({ + projectId: PROJECT_ID, + keyFilename: KEY_FILENAME +}); + const bucket = storage.bucket(BUCKET_NAME); /* async function generateSignedUrl() { @@ -79,11 +86,12 @@ app.get("/generateSignedURL", (req, res) => { console.log("Started server function!"); const options = { - GoogleAccessID: - " kivi-original-photos-id@marketalarm.iam.gserviceaccount.com", - PrivateKey: "dd909e0aeef15920e7fc18229ce421246c143f90", - version: "v4", + // GoogleAccessID: + // " kivi-original-photos-id@marketalarm.iam.gserviceaccount.com", + // PrivateKey: "dd909e0aeef15920e7fc18229ce421246c143f90", + version: "v2", action: "write", + contentType: "image/*", expires: Date.now() + 86400000 }; const filename = req.query.filename; diff --git a/marketalarm-262e746e533c.json b/marketalarm-262e746e533c.json new file mode 100644 index 0000000..1aaa350 --- /dev/null +++ b/marketalarm-262e746e533c.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "marketalarm", + "private_key_id": "262e746e533ce0437dd550c4bc709d879df1a8ff", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/9hpeJGAG5pN2\nYiIeWuyabVO9cHhzi7mlUcfyHmQKoDEcdVYC8iv2sle0Me/SjnK53AaxRBKGXEXy\nS00dKCEw9DkAmG6kTm3R7dduG/uu3jCr29xp2v8ttLtIBt7lq55g1FfqngNX9xcX\nNmkYf6f1LMiAEX5utkwGEiVOXk2kzUQiHTjmcE1XTSIQTAuFLZd9UsUDYKhLjwob\nu5UsCbIhoBeWmKcTun/MsKBocmpOoSl4GGMqt3orgvKedbCyzuA0r8AJ3rnFp2x0\n9APgvqnUy9WrKvM+TB0u3MDmvOfPUDxzu0/o2e5ZcrD2LkbFrB7nX41mKjk4Z1dN\nOIcW9k0BAgMBAAECggEAP6QYXtDBc1g7WFq1hAnR+mq3gg1JKcmPnUMNPnSb5zfv\nwEcYYnamY64BzLBnmY93cq4DG/79A0WRPQCBCuMUifXV9iATQm7sEta+/vbRDMsG\nKNwF6aRcyGrsUjdQ66Tnp6OOmC6V3jKBmcUEt8YOyYZ03JywJYVTlAmtC5vRMwr0\ny7DGE1lPYkfJnLiZLJHNXLABT+wPWCmbmOArBEHh9Ea9cJ7lsVJJw+YvRGU8bt7i\nDqEwT44O0w/WU31Wts4OUNA7o+ynheGHoYH4grIW1pEJmHKyNJRU/2CNAbFk+iJU\n8h5uZ/2BDGA+Nc0aeomVOCvdLEr1l/MRd9owZQKGXwKBgQD0/KAjdtVrMARrlaUo\nUHoJpHfc7GFC3pqybXVx1Q6Axk5WZr0wa7a4UmlxVvXcYkH8swfyle73K1gQlqy0\nUumznAt5yWFyKn+Og4nMmRplC0dn5JjYoZUskqEnMTyM85DY1l56smOZV1DeH0FE\nbKS6M2pEJx7Ran9iJBnIYguNpwKBgQDIlz71We7M1RIsfZVNvU5BrLPWI+4jS3g/\ni37Rbhlq9WHpWTuV8pFInYmFrFXehNfEgg4sIQeQ7ouQXorKYW37pfF/BekBhMTL\nmnpdBcJ+7NSQcfzuqrSltq764XNW4CmO+uRaRW7F9HSQVXVKsgITlzDP6Qa6sCFb\nKrb5rL81FwKBgCR3MfL1bkD9LbtB1AqTKAclZv4IZVXJwqcKae/escDzQ5fSxRhf\nAByhj7ZiJkh+i6nskCNItAAwgHQ/qUdSDB1C/eZL1mhi8QeqhqlgpLAjpKZPPX0J\nWCYBUWF/D68/VfEgv4Ft6itZ9tyJNHLV5RMeMhQg6pJrUrit/PR5u5SDAoGAVD/i\nO57IQ9QCTBl7CinGoqLs7bYtoTljih0G6OO7XUcvFplaA4LcLomsZy6Y6lsVXP3b\nAgHlcaQfjkWHObVuQlHSeq16zh57oaCCYGu44yKJrRmTSJL+SNPP7qOelBCWo+0Q\n2DFtc0tXYf/iwbq+UIgiAlE3eFXdzLLGI1vA+4UCgYAKhZbtn3hPOEpBixHKsF5h\n8Whz7+T+0XcAZ2D7bYqipSH+pMLDCgBaoAtvR6y1OJ8yWIVyVgRYaz8GGjEcPIWB\n0nSGfW771fyL+aMDK/69iOUu2opHl/ivbD9Bx6+zRZU4UsSHYmwBIWzHpWZcULCB\nz8gyCCcySL444h0frGPDeQ==\n-----END PRIVATE KEY-----\n", + "client_email": "marketalarm-photos@marketalarm.iam.gserviceaccount.com", + "client_id": "104397210403856258050", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/marketalarm-photos%40marketalarm.iam.gserviceaccount.com" +} diff --git a/marketalarm-cors.json b/marketalarm-cors.json new file mode 100644 index 0000000..2af91b2 --- /dev/null +++ b/marketalarm-cors.json @@ -0,0 +1,8 @@ +[ + { + "maxAgeSeconds": 3600, + "method": ["*"], + "origin": ["*"], + "responseHeader": ["*"] + } +] diff --git a/marketalarm-dd909e0aeef1.json b/marketalarm-dd909e0aeef1.json deleted file mode 100644 index df7c80e..0000000 --- a/marketalarm-dd909e0aeef1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "marketalarm", - "private_key_id": "dd909e0aeef15920e7fc18229ce421246c143f90", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLedKH5aM2yOo5\nPh8XRl8HsGZOdq4RveBT8ulJw33KexMckvCkRctSJkRPdbXF3I+N25/WihiUKEXy\nBlVqmDOCEM4qo4/sLllN7hxsoGdIGhnMEAzf8vO1/+NBdErKdu6lRW84GY29gVTH\nQBv54gMcbr2jvBW9qGqmx0Tn0DI0w3BLDd45Sz/yqhE42jmYLDEZ96E1uOR1jlG7\nwdaVlv0r3xdgmV51SjeZevlJxbWFjYCO7UXzhkvldklAjEK2Bgf0hkx9GPUHlo8u\n4TAePLXw35vx7wfrFG8cfDoPPAcB3O5WEzxX9z9/bdG4OZchcTWhguUfEGQ9Oq8Y\n3qnRpg+HAgMBAAECggEAFUWtpGZ2Cz6y+fwMHQ9O1Qt0jqRqq1Ep+CzPhdYpuvbl\n9xlHjiz7xiFZB+Oa9s4Jtf9tdOzoB+kz8ssFuAikbeca3qtN2xe3X2XS0+prEcck\nxkgxSGJqZy8Sz598SDFp3p5lM7y8LEEun0wNALFHuPu82LbLoRHP4JK5mfCSpyBN\nztXE+WFTFsNubgE3kqhZopVXXfQ+Wl43Gfx9jnFkFvxonL23soPP8JLd/Px7rsIZ\nFcaxCGjw3YsuEc3vSO6M7HY2rSx9ho+uSX9XpEb50p6bHXBTAb0ESE4Xf/uslVA5\nCqCxkzf7wB4RzveR6gLrDeTlg4Y5zN+Ioxzq6+8vSQKBgQDlGrAghbfAN6NemR8n\naiYTZ+cvZMigYuy9jSNMnCLmTYDe66r9+PWfT0jQdwaUFmhSbC3939goBAUiZlB9\nAfP4ygFR/TLJXHSXAt6c/9+VpU78lRbGCqs/RGSvH7NyObwSd1wzRXOXtzegXtjf\nz0hSYcOAZljayTEt/RX3fpERzwKBgQDjXOuB6dFRqEmNtetmB4qxBk1stHaFstiG\nG2Rcis09IlCPb0uom7wOxo0CBq8J/3QZWOouwkiXzaMoy8X/UuSJWJ8g0hgGhtNl\n/zlwSnLxaxpWdrP1zQ4vltcdmwc0oDGCjoXbUsJ3L7K/quRfdM1vyEcfNWkdxCus\nY6ugQ7isyQKBgQDN/lcKhvCWxfAAaJEYcVrW6/90H5w8iXXvYO2yPlkq1djfluph\n/O1sVm9T8RFbKWKXaWlY8WF7aVHsgi4wmAbzVT4mqBB3+Mdj2FKsu2wfM0l31d1q\nJ8Gd2zLkOw6vz7WIrQWbnAC5EyXS7jT113xhhkGwO1X9MhUkEoEjzQtHBQKBgGAK\nzGEgiA9aa1e1VS7QWMHWy7XztW1c0yIzR/3flDsS17z/YpJi1tnW/ZGxiRdMFZrv\neF0wLMITV6zQB1+HgIqUKQQQO53mLj6TxYutp0hb2dBUbEiUyj1IFq6m4jBUyxU/\nZ0PyfbsjJvrYEYhRKsbhb0m7oh+00k4L/F/Cu6whAoGAK/lwGbnxx4b+2bHLizol\nC1SCWfehwopZ6+RJDlh+nmdotLHqoJUuywQ4w1+3IfR4gfzsDsOo4hctyNDZXvK/\n5xDR5WpCXNDi1xLDajU5DcHPu+IqltvXe/KUEnEQdogIwsQMigp/MTNDy4tqVbaf\nDDaHojsNuJRgD2iek9vuciw=\n-----END PRIVATE KEY-----\n", - "client_email": "kivi-original-photos-id@marketalarm.iam.gserviceaccount.com", - "client_id": "105188302286128652978", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/kivi-original-photos-id%40marketalarm.iam.gserviceaccount.com" -} -- 2.47.3 From 57329b0311410239b0d6d9f0e5eaa4cba6f700b0 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Sun, 16 Feb 2020 12:11:18 +0100 Subject: [PATCH 19/43] CORS error still! --- app/views/publishPhotos.ejs | 7 +++---- index.js | 26 ++++---------------------- 2 files changed, 7 insertions(+), 26 deletions(-) diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index 39d956c..e8cd4ff 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -9,8 +9,8 @@
        \ No newline at end of file diff --git a/index.js b/index.js index 1495b4e..3fd2256 100644 --- a/index.js +++ b/index.js @@ -58,40 +58,23 @@ setInterval(checkUpNotify, 1000 * 60 * 60 * 24); const PROJECT_ID = "marketalarm"; const KEY_FILENAME = "marketalarm-262e746e533c.json"; //relative path const BUCKET_NAME = "marketalarm-photos"; - +//Tried implicitly creating with env credentials and direktcly as here const storage = new Storage({ projectId: PROJECT_ID, keyFilename: KEY_FILENAME }); const bucket = storage.bucket(BUCKET_NAME); -/* -async function generateSignedUrl() { - const options = { - version: "v2", - action: "write", - expires: Date.now() + 86400000 - }; - - const [url] = bucket.file("aFile").getSignedUrl(options); - - console.log(`The signed url for aFile is ${url}.`); - return url; -}*/ - -//generateSignedUrl().catch(console.error); app.get("/generateSignedURL", (req, res) => { async function generateSignedUrl() { console.log("Started server function!"); const options = { - // GoogleAccessID: - // " kivi-original-photos-id@marketalarm.iam.gserviceaccount.com", - // PrivateKey: "dd909e0aeef15920e7fc18229ce421246c143f90", - version: "v2", + //Tried to define Google ID and private key while debugging + version: "v2", //tried v4 also action: "write", - contentType: "image/*", + contentType: "image/*", //tried without and with specific image/png ex. expires: Date.now() + 86400000 }; const filename = req.query.filename; @@ -104,6 +87,5 @@ app.get("/generateSignedURL", (req, res) => { console.log(`The signed url for ${filename} is ${url}.`); res.send(url); } - generateSignedUrl().catch(console.error); }); -- 2.47.3 From 17f0e6443c0d36d80948ccd7694c259995db20a1 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Tue, 18 Feb 2020 13:35:56 +0100 Subject: [PATCH 20/43] Changed CORS options. --- index.js | 2 +- marketalarm-cors.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 3fd2256..626c786 100644 --- a/index.js +++ b/index.js @@ -84,7 +84,7 @@ app.get("/generateSignedURL", (req, res) => { const [url] = await bucket.file(filename).getSignedUrl(options); - console.log(`The signed url for ${filename} is ${url}.`); + console.log(`The signed url is ${url}.`); res.send(url); } generateSignedUrl().catch(console.error); diff --git a/marketalarm-cors.json b/marketalarm-cors.json index 2af91b2..355e679 100644 --- a/marketalarm-cors.json +++ b/marketalarm-cors.json @@ -1,8 +1,8 @@ [ { - "maxAgeSeconds": 3600, - "method": ["*"], - "origin": ["*"], - "responseHeader": ["*"] + "origin": ["http://localhost"], + "responseHeader": ["Content-Type"], + "method": ["GET", "HEAD", "DELETE"], + "maxAgeSeconds": 3600 } ] -- 2.47.3 From c11248e100dabab4ba8af7af4c360815eb836119 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Tue, 18 Feb 2020 21:40:40 +0100 Subject: [PATCH 21/43] Included npm cors. --- index.js | 3 +++ package-lock.json | 14 ++++++++++++++ package.json | 1 + 3 files changed, 18 insertions(+) diff --git a/index.js b/index.js index 626c786..9d6dbdd 100644 --- a/index.js +++ b/index.js @@ -7,6 +7,7 @@ const forceSSL = require("./app/helpers/forceSSL"); const { Storage } = require("@google-cloud/storage"); const validate = require("validate.js"); +const cors = require("cors"); const { APP_PORT, @@ -35,6 +36,8 @@ app.use("/", routes); app.use("/assets", express.static("./app/public")); +app.use(cors()); + app.listen(APP_PORT, () => console.log(`Example app listening on port ${APP_PORT}!`) ); diff --git a/package-lock.json b/package-lock.json index 58ecc85..ecf26b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -865,6 +865,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -3381,6 +3390,11 @@ "resolved": "https://registry.npmjs.org/obj-extend/-/obj-extend-0.1.0.tgz", "integrity": "sha1-u0SKR3X7les0p4H5CLusLfI9u1s=" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", diff --git a/package.json b/package.json index 0741340..613a522 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "bluebird": "^3.5.5", "cheerio": "^1.0.0-rc.2", "compression": "^1.7.4", + "cors": "^2.8.5", "dotenv": "^7.0.0", "ejs": "^2.6.1", "eslint-plugin-prettier": "^3.1.2", -- 2.47.3 From b13b4bc7c2af97e39a9fe873c4fe18ccacf8940c Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Tue, 18 Feb 2020 23:49:00 +0100 Subject: [PATCH 22/43] CORS error tryouts. --- app/views/publishPhotos.ejs | 5 +++-- index.js | 14 ++++++++++---- marketalarm-cors.json | 10 +++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index e8cd4ff..24da85e 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -58,10 +58,10 @@ function uploadFile(file) { $("#status").html('Starting Upload...') url = c; - fetch(url, { + fetch(url, { method: 'PUT', headers: { - "content-type": "image/png" + "content-type": "image/*" }, mode: 'cors', body: file @@ -75,5 +75,6 @@ .catch(error => $("#status").html(error) ) .then(response => $("#status").html('File uploaded successfully: ' + filename + 'Response:' + response.text())); + } \ No newline at end of file diff --git a/index.js b/index.js index 9d6dbdd..8861c34 100644 --- a/index.js +++ b/index.js @@ -23,6 +23,8 @@ const { const app = express(); +app.use(cors()); + app.use(forceSSL()); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); @@ -36,8 +38,6 @@ app.use("/", routes); app.use("/assets", express.static("./app/public")); -app.use(cors()); - app.listen(APP_PORT, () => console.log(`Example app listening on port ${APP_PORT}!`) ); @@ -77,7 +77,8 @@ app.get("/generateSignedURL", (req, res) => { //Tried to define Google ID and private key while debugging version: "v2", //tried v4 also action: "write", - contentType: "image/*", //tried without and with specific image/png ex. + "Content-Type": "image/*", + //contentType: "image/*", //tried without and with specific image/png ex. expires: Date.now() + 86400000 }; const filename = req.query.filename; @@ -88,7 +89,12 @@ app.get("/generateSignedURL", (req, res) => { const [url] = await bucket.file(filename).getSignedUrl(options); console.log(`The signed url is ${url}.`); - res.send(url); + + res.header("Access-Control-Allow-Origin", "http://localhost:5000"); + res.header("Access-Control-Allow-Methods", "PUT,OPTIONS"); + res.header("Access-Control-Allow-Headers", "Content-Type, Origin"); + res.header("Access-Control-Max-Age", "86400000"); + res.status(200).send(url); } generateSignedUrl().catch(console.error); }); diff --git a/marketalarm-cors.json b/marketalarm-cors.json index 355e679..784c4e9 100644 --- a/marketalarm-cors.json +++ b/marketalarm-cors.json @@ -1,8 +1,12 @@ [ { - "origin": ["http://localhost"], - "responseHeader": ["Content-Type"], - "method": ["GET", "HEAD", "DELETE"], + "origin": ["*"], + "responseHeader": [ + "Content-Type", + "Access-Control-Allow-Origin", + "x-goog-resumable" + ], + "method": ["GET", "HEAD", "DELETE", "POST", "PUT", "OPTIONS"], "maxAgeSeconds": 3600 } ] -- 2.47.3 From 2218e6888ab9f4b98cd2b52f85d4c4a9cd8f90ac Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Sun, 23 Feb 2020 01:52:43 +0100 Subject: [PATCH 23/43] Added map to kivi ad preview. --- app/config/appConfig.js | 1 - app/controllers/viewRealEstate.js | 10 ++-- app/public/main.css | 12 ++++ app/views/publishRealEstate.ejs | 4 +- app/views/viewRealEstate.ejs | 94 +++++++++++++++++++++++++------ 5 files changed, 94 insertions(+), 27 deletions(-) diff --git a/app/config/appConfig.js b/app/config/appConfig.js index 3e6003f..4b2b1aa 100644 --- a/app/config/appConfig.js +++ b/app/config/appConfig.js @@ -55,5 +55,4 @@ module.exports = { STAGING, CHECK_UP_DAYS, PROSTOR_LOGIN - }; diff --git a/app/controllers/viewRealEstate.js b/app/controllers/viewRealEstate.js index 403e902..e002751 100644 --- a/app/controllers/viewRealEstate.js +++ b/app/controllers/viewRealEstate.js @@ -134,9 +134,7 @@ const getViewRealEstate = async (req, res) => { ...BASIC_SEGMENT_PUBLISH, ...ADDITIONAL_SEGMENT_PUBLISH ]; - // - console.log("ALL BOOLEAN FIELDS:", ALL_BOOLEAN_FIELDS); - console.log("All boolean values", allBooleanValues); + //On view add page we will show only values that are not - null, or "", or undefined const forShowing = value => { return value !== false && value !== null && value !== ""; @@ -153,15 +151,15 @@ const getViewRealEstate = async (req, res) => { return forShowing(allSegmentSelectedValues[object.dbField]); }); - //console.log("booleanFields", booleanFields); - res.render("viewRealEstate", { title: pageTitle, booleanFields, inputFields, allInputValues, segmentFields, - allSegmentSelectedValues + allSegmentSelectedValues, + locationLat, + locationLong }); }; diff --git a/app/public/main.css b/app/public/main.css index 2f53359..5a30beb 100644 --- a/app/public/main.css +++ b/app/public/main.css @@ -169,3 +169,15 @@ h3 { left: auto; right: auto; } + +.dont-break-out { + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} diff --git a/app/views/publishRealEstate.ejs b/app/views/publishRealEstate.ejs index 9a863a5..51adf17 100644 --- a/app/views/publishRealEstate.ejs +++ b/app/views/publishRealEstate.ejs @@ -198,9 +198,7 @@ } */ if (!hasErrors) { - // - alert("Pokusavam submit formu!"); - + $("#publishForm").submit(); }; diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs index fb64c1a..7acf2b7 100644 --- a/app/views/viewRealEstate.ejs +++ b/app/views/viewRealEstate.ejs @@ -1,20 +1,11 @@
        -
        -<% for (const field of booleanFields){ %> -

        - <%= field.title %> - -

        -<% } %> -
        - -
        -
        +
        <% for (const field of inputFields){ %>

        - <%= field.title %> - <%= allInputValues[field.dbField] %> + <%= field.title %> + <%= allInputValues[field.dbField] %>

        +
        <% } %>
        @@ -22,12 +13,81 @@
        <% for (const field of segmentFields){ %>

        - <%= field.title %> + <%= field.title.replace(/>/g,'') %> <% for (const segmentObject of field.values) { %> <% if (allSegmentSelectedValues[field.dbField] === segmentObject.id) { %> - <%= segmentObject.title %> - <% } %>> + <%= segmentObject.title.replace(/>/g,'') %> + <% } %> <% } %>

        +
        <% } %> -
        \ No newline at end of file +
        +
        +
        +<% for (const field of booleanFields){ %> +

        + + <%= field.title %> + +

        +<% } %> +
        + +
        +
        + Lokacija nekretnine + +
        +
        +
        +
        +
        +
        +
        + + + \ No newline at end of file -- 2.47.3 From 9c63bdfbe25e43cc640b61a8f9d275b16ee0f81d Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Sun, 23 Feb 2020 23:05:28 +0100 Subject: [PATCH 24/43] Started photo gallery. --- app/controllers/viewRealEstate.js | 17 ++++++++++++++++- app/views/viewRealEstate.ejs | 23 ++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/controllers/viewRealEstate.js b/app/controllers/viewRealEstate.js index e002751..c63a2fd 100644 --- a/app/controllers/viewRealEstate.js +++ b/app/controllers/viewRealEstate.js @@ -151,6 +151,18 @@ const getViewRealEstate = async (req, res) => { return forShowing(allSegmentSelectedValues[object.dbField]); }); + //Placeholder array of image url-s --later to be urls from our storage bucket + //saved in new database table + const realEstatePhotosUrls = [ + "https://cdn.pixabay.com/photo/2020/02/16/16/31/night-4854108_960_720.jpg", + "https://cdn.pixabay.com/photo/2020/02/18/14/05/building-valley-4859574_960_720.jpg", + "https://cdn.pixabay.com/photo/2020/02/17/12/51/monastery-4856420_960_720.jpg", + "https://cdn.pixabay.com/photo/2020/02/20/11/11/children-4864480_960_720.jpg", + "https://cdn.pixabay.com/photo/2020/02/08/16/14/villa-4830490_960_720.jpg", + "https://cdn.pixabay.com/photo/2020/02/19/13/26/snow-4862208_960_720.jpg", + "https://cdn.pixabay.com/photo/2020/02/18/01/16/down-4858219__340.jpg" + ]; + res.render("viewRealEstate", { title: pageTitle, booleanFields, @@ -159,7 +171,10 @@ const getViewRealEstate = async (req, res) => { segmentFields, allSegmentSelectedValues, locationLat, - locationLong + locationLong, + adType, + realEstateType, + realEstatePhotosUrls }); }; diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs index 7acf2b7..00bfb08 100644 --- a/app/views/viewRealEstate.ejs +++ b/app/views/viewRealEstate.ejs @@ -1,3 +1,14 @@ +
        +
          + <% for (const photoUrl of realEstatePhotosUrls) { %> +
        • + alt=""/> +
        • + <% } %> +
        +
        + +
        <% for (const field of inputFields){ %> @@ -46,7 +57,17 @@
      + + \ No newline at end of file +> -- 2.47.3 From d36d7f413df114253788245b9c70ab3884b62aad Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Mon, 24 Feb 2020 15:41:28 +0100 Subject: [PATCH 25/43] Initialized flex slider --- app/config/appConfig.js | 4 ++-- app/views/layout.ejs | 4 ++++ app/views/location.ejs | 2 +- app/views/publishLocation.ejs | 2 +- app/views/viewRealEstate.ejs | 34 ++++++++++++++++++++-------------- development.env | 2 +- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/config/appConfig.js b/app/config/appConfig.js index 4b2b1aa..88f1c96 100644 --- a/app/config/appConfig.js +++ b/app/config/appConfig.js @@ -34,7 +34,7 @@ const MAX_REAL_ESTATES_IN_FIRST_EMAIL = const PRINT_CRAWLER_DEBUG = process.env.PRINT_CRAWLER_DEBUG_INFO || 0; -const API_MAP_KEY = process.env.API_MAP_KEY || ""; +const GOOGLE_MAP_KEY = process.env.GOOGLE_MAP_KEY || ""; const PROSTOR_LOGIN = { EMAIL: process.env.PROSTOR_LOGIN_EMAIL, @@ -51,7 +51,7 @@ module.exports = { MAX_REAL_ESTATES_IN_EMAIL, MAX_REAL_ESTATES_IN_FIRST_EMAIL, PRINT_CRAWLER_DEBUG, - API_MAP_KEY, + GOOGLE_MAP_KEY, STAGING, CHECK_UP_DAYS, PROSTOR_LOGIN diff --git a/app/views/layout.ejs b/app/views/layout.ejs index 2b89910..ae3c9e5 100644 --- a/app/views/layout.ejs +++ b/app/views/layout.ejs @@ -21,6 +21,10 @@ + + + + diff --git a/app/views/location.ejs b/app/views/location.ejs index 8e30feb..7f3d8bd 100644 --- a/app/views/location.ejs +++ b/app/views/location.ejs @@ -217,7 +217,7 @@ }); diff --git a/app/views/publishLocation.ejs b/app/views/publishLocation.ejs index d2dfd01..6c574f3 100644 --- a/app/views/publishLocation.ejs +++ b/app/views/publishLocation.ejs @@ -185,7 +185,7 @@ diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs index 00bfb08..302863f 100644 --- a/app/views/viewRealEstate.ejs +++ b/app/views/viewRealEstate.ejs @@ -1,12 +1,14 @@ -
      -
        - <% for (const photoUrl of realEstatePhotosUrls) { %> -
      • - alt=""/> -
      • - <% } %> -
      -
      +
      +
      +
        + <% for (const photoUrl of realEstatePhotosUrls) { %> +
      • + alt=""/> +
      • + <% } %> +
      +
      +

      @@ -57,10 +59,14 @@
      - diff --git a/development.env b/development.env index 18bf56f..3aa56a5 100644 --- a/development.env +++ b/development.env @@ -19,7 +19,7 @@ CHECK_UP_DAYS=Check up email is sent after this number of days without notificat GA_ID=Google Analytics ID #=============== GOOGLE MAPS =============# -API_MAP_KEY=(your-key-here) +GOOGLE_MAP_KEY=(your-key-here) #=============== GOOGLE STORAGE =============# GOOGLE_APPLICATION_CREDENTIALS="Path to json key file" -- 2.47.3 From b80577ef6be316b0169618f1339b4a608aa177e2 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Mon, 24 Feb 2020 23:15:48 +0100 Subject: [PATCH 26/43] WiP Ad preview page - flexslider problem. --- app/controllers/publishRealEstate.js | 4 +-- app/controllers/publishRealEstateTypes.js | 4 ++- app/controllers/viewRealEstate.js | 20 +++++++++++-- app/controllers/welcome.js | 6 ++-- app/public/main.css | 4 +++ app/views/viewRealEstate.ejs | 34 +++++++++++++++++------ 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 3e1b159..90ccec4 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -9,6 +9,8 @@ const { ACCESS_ROAD_TYPE, HEATING_TYPE } = require("../common/enums"); +const { APP_URL } = require("../config/appConfig"); + const { BASIC_BOOLEAN_PUBLISH, BASIC_SEGMENT_PUBLISH, @@ -185,8 +187,6 @@ const postPublishInputs = async (req, res) => { } const nextStepPage = req.query.nextStep || "/uspjesnaobjava"; - // - console.log("Req body:", req.body); const balcony = req.body.balcony === "on"; const elevator = req.body.elevator === "on"; diff --git a/app/controllers/publishRealEstateTypes.js b/app/controllers/publishRealEstateTypes.js index c053f1e..b49b415 100644 --- a/app/controllers/publishRealEstateTypes.js +++ b/app/controllers/publishRealEstateTypes.js @@ -6,6 +6,7 @@ const { const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); const { AD_CATEGORY, AD_TYPE, AD_AGENCY } = require("../common/enums"); +const { APP_URL } = require("../config/appConfig"); const getPublishTypes = async (req, res) => { const kiviOriginal = await currentKiviRealEstate(req); @@ -77,11 +78,12 @@ const postPublishTypes = async (req, res) => { const newKiviOriginal = await createKiviOriginal({ email: "" }); + const newKiviAdViewUrl = `${APP_URL}/preglednekretnine/${newKiviOriginal.kiviAdId}`; const newRealEstate = await createRealEstate({ adType: adTypeStringId, realEstateType: selectedRealEstateType, - url: "http://localhost:5000/", + url: newKiviAdViewUrl, originAgencyName: AD_AGENCY.KIVI, agencyObjectId: newKiviOriginal.kiviAdId }); diff --git a/app/controllers/viewRealEstate.js b/app/controllers/viewRealEstate.js index c63a2fd..f2dfd78 100644 --- a/app/controllers/viewRealEstate.js +++ b/app/controllers/viewRealEstate.js @@ -10,6 +10,8 @@ const { ADDITIONAL_INPUT_PUBLISH } = require("../common/publishEnums"); +const { AD_CATEGORY, AD_TYPE } = require("../common/enums"); + const getViewRealEstate = async (req, res) => { const kiviOriginal = await currentKiviRealEstate(req); @@ -163,6 +165,20 @@ const getViewRealEstate = async (req, res) => { "https://cdn.pixabay.com/photo/2020/02/18/01/16/down-4858219__340.jpg" ]; + const showRealEstateType = AD_CATEGORY[realEstateType].title.toUpperCase(); + let showAdType = ""; + switch (adType) { + case AD_TYPE.AD_TYPE_SALE.stringId: + showAdType = AD_TYPE.AD_TYPE_SALE.title.toUpperCase(); + break; + case AD_TYPE.AD_TYPE_RENT.stringId: + showAdType = AD_TYPE.AD_TYPE_RENT.title.toUpperCase(); + break; + default: + showAdType = "-"; + break; + } + res.render("viewRealEstate", { title: pageTitle, booleanFields, @@ -172,8 +188,8 @@ const getViewRealEstate = async (req, res) => { allSegmentSelectedValues, locationLat, locationLong, - adType, - realEstateType, + showAdType, + showRealEstateType, realEstatePhotosUrls }); }; diff --git a/app/controllers/welcome.js b/app/controllers/welcome.js index 11b42b5..30d793c 100644 --- a/app/controllers/welcome.js +++ b/app/controllers/welcome.js @@ -2,6 +2,7 @@ const { createSearchRequest } = require("../helpers/db/searchRequest"); const { createRealEstate } = require("../helpers/db/realEstate"); const { createKiviOriginal } = require("../helpers/db/kiviOriginal"); const { AD_TYPE, AD_CATEGORY, AD_AGENCY } = require("../common/enums"); +const { APP_URL } = require("../config/appConfig"); const getWelcome = (req, res) => { res.render("welcome", { @@ -39,11 +40,12 @@ const postWelcome = async (req, res) => { email: "" }); + const newKiviAdViewUrl = `${APP_URL}/preglednekretnine/${newKiviOriginal.kiviAdId}`; + const newRealEstate = await createRealEstate({ adType: adTypeStringId, realEstateType: AD_CATEGORY.FLAT.id, - //Temp variable because of the not null constraints - url: "http://localhost:5000/", + url: newKiviAdViewUrl, originAgencyName: AD_AGENCY.KIVI, agencyObjectId: newKiviOriginal.kiviAdId }); diff --git a/app/public/main.css b/app/public/main.css index 5a30beb..d7e12a5 100644 --- a/app/public/main.css +++ b/app/public/main.css @@ -181,3 +181,7 @@ h3 { -webkit-hyphens: auto; hyphens: auto; } + +.flex-direction-nav li a { + height: 50px; +} diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs index 302863f..9112365 100644 --- a/app/views/viewRealEstate.ejs +++ b/app/views/viewRealEstate.ejs @@ -1,16 +1,28 @@ +
      +
      +
      +
      <%= showAdType %>
      +
      +
      + <%= showRealEstateType %> +
      +
      + + +
      -
      +
        <% for (const photoUrl of realEstatePhotosUrls) { %> -
      • - alt=""/> -
      • - <% } %> +
      • + alt=""/> +
      • + <% } %>
      - +

      <% for (const field of inputFields){ %> @@ -60,12 +72,16 @@
      -- 2.47.3 From bbd9dab30d90881fcd71629c0cee56b83615760b Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Wed, 26 Feb 2020 14:56:00 +0100 Subject: [PATCH 27/43] Upload image file to bucket success. --- app/views/publishPhotos.ejs | 9 +++------ index.js | 14 +++----------- marketalarm-262e746e533c.json | 12 ------------ marketalarm-d4b71394407e.json | 12 ++++++++++++ 4 files changed, 18 insertions(+), 29 deletions(-) delete mode 100644 marketalarm-262e746e533c.json create mode 100644 marketalarm-d4b71394407e.json diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index 24da85e..b824a4f 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -55,26 +55,23 @@ return false; } - function uploadFile(file) { + function uploadFile(file) { $("#status").html('Starting Upload...') url = c; fetch(url, { method: 'PUT', - headers: { - "content-type": "image/*" - }, + headers: new Headers({'content-type': 'image/*'}), mode: 'cors', body: file }) .then(response => response.text()) .then (response => { - console.log(response); return response; } ) .catch(error => $("#status").html(error) ) - .then(response => $("#status").html('File uploaded successfully: ' + filename + 'Response:' + response.text())); + .then(response => $("#status").html('File uploaded successfully: ' + filename )); } \ No newline at end of file diff --git a/index.js b/index.js index 8861c34..5bb27be 100644 --- a/index.js +++ b/index.js @@ -59,13 +59,10 @@ setInterval(checkUpNotify, 1000 * 60 * 60 * 24); //Google storage req const PROJECT_ID = "marketalarm"; -const KEY_FILENAME = "marketalarm-262e746e533c.json"; //relative path +const KEY_FILENAME = ""; //relative path const BUCKET_NAME = "marketalarm-photos"; //Tried implicitly creating with env credentials and direktcly as here -const storage = new Storage({ - projectId: PROJECT_ID, - keyFilename: KEY_FILENAME -}); +const storage = new Storage(); const bucket = storage.bucket(BUCKET_NAME); @@ -77,8 +74,7 @@ app.get("/generateSignedURL", (req, res) => { //Tried to define Google ID and private key while debugging version: "v2", //tried v4 also action: "write", - "Content-Type": "image/*", - //contentType: "image/*", //tried without and with specific image/png ex. + contentType: "image/*", //tried without and with specific image/png ex. expires: Date.now() + 86400000 }; const filename = req.query.filename; @@ -90,10 +86,6 @@ app.get("/generateSignedURL", (req, res) => { console.log(`The signed url is ${url}.`); - res.header("Access-Control-Allow-Origin", "http://localhost:5000"); - res.header("Access-Control-Allow-Methods", "PUT,OPTIONS"); - res.header("Access-Control-Allow-Headers", "Content-Type, Origin"); - res.header("Access-Control-Max-Age", "86400000"); res.status(200).send(url); } generateSignedUrl().catch(console.error); diff --git a/marketalarm-262e746e533c.json b/marketalarm-262e746e533c.json deleted file mode 100644 index 1aaa350..0000000 --- a/marketalarm-262e746e533c.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "marketalarm", - "private_key_id": "262e746e533ce0437dd550c4bc709d879df1a8ff", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/9hpeJGAG5pN2\nYiIeWuyabVO9cHhzi7mlUcfyHmQKoDEcdVYC8iv2sle0Me/SjnK53AaxRBKGXEXy\nS00dKCEw9DkAmG6kTm3R7dduG/uu3jCr29xp2v8ttLtIBt7lq55g1FfqngNX9xcX\nNmkYf6f1LMiAEX5utkwGEiVOXk2kzUQiHTjmcE1XTSIQTAuFLZd9UsUDYKhLjwob\nu5UsCbIhoBeWmKcTun/MsKBocmpOoSl4GGMqt3orgvKedbCyzuA0r8AJ3rnFp2x0\n9APgvqnUy9WrKvM+TB0u3MDmvOfPUDxzu0/o2e5ZcrD2LkbFrB7nX41mKjk4Z1dN\nOIcW9k0BAgMBAAECggEAP6QYXtDBc1g7WFq1hAnR+mq3gg1JKcmPnUMNPnSb5zfv\nwEcYYnamY64BzLBnmY93cq4DG/79A0WRPQCBCuMUifXV9iATQm7sEta+/vbRDMsG\nKNwF6aRcyGrsUjdQ66Tnp6OOmC6V3jKBmcUEt8YOyYZ03JywJYVTlAmtC5vRMwr0\ny7DGE1lPYkfJnLiZLJHNXLABT+wPWCmbmOArBEHh9Ea9cJ7lsVJJw+YvRGU8bt7i\nDqEwT44O0w/WU31Wts4OUNA7o+ynheGHoYH4grIW1pEJmHKyNJRU/2CNAbFk+iJU\n8h5uZ/2BDGA+Nc0aeomVOCvdLEr1l/MRd9owZQKGXwKBgQD0/KAjdtVrMARrlaUo\nUHoJpHfc7GFC3pqybXVx1Q6Axk5WZr0wa7a4UmlxVvXcYkH8swfyle73K1gQlqy0\nUumznAt5yWFyKn+Og4nMmRplC0dn5JjYoZUskqEnMTyM85DY1l56smOZV1DeH0FE\nbKS6M2pEJx7Ran9iJBnIYguNpwKBgQDIlz71We7M1RIsfZVNvU5BrLPWI+4jS3g/\ni37Rbhlq9WHpWTuV8pFInYmFrFXehNfEgg4sIQeQ7ouQXorKYW37pfF/BekBhMTL\nmnpdBcJ+7NSQcfzuqrSltq764XNW4CmO+uRaRW7F9HSQVXVKsgITlzDP6Qa6sCFb\nKrb5rL81FwKBgCR3MfL1bkD9LbtB1AqTKAclZv4IZVXJwqcKae/escDzQ5fSxRhf\nAByhj7ZiJkh+i6nskCNItAAwgHQ/qUdSDB1C/eZL1mhi8QeqhqlgpLAjpKZPPX0J\nWCYBUWF/D68/VfEgv4Ft6itZ9tyJNHLV5RMeMhQg6pJrUrit/PR5u5SDAoGAVD/i\nO57IQ9QCTBl7CinGoqLs7bYtoTljih0G6OO7XUcvFplaA4LcLomsZy6Y6lsVXP3b\nAgHlcaQfjkWHObVuQlHSeq16zh57oaCCYGu44yKJrRmTSJL+SNPP7qOelBCWo+0Q\n2DFtc0tXYf/iwbq+UIgiAlE3eFXdzLLGI1vA+4UCgYAKhZbtn3hPOEpBixHKsF5h\n8Whz7+T+0XcAZ2D7bYqipSH+pMLDCgBaoAtvR6y1OJ8yWIVyVgRYaz8GGjEcPIWB\n0nSGfW771fyL+aMDK/69iOUu2opHl/ivbD9Bx6+zRZU4UsSHYmwBIWzHpWZcULCB\nz8gyCCcySL444h0frGPDeQ==\n-----END PRIVATE KEY-----\n", - "client_email": "marketalarm-photos@marketalarm.iam.gserviceaccount.com", - "client_id": "104397210403856258050", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/marketalarm-photos%40marketalarm.iam.gserviceaccount.com" -} diff --git a/marketalarm-d4b71394407e.json b/marketalarm-d4b71394407e.json new file mode 100644 index 0000000..672a051 --- /dev/null +++ b/marketalarm-d4b71394407e.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "marketalarm", + "private_key_id": "d4b71394407eb3dba9e431851dab60b198d6985d", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDTE6dkFr0bzDXg\n7ghMxkzq8cajqqqes9JZVqsXh+b/kFJYmEImFUILJJZdI080KM2sEYsIapBCxhMP\nFH017f/gfH3jnRbp3c70hghNh8noSTsq7kPA4l25o8GQnJ6AS+nhy8umPjb4KzX9\nkmC6OOD4P8mAmGqhoUv4s2jld1cXNur6NJjCpjEd2cH3SUbI71oA3V/4W8aK4dvS\n660kLY0PRt7mCiITe0hbTUBZY48W2ijZ7wM2r0HUtPG9XEeGMGmNsC+qD2oWxUU3\nvnm7l1fEIUvLYF4GrLRDJDSkpChBXNcWhoGV2AOvuTc+yghU2+lJWqrKcpLlI23E\nlVJjt9UhAgMBAAECggEABatr8sxq+SQOf9hSIe3Me9Kc1nunrC42scFHRKBNxahJ\ndXw5B9FQPh738Cqhk0xEz6hlrln1Agj6HhRIz8U0r9R+z4TRRr6kfnWmBZAMShu0\nC4JW448abpAYx8CQ/CvRmq2GlF+/M+QBeqpLS8gPzyaKTB/5IBaKG8Bn0fXXQZ2e\n7RaTpGx62jq79omPwiKz0PMVBGZrzPu8Z4tW47muV51osdKSNVgsXb4gCZl28zN2\n6zzY1ZK7u89MesY8joILMHm8cw0oyv9o+RVGEa1I1nq2q1A8ftZny4p7kUA/ITZX\nEZ6SCOP87z9HeVCr8lzexcovD8uZCOTYpcfotlSjGQKBgQD1VVGU2bzExiV0XQGc\n8n6m4TR6Y9zwXBiQPe0rXPZhvsj8QMTXk+L0ejCo4m7NF1dEyH6u+qX6wjNL1Hm9\nN/ZuDFqYtd9w6cQ8CtDZ6QZIE60k6tLQhMNRNMvHdMfedq+VOz3LX6TdyTnv8dP3\nbEsD8wIfFd6t5wNgeZkbKsNxBwKBgQDcQQsUppjglGpUoz7lGHKbFcKMPpIj9fMY\nfze1DXeTAtHGxGm2F10WZvxOEs4DCOUllBlarL5xDAJIJHk/NYlgnI6MJXMLro6d\nsb4iNTUuJKdqAijyOaZQUADJpdYKGwu5y66PUOuojWFV9kiamquXduJ9jzOa1vr1\nSJPUy2YGlwKBgQDNJrpgwa8z0QozAy89Ih68x+fNTMLNkAXOYKp6L3OsixCguDyi\nlP0dOSyFnUvQXutQDmS5R8oSJeElURk4HJsKrXP47WVak3DQUK8S+eSR0zpfe6os\nSkjWGFMriEE2i4MKRI7JCULhX8r+FfgNl9YnCEfG3M/oFhzhyO06JYlncwKBgF6n\nBSAGyEQbA+cDkI/bhcToAQdMDHmvxJyOb147P1vKJmSJG/TI7ZQnBd53blkXhYI0\ntwCko+LpCkH+iqyDUVpXbVsE7P/kMB3MuKzyuLvvvJJuAzK1W6e/+daukeEd5lge\nFBI68EsrFt1eTa1DMuKQkJzs4Xx1TrwCSKV2E45ZAoGBAIZkXyAOhwqCxwDF7B69\nt/7CWs0gPGqp6lFO7fgt7jPmcmSEr/xgUbBDFwd7D49jpXVgCEtr1Bd6MItlu/Ns\nXgXyOa5LPQmglF7UtnvuQLASBy5X6boKaf3sz7I5eho1kXczPGQUHfR5e0DaTND3\nTi2NLIAUci8T7hc8mONdeEHD\n-----END PRIVATE KEY-----\n", + "client_email": "marketalarm-photos-service-acc@marketalarm.iam.gserviceaccount.com", + "client_id": "115644068453290488813", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/marketalarm-photos-service-acc%40marketalarm.iam.gserviceaccount.com" +} -- 2.47.3 From 54d9822fc85456893f2f3454e2a848a4b1f21afa Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Tue, 3 Mar 2020 17:02:20 +0100 Subject: [PATCH 28/43] Flexslider vs Materilize debugg. --- app/public/custom-flexslider.css | 0 app/views/layout.ejs | 3 +- app/views/viewRealEstate.ejs | 55 ++++++++++++++++++++++++++++---- 3 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 app/public/custom-flexslider.css diff --git a/app/public/custom-flexslider.css b/app/public/custom-flexslider.css new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layout.ejs b/app/views/layout.ejs index ae3c9e5..afeebfa 100644 --- a/app/views/layout.ejs +++ b/app/views/layout.ejs @@ -20,8 +20,9 @@ + + - diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs index 9112365..2aa8e45 100644 --- a/app/views/viewRealEstate.ejs +++ b/app/views/viewRealEstate.ejs @@ -8,9 +8,7 @@
    - - -
    + + +

    @@ -74,14 +93,36 @@ -- 2.47.3 From 6821f61e5533aca6a25c5abee93d748468b43233 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Tue, 3 Mar 2020 22:03:41 +0100 Subject: [PATCH 29/43] Flexslider fixed. --- app/public/custom-flexslider.css | 0 app/public/main.css | 5 +++ app/views/layout.ejs | 1 - app/views/viewRealEstate.ejs | 60 ++++---------------------------- 4 files changed, 11 insertions(+), 55 deletions(-) delete mode 100644 app/public/custom-flexslider.css diff --git a/app/public/custom-flexslider.css b/app/public/custom-flexslider.css deleted file mode 100644 index e69de29..0000000 diff --git a/app/public/main.css b/app/public/main.css index d7e12a5..8d8fd80 100644 --- a/app/public/main.css +++ b/app/public/main.css @@ -185,3 +185,8 @@ h3 { .flex-direction-nav li a { height: 50px; } + +.slider .slides li { + opacity: 1; + position: relative; +} diff --git a/app/views/layout.ejs b/app/views/layout.ejs index afeebfa..9ee5b2a 100644 --- a/app/views/layout.ejs +++ b/app/views/layout.ejs @@ -21,7 +21,6 @@ - diff --git a/app/views/viewRealEstate.ejs b/app/views/viewRealEstate.ejs index 2aa8e45..424e700 100644 --- a/app/views/viewRealEstate.ejs +++ b/app/views/viewRealEstate.ejs @@ -8,39 +8,18 @@
    - - - + +

    @@ -92,38 +71,11 @@ - + + + + + + @@ -48,6 +55,9 @@ <% } else { %> Kivi.ba <% } %> + + + diff --git a/app/views/publishPhotos.ejs b/app/views/publishPhotos.ejs index b824a4f..6dc21f1 100644 --- a/app/views/publishPhotos.ejs +++ b/app/views/publishPhotos.ejs @@ -8,30 +8,62 @@
    +****************************** +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ecf26b5..ba4349f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ } }, "@google-cloud/common": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.3.0.tgz", - "integrity": "sha512-nmIyi3q/FL2j6ZJ61xK/863DoJEZayI2/W/iCgwrCYUYsem277XO45MBTAimjgiKBCA0c9InmQyfT48h/IK4jg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz", + "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==", "requires": { "@google-cloud/projectify": "^1.0.0", "@google-cloud/promisify": "^1.0.0", @@ -48,9 +48,9 @@ "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==" }, "@google-cloud/storage": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.3.1.tgz", - "integrity": "sha512-/i7tAcUZDQNDs8/+oN+U2mOXdWdP2eld0pFKLkpthmWmaD89JQlrgHAFL7uvlgCSbaD7YxgbSyJebgd6YBgMgQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.5.0.tgz", + "integrity": "sha512-ZLFcR6CiP1AnYBA9eTtASF9Dy3wjYmGx+HZiy/LsIPN41wyBTn9yAjIOxRHiteqzX3uQzZ+VJNCB/DmTU33CeQ==", "requires": { "@google-cloud/common": "^2.1.1", "@google-cloud/paginator": "^2.0.0", @@ -82,9 +82,9 @@ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -188,9 +188,27 @@ } }, "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } }, "ajv": { "version": "6.10.0", @@ -1492,9 +1510,9 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-text-encoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", - "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.1.tgz", + "integrity": "sha512-x4FEgaz3zNRtJfLFqJmHWxkMDDvXVtaznj2V9jiP8ACUJrUgist4bP9FmDL2Vew2Y9mEQI/tG4GqabaitYp9CQ==" }, "fill-range": { "version": "4.0.0", @@ -2155,13 +2173,13 @@ } }, "gaxios": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.0.tgz", - "integrity": "sha512-VgC4JKJQAAAGK5rFZbPcS5mXsdIYVMIUJOxMjSOkYdfhB74R0L6y8PFQDdS0r1ObG6hdP11e71EjHh3xbI+6fQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.2.tgz", + "integrity": "sha512-K/+py7UvKRDaEwEKlLiRKrFr+wjGjsMz5qH7Vs549QJS7cpSCOT/BbWL7pzqECflc46FcNPipjSfB+V1m8PAhw==", "requires": { "abort-controller": "^3.0.0", "extend": "^3.0.2", - "https-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", "is-stream": "^2.0.0", "node-fetch": "^2.3.0" }, @@ -2174,9 +2192,9 @@ } }, "gcp-metadata": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.3.1.tgz", - "integrity": "sha512-RrASg1HaVAxoB9Q/8sYfJ++v9PMiiqIgOrOxZeagMgS4osZtICT1lKBx2uvzYgwetxj8i6K99Z0iuKMg7WraTg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", "requires": { "gaxios": "^2.1.0", "json-bigint": "^0.3.0" @@ -2196,11 +2214,11 @@ }, "dependencies": { "configstore": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", - "integrity": "sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "requires": { - "dot-prop": "^5.1.0", + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", @@ -2248,9 +2266,9 @@ } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -2336,15 +2354,16 @@ } }, "google-auth-library": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.9.2.tgz", - "integrity": "sha512-rBE1YTOZ3/Hu6Mojkr+UUmbdc/F28hyMGYEGxjyfVA9ZFmq12oqS3AeftX4h9XpdVIcxPooSo8hECYGT6B9XqQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", "requires": { "arrify": "^2.0.0", "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", "fast-text-encoding": "^1.0.0", "gaxios": "^2.1.0", - "gcp-metadata": "^3.3.0", + "gcp-metadata": "^3.4.0", "gtoken": "^4.1.0", "jws": "^4.0.0", "lru-cache": "^5.0.0" @@ -2572,14 +2591,6 @@ "debug": "4" }, "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "requires": { - "debug": "4" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -2606,11 +2617,11 @@ } }, "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "agent-base": "5", + "agent-base": "6", "debug": "4" }, "dependencies": { @@ -4529,38 +4540,6 @@ "node-fetch": "^2.2.0", "stream-events": "^1.0.5", "uuid": "^3.3.2" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "requires": { - "debug": "4" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "term-size": { diff --git a/package.json b/package.json index 613a522..69ff7f1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "2checkout-node": "0.0.1", - "@google-cloud/storage": "^4.3.1", + "@google-cloud/storage": "^4.5.0", "@sendgrid/mail": "^6.3.1", "aws-sdk": "^2.422.0", "bluebird": "^3.5.5", -- 2.47.3 From 5f674230e1f74ee2f573361a2a40ee8b7aec4a27 Mon Sep 17 00:00:00 2001 From: Naida Vatric Date: Mon, 9 Mar 2020 23:30:37 +0100 Subject: [PATCH 31/43] Real estate input clean up. --- app/common/publishEnums.js | 105 ++++++++++++++------------- app/controllers/publishRealEstate.js | 3 + app/public/main.css | 12 ++- app/views/publishAdditionalData.ejs | 11 ++- app/views/publishBasicData.ejs | 4 +- app/views/publishEnd.ejs | 19 ++--- app/views/publishLocation.ejs | 3 +- app/views/publishPhotos.ejs | 103 +------------------------- app/views/publishRealEstate.ejs | 91 ++++++++++++++++++++++- index.js | 17 ++--- 10 files changed, 182 insertions(+), 186 deletions(-) diff --git a/app/common/publishEnums.js b/app/common/publishEnums.js index 93f6073..e98f361 100644 --- a/app/common/publishEnums.js +++ b/app/common/publishEnums.js @@ -6,16 +6,6 @@ const { } = require("./enums"); const BASIC_BOOLEAN_PUBLISH = [ - { - dbField: "balcony", - title: "Balkon", - categoriesToShow: [ - AD_CATEGORY.FLAT, - AD_CATEGORY.HOUSE, - AD_CATEGORY.APARTMENT, - AD_CATEGORY.COTTAGE - ] - }, { dbField: "newBuilding", title: "Novogradnja", @@ -28,6 +18,17 @@ const BASIC_BOOLEAN_PUBLISH = [ AD_CATEGORY.GARAGE ] }, + { + dbField: "balcony", + title: "Balkon", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE + ] + }, + { dbField: "elevator", title: "Lift", @@ -51,6 +52,34 @@ const BASIC_BOOLEAN_PUBLISH = [ ]; const BASIC_INPUT_PUBLISH = [ + { + dbField: "title", + title: "Naslov", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ], + constraint: ["required"] + }, + { + dbField: "shortDescription", + title: "Opis", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ], + constraint: [] + }, { dbField: "price", title: "Cijena (KM)", @@ -85,6 +114,20 @@ const BASIC_INPUT_PUBLISH = [ categoriesToShow: [AD_CATEGORY.HOUSE, AD_CATEGORY.COTTAGE], constraint: ["numerical"] }, + { + dbField: "streetName", + title: "Adresa", + categoriesToShow: [ + AD_CATEGORY.FLAT, + AD_CATEGORY.HOUSE, + AD_CATEGORY.APARTMENT, + AD_CATEGORY.COTTAGE, + AD_CATEGORY.OFFICE, + AD_CATEGORY.LAND, + AD_CATEGORY.GARAGE + ], + constraint: [] + }, { dbField: "numberOfRooms", title: "Broj soba", @@ -117,48 +160,6 @@ const BASIC_INPUT_PUBLISH = [ AD_CATEGORY.OFFICE ], constraint: ["integer"] - }, - { - dbField: "title", - title: "Naslov", - categoriesToShow: [ - AD_CATEGORY.FLAT, - AD_CATEGORY.HOUSE, - AD_CATEGORY.APARTMENT, - AD_CATEGORY.COTTAGE, - AD_CATEGORY.OFFICE, - AD_CATEGORY.LAND, - AD_CATEGORY.GARAGE - ], - constraint: ["required"] - }, - { - dbField: "shortDescription", - title: "Opis", - categoriesToShow: [ - AD_CATEGORY.FLAT, - AD_CATEGORY.HOUSE, - AD_CATEGORY.APARTMENT, - AD_CATEGORY.COTTAGE, - AD_CATEGORY.OFFICE, - AD_CATEGORY.LAND, - AD_CATEGORY.GARAGE - ], - constraint: [] - }, - { - dbField: "streetName", - title: "Adresa", - categoriesToShow: [ - AD_CATEGORY.FLAT, - AD_CATEGORY.HOUSE, - AD_CATEGORY.APARTMENT, - AD_CATEGORY.COTTAGE, - AD_CATEGORY.OFFICE, - AD_CATEGORY.LAND, - AD_CATEGORY.GARAGE - ], - constraint: [] } ]; diff --git a/app/controllers/publishRealEstate.js b/app/controllers/publishRealEstate.js index 8bb66a5..b072551 100644 --- a/app/controllers/publishRealEstate.js +++ b/app/controllers/publishRealEstate.js @@ -243,6 +243,9 @@ const postPublishInputs = async (req, res) => { //Contact email saved in other table const contactEmail = req.body.email || ""; + const imageUrlsArray = req.body.imageUrls || []; + console.log(imageUrlsArray); + realEstate.balcony = balcony; realEstate.elevator = elevator; realEstate.newBuilding = newBuilding; diff --git a/app/public/main.css b/app/public/main.css index afb8c00..d2ba8e1 100644 --- a/app/public/main.css +++ b/app/public/main.css @@ -164,7 +164,6 @@ h3 { } .custom-col { - width: 18%; margin-left: auto; left: auto; right: auto; @@ -175,7 +174,16 @@ h3 { border-radius: 10px; border: 4px dashed #02adba; border-image: none; - max-width: 500px; + max-width: 100%; margin-left: auto; margin-right: auto; } + +.dz-progress { + /* progress bar covers file name */ + display: none; +} + +h3.custom-h3 { + font-size: 20px; +} diff --git a/app/views/publishAdditionalData.ejs b/app/views/publishAdditionalData.ejs index 6e57174..7a5a21d 100644 --- a/app/views/publishAdditionalData.ejs +++ b/app/views/publishAdditionalData.ejs @@ -1,7 +1,7 @@
    <% for (const input of additionalInputInputs){ %> -
    +