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
+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>mx.gob.slp.baseadminweb</groupId>
<artifactId>base-admin-web</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>base-admin-web-domain</artifactId>
<name>base-admin-web-domain</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,96 @@
package mx.gob.slp.baseadminweb.domain.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.Table;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "users")
public class AppUser implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true, length = 50)
private String username;
@Column(nullable = false, length = 120)
private String password;
@Column(nullable = false, length = 120)
private String displayName;
@Column(nullable = false)
private boolean enabled;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles = new HashSet<>();
protected AppUser() {
}
public AppUser(String username, String password, String displayName, boolean enabled) {
this.username = username;
this.password = password;
this.displayName = displayName;
this.enabled = enabled;
}
public Long getId() {
return id;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles.stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.toList();
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
public String getDisplayName() {
return displayName;
}
public Set<Role> getRoles() {
return roles;
}
@Override
public boolean isEnabled() {
return enabled;
}
public void addRole(Role role) {
roles.add(role);
}
}
@@ -0,0 +1,84 @@
package mx.gob.slp.baseadminweb.domain.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.Instant;
@Entity
@Table(name = "pass_codes")
public class PassCode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 120)
private String name;
@Column(nullable = false, unique = true, length = 16, updatable = false)
private String code;
@Column(nullable = false, updatable = false)
private Instant createdAt;
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 20)
private PassCodeStatus status;
@Column(nullable = false)
private boolean scanned;
private Instant scannedAt;
protected PassCode() {
}
public PassCode(String name, String code, Instant createdAt) {
this.name = name;
this.code = code;
this.createdAt = createdAt;
this.status = PassCodeStatus.ACTIVO;
this.scanned = false;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getCode() {
return code;
}
public Instant getCreatedAt() {
return createdAt;
}
public PassCodeStatus getStatus() {
return status;
}
public boolean isScanned() {
return scanned;
}
public Instant getScannedAt() {
return scannedAt;
}
public void markAsUsed(Instant scannedAt) {
this.status = PassCodeStatus.UTILIZADO;
this.scanned = true;
this.scannedAt = scannedAt;
}
}
@@ -0,0 +1,6 @@
package mx.gob.slp.baseadminweb.domain.model;
public enum PassCodeStatus {
ACTIVO,
UTILIZADO
}
@@ -0,0 +1,43 @@
package mx.gob.slp.baseadminweb.domain.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true, length = 50)
private String name;
@Column(nullable = false, length = 150)
private String description;
protected Role() {
}
public Role(String name, String description) {
this.name = name;
this.description = description;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
@@ -0,0 +1,11 @@
package mx.gob.slp.baseadminweb.domain.repository;
import mx.gob.slp.baseadminweb.domain.model.AppUser;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface AppUserRepository extends JpaRepository<AppUser, Long> {
Optional<AppUser> findByUsername(String username);
}
@@ -0,0 +1,13 @@
package mx.gob.slp.baseadminweb.domain.repository;
import mx.gob.slp.baseadminweb.domain.model.PassCode;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface PassCodeRepository extends JpaRepository<PassCode, Long> {
Optional<PassCode> findByCode(String code);
boolean existsByCode(String code);
}
@@ -0,0 +1,11 @@
package mx.gob.slp.baseadminweb.domain.repository;
import mx.gob.slp.baseadminweb.domain.model.Role;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface RoleRepository extends JpaRepository<Role, Long> {
Optional<Role> findByName(String name);
}