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

Skip to content
Snippets Groups Projects
Commit 9d3458b5 authored by Michael Breu's avatar Michael Breu :speech_balloon:
Browse files

Sonar and Test button in settings.

parent 8af4f9b2
2 merge requests!55June Release,!52Resolve "Extend Bookmarklists and implement stored searches"
Showing
with 89 additions and 47 deletions
package at.ac.uibk.gitsearch.repository;
import at.ac.uibk.gitsearch.domain.Authority;
import java.util.List;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import at.ac.uibk.gitsearch.domain.Authority;
/**
* Spring Data JPA repository for the {@link Authority} entity.
*/
......
......@@ -68,8 +68,17 @@ public class MailService {
this.userWatchListService = userWatchListService;
}
/**
* send email
* @param to
* @param subject
* @param content
* @param isMultipart
* @param isHtml
* @return true if mail was successfully sent.
*/
@Async
public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
public boolean sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
log.debug("Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}",
isMultipart, isHtml, to, subject, content);
......@@ -83,8 +92,10 @@ public class MailService {
message.setText(content, isHtml);
javaMailSender.send(mimeMessage);
log.debug("Sent email to User '{}'", to);
return true;
} catch (MailException | MessagingException e) {
log.warn("Email could not be sent to user '{}'", to, e);
return false;
}
}
......@@ -111,18 +122,19 @@ public class MailService {
public void sendInfoMails() {
for(User user: userRepository.findAll()) {
sendInfoMail(user);
sendInfoMail(user, false /* only if content */);
}
}
/**
* send an info mail to user, if relevant.
* For test purposes mainly.
* @param user
* @param user the user
* @param force force mail sending, even if mail is empty.
* @return true if mail was sent.
*/
public boolean sendInfoMail(User user) {
boolean hasContent = false;
public boolean sendInfoMail(User user, boolean force) {
boolean hasContent = force;
Locale locale = Locale.forLanguageTag(user.getLangKey());
Context context = new Context(locale);
context.setVariable(USER, user);
......@@ -159,10 +171,12 @@ public class MailService {
context.setVariable("watchListUpdates", changedExercises);
String content = templateEngine.process("mail/info/infoEmail", context);
String subject = messageSource.getMessage("email.info.title", null, locale);
sendEmail(user.getEmail(), subject, content, false, true);
user.setLastMailSent(Instant.now());
userRepository.save(user);
return true;
boolean success = sendEmail(user.getEmail(), subject, content, false, true);
if(success) {
user.setLastMailSent(Instant.now());
userRepository.save(user);
return true;
}
}
return false;
}
......
......@@ -14,7 +14,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.cache.CacheManager;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
......@@ -172,7 +171,6 @@ public class UserService {
// insert new authorities into managedAuthoritiesTable
userAuthorities.stream().filter(auth -> !allAuthorities.contains(auth))
.forEach(authorityRepository::save);
// TODO: define some cron job to clean up userAuthorities table from unused groups
user.setAuthorities(userAuthorities);
}
......@@ -214,14 +212,12 @@ public class UserService {
user.setImageUrl(userDTO.getImageUrl());
user.setActivated(userDTO.isActivated());
user.setLangKey(userDTO.getLangKey());
// Set<Authority> managedAuthorities = user.getAuthorities();
final List<Authority> allAuthorities = authorityRepository.findAll();
final Set<Authority> userAuthorities = userDTO.getAuthorities().stream().map(authString -> new Authority(authString)).collect(Collectors.toSet());
// insert new authorities into managedAuthoritiesTable
userAuthorities.stream().filter(auth -> !allAuthorities.contains(auth))
.forEach(auth -> authorityRepository.save(auth));
// TODO: define some cron job to clean up userAuthorities table from unused groups
user.setAuthorities(userAuthorities);
userSearchRepository.save(user);
this.clearUserCaches(user);
......@@ -358,7 +354,7 @@ public class UserService {
}
public Optional<org.springframework.security.core.userdetails.User> convertToSecurityUser(Optional<User> u) {
return u.map(user -> convertToSecurityUser(user));
return u.map(this::convertToSecurityUser);
}
}
......@@ -203,12 +203,10 @@ public class UserWatchListService {
*/
public Map<SearchResultDTO, UserWatchList> findChangesSince(Instant since, at.ac.uibk.gitsearch.domain.User user) {
Map<SearchResultDTO, UserWatchList> result = new HashMap<>();
final Function<WatchListEntry, String> exerciseIdMapper = wle -> wle.getExerciseId();
findByUser(user).stream()
findByUser(user).stream()
.filter(wl -> wl.getCheckFrequency() != CheckFrequency.NEVER)
.forEach(wl ->
metaDataRepository.getExercisesById(wl.getWatchListEntries().stream().map( exerciseIdMapper ) ,
metaDataRepository.getExercisesById(wl.getWatchListEntries().stream().map( (Function<WatchListEntry, String>) WatchListEntry::getExerciseId ) ,
userService.convertToSecurityUser(Optional.of(user)), 0, 100, since).
getSearchResult().forEach(
sr -> {
......
package at.ac.uibk.gitsearch.service.dto;
/**
* just a very simple DTO to transfer a message.
* @author Michael Breu
*
*/
public class MessageDTO {
public MessageDTO() {
}
public MessageDTO(String message) {
super();
this.message = message;
}
private String message;
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
}
......@@ -37,13 +37,13 @@ import at.ac.uibk.gitsearch.web.rest.vm.ManagedUserVM;
@RequestMapping("/api")
public class AccountResource {
private static class AccountResourceException extends RuntimeException {
public static class AccountResourceException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = -4660672207242510582L;
private AccountResourceException(String message) {
public AccountResourceException(String message) {
super(message);
}
}
......
......@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.RestController;
import at.ac.uibk.gitsearch.security.jwt.TokenProvider;
import at.ac.uibk.gitsearch.service.MailService;
import at.ac.uibk.gitsearch.service.UserService;
import at.ac.uibk.gitsearch.service.dto.MessageDTO;
import at.ac.uibk.gitsearch.web.rest.AccountResource.AccountResourceException;
/**
* REST controller for various tests that can be initiated by the user.
......@@ -23,10 +25,6 @@ public class TestResource {
private final Logger log = LoggerFactory.getLogger(TestResource.class);
// @Value("${jhipster.clientApp.name}") // warning: inconsistent rename of gitSearchApp to gitSearchV2App :-(
@SuppressWarnings("unused")
private final static String applicationName = "gitsearchApp";
private final MailService mailService;
@SuppressWarnings("unused")
private final TokenProvider tokenProvider;
......@@ -44,21 +42,16 @@ public class TestResource {
* {@code Get /triggerInfoMail} : Triggers the info mail for the current user.
*/
@GetMapping("/triggerInfoMail")
public ResponseEntity<String> triggerInfoMail() {
// if(tokenProvider.getCurrentPrincipal().isEmpty()) {
// log.debug("unknown user for triggerInfoMail");
// return ResponseEntity.badRequest().build();
// }
// String userName = tokenProvider.getCurrentPrincipal().get().getUsername();
public MessageDTO triggerInfoMail() {
Optional<at.ac.uibk.gitsearch.domain.User> uo = userService.getUserWithAuthorities();
if(uo.isEmpty()) {
log.debug("unknown user for triggerInfoMail");
return ResponseEntity.badRequest().build();
new AccountResource.AccountResourceException("User could not be found");
}
boolean wasSent = mailService.sendInfoMail(uo.get());
return ResponseEntity.ok().body(wasSent?"success":"no mail to send");
boolean wasSent = mailService.sendInfoMail(uo.get(), true /* even if no content */);
return new MessageDTO(wasSent?"Mail successfully sent to " + uo.get().getEmail():"no relevant content found (or potential mailing problems). No Mail sent to " + uo.get().getEmail());
}
......
......@@ -104,8 +104,10 @@
<button type="submit" [disabled]="settingsForm.invalid" class="btn btn-primary" jhiTranslate="settings.form.button">Save</button>
</form>
</div>
</div>
<div class="row justify-content-center">
<div>
<button type="submit" class="btn btn-primary" (click)="triggerInfoMailSending()">Test Mail Sending</button>
</div>
<button type="submit" class="btn btn-primary" (click)="triggerInfoMailSending()" jhiTranslate="settings.test.emailSending">Test Mail Sending</button>
</div>
</div>
</div>
import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { JhiLanguageService } from 'ng-jhipster';
import { TestService } from 'app/shared/service/test-service';
import { TestService, Message } from 'app/shared/service/test-service';
import { AccountService } from 'app/core/auth/account.service';
import { Account } from 'app/core/user/account.model';
......@@ -60,7 +60,7 @@ export class SettingsComponent implements OnInit {
public triggerInfoMailSending(): void {
this.testService.triggerInfoMail().subscribe(
(message:String) => {alert(message);},
(m: Message) => {alert(m.message);},
() => alert("Message sending failed!")
);
}
......
......@@ -4,6 +4,9 @@ import { Observable } from 'rxjs';
import { SERVER_API_URL } from 'app/app.constants';
export interface Message {
message: string;
}
/**
provides infrastructure services for Plugins
......@@ -14,8 +17,8 @@ export class TestService {
constructor(protected http: HttpClient) {}
public triggerInfoMail(): Observable<String> {
return this.http.get<String>(this.triggerInfoMailURL);
public triggerInfoMail(): Observable<Message> {
return this.http.get<Message>(this.triggerInfoMailURL);
}
}
......@@ -9,6 +9,9 @@
"language": "Sprache",
"button": "Speichern"
},
"test": {
"emailSending": "Teste den Versand der Info E-Mail"
},
"messages": {
"error": {
"fail": "<strong>Es ist ein Fehler aufgetreten!</strong> Die Einstellungen konnten nicht gespeichert werden.",
......
......@@ -9,6 +9,9 @@
"language": "Language",
"button": "Save"
},
"test": {
"emailSending": "Test Sending of Info Email"
},
"messages": {
"error": {
"fail": "<strong>An error has occurred!</strong> Settings could not be saved.",
......
......@@ -249,16 +249,11 @@ public class UserServiceIT {
assertThat(authorityRepository.findById(usedAuthority.getName())).isNotEmpty();
assertThat(authorityRepository.findById(unUsedAuthority.getName())).isNotEmpty();
final List<Authority> usedAuthorities = authorityRepository.getUsedAuthorities();
userService.cleanUpUnusedAuthorities();
// unfortunatelly authorities are somehow cached :-(
entityManager.clear();
final List<Authority> usedAuthorities2 = authorityRepository.getUsedAuthorities();
assertThat(authorityRepository.findById(usedAuthority.getName())).isNotEmpty();
assertThat(authorityRepository.findById(unUsedAuthority.getName())).isEmpty();
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment