This is the codeAbility Sharing Platform! Learn more about the codeAbility Sharing Platform.

Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • development/sharing/codeability-sharing-platform
1 result
Show changes
Commits on Source (31)
Showing
with 263 additions and 97 deletions
......@@ -110,7 +110,6 @@ maven-test:
- export APPLICATION_GITLAB_ADMINACCESSTOKEN=$APPLICATION_GITLAB_ADMINACCESSTOKEN
- export APPLICATION_GITLAB_GENERALACCESSTOKEN=$APPLICATION_GITLAB_GENERALACCESSTOKEN
- export MAIL_FROM=no-reply@uibk.ac.at
frontend-test:
stage: test
cache:
......
......@@ -2,6 +2,7 @@ eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/main/resources/i18n/messages_de.properties=UTF-8
encoding//src/main/webapp/app/layouts/datapolicy/datapolicy.component.html=UTF-8
encoding//src/main/webapp/i18n/de/achievements.json=UTF-8
encoding//src/main/webapp/i18n/de/checkFrequency.json=UTF-8
encoding//src/main/webapp/i18n/de/exercise.json=UTF-8
......
......@@ -91,6 +91,8 @@
<lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
<properties-maven-plugin.version>1.0.0</properties-maven-plugin.version>
<sonar-maven-plugin.version>3.9.1.2184</sonar-maven-plugin.version>
<skipUTs>${skipTests}</skipUTs><!-- skip plain unit tests -->
<!-- jhipster-needle-maven-property -->
</properties>
......@@ -859,6 +861,7 @@
<exclude>**/*IT*</exclude>
<exclude>**/*IntTest*</exclude>
</excludes>
<skipTests>${skipUTs}</skipTests>
</configuration>
</plugin>
<plugin>
......
......@@ -12,7 +12,7 @@ services:
- _JAVA_OPTIONS=-Xmx512m -Xms256m
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true
- SPRING_DATASOURCE_URL=jdbc:mysql://sharing_mysql:3306/gitsearch?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true
- SPRING_DATASOURCE_URL=jdbc:mysql://sharing_mysql:3306/gitsearch?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true
- JHIPSTER_SLEEP=5 # gives a small time for other services to boot before the application
- SPRING_DATA_JEST_URI=http://sharing_elasticsearch:9200
- SPRING_ELASTICSEARCH_REST_URIS=http://sharing_elasticsearch:9200
......@@ -91,7 +91,6 @@ services:
GITLAB_HOME: $GITLAB_HOME
EXTERNAL_URL: $EXTERNAL_URL
GITLAB_HOSTNAME: $GITLAB_HOSTNAME
GITLAB_API_ROOT_ACCESS_TOKEN: $GITLAB_API_ROOT_ACCESS_TOKEN
INDEXING_SERVICE_URL: $INDEXING_SERVICE_URL
MAIL_USERNAME: $MAIL_USERNAME
MAIL_PASSWORD: $MAIL_PASSWORD
......
......@@ -35,10 +35,11 @@ It can be executed as follows:
- ``. .env`` the .env file can be found in the KeePass file. It contains the secrets for the containers. A current version of .env can be found in the keepass file.
- ``export GITLAB_HOME``
- ``export INDEXING_SERVICE_URL``
- ``export GITBRANCH=development # or some other gitlab branch``
- ``export COMMIT_ID=$(git rev-parse HEAD); export COMMIT_DATE=$(git show -s --format=%ct``
- ``docker-compose -f gitsearch.yml create gitlab`` # this may fail, if the format of the gitsearch-app version needs to be adapted.
.. note::
the command may complain about missing variables COMMIT_ID, COMMIT_DATE, GITLAB_API_ROOT_ACCESS_TOKEN. This is ok, since the variables are only used in the gitlab container.
the command may complain about missing variables COMMIT_ID, COMMIT_DATE. This is ok, since the variables are only used in the gitlab container.
- ``docker-compose -f gitsearch.yml up -d gitlab plantuml elasticsearch``
The following environment variables are set within the config files.
......
package at.ac.uibk.gitsearch.config;
import at.ac.uibk.gitsearch.edu_sharing.model.EditorialGroup;
import at.ac.uibk.gitsearch.edu_sharing.model.Authority;
import at.ac.uibk.gitsearch.properties.ApplicationProperties;
import at.ac.uibk.gitsearch.service.edu_sharing.EduSharingConfiguration;
import org.slf4j.Logger;
......@@ -42,6 +42,10 @@ public class EduSharingApiConfiguration {
@Value("${edu-sharing-integration.content.editorial.group-authority-name}")
private String editorialGroupAuthorityName;
@SuppressWarnings("PMD.ImmutableField")
@Value("${edu-sharing-integration.content.editorial.permission}")
private String editorialPermission;
@SuppressWarnings("PMD.ImmutableField")
@Value("${edu-sharing-integration.content.repository}")
private String repository;
......@@ -66,13 +70,14 @@ public class EduSharingApiConfiguration {
@Bean
EduSharingConfiguration eduSharingConfiguration() {
final var editorialGroup = new EditorialGroup();
final var editorialGroup = new Authority();
editorialGroup.setEditable(true);
editorialGroup.setAuthorityName(editorialGroupAuthorityName);
editorialGroup.setAuthorityType("GROUP");
return new EduSharingConfiguration(
enabled,
editorialGroup,
editorialPermission,
repository,
baseNode,
workflowToCheckStatus,
......
......@@ -185,6 +185,8 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
.and()
.authorizeHttpRequests()
.antMatchers("/api/validateMetaData").permitAll()
.antMatchers("/api/statistics/orphans").hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers("/api/statistics/duplicates").hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers("/api/statistics/**").permitAll()
.antMatchers("/oauth2/**").permitAll()
.antMatchers("/api/search/saved-searches").authenticated()
......@@ -197,6 +199,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
.antMatchers("/api/exerciseChildren/**").permitAll()
.antMatchers("/api/exercise/**").permitAll()
.antMatchers("/api/exercises/source-authorization/**").permitAll()
.antMatchers("/api/exercises/firstViewInSession/**").permitAll()
.antMatchers("/api/exerciseFile/**").permitAll()
.antMatchers("/api/refreshToken").permitAll()
.antMatchers("/api/register").denyAll()
......
package at.ac.uibk.gitsearch.edu_sharing.model;
import java.io.Serializable;
import java.util.Objects;
public class EditorialGroup implements Serializable {
public class Authority implements Serializable {
private static final long serialVersionUID = 1L;
......@@ -35,4 +36,23 @@ public class EditorialGroup implements Serializable {
public void setAuthorityType(String authorityType) {
this.authorityType = authorityType;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Authority)) {
return false;
}
Authority authority = (Authority) o;
return (
Objects.equals(getAuthorityName(), authority.getAuthorityName()) && Objects.equals(getAuthorityType(), authority.getAuthorityType())
);
}
@Override
public int hashCode() {
return Objects.hash(getAuthorityName(), getAuthorityType());
}
}
package at.ac.uibk.gitsearch.edu_sharing.model;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.*;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.AggregationLevelDeserializer;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.AggregationLevelSerializer;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.DefaultNodeDeserializer;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.DefaultNodeSerializer;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.VCardDTODeserializer;
import at.ac.uibk.gitsearch.edu_sharing.model.serializer.VCardDTOSerializer;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
......@@ -11,6 +16,7 @@ import java.util.Objects;
import org.apache.commons.collections4.CollectionUtils;
import org.codeability.sharing.plugins.api.search.PersonDTO;
@SuppressWarnings("PMD.TooManyFields")
public class EduSharingMetadataDTO implements Serializable {
private static final long serialVersionUID = 1L;
......@@ -87,6 +93,11 @@ public class EduSharingMetadataDTO implements Serializable {
@JsonProperty("ccm:furtherReferences")
private String reverseLink;
@JsonSerialize(using = DefaultNodeSerializer.class)
@JsonDeserialize(using = DefaultNodeDeserializer.class)
@JsonProperty("ccm:uibk_sdg")
private String sustainableDevelopmentGoal;
public String getVersion() {
return version;
}
......@@ -207,6 +218,14 @@ public class EduSharingMetadataDTO implements Serializable {
this.reverseLink = reverseLink;
}
public String getSustainableDevelopmentGoal() {
return sustainableDevelopmentGoal;
}
public void setSustainableDevelopmentGoal(String sustainableDevelopmentGoal) {
this.sustainableDevelopmentGoal = sustainableDevelopmentGoal;
}
@Override
public boolean equals(Object o) {
if (this == o) {
......@@ -231,7 +250,8 @@ public class EduSharingMetadataDTO implements Serializable {
Objects.equals(getEducationalLearningResourceType(), that.getEducationalLearningResourceType()) &&
Objects.equals(getEducationalContext(), that.getEducationalContext()) &&
Objects.equals(getTaxonomy(), that.getTaxonomy()) &&
Objects.equals(getReverseLink(), that.getReverseLink())
Objects.equals(getReverseLink(), that.getReverseLink()) &&
Objects.equals(getSustainableDevelopmentGoal(), that.getSustainableDevelopmentGoal())
);
}
......@@ -252,7 +272,8 @@ public class EduSharingMetadataDTO implements Serializable {
getEducationalLearningResourceType(),
getEducationalContext(),
getTaxonomy(),
getReverseLink()
getReverseLink(),
getSustainableDevelopmentGoal()
);
}
}
package at.ac.uibk.gitsearch.edu_sharing.model.permissions;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashSet;
import java.util.Set;
public class GetPermissionAnswerDTO {
@JsonProperty("permissions.localPermissions")
private LocalPermissionDTO localPermissions;
@JsonProperty("permissions.inheritedPermissions")
private Set<PermissionDTO> inheritedPermissions = new HashSet<>();
public LocalPermissionDTO getLocalPermissions() {
return localPermissions;
}
public void setLocalPermissions(LocalPermissionDTO localPermissions) {
this.localPermissions = localPermissions;
}
public Set<PermissionDTO> getInheritedPermissions() {
return inheritedPermissions;
}
public void setInheritedPermissions(Set<PermissionDTO> inheritedPermissions) {
this.inheritedPermissions = inheritedPermissions;
}
}
package at.ac.uibk.gitsearch.edu_sharing.model.permissions;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class LocalPermissionDTO {
private boolean inherited;
private Set<PermissionDTO> permissions = new HashSet<>();
public boolean isInherited() {
return inherited;
}
public void setInherited(boolean inherited) {
this.inherited = inherited;
}
public Set<PermissionDTO> getPermissions() {
return permissions;
}
public void setPermissions(Set<PermissionDTO> permissions) {
this.permissions = permissions;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof LocalPermissionDTO)) {
return false;
}
LocalPermissionDTO that = (LocalPermissionDTO) o;
return isInherited() == that.isInherited() && Objects.equals(getPermissions(), that.getPermissions());
}
@Override
public int hashCode() {
return Objects.hash(isInherited(), getPermissions());
}
}
package at.ac.uibk.gitsearch.edu_sharing.model.permissions;
import at.ac.uibk.gitsearch.edu_sharing.model.Authority;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class PermissionDTO {
private boolean editable;
private Authority authority;
private Set<String> permissions = new HashSet<>();
public boolean isEditable() {
return editable;
}
public void setEditable(boolean editable) {
this.editable = editable;
}
public Authority getAuthority() {
return authority;
}
public void setAuthority(Authority authority) {
this.authority = authority;
}
public Set<String> getPermissions() {
return permissions;
}
public void setPermissions(Set<String> permissions) {
this.permissions = permissions;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof PermissionDTO)) {
return false;
}
PermissionDTO that = (PermissionDTO) o;
return Objects.equals(getAuthority(), that.getAuthority());
}
@Override
public int hashCode() {
return Objects.hash(getAuthority());
}
}
......@@ -62,7 +62,7 @@ public class CustomAuditEventRepository implements AuditEventRepository {
persistentAuditEvent.setAuditEventType(event.getType());
persistentAuditEvent.setAuditEventDate(event.getTimestamp());
Map<String, String> eventData = auditEventConverter.convertDataToStrings(event.getData());
persistentAuditEvent.setData(truncate(eventData));
persistentAuditEvent.getData().putAll(truncate(eventData));
persistenceAuditEventRepository.save(persistentAuditEvent);
}
}
......
......@@ -6,8 +6,6 @@ import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
/**
* Spring Data JPA repository for the {@link PersistentAuditEvent} entity.
......@@ -22,10 +20,12 @@ public interface PersistenceAuditEventRepository extends JpaRepository<Persisten
List<PersistentAuditEvent> findTop1000ByAuditEventDateBefore(Instant before);
/**
* @Deprecated due to https://hibernate.atlassian.net/browse/HHH-5528
*
* Unsafe due to https://hibernate.atlassian.net/browse/HHH-5529.
* It needs to load all AuditEvents before deletion, in order to remove
* EnitityCollection(!)
* May be solved when migrating to hibernate > 6.0.0.Beta2
*/
@Deprecated
@Modifying
@Query("delete from PersistentAuditEvent ae where ae.auditEventDate < ?1")
int deleteInBulkByRoleId(Instant before);
int deleteByAuditEventDateBefore(Instant before);
}
......@@ -3,6 +3,7 @@ package at.ac.uibk.gitsearch.repository.jpa;
import at.ac.uibk.gitsearch.domain.Statistics;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
......@@ -14,14 +15,27 @@ import org.springframework.stereotype.Repository;
@Repository
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
public interface StatisticsRepository extends JpaRepository<Statistics, Long> {
Optional<Statistics> findByExerciseID(String id);
List<Statistics> findByExerciseID(String id);
@Override
Optional<Statistics> findById(Long id);
@Query("SELECT s FROM Statistics s")
Stream<Statistics> streamAll();
@Query("SELECT SUM(u.views) FROM Statistics u WHERE u.exerciseID IN (:ids)")
Optional<Integer> findNumberOfViewsByExerciseIDs(@Param("ids") List<String> exerciseIds);
/**
* find entries with duplicate exerciseId ordered by exerciseId
*
* @return
*/
@Query(
"SELECT s FROM Statistics s WHERE s.exerciseID IN (SELECT exerciseID FROM Statistics su GROUP BY su.exerciseID HAVING COUNT(*)>1) ORDER BY s.exerciseID"
)
List<Statistics> findDuplicates();
@Query("SELECT SUM(u.downloads) FROM Statistics u WHERE u.exerciseID IN (:ids)")
Optional<Integer> findNumberOfDownloadsByExerciseIDs(@Param("ids") List<String> exerciseIds);
......
package at.ac.uibk.gitsearch.repository.search;
import at.ac.uibk.gitsearch.repository.jpa.StatisticsRepository;
import at.ac.uibk.gitsearch.service.StatisticsService;
import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.ElasticsearchException;
......@@ -33,6 +33,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.codeability.sharing.plugins.api.search.SearchResultDTO;
import org.codeability.sharing.plugins.api.search.SearchStatisticsDTO;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Repository;
@Repository
......@@ -41,14 +42,14 @@ public class ElasticSearchRepository {
private final ElasticsearchClient elasticsearchAPIClient;
private final StatisticsRepository statisticsRepository;
private final ApplicationContext applicationContext;
private static final Logger LOGGER = LogManager.getLogger(ElasticSearchRepository.class);
protected ElasticSearchRepository(ElasticsearchClient elasticsearchAPIClient, StatisticsRepository statisticsRepository) {
protected ElasticSearchRepository(ElasticsearchClient elasticsearchAPIClient, ApplicationContext applicationContext) {
super();
this.elasticsearchAPIClient = elasticsearchAPIClient;
this.statisticsRepository = statisticsRepository;
this.applicationContext = applicationContext;
}
/**
......@@ -180,7 +181,9 @@ public class ElasticSearchRepository {
* @param doc
*/
public void updateSearchStatistics(SearchResultDTO doc) {
final Optional<StatisticsDTO> statistics = statisticsRepository.findByExerciseID(doc.getExerciseId()).map(StatisticsDTO::fromEntity);
StatisticsService statisticsService = applicationContext.getBean(StatisticsService.class);
final Optional<StatisticsDTO> statistics = statisticsService.getStatistics(doc.getExerciseId()).map(StatisticsDTO::fromEntity);
statistics.ifPresent(s -> updateSearchStatistics(doc, s));
}
......
......@@ -64,7 +64,9 @@ public class TokenProvider {
public TokenProvider(JHipsterProperties jHipsterProperties, SecurityMetersService securityMetersService) {
byte[] keyBytes;
log.debug("Using a Base64-encoded JWT secret key");
String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret();
log.debug("Using a Base64-encoded JWT secret key");
if (ObjectUtils.isEmpty(secret)) {
log.warn(
"Warning: the JWT key used is not Base64-encoded. " +
......@@ -74,6 +76,7 @@ public class TokenProvider {
keyBytes = secret.getBytes(StandardCharsets.UTF_8);
} else {
log.debug("Using a Base64-encoded JWT secret key");
log.debug(secret);
keyBytes = Decoders.BASE64.decode(secret);
}
key = Keys.hmacShaKeyFor(keyBytes);
......
......@@ -7,6 +7,7 @@ import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.actuate.audit.AuditEvent;
......@@ -16,9 +17,8 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import tech.jhipster.config.JHipsterProperties;
......@@ -31,17 +31,16 @@ import tech.jhipster.config.JHipsterProperties;
@Transactional
public class AuditEventService {
@SuppressWarnings("unused")
private static final Logger LOGGER = LoggerFactory.getLogger(AuditEventService.class);
private final JHipsterProperties jHipsterProperties;
private final PersistenceAuditEventRepository persistenceAuditEventRepository;
private final TransactionTemplate isolatedTransactionTemplate;
private final AuditEventConverter auditEventConverter;
private final PlatformTransactionManager platformTransactionManager;
public AuditEventService(
PersistenceAuditEventRepository persistenceAuditEventRepository,
AuditEventConverter auditEventConverter,
......@@ -51,9 +50,7 @@ public class AuditEventService {
this.persistenceAuditEventRepository = persistenceAuditEventRepository;
this.auditEventConverter = auditEventConverter;
this.jHipsterProperties = jhipsterProperties;
isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
this.platformTransactionManager = platformTransactionManager;
}
/**
......@@ -62,29 +59,40 @@ public class AuditEventService {
* This is scheduled to get fired at 11:00 (pm) UTC.
*/
@Scheduled(cron = "0 0 23 * * ?")
public void removeOldAuditEvents() {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public int removeOldAuditEvents() {
final TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
isolatedTransactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); // this is mainly
// to enable
// testing
boolean next = true;
AtomicInteger count = new AtomicInteger(0);
while (next) {
next =
isolatedTransactionTemplate.execute(
new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus status) {
final List<PersistentAuditEvent> auditEventDeleteCandidates = persistenceAuditEventRepository.findTop1000ByAuditEventDateBefore(
Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)
);
persistenceAuditEventRepository.deleteAll(auditEventDeleteCandidates);
return !auditEventDeleteCandidates.isEmpty();
}
}
);
isolatedTransactionTemplate.execute(status -> {
final List<PersistentAuditEvent> auditEventDeleteCandidates = persistenceAuditEventRepository.findTop1000ByAuditEventDateBefore(
Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)
);
count.set(count.intValue() + auditEventDeleteCandidates.size());
persistenceAuditEventRepository.deleteAll(auditEventDeleteCandidates);
return !auditEventDeleteCandidates.isEmpty();
});
}
// not working, due to https://hibernate.atlassian.net/browse/HHH-5528
// int count = persistenceAuditEventRepository.deleteInBulkByRoleId(
// Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)
// );
// LOGGER.info("cleaned up {} outdated AuditEnvets", count);
LOGGER.info("Cleaned Up {} outdated audit events", count.intValue());
return count.intValue();
}
/**
* unsafe, because hibernate loads all events before deletion!
*
* @return
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public int removeOutdatedAuditEvents2() {
Instant deleteBefore = Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS);
return this.persistenceAuditEventRepository.deleteByAuditEventDateBefore(deleteBefore);
}
@Transactional(readOnly = true)
......
......@@ -99,6 +99,10 @@ public class MailService {
);
}
if (content == null) {
log.warn("Empty Content for {}?", subject);
return false;
}
if (!getjHipsterProperties().getMail().isEnabled()) {
log.debug("Email is disabled, not sending email to '{}'", to);
return false;
......@@ -122,33 +126,6 @@ public class MailService {
}
}
// public void sendMailPlainAndHTML(String mail_to, String mail_subject, String mail_html, String mail_plain) -> None:
// """
// Sends an e-mail via an SMTP server
//
// :param mail_to: Mail recipient
// :param mail_subject: Mail subject
// :param mail_html: Mail body as HTML
// :param mail_plain: Mail body as plain text
// :return: None
// """
// msg = MIMEMultipart("alternative")
// msg["From"] = self.mail_from
// msg["To"] = mail_to
// msg["Subject"] = mail_subject
//
// part1 = MIMEText(mail_plain, "plain")
// part2 = MIMEText(mail_html, "html")
// msg.attach(part1)
// msg.attach(part2)
//
// logger.info("To: <%s> Subject: <%s> Msg: <%s>", mail_to, mail_subject, mail_plain)
// context = ssl.create_default_context()
// with smtplib.SMTP(self.host, self.port) as smtp:
// smtp.starttls(context=context)
// smtp.login(self.username, self.password)
// smtp.send_message(msg)
@Async
public void sendEmailFromTemplate(User user, String templateName, String titleKey) {
if (user.getEmail() == null) {
......@@ -194,25 +171,6 @@ public class MailService {
return sendEmail(user.getEmail(), subject, content, false, true);
}
// /**
// * Send info mails to every user, iff he/she was scheduled for sending.
// * This is scheduled to get fired everyday, at 05:00 (am).
// */
// @Scheduled(cron = "0 0 5 * * ?")
// public void sendInfoMails() {
// for (User user : userRepository.findAll()) {
// sendInfoMail(user, false/* only if content */);
// }
// }
//
// /**
// * send an info mail to user, if relevant.
// * For test purposes mainly.
// * @param user the user
// * @param force force mail sending, even if mail is empty.
// * @return true if mail was sent.
// */
@Async
public void sendActivationEmail(User user) {
log.debug("Sending activation email to '{}'", user.getEmail());
......
......@@ -68,7 +68,6 @@ public class ReminderService {
log.info("Starting mail send check for user {}", user.getLogin());
final WatchInfo watchInfo = userWatchListService.calculateWatchListUpdates(user);
final SavedSearchesInfo savedSearches = savedSearchesService.calculateSavedSearchesUpdates(user);
// watchInfo.put("watchListUpdates", getWatchListUpdates(user));
if (!watchInfo.isEmpty() || !savedSearches.isEmpty()) {
final boolean success = mailService.sendGenericEmailFromTemplate(
......