import 'package:dio/dio.dart'; import '../../auth/token_storage.dart'; import '../../marianumconnect_query.dart'; import 'auth_login_response.dart'; /// Performs the Marianum-Connect bearer login. Used both by the foreground /// login flow and by the auth interceptor's silent re-auth on 401. Does *not* /// run through the shared dio instance — that one has the interceptor, which /// would attempt to re-auth us into a loop if our credentials are wrong. class AuthLogin extends MarianumConnectQuery { static const Duration _connectTimeout = Duration(seconds: 10); static const Duration _receiveTimeout = Duration(seconds: 15); final MarianumConnectTokenStorage _tokenStorage; AuthLogin({ MarianumConnectTokenStorage tokenStorage = const MarianumConnectTokenStorage(), Dio? dio, }) : _tokenStorage = tokenStorage, super(dio: dio ?? _buildDio()); static Dio _buildDio() => Dio( BaseOptions( connectTimeout: _connectTimeout, receiveTimeout: _receiveTimeout, sendTimeout: _connectTimeout, responseType: ResponseType.json, contentType: 'application/json', ), ); Future run({ required String username, required String password, required String tokenName, }) => guard(() async { final response = await dio.post>( endpoint('auth/login'), data: { 'username': username, 'password': password, 'tokenName': tokenName, }, ); final payload = AuthLoginResponse.fromJson(response.data!); await _tokenStorage.write( token: payload.token, tokenId: payload.tokenId, expiresAt: payload.expiresAt, ); return payload; }); }