app mobile allarmi prima

This commit is contained in:
2025-10-20 19:17:45 +02:00
commit 300912ee02
159 changed files with 11755 additions and 0 deletions

View File

@@ -0,0 +1,166 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../utils/constants.dart';
import '../models/user.dart';
import '../models/allarme.dart';
import '../models/sito.dart';
import '../models/statistiche.dart';
class ApiService {
static final ApiService _instance = ApiService._internal();
factory ApiService() => _instance;
ApiService._internal();
String? _authToken;
void setAuthToken(String token) => _authToken = token;
void clearAuthToken() => _authToken = null;
Map<String, String> _getHeaders({bool includeAuth = true}) {
final headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
};
if (includeAuth && _authToken != null) {
headers['Authorization'] = 'Bearer $_authToken';
}
return headers;
}
Future<Map<String, dynamic>> _handleResponse(http.Response response) async {
if (response.statusCode >= 200 && response.statusCode < 300) {
return json.decode(utf8.decode(response.bodyBytes));
} else {
final error = json.decode(utf8.decode(response.bodyBytes));
throw Exception(error['detail'] ?? 'Errore sconosciuto');
}
}
Future<Map<String, dynamic>> login(String email, String password) async {
final response = await http.post(
Uri.parse('${AppConstants.apiBaseUrl}/auth/login'),
headers: _getHeaders(includeAuth: false),
body: json.encode({'email': email, 'password': password}),
);
return _handleResponse(response);
}
Future<User> getCurrentUser() async {
final response = await http.get(
Uri.parse('${AppConstants.apiBaseUrl}/auth/me'),
headers: _getHeaders(),
);
final data = await _handleResponse(response);
return User.fromJson(data);
}
Future<void> registerFcmToken(String fcmToken) async {
final response = await http.post(
Uri.parse('${AppConstants.apiBaseUrl}/auth/register-fcm-token'),
headers: _getHeaders(),
body: json.encode({'fcm_token': fcmToken}),
);
await _handleResponse(response);
}
Future<AllarmeListResponse> getAllarmi({
int page = 1,
int pageSize = 20,
String? severita,
String? stato,
}) async {
final queryParams = {
'page': page.toString(),
'page_size': pageSize.toString(),
if (severita != null) 'severita': severita,
if (stato != null) 'stato': stato,
};
final uri = Uri.parse('${AppConstants.apiBaseUrl}/allarmi')
.replace(queryParameters: queryParams);
final response = await http.get(uri, headers: _getHeaders());
final data = await _handleResponse(response);
return AllarmeListResponse.fromJson(data);
}
Future<Allarme> getAllarme(int id) async {
final response = await http.get(
Uri.parse('${AppConstants.apiBaseUrl}/allarmi/$id'),
headers: _getHeaders(),
);
final data = await _handleResponse(response);
return Allarme.fromJson(data);
}
Future<Allarme> updateAllarme(int id, {String? stato}) async {
final body = <String, dynamic>{};
if (stato != null) body['stato'] = stato;
final response = await http.patch(
Uri.parse('${AppConstants.apiBaseUrl}/allarmi/$id'),
headers: _getHeaders(),
body: json.encode(body),
);
final data = await _handleResponse(response);
return Allarme.fromJson(data);
}
Future<Sito> getSito(int sitoId) async {
final response = await http.get(
Uri.parse('${AppConstants.apiBaseUrl}/siti/$sitoId'),
headers: _getHeaders(),
);
final data = await _handleResponse(response);
return Sito.fromJson(data);
}
Future<List<Sito>> getSiti({String? tipo}) async {
final queryParams = <String, String>{};
if (tipo != null) queryParams['tipo'] = tipo;
final uri = Uri.parse('${AppConstants.apiBaseUrl}/siti')
.replace(queryParameters: queryParams.isNotEmpty ? queryParams : null);
final response = await http.get(uri, headers: _getHeaders());
final data = await _handleResponse(response);
final items = (data['items'] as List)
.map((item) => Sito.fromJson(item as Map<String, dynamic>))
.toList();
return items;
}
Future<AllarmeListResponse> getAllarmiBySito(int sitoId, {int page = 1, int pageSize = 20}) async {
final queryParams = {
'page': page.toString(),
'page_size': pageSize.toString(),
};
final uri = Uri.parse('${AppConstants.apiBaseUrl}/allarmi/sito/$sitoId')
.replace(queryParameters: queryParams);
final response = await http.get(uri, headers: _getHeaders());
final data = await _handleResponse(response);
return AllarmeListResponse.fromJson(data);
}
Future<Statistiche> getStatistiche() async {
final response = await http.get(
Uri.parse('${AppConstants.apiBaseUrl}/statistiche'),
headers: _getHeaders(),
);
final data = await _handleResponse(response);
return Statistiche.fromJson(data);
}
Future<AllarmiPerGiornoResponse> getAllarmiPerGiorno({int giorni = 30}) async {
final uri = Uri.parse('${AppConstants.apiBaseUrl}/statistiche/allarmi-per-giorno')
.replace(queryParameters: {'giorni': giorni.toString()});
final response = await http.get(uri, headers: _getHeaders());
final data = await _handleResponse(response);
return AllarmiPerGiornoResponse.fromJson(data);
}
}