Estado base antes de integración Cognito.

Incluye admin web Spring Boot, API JWT para escáner y app Flutter qrscanner con login y escaneo de pases.
This commit is contained in:
Alejandro Lara
2026-06-09 15:51:44 -06:00
commit f8468350d5
2162 changed files with 433376 additions and 0 deletions
@@ -0,0 +1,52 @@
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,
});
factory AuthSession.fromLoginResponse(LoginResponse response) {
return AuthSession(
username: response.username ?? '',
accessToken: response.accessToken ?? '',
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? ?? '',
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 tokenType;
final int expiresIn;
final List<String> roles;
String get authorizationHeader => '$tokenType $accessToken';
bool get isScanner => roles.contains('ROLE_SCANNER');
Map<String, dynamic> toJson() => {
'username': username,
'accessToken': accessToken,
'tokenType': tokenType,
'expiresIn': expiresIn,
'roles': roles,
};
}
@@ -0,0 +1,54 @@
class LoginResponse {
const LoginResponse({
required this.success,
this.accessToken,
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?,
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? tokenType;
final int? expiresIn;
final String? username;
final List<String> roles;
final String? message;
LoginResponse copyWith({
bool? success,
String? accessToken,
String? tokenType,
int? expiresIn,
String? username,
List<String>? roles,
String? message,
}) {
return LoginResponse(
success: success ?? this.success,
accessToken: accessToken ?? this.accessToken,
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;
}