Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
vdlald committed Nov 8, 2020
2 parents 456b9c1 + 7eae186 commit 119aee2
Show file tree
Hide file tree
Showing 16 changed files with 312 additions and 139 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import com.vladislav.crm.communications.responses.AuthResponse;
import com.vladislav.crm.entities.RefreshToken;
import com.vladislav.crm.entities.User;
import com.vladislav.crm.services.TokenService;
import com.vladislav.crm.functions.GenerateAccessTokenFunction;
import com.vladislav.crm.functions.GenerateRefreshTokenFunction;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
Expand All @@ -18,8 +19,9 @@
public class AuthRequestHandlerImpl implements AuthRequestHandler {

private final UserDetailsService userDetailsService;
private final TokenService tokenService;
private final AuthenticationManager authenticationManager;
private final GenerateRefreshTokenFunction generateRefreshTokenFunction;
private final GenerateAccessTokenFunction generateAccessTokenFunction;

@Override
public AuthResponse handle(AuthRequest authRequest) {
Expand All @@ -28,8 +30,8 @@ public AuthResponse handle(AuthRequest authRequest) {

final User user = (User) userDetailsService.loadUserByUsername(authRequest.getUsername());

final String accessToken = tokenService.generateAccessToken(user);
final RefreshToken refreshToken = tokenService.generateRefreshToken(user);
final String accessToken = generateAccessTokenFunction.apply(user);
final RefreshToken refreshToken = generateRefreshTokenFunction.apply(user);

return new AuthResponse()
.setAccessToken(accessToken)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
import com.vladislav.crm.communications.responses.AuthResponse;
import com.vladislav.crm.entities.RefreshToken;
import com.vladislav.crm.entities.User;
import com.vladislav.crm.services.TokenService;
import com.vladislav.crm.functions.GenerateAccessTokenFunction;
import com.vladislav.crm.functions.GenerateRefreshTokenFunction;
import com.vladislav.crm.services.operations.refreshtokens.DeleteRefreshTokenOperation;
import com.vladislav.crm.services.operations.refreshtokens.ReadRefreshTokenOperation;
import lombok.RequiredArgsConstructor;
Expand All @@ -20,9 +21,10 @@
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RefreshAccessTokenRequestHandlerImpl implements RefreshAccessTokenRequestHandler {

private final TokenService tokenService;
private final ReadRefreshTokenOperation readRefreshTokenOperation;
private final DeleteRefreshTokenOperation deleteRefreshTokenOperation;
private final GenerateRefreshTokenFunction generateRefreshTokenFunction;
private final GenerateAccessTokenFunction generateAccessTokenFunction;

@Override
public AuthResponse handle(UUID refreshTokenRaw) {
Expand All @@ -40,8 +42,8 @@ public AuthResponse handle(UUID refreshTokenRaw) {
final User user = refreshToken.getUser();

return new AuthResponse()
.setAccessToken(tokenService.generateAccessToken(user))
.setRefreshToken(tokenService.generateRefreshToken(user));
.setAccessToken(generateAccessTokenFunction.apply(user))
.setRefreshToken(generateRefreshTokenFunction.apply(user));
} else {
throw new AccessDeniedException("Refresh token has expired");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,12 @@
package com.vladislav.crm.functions;

import com.vladislav.crm.entities.Lead;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.function.Function;

@Component
public class CreateExcelFromLeadsFunction implements Function<Collection<Lead>, Pair<HSSFWorkbook, HSSFSheet>> {

@Override
public Pair<HSSFWorkbook, HSSFSheet> apply(Collection<Lead> leads) {
final HSSFWorkbook workbook = new HSSFWorkbook();
final HSSFSheet sheet = workbook.createSheet("Сделки");

final HSSFRow rowHead = sheet.createRow(0);
rowHead.createCell(0).setCellValue("Идентификатор");
rowHead.createCell(1).setCellValue("Название");
rowHead.createCell(2).setCellValue("Бюджет");
rowHead.createCell(3).setCellValue("Статус");

int i = 0;
for (Lead lead : leads) {
i++;
final HSSFRow row = sheet.createRow(i);
row.createCell(0).setCellValue(lead.getId());
row.createCell(1).setCellValue(lead.getName());
row.createCell(2).setCellValue(lead.getSale().toString());
row.createCell(3).setCellValue(lead.getStatus().getName());
}

return Pair.of(workbook, sheet);
}
public interface CreateExcelFromLeadsFunction extends Function<Collection<Lead>, Pair<HSSFWorkbook, HSSFSheet>> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.vladislav.crm.functions;

import com.vladislav.crm.entities.User;

import java.util.function.Function;

public interface GenerateAccessTokenFunction extends Function<User, String> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.vladislav.crm.functions;

import com.vladislav.crm.entities.RefreshToken;
import com.vladislav.crm.entities.User;

import java.util.function.Function;

public interface GenerateRefreshTokenFunction extends Function<User, RefreshToken> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.vladislav.crm.functions;

import org.springframework.security.core.userdetails.UserDetails;

import java.util.function.Function;

public interface ParseJwtTokenFunction extends Function<String, UserDetails> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.vladislav.crm.functions.impl;

import com.vladislav.crm.entities.Lead;
import com.vladislav.crm.functions.CreateExcelFromLeadsFunction;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Component;

import java.util.Collection;

@Component
public class CreateExcelFromLeadsFunctionImpl implements CreateExcelFromLeadsFunction {

@Override
public Pair<HSSFWorkbook, HSSFSheet> apply(Collection<Lead> leads) {
final HSSFWorkbook workbook = new HSSFWorkbook();
final HSSFSheet sheet = workbook.createSheet("Сделки");

final HSSFRow rowHead = sheet.createRow(0);
rowHead.createCell(0).setCellValue("Идентификатор");
rowHead.createCell(1).setCellValue("Название");
rowHead.createCell(2).setCellValue("Бюджет");
rowHead.createCell(3).setCellValue("Статус");

int i = 0;
for (Lead lead : leads) {
i++;
final HSSFRow row = sheet.createRow(i);
row.createCell(0).setCellValue(lead.getId());
row.createCell(1).setCellValue(lead.getName());
row.createCell(2).setCellValue(lead.getSale().toString());
row.createCell(3).setCellValue(lead.getStatus().getName());
}

return Pair.of(workbook, sheet);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.vladislav.crm.functions.impl;

import com.vladislav.crm.entities.User;
import com.vladislav.crm.functions.GenerateAccessTokenFunction;
import io.jsonwebtoken.Jwts;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class GenerateAccessTokenFunctionImpl implements GenerateAccessTokenFunction {

private final SecretKey jwtSecretKey;

@Value("${app.jwt.access-token-lifetime}")
private Integer accessTokenLifetime;

@Override
public String apply(User user) {
final Instant createdAt = Instant.now();
final Instant expiredAt = createdAt.plus(accessTokenLifetime, ChronoUnit.MINUTES);

return Jwts.builder()
.claim("userId", user.getId())
.claim("username", user.getUsername())
.claim("authorities", user.getAuthorities())
.setIssuedAt(Date.from(createdAt))
.setExpiration(Date.from(expiredAt))
.signWith(jwtSecretKey)
.compact();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.vladislav.crm.functions.impl;

import com.vladislav.crm.entities.RefreshToken;
import com.vladislav.crm.entities.User;
import com.vladislav.crm.functions.GenerateRefreshTokenFunction;
import com.vladislav.crm.repositories.RefreshTokenRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class GenerateRefreshTokenFunctionImpl implements GenerateRefreshTokenFunction {

@Value("${app.jwt.refresh-token-lifetime}")
private Integer refreshTokenLifetime;

private final RefreshTokenRepository refreshTokenRepository;

@Override
public RefreshToken apply(User user) {
final Instant createdAt = Instant.now();
final Instant expiredAt = createdAt.plus(refreshTokenLifetime, ChronoUnit.DAYS);

final RefreshToken refreshToken = new RefreshToken().setUserUnsafe(user)
.setValidUntil(LocalDateTime.ofInstant(expiredAt, ZoneId.systemDefault()));

return refreshTokenRepository.save(refreshToken);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.vladislav.crm.functions.impl;

import com.vladislav.crm.entities.User;
import com.vladislav.crm.functions.ParseJwtTokenFunction;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtParser;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ParseJwtTokenFunctionImpl implements ParseJwtTokenFunction {

private final JwtParser jwtParser;

@Override
@SuppressWarnings("unchecked cast")
public UserDetails apply(String token) {
final Jws<Claims> jws = jwtParser.parseClaimsJws(token);
final Claims claims = jws.getBody();

final User user = new User();

user.setId(claims.get("userId", Long.class));
user.setUsername(claims.get("username", String.class));

final List<String> authorities = (List<String>) claims.get("authorities");
user.setAuthorities(authorities.stream().map(User.Authority::valueOf).collect(Collectors.toList()));

return user;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.vladislav.crm.security.filters;

import com.vladislav.crm.services.TokenService;
import com.vladislav.crm.functions.ParseJwtTokenFunction;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
Expand All @@ -20,7 +20,7 @@
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class JwtFilter extends OncePerRequestFilter {

private final TokenService tokenService;
private final ParseJwtTokenFunction parseJwtTokenFunction;

@Override
protected void doFilterInternal(
Expand All @@ -33,7 +33,7 @@ protected void doFilterInternal(
if (Objects.nonNull(requestTokenHeader) && requestTokenHeader.startsWith("Bearer ")) {
final String token = requestTokenHeader.substring(7);

final UserDetails user = tokenService.parseToken(token);
final UserDetails user = parseJwtTokenFunction.apply(token);

final UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(user, "", user.getAuthorities());
Expand Down
13 changes: 0 additions & 13 deletions src/main/java/com/vladislav/crm/services/TokenService.java

This file was deleted.

Loading

0 comments on commit 119aee2

Please sign in to comment.