0e19aa0521
- Implemented Error Log API to capture and store error logs from various services. - Updated admin_ui to include Error Log Viewer component for inspecting logs. - Enhanced error handling in auth_api, employee_api, and transit_api to report errors to the Error Log API. - Modified existing services to utilize the new error logging functionality. - Updated Docker Compose configuration to include the Error Log API service. - Added error logging service in bus_terminal for Flutter application.
96 lines
2.6 KiB
Dart
96 lines
2.6 KiB
Dart
import 'dart:convert';
|
|
import 'package:http/http.dart' as http;
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import '../models/user.dart';
|
|
import 'error_log_service.dart';
|
|
|
|
/// Authentication Service
|
|
class AuthService {
|
|
static const String _apiBaseUrl = 'https://transit.xtransit.testinstance.nl';
|
|
static const String _tokenKey = 'auth_token';
|
|
|
|
late SharedPreferences _prefs;
|
|
|
|
Future<void> _reportError(String partOfService, Object error) {
|
|
return ErrorLogService.report(
|
|
service: 'bus_terminal',
|
|
partOfService: partOfService,
|
|
error: error.toString(),
|
|
);
|
|
}
|
|
|
|
Future<void> _initPrefs() async {
|
|
_prefs = await SharedPreferences.getInstance();
|
|
}
|
|
|
|
/// Login with userCode and password
|
|
Future<AuthResponse> login({
|
|
required int userCode,
|
|
required String password,
|
|
}) async {
|
|
await _initPrefs();
|
|
|
|
try {
|
|
final response = await http.post(
|
|
Uri.parse('$_apiBaseUrl/login'),
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: jsonEncode({
|
|
'userCode': userCode,
|
|
'password': password,
|
|
}),
|
|
);
|
|
|
|
if (response.statusCode == 200) {
|
|
final body = response.body;
|
|
try {
|
|
final data = jsonDecode(body) as Map<String, dynamic>;
|
|
final authResponse = AuthResponse.fromJson(data);
|
|
|
|
// Store token
|
|
await _prefs.setString(_tokenKey, authResponse.token);
|
|
|
|
return authResponse;
|
|
} catch (e) {
|
|
await _reportError('AuthService.login.parse', e);
|
|
// Surface the response body to help debug backend field names / formats
|
|
throw Exception('Login parse error: $e -- response body: $body');
|
|
}
|
|
} else if (response.statusCode == 401) {
|
|
throw Exception('Invalid credentials');
|
|
} else {
|
|
throw Exception('Login failed: ${response.statusCode}');
|
|
}
|
|
} catch (e) {
|
|
await _reportError('AuthService.login', e);
|
|
throw Exception('Login error: $e');
|
|
}
|
|
}
|
|
|
|
/// Get stored token
|
|
Future<String?> getToken() async {
|
|
await _initPrefs();
|
|
return _prefs.getString(_tokenKey);
|
|
}
|
|
|
|
/// Check if user is logged in
|
|
Future<bool> isLoggedIn() async {
|
|
final token = await getToken();
|
|
return token != null;
|
|
}
|
|
|
|
/// Logout
|
|
Future<void> logout() async {
|
|
await _initPrefs();
|
|
await _prefs.remove(_tokenKey);
|
|
}
|
|
|
|
/// Get Authorization header
|
|
Future<Map<String, String>> getAuthHeaders() async {
|
|
final token = await getToken();
|
|
return {
|
|
'Authorization': 'Bearer $token',
|
|
'Content-Type': 'application/json',
|
|
};
|
|
}
|
|
}
|