login function
Log in to a Music Assistant server with username and password.
Returns a tuple of (User, access_token). Throws LoginFailedException for bad credentials or CannotConnectException for connection-level failures.
Implementation
Future<(User, String)> login(String serverUrl, String username, String password) async {
try {
final response = await http.post(
Uri.parse(serverUrl).resolve('auth/login'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'credentials': {'username': username, 'password': password},
}),
);
if (response.statusCode == 401) {
throw const LoginFailedException('Invalid username or password');
}
if (response.statusCode != 200) {
throw CannotConnectException('Login failed with status ${response.statusCode}');
}
final data = jsonDecode(response.body) as Map<String, dynamic>;
final user = User.fromJson(data['user'] as Map<String, dynamic>);
final accessToken = data['token'] as String;
return (user, accessToken);
} on LoginFailedException {
rethrow;
} on CannotConnectException {
rethrow;
} on http.ClientException catch (e) {
throw CannotConnectException(e.message);
}
}