2026-04-14-8 auth and commercial
This commit is contained in:
+137
@@ -0,0 +1,137 @@
|
||||
"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;
|
||||
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", [typeorm_2.Repository])
|
||||
], AdminBoundariesService);
|
||||
//# sourceMappingURL=admin-boundaries.service.js.map
|
||||
Reference in New Issue
Block a user