UNPKG

@golemio/parkings

Version:
159 lines 7.71 kB
"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