Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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
minLevel1
maxLevel7

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:

...

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 el siguiente ejemplo: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();