import 'package:dio/dio.dart'; import '../../../common/network/dio_provider.dart'; import '../../../models/pb/jinzhi/v1/account.pb.dart' as pb; import 'auth_models.dart'; /// 金值账户的 protobuf-over-HTTP 客户端。 class AuthApi { const AuthApi(this._dio); final Dio _dio; Future sendSmsCode(String phone) async { final response = await _dio.post>( '/api/v1/auth/sms/send', data: pb.SendSmsCodeRequest(phone: phone).writeToBuffer(), options: protobufOptions(), ); return pb.SendSmsCodeReply.fromBuffer( response.data ?? const [], ).expiresIn; } Future verifySmsCode(String phone, String code) async { final response = await _dio.post>( '/api/v1/auth/sms/verify', data: pb.VerifySmsCodeRequest(phone: phone, code: code).writeToBuffer(), options: protobufOptions(), ); return AuthLoginResult.fromProto( pb.VerifySmsCodeReply.fromBuffer(response.data ?? const []), ); } Future verifyOneKeyLogin(String loginToken) async { final response = await _dio.post>( '/api/v1/auth/onekey/verify', data: pb.VerifyOneKeyLoginRequest(loginToken: loginToken).writeToBuffer(), options: protobufOptions(), ); return AuthLoginResult.fromProto( pb.VerifySmsCodeReply.fromBuffer(response.data ?? const []), ); } Future getProfile() async { final response = await _dio.get>( '/api/v1/me', options: protobufOptions(), ); final reply = pb.ProfileReply.fromBuffer(response.data ?? const []); if (!reply.hasUser()) { throw const FormatException('账号资料响应缺少 user'); } return _userFromProto(reply.user); } Future deleteAccount(String smsCode) async { await _dio.delete>( '/api/v1/me', data: pb.DeleteAccountRequest(smsCode: smsCode).writeToBuffer(), options: protobufOptions(), ); } } class AuthLoginResult { const AuthLoginResult({ required this.accessToken, required this.expiresIn, required this.user, }); final String accessToken; final int expiresIn; final JinzhiUser user; factory AuthLoginResult.fromProto(pb.VerifySmsCodeReply reply) { if (reply.accessToken.trim().isEmpty || !reply.hasUser()) { throw const FormatException('登录响应缺少 access_token 或 user'); } return AuthLoginResult( accessToken: reply.accessToken.trim(), expiresIn: reply.expiresIn, user: _userFromProto(reply.user), ); } } JinzhiUser _userFromProto(pb.UserInfo user) => JinzhiUser( id: user.id.trim(), phone: user.phone.trim(), createdAt: user.createdAt.trim(), );