MIF_E31231623/android/wisata_app/lib/models/destination_model.dart

139 lines
3.4 KiB
Dart

import '../config/api_config.dart';
class Destination {
final int id;
final String nama;
final String deskripsi;
final String lokasi;
final double rating;
final String kategori;
final String gambar;
final String modelPath;
final String deskripsiLengkap;
final String ketinggian;
final String tiketParkir;
final String jamOperasional;
final bool isVideo;
final String videoPath;
const Destination({
required this.id,
required this.nama,
required this.deskripsi,
required this.lokasi,
required this.rating,
required this.kategori,
required this.gambar,
required this.modelPath,
required this.deskripsiLengkap,
required this.ketinggian,
required this.tiketParkir,
required this.jamOperasional,
required this.isVideo,
required this.videoPath,
});
factory Destination.fromJson(Map<String, dynamic> json) {
return Destination(
id: _parseInt(json['id']),
nama: (json['nama'] ?? '').toString(),
deskripsi: (json['deskripsi'] ?? '').toString(),
lokasi: _normalizeLokasi(
(json['lokasi'] ?? '').toString(),
),
rating: _parseDouble(json['rating']),
kategori: (json['kategori'] ?? 'Wisata').toString(),
gambar: _resolveImageUrl(
(json['image'] ??
json['gambar'] ??
json['image_url'] ??
'')
.toString(),
),
modelPath: _resolveStorageUrl(
(json['model_path'] ?? '').toString(),
),
deskripsiLengkap:
(json['overview'] ??
json['deskripsi_lengkap'] ??
json['deskripsi'] ??
'')
.toString(),
ketinggian:
(json['ketinggian'] ?? '').toString(),
tiketParkir:
(json['tiket_parkir'] ?? '').toString(),
jamOperasional:
(json['jam_operasional'] ?? '').toString(),
isVideo: json['is_video'] == 1 ||
json['is_video'] == true,
videoPath: _resolveStorageUrl(
(json['video_path'] ?? '').toString(),
),
);
}
static int _parseInt(dynamic value) {
if (value == null) return 0;
if (value is int) return value;
return int.tryParse(value.toString()) ?? 0;
}
static double _parseDouble(dynamic value) {
if (value == null) return 0.0;
if (value is double) return value;
if (value is int) return value.toDouble();
return double.tryParse(value.toString()) ?? 0.0;
}
static String _normalizeLokasi(String lokasi) {
final value = lokasi.trim();
if (value.isEmpty || value.toLowerCase() == 'lokasi') {
return 'Lumajang, Jawa Timur';
}
return value;
}
static String _resolveImageUrl(String path) {
if (path.trim().isEmpty) {
return '';
}
final cleaned = path.replaceAll('\\', '/');
if (cleaned.startsWith('http')) {
return cleaned;
}
if (cleaned.startsWith('storage/')) {
return '${ApiConfig.storageUrl}${cleaned.replaceFirst('storage/', '')}';
}
return '${ApiConfig.storageUrl}$cleaned';
}
static String _resolveStorageUrl(String path) {
if (path.trim().isEmpty) {
return '';
}
final cleaned = path.replaceAll('\\', '/');
if (cleaned.startsWith('http')) {
return cleaned;
}
if (cleaned.startsWith('storage/')) {
return '${ApiConfig.storageUrl}${cleaned.replaceFirst('storage/', '')}';
}
return '${ApiConfig.storageUrl}$cleaned';
}
}