"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var AdminBoundariesService_1; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AdminBoundariesService = void 0; const common_1 = require("@nestjs/common"); const typeorm_1 = require("@nestjs/typeorm"); const typeorm_2 = require("typeorm"); const admin_boundary_entity_1 = require("./entities/admin-boundary.entity"); let AdminBoundariesService = AdminBoundariesService_1 = class AdminBoundariesService { adminBoundaryRepo; logger = new common_1.Logger(AdminBoundariesService_1.name); constructor(adminBoundaryRepo) { this.adminBoundaryRepo = adminBoundaryRepo; } async importGeoJSON(targetCountryCode, geoJson) { this.logger.log(`Importing admin boundaries for ${targetCountryCode}...`); let imported = 0; let errors = 0; let skipped = 0; if (!geoJson || !geoJson.features || !Array.isArray(geoJson.features)) { this.logger.error('Invalid GeoJSON format'); return { success: false, imported: 0, errors: 1, skipped: 0 }; } for (const feature of geoJson.features) { try { const props = feature.properties || {}; const countryCode = props.country || props.iso_3166_1_alpha2; if (targetCountryCode && countryCode && countryCode.toUpperCase() !== targetCountryCode.toUpperCase()) { skipped++; continue; } const subtype = (props.subtype || '').toLowerCase(); let adminLevel; switch (subtype) { case 'country': adminLevel = 2; break; case 'region': adminLevel = 4; break; case 'county': adminLevel = 6; break; case 'localadmin': adminLevel = 8; break; case 'locality': adminLevel = 8; break; case 'neighborhood': adminLevel = 10; break; case 'macrohood': adminLevel = 9; break; case 'microhood': adminLevel = 11; break; default: adminLevel = parseInt(props.admin_level || props.adminLevel, 10); } if (isNaN(adminLevel)) { skipped++; continue; } const nameAr = props['names']?.['primary'] || props['names']?.['common'] || props['name_ar'] || props['name']; const nameEn = props['names']?.['en'] || props['name_en']; const isArabic = (text) => /[\u0600-\u06FF]/.test(text); if (['JO', 'SY', 'EG'].includes(targetCountryCode.toUpperCase()) && nameAr && !isArabic(nameAr)) { const alternativeAr = Object.values(props['names'] || {}).find(v => typeof v === 'string' && isArabic(v)); if (!alternativeAr) { skipped++; continue; } } let geom = feature.geometry; if (geom.type === 'Polygon') { geom = { type: 'MultiPolygon', coordinates: [geom.coordinates] }; } else if (geom.type !== 'MultiPolygon') { skipped++; continue; } const boundary = this.adminBoundaryRepo.create({ country_code: targetCountryCode.toUpperCase(), admin_level: adminLevel, name_ar: nameAr, name_en: nameEn, geom: geom, }); await this.adminBoundaryRepo.save(boundary); imported++; } catch (err) { this.logger.error(`Error importing feature: ${err.message}`); errors++; } } this.logger.log(`Import finished. Imported: ${imported}, Errors: ${errors}, Skipped: ${skipped}`); return { success: true, imported, errors, skipped }; } async importFromFile(countryCode, filePath) { const fs = require('fs'); if (!fs.existsSync(filePath)) { this.logger.error(`File not found: ${filePath}`); return { success: false, imported: 0, errors: 1, skipped: 0 }; } try { const data = fs.readFileSync(filePath, 'utf8'); const geoJson = JSON.parse(data); return this.importGeoJSON(countryCode, geoJson); } catch (err) { this.logger.error(`Failed to read or parse GeoJSON file: ${err.message}`); return { success: false, imported: 0, errors: 1, skipped: 0 }; } } }; exports.AdminBoundariesService = AdminBoundariesService; exports.AdminBoundariesService = AdminBoundariesService = AdminBoundariesService_1 = __decorate([ (0, common_1.Injectable)(), __param(0, (0, typeorm_1.InjectRepository)(admin_boundary_entity_1.AdminBoundary)), __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object]) ], AdminBoundariesService); //# sourceMappingURL=admin-boundaries.service.js.map