UNPKG

howsmydriving-nyc

Version:
229 lines (228 loc) 10.4 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var howsmydriving_utils_1 = require("howsmydriving-utils"); var howsmydriving_utils_2 = require("howsmydriving-utils"); var howsmydriving_utils_3 = require("howsmydriving-utils"); var fine_data_1 = require("./models/fine_data"); var logging_1 = require("./logging"); var server_1 = require("./server"); var logging_2 = require("./logging"); // TODO: Consolidate these. var parkingAndCameraViolationsText = 'Total __REGION__ parking and camera violations for #__LICENSE__: __COUNT__', violationsByYearText = 'Violations by year for #', violationsByStatusText = 'Violations by status for #', citationQueryText = 'License #__LICENSE__ has been queried __COUNT__ times.'; var NewYorkCityRegionFactory = /** @class */ (function (_super) { __extends(NewYorkCityRegionFactory, _super); function NewYorkCityRegionFactory() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.name = logging_1.__REGION_NAME__; return _this; } NewYorkCityRegionFactory.prototype.createRegion = function (state_store) { var region = new NewYorkCity(state_store); return Promise.resolve(region); }; return NewYorkCityRegionFactory; }(howsmydriving_utils_3.RegionFactory)); exports.NewYorkCityRegionFactory = NewYorkCityRegionFactory; var NewYorkCity = /** @class */ (function (_super) { __extends(NewYorkCity, _super); function NewYorkCity(state_store) { var _this = _super.call(this, logging_1.__REGION_NAME__, state_store) || this; logging_2.log.debug("Creating instance of " + _this.name + " for region " + logging_1.__REGION_NAME__); return _this; } NewYorkCity.prototype.GetCitationsByPlate = function (plate, state) { logging_2.log.debug("Getting citations for " + state + ":" + plate + " in region " + logging_1.__REGION_NAME__ + "."); return new Promise(function (resolve, reject) { var vehicle = { state: state, plate: plate, types: null }; var external_data = { lookup_source: 'api', fingerprint_id: null, mixpanel_id: null }; server_1.getVehicleResponse(vehicle, null, external_data).then(function (response) { var citations = []; response.vehicle.violations.forEach(function (violation) { var citation = violation; citations.push(citation); }); resolve(citations); }); }); }; NewYorkCity.prototype.ProcessCitationsForRequest = function (citations, query_count) { var citationInfo = citations[0]; logging_2.log.info("ProcessCitationsForRequest called with " + citations.length); server_1._form_plate_lookup_response_parts(undefined, 0, new fine_data_1.FineData(citationInfo.fines), citationInfo.plate, citationInfo.plate_types, citationInfo.state, citationInfo.violations, citationInfo.years, citationInfo.camera_streak_data, citationInfo.previous_lookup); var categorizedCitations = {}; // TODO: Does it work to convert Date's to string for sorting? Might have to use epoch. var chronologicalCitations = {}; var violationsByYear = {}; var violationsByStatus = {}; if (!citations || citations.length == 0) { // Should never happen. There is always at least a "no citations found" citation. throw new Error("We should never be called with zero citations. The controller is responsible for handling 'no records found for region n'"); } var license; var region; for (var i = 0; i < citations.length; i++) { var citation = citations[i]; var year = 1970; var violationDate = new Date(Date.now()); // All citations are from the same license if (license == null) { license = citation.license; } if (region == null) { region = citation.region; } try { violationDate = new Date(Date.parse(citation.ViolationDate)); } catch (e) { // TODO: refactor error handling to a separate file throw new Error(e); } // TODO: Is it possible to have more than 1 citation with exact same time? // Maybe throw an exception if we ever encounter it... if (!(violationDate.getTime().toString() in chronologicalCitations)) { chronologicalCitations[violationDate.getTime().toString()] = new Array(); } chronologicalCitations[violationDate.getTime().toString()].push(citation); if (!(citation.Type in categorizedCitations)) { categorizedCitations[citation.Type] = 0; } categorizedCitations[citation.Type]++; if (!(citation.Status in violationsByStatus)) { violationsByStatus[citation.Status] = 0; } violationsByStatus[citation.Status]++; year = violationDate.getFullYear(); if (!(year.toString() in violationsByYear)) { violationsByYear[year.toString()] = 0; } violationsByYear[year.toString()]++; } var general_summary = parkingAndCameraViolationsText .replace('__LICENSE__', howsmydriving_utils_2.formatPlate(license)) .replace('__REGION__', region) .replace('__COUNT__', Object.keys(citations).length.toString()); Object.keys(categorizedCitations).forEach(function (key) { var line = key + ': ' + categorizedCitations[key]; // Max twitter username is 15 characters, plus the @ general_summary += '\n'; general_summary += line; }); general_summary += '\n\n'; general_summary += citationQueryText .replace('__LICENSE__', howsmydriving_utils_2.formatPlate(license)) .replace('__COUNT__', query_count.toString()); var detailed_list = ''; var sortedChronoCitationKeys = Object.keys(chronologicalCitations).sort(function (a, b) { //return new Date(a).getTime() - new Date(b).getTime(); return howsmydriving_utils_1.CompareNumericStrings(a, b); //(a === b) ? 0 : ( a < b ? -1 : 1); }); var first = true; for (var i = 0; i < sortedChronoCitationKeys.length; i++) { var key = sortedChronoCitationKeys[i]; chronologicalCitations[key].forEach(function (citation) { if (first != true) { detailed_list += '\n'; } first = false; detailed_list += citation.ViolationDate + ", " + citation.Type + ", " + citation.ViolationLocation + ", " + citation.Status; }); } var temporal_summary = violationsByYearText + howsmydriving_utils_2.formatPlate(license) + ':'; Object.keys(violationsByYear).forEach(function (key) { temporal_summary += '\n'; temporal_summary += key + ": " + violationsByYear[key].toString(); }); var type_summary = violationsByStatusText + howsmydriving_utils_2.formatPlate(license) + ':'; Object.keys(violationsByStatus).forEach(function (key) { type_summary += '\n'; type_summary += key + ": " + violationsByStatus[key]; }); // Return them in the order they should be rendered. return [general_summary, detailed_list, type_summary, temporal_summary]; }; NewYorkCity.prototype.GetRecentCollisions = function () { logging_2.log.info("Collisions feature is not implemented in NYC region plugin."); return Promise.resolve([]); }; NewYorkCity.prototype.ProcessCollisions = function (collisions) { return Promise.resolve([]); }; return NewYorkCity; }(howsmydriving_utils_3.Region)); exports.NewYorkCity = NewYorkCity; function CitationType() { var citation_types = [ 'PARKING', 'TRAFFIC CAMERA', 'INFRACTION', 'EXPLODING CAR', 'G@SSHOLE DRIVIST', 'PARKING IN BIKE LANE', 'BOOMER ENTITLEMENT' ]; return citation_types[Math.floor(Math.random() * citation_types.length)]; } function CitationStatus() { var citation_statuses = [ 'PAID', 'ACTIVE', 'DISPOSED', 'COLLECTIONS', 'BUDDYS_A_JUDGE' ]; return citation_statuses[Math.floor(Math.random() * citation_statuses.length)]; } function CitationValidationDate() { var days_in_month = { 1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31 }; var month = Math.floor(Math.random() * 12) + 1; var day = Math.floor(Math.random() * days_in_month[month]) + 1; var year = Math.floor(Math.random() * 10) + 2010; return month + "/" + day + "/" + year; } function CitationValidationLocation() { var directions = ['NE', 'NW', 'SE', 'SW']; var street_types = ['St', 'Ave', 'Blvd', 'Circle', 'Ct']; var num = Math.floor(Math.random() * 100000) + 1; var dir = directions[Math.floor(Math.random() * 4)]; var street = Math.floor(Math.random() * 145) + 1; var street_type = street_types[Math.floor(Math.random() * street_types.length)]; return num + " " + dir + " " + street + "th " + street_type; } var Factory = new NewYorkCityRegionFactory(); exports.default = Factory; exports.Factory = Factory;