Initial commit: QR Scanner Flutter app
App móvil para validar pases QR contra base-admin-web con login Cognito, escáner en tiempo real, feedback auditivo/háptico y README completo.
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
import 'package:qrscanner/models/login_response.dart';
|
||||
|
||||
class AuthSession {
|
||||
const AuthSession({
|
||||
required this.username,
|
||||
required this.accessToken,
|
||||
required this.tokenType,
|
||||
required this.expiresIn,
|
||||
required this.roles,
|
||||
this.refreshToken,
|
||||
this.idToken,
|
||||
});
|
||||
|
||||
factory AuthSession.fromLoginResponse(LoginResponse response) {
|
||||
return AuthSession(
|
||||
username: response.username ?? '',
|
||||
accessToken: response.accessToken ?? '',
|
||||
refreshToken: response.refreshToken,
|
||||
idToken: response.idToken,
|
||||
tokenType: response.tokenType ?? 'Bearer',
|
||||
expiresIn: response.expiresIn ?? 0,
|
||||
roles: response.roles,
|
||||
);
|
||||
}
|
||||
|
||||
factory AuthSession.fromJson(Map<String, dynamic> json) {
|
||||
return AuthSession(
|
||||
username: json['username'] as String? ?? '',
|
||||
accessToken: json['accessToken'] as String? ?? '',
|
||||
refreshToken: json['refreshToken'] as String?,
|
||||
idToken: json['idToken'] as String?,
|
||||
tokenType: json['tokenType'] as String? ?? 'Bearer',
|
||||
expiresIn: (json['expiresIn'] as num?)?.toInt() ?? 0,
|
||||
roles: (json['roles'] as List<dynamic>?)
|
||||
?.map((role) => role.toString())
|
||||
.toList() ??
|
||||
const [],
|
||||
);
|
||||
}
|
||||
|
||||
final String username;
|
||||
final String accessToken;
|
||||
final String? refreshToken;
|
||||
final String? idToken;
|
||||
final String tokenType;
|
||||
final int expiresIn;
|
||||
final List<String> roles;
|
||||
|
||||
/// Token usado en las peticiones API (`Authorization: Bearer ...`).
|
||||
String get authorizationHeader => '$tokenType $accessToken';
|
||||
|
||||
bool get isScanner =>
|
||||
roles.contains('ROLE_SCANNER') || roles.contains('scanners');
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'username': username,
|
||||
'accessToken': accessToken,
|
||||
'refreshToken': refreshToken,
|
||||
'idToken': idToken,
|
||||
'tokenType': tokenType,
|
||||
'expiresIn': expiresIn,
|
||||
'roles': roles,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
class LoginResponse {
|
||||
const LoginResponse({
|
||||
required this.success,
|
||||
this.accessToken,
|
||||
this.refreshToken,
|
||||
this.idToken,
|
||||
this.tokenType,
|
||||
this.expiresIn,
|
||||
this.username,
|
||||
this.roles = const [],
|
||||
this.message,
|
||||
});
|
||||
|
||||
factory LoginResponse.fromJson(Map<String, dynamic> json) {
|
||||
return LoginResponse(
|
||||
success: json['success'] == true,
|
||||
accessToken: json['accessToken'] as String?,
|
||||
refreshToken: json['refreshToken'] as String?,
|
||||
idToken: json['idToken'] as String?,
|
||||
tokenType: json['tokenType'] as String?,
|
||||
expiresIn: (json['expiresIn'] as num?)?.toInt(),
|
||||
username: json['username'] as String?,
|
||||
roles: (json['roles'] as List<dynamic>?)
|
||||
?.map((role) => role.toString())
|
||||
.toList() ??
|
||||
const [],
|
||||
message: json['message'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
final bool success;
|
||||
final String? accessToken;
|
||||
final String? refreshToken;
|
||||
final String? idToken;
|
||||
final String? tokenType;
|
||||
final int? expiresIn;
|
||||
final String? username;
|
||||
final List<String> roles;
|
||||
final String? message;
|
||||
|
||||
LoginResponse copyWith({
|
||||
bool? success,
|
||||
String? accessToken,
|
||||
String? refreshToken,
|
||||
String? idToken,
|
||||
String? tokenType,
|
||||
int? expiresIn,
|
||||
String? username,
|
||||
List<String>? roles,
|
||||
String? message,
|
||||
}) {
|
||||
return LoginResponse(
|
||||
success: success ?? this.success,
|
||||
accessToken: accessToken ?? this.accessToken,
|
||||
refreshToken: refreshToken ?? this.refreshToken,
|
||||
idToken: idToken ?? this.idToken,
|
||||
tokenType: tokenType ?? this.tokenType,
|
||||
expiresIn: expiresIn ?? this.expiresIn,
|
||||
username: username ?? this.username,
|
||||
roles: roles ?? this.roles,
|
||||
message: message ?? this.message,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
class PassCode {
|
||||
const PassCode({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.code,
|
||||
required this.status,
|
||||
required this.scanned,
|
||||
required this.createdAt,
|
||||
this.scannedAt,
|
||||
});
|
||||
|
||||
factory PassCode.fromJson(Map<String, dynamic> json) {
|
||||
return PassCode(
|
||||
id: (json['id'] as num).toInt(),
|
||||
name: json['name'] as String? ?? '',
|
||||
code: json['code'] as String? ?? '',
|
||||
status: json['status'] as String? ?? '',
|
||||
scanned: json['scanned'] == true,
|
||||
createdAt: json['createdAt'] as String? ?? '',
|
||||
scannedAt: json['scannedAt'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
final int id;
|
||||
final String name;
|
||||
final String code;
|
||||
final String status;
|
||||
final bool scanned;
|
||||
final String createdAt;
|
||||
final String? scannedAt;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import 'package:qrscanner/models/pass_code.dart';
|
||||
|
||||
class ScanResponse {
|
||||
const ScanResponse({
|
||||
required this.success,
|
||||
this.message,
|
||||
this.passCode,
|
||||
});
|
||||
|
||||
factory ScanResponse.fromJson(Map<String, dynamic> json) {
|
||||
return ScanResponse(
|
||||
success: json['success'] == true,
|
||||
message: json['message'] as String?,
|
||||
passCode: json['passCode'] is Map<String, dynamic>
|
||||
? PassCode.fromJson(json['passCode'] as Map<String, dynamic>)
|
||||
: null,
|
||||
);
|
||||
}
|
||||
|
||||
final bool success;
|
||||
final String? message;
|
||||
final PassCode? passCode;
|
||||
}
|
||||
Reference in New Issue
Block a user