...
La funcionalidad que sustenta el sistema de versionado de recursos es bastante genérica, y está basada en el uso de la interfaz Versionable<T> , por lo que el esfuerzo que se requiere para añadir una entidad a este sistema es mínimo. A continuación detallaremos los pasos a seguir.
Table of Contents | ||||
---|---|---|---|---|
|
1. Implementación de la interfaz Versionable<T>
...
Code Block |
---|
@Autowired
private ApiRepository apiRepository;
private static final String API="Api"; //Nombre de la clase Java, respetar Mayus.
....
@SuppressWarnings("unchecked")
public <R extends JpaRepository<T, I>, T, I> R getJpaRepository(T versionable) {
switch (versionable.getClass().getSimpleName()) {
....
case API:
return (R) apiRepository;
....
}
@SuppressWarnings("unchecked")
public <S> S save(Versionable<S> versionable) {
switch (versionable.getClass().getSimpleName()) {
.....
case API:
return (S) apiRepository.save((Api) versionable);
.....
} |
3. Métodos en el repositorio
Es necesario que el repositorio de la entidad Versionable implemente el siguiente método:
Code Block |
---|
@Modifying
@Transactional
void deleteByIdNotIn(Collection<String> ids); |
En algunos casos de modelo de entidad-relación complejos, se tendrá que implementar un default, por ejemplo en realms (App.java)
Code Block |
---|
@Modifying @Transactional @Query(value = "DELETE FROM APP_ASSOCIATED WHERE APP_ASSOCIATED.PARENT_APP NOT IN :ids OR APP_ASSOCIATED.CHILD_APP NOT IN :ids", nativeQuery = true) void deleteAppAssociatedWhereIdNotIn(@Param("ids") Collection<String> ids); @Modifying @Transactional @Query(value = "DELETE FROM APP_ASSOCIATED_ROLES", nativeQuery = true) void deleteAppAssociatedRoles(); @Modifying @Transactional @Query("DELETE FROM App AS p WHERE p.id NOT IN :ids") void deleteByIdNotInCustom(@Param("ids") Collection<String> ids); @Modifying @Transactional default void deleteByIdNotIn(Collection<String> ids) { deleteAppAssociatedWhereIdNotIn(ids); deleteAppAssociatedRoles(); deleteByIdNotInCustom(ids); } |
4. Consideraciones extra si la entidad no extiende de OPResource
1. Find By User
Para el caso de entidades versionables que no extiendan de OPResource habrá dos casos:
La entidad tiene atributo user
En este caso tendremos que ir al repositorio de la entidad, tomemos como ejemplo DashboardUserAccess y DashboardUserAccessRepository, y asegurarnos de que existe el método findByUser, si no, lo creamos:
Code Block |
---|
public interface DashboardUserAccessRepository extends JpaRepository<DashboardUserAccess, String> {
...
List<DashboardUserAccess> findByUser(User user);
}
|
La entidad no tiene atributo user
En este caso iremos al repositorio de la entidad, si podemos hacer una query que relacione un usuario con la entidad la crearemos, y si no, crearemos el método findByUser como un default tal como en los siguientes ejemplos:
Code Block |
---|
@Query("SELECT t FROM Token t WHERE t.clientPlatform.user= :#{#user}") List<Token> findByUser(User user); |
Code Block |
---|
public interface DashboardConfRepository extends JpaRepository<DashboardConf, String> { .... default List<DashboardConf> findByUser(User user){ return findAll(); } ... } |
Esto es necesario para que funcionen ciertas funcionalidades para usuarios no administradores.
2. Find versionable views
Se tendrá que añadir el método findVersionableViews, tómese el siguiente ejemplo. Se necesita pasar como argumento, la identifcación, id y nombre de la clase al constructor.
Code Block |
---|
@Query("SELECT new com.minsait.onesait.platform.config.versioning.VersionableVO(o.userId, o.userId, 'User') FROM User AS o")
public List<VersionableVO> findVersionableViews(); |