login static method

Future<Map<String, dynamic>> login(
  1. String email,
  2. String password
)

Implementation

static Future<Map<String, dynamic>> login(
    String email, String password) async {
  final qb = QueryBuilder(table: _config.table);
  final user =
      await qb.where(_config.emailColumn, '=', email).limit(1).first();

  if (user == null) {
    throw AuthException('Invalid email or password');
  }

  final hashedPassword = user[_config.passwordColumn] as String;
  final isMatch = Hashing().verify(password, hashedPassword);

  if (!isMatch) {
    throw AuthException('Invalid email or password');
  }

  if (_config.requireEmailVerification && user['email_verified_at'] == null) {
    throw AuthException('Email verification required.');
  }

  final cleanUser = _sanitizeUserData(user);

  // ✅ Create JWT token with expiry
  final jwt = JWT({
    'id': cleanUser['id'],
    'email': cleanUser[_config.emailColumn],
  });

  final token = jwt.sign(
    SecretKey(_config.jwtSecret!),
    expiresIn: Duration(hours: _config.jwtExpiryHours),
  );

  return {
    'user': cleanUser,
    'token': token,
  };
}