import melo from "../../melo.app.mjs";
import constants from "../../common/constants.mjs";
import { ConfigurationError } from "@pipedream/platform";
export default {
key: "melo-new-property-created",
name: "New Property Created (Instant)",
description: "Emit new event when a new property ad is created in Melo. Requires a Production Environment.",
version: "0.0.1",
type: "source",
dedupe: "unique",
props: {
melo,
http: {
type: "$.interface.http",
customResponse: true,
},
title: {
type: "string",
label: "Title",
description: "Title of the created search.",
},
transactionType: {
type: "string",
label: "Transaction Type",
description: "Type of transaction. Sell 0, Rent 1.",
options: constants.TRANSACTION_TYPES,
},
propertyTypes: {
type: "string[]",
label: "Property Types",
description: "Type of property. Apartment 0, House 1, Building 2, Parking 3, Office 4, Land 5, Shop 6. Example: propertyTypes[]=0&propertyTypes[]=1",
options: constants.PROPERTY_TYPES,
},
bedroomMin: {
type: "integer",
label: "Minimum Bedrooms",
description: "Minimum number of bedrooms in the property.",
optional: true,
},
bedroomMax: {
type: "integer",
label: "Maximum Bedrooms",
description: "Maximum number of bedrooms in the property.",
optional: true,
},
budgetMin: {
type: "integer",
label: "Minimum Budget",
description: "Minimum budget for the property.",
optional: true,
},
budgetMax: {
type: "integer",
label: "Maximum Budget",
description: "Maximum budget for the property.",
},
excludedCities: {
type: "string[]",
label: "Excluded Cities",
description: "Cities to be excluded.",
optional: true,
},
excludedSiteCategories: {
type: "string[]",
label: "Excluded Site Categories",
description: "Site categories to be excluded.",
optional: true,
},
furnished: {
type: "boolean",
label: "Furnished",
description: "Whether the property is furnished or not.",
optional: true,
},
hidePropertyContact: {
type: "boolean",
label: "Hide Property Contact",
description: "Whether to hide property contact information or not.",
optional: true,
},
includedCities: {
type: "string[]",
label: "Included Cities",
description: "Included cities.",
optional: true,
},
includedDepartments: {
type: "string[]",
label: "Included Departments",
description: "Included departments.",
optional: true,
},
includedSiteCategories: {
type: "string[]",
label: "Included Site Categories",
description: "Included site categories.",
optional: true,
},
includedZipcodes: {
type: "string[]",
label: "Included Zipcodes",
description: "Included zipcodes.",
optional: true,
},
landSurfaceMax: {
type: "integer",
label: "Maximum Land Surface",
description: "Maximum land surface.",
optional: true,
},
landSurfaceMin: {
type: "integer",
label: "Minimum Land Surface",
description: "Minimum land surface.",
optional: true,
},
lat: {
type: "string",
label: "Latitude",
description: "Latitude. Will work if latitude exists in the property.",
optional: true,
},
lon: {
type: "string",
label: "Longitude",
description: "Longitude. Will work if latitude exists in the property.",
optional: true,
},
pricePerMeterMax: {
type: "integer",
label: "Maximum Price Per Meter",
description: "Maximum price per meter.",
optional: true,
},
pricePerMeterMin: {
type: "integer",
label: "Minimum Price Per Meter",
description: "Minimum price per meter.",
optional: true,
},
publisherTypes: {
type: "string[]",
label: "Publisher Types",
description: "Type of publisher. Individual 0, Professional 1.",
options: constants.PUBLISHER_TYPES,
optional: true,
},
radius: {
type: "integer",
label: "Radius",
description: "Distance expressed in kilometers. Will work if latitude & longitude parameters are also set.",
optional: true,
},
roomMin: {
type: "integer",
label: "Minimum Number of Rooms",
description: "Minimum number of rooms.",
optional: true,
},
roomMax: {
type: "integer",
label: "Maximum Number of Rooms",
description: "Maximum number of rooms.",
optional: true,
},
surfaceMax: {
type: "integer",
label: "Maximum Surface Area",
description: "Maximum property surface area.",
optional: true,
},
surfaceMin: {
type: "integer",
label: "Minimum Surface Area",
description: "Minimum property surface area.",
optional: true,
},
withCoherentPrice: {
type: "boolean",
label: "With Coherent Price",
description: "Having properties with coherent prices.",
optional: true,
default: true,
},
withVirtualTour: {
type: "boolean",
label: "With Virtual Tour",
description: "Whether the property includes a virtual tour.",
optional: true,
},
},
hooks: {
async deploy() {
if (!this.includedCities?.length
&& !this.includedDepartments?.length
&& !(this.lat && this.lon && this.radius)
) {
throw new ConfigurationError("Choose at least one location. IncludedCities or includedDepartments or radius/lon/lat.");
}
const {
melo,
http,
transactionType,
propertyTypes,
publisherTypes,
lat,
lon,
...data
} = this;
try {
await melo.createSearch({
data: {
subscribedEvents: [
"property.ad.create",
],
notificationEnabled: true,
endpointRecipient: http.endpoint,
transactionType: parseInt(transactionType),
propertyTypes: propertyTypes.map((type) => parseInt(type)),
publisherTypes: publisherTypes?.length
? publisherTypes.map((type) => parseInt(type))
: undefined,
lat: lat
? parseFloat(lat)
: undefined,
lon: lon
? parseFloat(lon)
: undefined,
...data,
},
});
} catch (e) {
const message = JSON.parse(e.message);
if (message["hydra:description"] === "Access Denied.") {
throw new ConfigurationError(`${message["hydra:description"]} Creating webhooks requires a Production Environment API Key.`);
}
throw new Error(JSON.stringify(message));
}
},
},
async run(event) {
this.http.respond({
status: 200,
});
const { body } = event;
this.$emit(body, {
id: body.match["@id"],
summary: `${body.match.propertyDocument.title}`,
ts: Date.parse(body.match.createdAt),
});
},
};