Skip to content

Commit

Permalink
big refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Marc Gorzala committed Oct 19, 2022
1 parent fd1e230 commit 47f4870
Show file tree
Hide file tree
Showing 26 changed files with 253 additions and 192 deletions.
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ version: '3.8'

services:
dancer-db:
image: postgres
image: postgres:14
restart: always
ports:
- "5432:5432"
Expand Down
16 changes: 16 additions & 0 deletions drop-dancier-database.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
docker exec -i dancer_dancer-db_1 psql -h localhost -U dancer postgres << SQL
-- https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db
REVOKE CONNECT ON DATABASE dancer FROM public;
SELECT pid, pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'dancer' AND pid <> pg_backend_pid();
drop database dancer;
create database dancer;
GRANT CONNECT ON DATABASE dancer TO public;
SQL
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public ResponseEntity<?> loginUser(@Valid @RequestBody LoginRequestDto loginRequ
)
);
AuthenticatedUser authenticatedUser = (AuthenticatedUser) authentication.getPrincipal();
User user = authenticationService.getUser(authenticatedUser.getId());
User user = authenticationService.getUser(authenticatedUser.getUserId());
if (!user.isEmailValidated()) {
return ResponseEntity.status(HttpStatus.FORBIDDEN)
.body(new ApiResponse(false, "You have to validate the email."));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package net.dancier.dancer.authentication.event;

import lombok.Builder;
import lombok.Data;

import java.util.Set;
import java.util.UUID;

@Builder
@Data
public class NewUserCreatedEvent {

private UUID id;

private String email;

private Set<String> roles;

private Boolean isEmailValidated;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package net.dancier.dancer.authentication.event;

import lombok.RequiredArgsConstructor;
import net.dancier.dancer.authentication.model.EmailValidationCode;
import net.dancier.dancer.authentication.repository.EmailValidationCodeRepository;
import net.dancier.dancer.mail.service.MailCreationService;
import net.dancier.dancer.mail.service.MailEnqueueService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

@Component
@RequiredArgsConstructor
public class NewUserCreatedEventListener {

private final static Logger log = LoggerFactory.getLogger(NewUserCreatedEventListener.class);

private final EmailValidationCodeRepository emailValidationCodeRepository;
private final MailEnqueueService mailEnqueueService;

private final MailCreationService mailCreationService;

private final String frontendBaseName;

@EventListener
void handle(NewUserCreatedEvent newUserCreatedEvent) {
Objects.requireNonNull(newUserCreatedEvent.getId());
EmailValidationCode emailValidationCode = emailValidationCodeRepository
.findByUserId(newUserCreatedEvent.getId())
.orElseGet(() -> new EmailValidationCode());
emailValidationCode.setExpiresAt(Instant
.now()
.plus(3, ChronoUnit.HOURS));
emailValidationCode.setUserId(newUserCreatedEvent.getId());
emailValidationCode.setCode(UUID.randomUUID().toString());
emailValidationCodeRepository.save(emailValidationCode);
enqueueUserMail(newUserCreatedEvent, emailValidationCode.getCode());
log.debug("Created validation code: " + emailValidationCode.getCode() + " for user: " + newUserCreatedEvent);
}

private void enqueueUserMail(NewUserCreatedEvent newUserCreatedEvent, String code) {
mailEnqueueService.enqueueMail(
mailCreationService.createDancierMessageFromTemplate(
newUserCreatedEvent.getEmail(),
MailCreationService.NO_REPLY_FROM,
"Dancier - bestätige Deine E-Mail-Adresse!",
MailCreationService.NEW_USER_VALIDATE_EMAIL,
Map.of( "validationLink", emailValidationLink(code)
))
);
}

private String emailValidationLink(String validationCode) {
return frontendBaseName + "/registration/verify-account/" + validationCode;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.RequiredArgsConstructor;
import net.dancier.dancer.authentication.dto.RegisterRequestDto;
import net.dancier.dancer.authentication.event.NewUserCreatedEvent;
import net.dancier.dancer.authentication.model.*;
import net.dancier.dancer.authentication.repository.*;
import net.dancier.dancer.core.exception.AppliationException;
Expand All @@ -12,6 +13,7 @@
import net.dancier.dancer.security.JwtTokenProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
Expand Down Expand Up @@ -50,6 +52,7 @@ public class AuthenticationService {

private final VerifiedActionCodeRepository verifiedActionCodeRepository;
private final String frontendBaseName;
private final ApplicationEventPublisher applicationEventPublisher;

public Authentication authenticate(Authentication authentication) {
return this.authenticationManager.authenticate(authentication);
Expand Down Expand Up @@ -104,7 +107,12 @@ public void registerUser(RegisterRequestDto signUpRequest) {

User savedUser = userRepository.save(user);
userRepository.flush();
createEmailValidationCode(savedUser);
applicationEventPublisher.publishEvent(
NewUserCreatedEvent.builder()
.id(savedUser.getId())
.email(savedUser.getEmail())
.isEmailValidated(savedUser.isEmailValidated()).build()
);
}
}

Expand Down Expand Up @@ -238,12 +246,4 @@ private void enqueueUserMail(User user, String validationCode) {
);
}

private VerifiedActionCode createNewVerifiedActionCode(VerifiedActionCode.Action action, UUID userId) {
VerifiedActionCode verifiedActionCode = new VerifiedActionCode();
verifiedActionCode.setExpiresAt(Instant.now().plus(3, ChronoUnit.HOURS));
verifiedActionCode.setUserId(userId);
verifiedActionCode.setCode(UUID.randomUUID().toString());
verifiedActionCode.setAction(action);
return verifiedActionCode;
}
}
14 changes: 0 additions & 14 deletions src/main/java/net/dancier/dancer/cabaceo/Cabaceo.java

This file was deleted.

37 changes: 0 additions & 37 deletions src/main/java/net/dancier/dancer/cabaceo/CabaceoController.java

This file was deleted.

26 changes: 0 additions & 26 deletions src/main/java/net/dancier/dancer/cabaceo/CabaceoService.java

This file was deleted.

12 changes: 0 additions & 12 deletions src/main/java/net/dancier/dancer/cabaceo/NewCabaceoDto.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.dancier.dancer.core;

import lombok.Builder;
import lombok.Data;
import org.springframework.security.core.Authentication;

@Builder
@Data
public class AuthenticationSucceededEvent {

Authentication authentication;

}
4 changes: 2 additions & 2 deletions src/main/java/net/dancier/dancer/core/ProfileController.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ public ResponseEntity<?> checkUsernameAvailability(@PathVariable String dancerNa
@GetMapping
public ResponseEntity<ProfileDto> get(@CurrentUser AuthenticatedUser authenticatedUser) {
return ResponseEntity.ok(
profileService.getProfileByUserId(authenticatedUser.getId())
profileService.getProfileByUserId(authenticatedUser.getUserId())
);
}

@Secured(ROLE_USER)
@PutMapping
public ResponseEntity put(@CurrentUser AuthenticatedUser authenticatedUser, @RequestBody ProfileDto profileDto) {
profileService.updateProfileForUserId(authenticatedUser.getId(), profileDto);
profileService.updateProfileForUserId(authenticatedUser.getUserId(), profileDto);
return ResponseEntity.ok().build();
}

Expand Down
15 changes: 14 additions & 1 deletion src/main/java/net/dancier/dancer/core/ProfileService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package net.dancier.dancer.core;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import net.dancier.dancer.authentication.model.User;
import net.dancier.dancer.authentication.repository.UserRepository;
Expand All @@ -8,12 +10,15 @@
import net.dancier.dancer.core.exception.NotFoundException;
import net.dancier.dancer.core.model.*;
import net.dancier.dancer.core.util.ModelMapper;
import net.dancier.dancer.eventlog.EventlogDto;
import net.dancier.dancer.eventlog.EventlogService;
import net.dancier.dancer.location.ZipCode;
import net.dancier.dancer.location.ZipCodeRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.sql.SQLException;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
Expand All @@ -32,7 +37,11 @@ public class ProfileService {

private final ZipCodeRepository zipCodeRepository;

public ProfileDto getProfileByUserId(UUID userId) {
private final EventlogService eventlogService;

private final ObjectMapper objectMapper;

public ProfileDto getProfileByUserId(UUID userId) {
User user = userRepository.findById(userId).orElseThrow(
() -> new NotFoundException("User not found for id: " + userId));
Dancer dancer = dancerRepository.findByUserId(userId).orElseGet( () -> new Dancer());
Expand Down Expand Up @@ -67,6 +76,10 @@ public void updateProfileForUserId(UUID userId, ProfileDto profileDto) {
dancer.setCountry(Country.valueOf(zipCode.getCountry()));
}
handleDancerProfiles(dancer, profileDto);
EventlogDto eventlogDto = new EventlogDto();
eventlogDto.setTopic("profile-updated");
eventlogDto.setPayload(objectMapper.convertValue(profileDto, JsonNode.class));
eventlogService.createNew(eventlogDto);
dancerRepository.save(dancer);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public ObjectMapper objectMapper() {
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
mapper.registerModule(javaTimeModule);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {

private final JwtAuthenticationEntryPoint unauthorizedHandler;

@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter();
}

private final JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder
Expand Down Expand Up @@ -71,7 +67,6 @@ protected void configure(HttpSecurity http) throws Exception {
.anyRequest()
.authenticated();

http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

http.addFilterAfter(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
}
Loading

0 comments on commit 47f4870

Please sign in to comment.