login function

Future<(User, String)> login(
  1. String serverUrl,
  2. String username,
  3. String password
)

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);
  }
}