Virtual Checker built with Angular + Firebase + Flutter + JakartaEE + Microprofile + PostgreSQL on Azure - Parte 4






This post is about the inspector backend,  it will be deployed in our payara server.


The source code is on GitHub: https://github.com/joedayz/ws-inspector


1. This project will be using Jakarta EE, Microprofile, Blaze Persistence, Apache DeltaSpike, Lombok and Firebase-Admin as principal dependencies. See the pom.xml in GitHub.

2. In webapp/WEB-INF we have the beans.xml, glassfish-resource.xml and glassfish-web.xml:


beans.xml


glassfish-web.xml (context root)


glassfish-resources.xml




3. We will use the publicKey.pem generated in our first post to validate if the user has been authenticated or has the authorization to execute some method. 



4. firebase-sdk.json is the file downloaded from firebase.com mandatory to interact with our firebase account.


5. persistence.xml shows the JDBC resource configured in our payara server.





6. apache-deltaspike.properties is configured according to transaction type: JTA.

globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy = org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy


7.  The model will be according to the database model explained in my last post.

For example it is the configuration for the table "asegurado" in the "core" scheme.

@Getter
@Setter
@Entity
@Table(name = "asegurado", schema = "core")
public class AseguradoModel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_asegurado")
private Long idAsegurado;

@Column(name = "nombre")
private String nombre;

@Column(name = "apellido_paterno")
private String apellidoPaterno;

@Column(name = "apellido_materno")
private String apellidoMaterno;

@Column(name = "id_ct_tipo_documento")
private String idCtTipoDocumento;

@Column(name = "numero_documento")
private String numeroDocumento;

@Column(name = "direccion")
private String direccion;

@Column(name = "id_distrito")
private Integer idDistrito;

@Column(name = "telefono_movil")
private String telefonoMovil;

@Column(name = "telefono_fijo")
private String telefonoFijo;

@Column(name = "correo")
private String correo;

@Column(name = "usuario_creacion", updatable = false)
private String usuarioCreacion;

@Column(name = "usuario_modificacion")
private String usuarioModificacion;

@Column(name = "fecha_creacion", updatable = false)
private LocalDateTime fechaCreacion;

@Column(name = "fecha_modificacion")
private LocalDateTime fechaModificacion;
}

It is the table "inspeccion" in the "inspeccion" scheme:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "inspeccion", schema = "inspeccion")
public class InspeccionModel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_inspeccion")
private Long idInspeccion;

@Column(name = "id_vehiculo_asegurado")
private Integer idVehiculoAsegurado;

@Column(name = "codigo_inspeccion")
private String codigoInspeccion;

@Column(name = "codigo_inspeccion_legall")
private String codigoInspeccionLegall;

@Column(name = "id_ct_estado_inspeccion")
private String estado;

@Column(name = "id_tramite")
private Integer idTramite;

@Column(name = "id_distrito")
private String idDistrito;

@Column(name = "id_empleado_inspector")
private Integer idEmpleadoInspector;

@Column(name = "observaciones")
private String observaciones;

@Column(name = "latitude")
private Double latitude;

@Column(name = "longitude")
private Double longitude;

@Column(name = "fecha_termino")
private LocalDateTime fechaTermino;

@Column(name = "direccion_inspeccion")
private String direccionInspeccion;

@Column(name = "usuario_creacion", updatable = false)
private String usuarioCreacion;

@Column(name = "fecha_creacion", updatable = false)
private LocalDateTime fechaCreacion;

@Column(name = "usuario_modificacion")
private String usuarioModificacion;

@Column(name = "fecha_modificacion")
private LocalDateTime fechaModificacion;
}

If you need use some view (vw_inspecciones) the declaration is similar:


@Getter
@Setter
@Entity
@Table(name = "vw_inspecciones", schema = "public")
public class InspeccionView {

@Id
@Column(name = "id_informe")
private Long id;

@Column(name = "id_inspeccion")
private Long idInspeccion;

@Column(name = "codigo_inspeccion")
private String codigoInspeccion;

@Column(name = "codigo_inspeccion_legall")
private String codigoInspeccionLegall;

@Column(name = "observaciones")
private String observaciones;

@Column(name = "informe_fecha_programada")
private LocalDateTime fechaProgramada;

@Column(name = "id_distrito")
private String idDistrito;

@Column(name = "id_empleado_inspector")
private String idEmpleadoInspector;

@Column(name = "usuario_creacion")
private String usuarioCreacion;

@Column(name = "id_tramite")
private Integer idTramite;

@Column(name = "nro_tramite_compania_seguro")
private String numeroTramite;

@Column(name = "contacto")
private String contacto;

@Column(name = "placa")
private String placa;

@Column(name = "id_ct_motivo")
private String idCtMotivo;

@Column(name = "id_estado")
private String idEstado;

@Column(name = "estado")
private String estado;

@Column(name = "contratante_nombre")
private String contratanteNombre;

@Column(name = "contratante_razon_social")
private String contratanteRazonSocial;

@Column(name = "asegurado_nombre")
private String nombreApellido;

@Column(name = "telefono_fijo")
private String telefonoFijo;

@Column(name = "telefono_movil")
private String telefono;

@Column(name = "correo")
private String correo;

@Column(name = "direccion")
private String direccion;

@Column(name = "id_marca")
private String idMarca;

@Column(name = "marca")
private String marca;

@Column(name = "id_modelo")
private String idModelo;

@Column(name = "modelo")
private String modelo;

@Column(name = "id_vehiculo_asegurado")
private String idVehiculoAsegurado;

@Column(name = "id_asegurado")
private String idAsegurado;

public String getEstado() {
switch (estado) {
case "Pendiente":
return Constantes.ON_HOLD;
case "Digitado":
return Constantes.AVAILABLE;
case "Terminado":
return Constantes.COMPLETE;
default:
return estado;
}
}


}

This view exists in the database in the public scheme:


That's a short overview of our model. You can see the other classes in this package:




8. The repository layer is very easy if you use the deltaspike  data module:

- For example, you can declare an interface as repository and extends of some interface as EntityRepository that will generate the CRUD methods.  



These are the methods that will be generated thanks to EntityRepository:


- You can generate your own finders:





- Fortunately for us there is an integration between blaze and deltaspike to use views as entities, I used this integration to work with the view "vw_inspecciones" declared in our entity InspeccionView.


9. Before looking at our service layer. We see the producers created for the project in the config package:


Log Producer


It then can be injected in some class to produce log in this way:



FirebaseConfig to work with our firebase account:



Note: It use the file firebase-sdk.json that must be in src/main/resources.

EntityManagerProducer where we use the reference of our persistence unit ("legall_pu"):



CriteriaBuilderFactoryProducer uses blaze-persistence to have a rich criteria API for JPA providers:


EntityViewManagerProducer use the BlazePersistence - Entity View ModuleBlaze Persistence entity views try to solve these and many more problems a developer faces when having to implement efficient model mapping in a JPA application. It allows to define DTOs as interfaces and provides the mappings to the JPA model via annotations. It favors convention-over-configuration by providing smart defaults that allow to omit most mappings. By applying DTOs to a query builder through the ObjectBuilder extension point it is possible to separate query logic from the projections while still enjoying high performance queries.


Finally CorsFilter to evict problems of CORS with our frontend:



10. Now is the moment of see our JAXRSConfiguration where will be using MicroProfile JWT



This is very simple and minimalist. I love that.


- Our controllers depend on the roles allowed. 


- We have some DTOs for request and response:






11. In our service layer we use the repositories and create the business logic:




In some cases is necessary the sincronization with firebase, for example for a re-schedule of inspection:

 




It backend will be used by our frontend and mobile application in the next articles. 


Enjoy!

Joe





Share:

Virtual Checker built with Angular + Firebase + Flutter + JakartaEE + Microprofile + PostgreSQL on Azure - Parte 3

 

In this post, we will be discussing the database model.  We have 4 schemas: admin, core, inspection and public.


Admin Scheme


Core Scheme


Inspeccion Scheme


Public scheme



This is the view in my DataGrip:


In the next article, we will be showing the backend of our solution.

Enjoy!

Joe






 



Share: