@golemio/parkings
Version:
Golemio Parkings Module
159 lines • 7.71 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TskParkingLotsRepository = void 0;
const ParkingPaymentsRepository_1 = require("./ParkingPaymentsRepository");
const _sch_1 = require("../../schema-definitions");
const ParkingMeasurementsDtoSchema_1 = require("../../schema-definitions/datasources/ParkingMeasurementsDtoSchema");
const output_gateway_1 = require("@golemio/core/dist/output-gateway");
const sequelize_1 = __importDefault(require("@golemio/core/dist/shared/sequelize"));
const ParkingsMeasurementsModels_1 = require("../models/ParkingsMeasurementsModels");
const TskFeatureMapper_1 = require("./helpers/TskFeatureMapper");
const TskAverageOccupancyRepository_1 = require("./TskAverageOccupancyRepository");
const TskDistrictsRepository_1 = require("./TskDistrictsRepository");
class TskParkingLotsRepository extends output_gateway_1.SequelizeModel {
constructor() {
super(_sch_1.Parkings.name, _sch_1.Parkings.parkings.pgTableName, _sch_1.Parkings.parkings.outputSequelizeAttributes, {
schema: _sch_1.Parkings.pgSchema,
});
this.GetAll = async (options = {}) => {
let whereAttributes = {
source: { [sequelize_1.default.Op.in]: ["tsk", "TSK"] },
[sequelize_1.default.Op.and]: [sequelize_1.default.where(sequelize_1.default.fn("ST_GeometryType", sequelize_1.default.col("centroid")), "ST_Point")],
};
let order = [];
if (options.updatedSince) {
whereAttributes.updated_at = {
[sequelize_1.default.Op.gt]: options?.updatedSince,
};
}
if (options.lat && options.lng) {
if (options.range) {
whereAttributes.range = sequelize_1.default.where(sequelize_1.default.fn("ST_DWithin", sequelize_1.default.col("centroid"), sequelize_1.default.cast(sequelize_1.default.fn("ST_SetSRID", sequelize_1.default.fn("ST_MakePoint", options.lng, options.lat), 4326), "geography"), options.range, true), "true");
}
order.push(sequelize_1.default.fn("ST_Distance", sequelize_1.default.col("centroid"), sequelize_1.default.cast(sequelize_1.default.fn("ST_SetSRID", sequelize_1.default.fn("ST_MakePoint", options.lng, options.lat), 4326), "geography")));
}
const result = await this.sequelizeModel.findAll({
attributes: this.attributeOptions,
include: [
...this.includeOptions,
{
as: "tsk_districts",
model: this.tskDistrictsRepository.sequelizeModel,
attributes: [],
where: options.districts && options.districts.length > 0
? {
district: options.districts,
}
: undefined,
},
{
model: this.paymentsRepository.sequelizeModel,
as: "parking_payments",
required: false,
subQuery: false,
},
],
where: whereAttributes,
limit: options?.limit,
offset: Number.isInteger(options?.offset) ? options?.offset : undefined,
order,
});
return (0, output_gateway_1.buildGeojsonFeatureCollection)(result.map((record) => {
return TskFeatureMapper_1.TskFeatureMapper.formatOutput(record);
}));
};
this.GetOne = async (id) => {
const result = await this.sequelizeModel.findOne({
attributes: this.attributeOptions,
where: {
source_id: id,
source: {
[sequelize_1.default.Op.in]: ["tsk", "TSK"],
},
[sequelize_1.default.Op.and]: [sequelize_1.default.where(sequelize_1.default.fn("ST_GeometryType", sequelize_1.default.col("centroid")), "ST_Point")],
},
include: [
...this.includeOptions,
{
as: "tsk_districts",
model: this.tskDistrictsRepository.sequelizeModel,
attributes: [],
},
],
});
return result && TskFeatureMapper_1.TskFeatureMapper.formatOutput(result);
};
this.GetProperties = async () => {
return [];
};
this.measurementsRepository = new ParkingsMeasurementsModels_1.ParkingsMeasurementsModels({
..._sch_1.Parkings.measurementsActual,
outputJsonSchema: ParkingMeasurementsDtoSchema_1.ParkingMeasurementsDtoSchema,
});
this.tskDistrictsRepository = new TskDistrictsRepository_1.TskDistrictsRepository();
this.tskAverageRepository = new TskAverageOccupancyRepository_1.TskAverageOccupancyRepository();
this.paymentsRepository = new ParkingPaymentsRepository_1.ParkingPaymentsRepository();
this.sequelizeModel.hasOne(this.measurementsRepository.sequelizeModel, {
as: "measurements",
foreignKey: "source_id",
sourceKey: "source_id",
});
this.sequelizeModel.hasOne(this.tskDistrictsRepository.sequelizeModel, {
as: "tsk_districts",
foreignKey: "source_id",
sourceKey: "source_id",
});
this.sequelizeModel.hasOne(this.tskAverageRepository.sequelizeModel, {
as: "tsk_average_occupancy",
foreignKey: "source_id",
sourceKey: "source_id",
});
this.sequelizeModel.hasOne(this.paymentsRepository.sequelizeModel, {
as: "parking_payments",
foreignKey: "parking_id",
sourceKey: "id",
});
}
IsPrimaryIdNumber(_idKey) {
return Promise.resolve(false);
}
PrimaryIdentifierSelection(id) {
return { id };
}
get attributeOptions() {
return [
"centroid",
"parking_type",
[sequelize_1.default.col("parkings.source_id"), "id"],
"name",
[sequelize_1.default.col("measurements.available_spot_number"), "num_of_free_places"],
[sequelize_1.default.col("measurements.occupied_spot_number"), "num_of_taken_places"],
[sequelize_1.default.col("measurements.updated_at"), "updated_at"],
[sequelize_1.default.col("parkings.total_spot_number"), "total_num_of_places"],
"address",
[sequelize_1.default.col("tsk_average_occupancy.average_occupancy"), "average_occupancy"],
[sequelize_1.default.col("tsk_districts.district"), "district"],
[sequelize_1.default.col("measurements.date_modified"), "last_updated"],
];
}
get includeOptions() {
return [
{
as: "measurements",
model: this.measurementsRepository.sequelizeModel,
attributes: [],
},
{
as: "tsk_average_occupancy",
model: this.tskAverageRepository.sequelizeModel,
attributes: [],
required: true,
},
];
}
}
exports.TskParkingLotsRepository = TskParkingLotsRepository;
//# sourceMappingURL=TskParkingLotsRepository.js.map