✨ Added ImportService to retrieve and validate data from the Geoapify API, as well as convert data into POI objects.
parent
2f402710f0
commit
afdc6b7b33
@ -0,0 +1,98 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { HttpClient } from '@angular/common/http';
|
||||||
|
import { Observable, throwError } from 'rxjs';
|
||||||
|
import { catchError, map } from 'rxjs/operators';
|
||||||
|
import { POI } from '../model/POI';
|
||||||
|
|
||||||
|
export interface GeoapifyFeature {
|
||||||
|
type: string;
|
||||||
|
properties: {
|
||||||
|
name: string;
|
||||||
|
country: string;
|
||||||
|
city: string;
|
||||||
|
street: string;
|
||||||
|
housenumber?: string;
|
||||||
|
postcode: string;
|
||||||
|
lon: number;
|
||||||
|
lat: number;
|
||||||
|
formatted: string;
|
||||||
|
categories: string[];
|
||||||
|
website?: string;
|
||||||
|
contact?: {
|
||||||
|
phone?: string;
|
||||||
|
email?: string;
|
||||||
|
};
|
||||||
|
opening_hours?: string;
|
||||||
|
[key: string]: any;
|
||||||
|
};
|
||||||
|
geometry: {
|
||||||
|
type: string;
|
||||||
|
coordinates: [number, number];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GeoapifyResponse {
|
||||||
|
type: string;
|
||||||
|
features: GeoapifyFeature[];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class ImportService {
|
||||||
|
constructor(private http: HttpClient) {}
|
||||||
|
|
||||||
|
fetchDataFromUrl(url: string): Observable<GeoapifyResponse> {
|
||||||
|
return this.http.get<GeoapifyResponse>(url).pipe(
|
||||||
|
catchError(error => {
|
||||||
|
console.error('Erreur lors de la récupération des données:', error);
|
||||||
|
return throwError(() => new Error('Impossible de récupérer les données depuis l\'URL fournie'));
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
validateGeoapifyData(data: any): boolean {
|
||||||
|
return (
|
||||||
|
data &&
|
||||||
|
data.type === 'FeatureCollection' &&
|
||||||
|
Array.isArray(data.features) &&
|
||||||
|
data.features.length > 0 &&
|
||||||
|
data.features.every((feature: any) =>
|
||||||
|
feature.type === 'Feature' &&
|
||||||
|
feature.properties &&
|
||||||
|
feature.geometry
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
convertToPOI(feature: GeoapifyFeature, fieldMappings: { [key: string]: string }): POI {
|
||||||
|
const poi: POI = {
|
||||||
|
id: '',
|
||||||
|
location: feature.geometry.coordinates,
|
||||||
|
complete_address: feature.properties.formatted || '',
|
||||||
|
title: feature.properties.name || '',
|
||||||
|
files: [],
|
||||||
|
description: '',
|
||||||
|
user_id: null,
|
||||||
|
is_poi: true,
|
||||||
|
date: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
// Appliquer les mappings de champs
|
||||||
|
Object.entries(fieldMappings).forEach(([targetField, sourceField]) => {
|
||||||
|
if (targetField === 'latitude') {
|
||||||
|
poi.location[0] = feature.properties[sourceField];
|
||||||
|
} else if (targetField === 'longitude') {
|
||||||
|
poi.location[1] = feature.properties[sourceField];
|
||||||
|
} else if (sourceField && feature.properties[sourceField]) {
|
||||||
|
(poi as any)[targetField] = feature.properties[sourceField];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (poi.description === '') {
|
||||||
|
poi.description = poi.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
return poi;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue