2 Commits

Author SHA1 Message Date
Dmitrii Cravcenco
a84c498073 Automatic google auth fix 2023-12-04 16:01:38 +02:00
Dmitrii Cravcenco
aaf67ab09b Automatic google auth fix 2023-12-04 15:57:22 +02:00
12 changed files with 56 additions and 160 deletions

View File

@@ -78,12 +78,6 @@
<artifactId>spring-security-web</artifactId>
<version>6.1.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
</dependencies>
<build>
<defaultGoal>package</defaultGoal>

View File

@@ -65,7 +65,6 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
ObjectMapper objectMapper = new ObjectMapper();
response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
response.getWriter().flush();
return;
}

View File

@@ -45,6 +45,7 @@ public class SecurityConfiguration {
.cors(Customizer.withDefaults())
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/v1/auth/*").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(withDefaults());

View File

@@ -9,9 +9,11 @@ import com.faf223.expensetrackerfaf.model.User;
import com.faf223.expensetrackerfaf.service.ExpenseCategoryService;
import com.faf223.expensetrackerfaf.service.ExpenseService;
import com.faf223.expensetrackerfaf.service.UserService;
import com.faf223.expensetrackerfaf.util.DataExtender;
import com.faf223.expensetrackerfaf.util.errors.ErrorResponse;
import com.faf223.expensetrackerfaf.util.exceptions.*;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionDoesNotBelongToTheUserException;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionNotCreatedException;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionNotUpdatedException;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionsNotFoundException;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
@@ -24,7 +26,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Month;
import java.util.Collections;
@@ -133,32 +134,6 @@ public class ExpenseController {
throw new TransactionsNotFoundException("The expenses have not been found");
}
@GetMapping("/extend-data")
public ResponseEntity<List<BigDecimal>> extendData(@RequestParam Optional<String> extendValue,
@RequestParam Optional<Integer> extrapolationCount) {
if(extendValue.isEmpty())
throw new RequiredParamMissingException("Extend value has not been specified");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
User user;
if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails)
user = userService.getUserByEmail(userDetails.getUsername());
else
user = null;
if(user == null)
throw new UserNotFoundException("User with the specified UUID has not been found");
if(extendValue.get().equalsIgnoreCase("i"))
return ResponseEntity.ok(DataExtender.interpolate(user.getExpenses()));
if(extendValue.get().equalsIgnoreCase("e"))
return extrapolationCount.map(integer -> ResponseEntity.ok(DataExtender.extrapolate(user.getExpenses(), integer))).orElseGet(() -> ResponseEntity.ok(DataExtender.extrapolate(user.getExpenses(), 10)));
throw new WrongParamValueException("Wrong extend value has been specified (use either \"i\" or \"e\")");
}
@GetMapping("/categories")
public ResponseEntity<List<ExpenseCategory>> getAllCategories() {
List<ExpenseCategory> categories = expenseCategoryService.getAllCategories();

View File

@@ -12,47 +12,72 @@ public class GlobalExceptionHandler {
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleDoesNotBelongException(TransactionDoesNotBelongToTheUserException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.FORBIDDEN);
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
return new ResponseEntity<>(response, HttpStatus.FORBIDDEN);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleTransactionNotCreatedException(TransactionNotCreatedException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.NOT_MODIFIED);
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
return new ResponseEntity<>(response, HttpStatus.NOT_MODIFIED);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleTransactionsNotFoundException(TransactionsNotFoundException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.NOT_FOUND);
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.NOT_FOUND);
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleTransactionNotUpdatedException(TransactionNotUpdatedException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.NOT_MODIFIED);
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
return new ResponseEntity<>(response, HttpStatus.NOT_MODIFIED);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleUserNotAuthenticatedException(UserNotAuthenticatedException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.FORBIDDEN);
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
return new ResponseEntity<>(response, HttpStatus.FORBIDDEN);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleUserNotCreatedException(UserNotCreatedException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.NOT_MODIFIED);
}
ErrorResponse response = new ErrorResponse(
e.getMessage(),
System.currentTimeMillis()
);
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleRequiredParamMissingException(RequiredParamMissingException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler
private ResponseEntity<ErrorResponse> handleWrongParamValueException(WrongParamValueException e) {
return new ResponseEntity<>(new ErrorResponse(e.getMessage()), HttpStatus.BAD_REQUEST);
return new ResponseEntity<>(response, HttpStatus.NOT_MODIFIED);
}
}

View File

@@ -9,9 +9,11 @@ import com.faf223.expensetrackerfaf.model.User;
import com.faf223.expensetrackerfaf.service.IncomeCategoryService;
import com.faf223.expensetrackerfaf.service.IncomeService;
import com.faf223.expensetrackerfaf.service.UserService;
import com.faf223.expensetrackerfaf.util.DataExtender;
import com.faf223.expensetrackerfaf.util.errors.ErrorResponse;
import com.faf223.expensetrackerfaf.util.exceptions.*;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionDoesNotBelongToTheUserException;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionNotCreatedException;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionNotUpdatedException;
import com.faf223.expensetrackerfaf.util.exceptions.TransactionsNotFoundException;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
@@ -24,7 +26,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Month;
import java.util.Collections;
@@ -133,32 +134,6 @@ public class IncomeController {
throw new TransactionsNotFoundException("The expenses have not been found");
}
@GetMapping("/extend-data")
public ResponseEntity<List<BigDecimal>> extendData(@RequestParam Optional<String> extendValue,
@RequestParam Optional<Integer> extrapolationCount) {
if(extendValue.isEmpty())
throw new RequiredParamMissingException("Extend value has not been specified");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
User user;
if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails)
user = userService.getUserByEmail(userDetails.getUsername());
else
user = null;
if(user == null)
throw new UserNotFoundException("User with the specified UUID has not been found");
if(extendValue.get().equalsIgnoreCase("i"))
return ResponseEntity.ok(DataExtender.interpolate(user.getIncomes()));
if(extendValue.get().equalsIgnoreCase("e"))
return extrapolationCount.map(integer -> ResponseEntity.ok(DataExtender.extrapolate(user.getIncomes(), integer))).orElseGet(() -> ResponseEntity.ok(DataExtender.extrapolate(user.getIncomes(), 10)));
throw new WrongParamValueException("Wrong extend value has been specified (use either \"i\" or \"e\")");
}
@GetMapping("/categories")
public ResponseEntity<List<IncomeCategory>> getAllCategories() {
List<IncomeCategory> categories = incomeCategoryService.getAllCategories();

View File

@@ -14,16 +14,19 @@ public class AuthenticationController {
@PostMapping("/register")
public ResponseEntity<AuthenticationResponse> register(@RequestBody RegisterRequest request) {
System.out.println("register");
return ResponseEntity.ok(service.register(request));
}
@PostMapping("/authenticate")
public ResponseEntity<AuthenticationResponse> authenticate(@RequestBody AuthenticationRequest request) {
System.out.println("Refresh token!========================");
return ResponseEntity.ok(service.authenticate(request));
}
@PostMapping("/refreshtoken")
public ResponseEntity<AuthenticationResponse> refreshAccessToken(@RequestBody TokenRefreshRequest request) {
System.out.println("Refresh token!========================");
return ResponseEntity.ok(service.refreshAccessToken(request));
}
}

View File

@@ -34,8 +34,6 @@ public class User {
private String username;
@Transient
@NotNull(message = "Password must not be null")
@NotEmpty(message = "Password must not be empty")
private String password;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)

View File

@@ -49,6 +49,7 @@ public class AuthenticationService {
String jwtToken = jwtService.generateToken(userDetails);
String refreshToken = jwtService.generateRefreshToken(userDetails);
System.out.println(user);
return AuthenticationResponse.builder()
.accessToken(jwtToken)
.refreshToken(refreshToken)
@@ -113,6 +114,7 @@ public class AuthenticationService {
UserDetails userDetails = new PersonDetails(credential);
String jwtToken = jwtService.generateToken(userDetails);
String refreshToken = jwtService.generateRefreshToken(userDetails);
System.out.println(jwtToken);
return AuthenticationResponse.builder()
.accessToken(jwtToken)
.refreshToken(refreshToken)
@@ -127,6 +129,7 @@ public class AuthenticationService {
UserDetails userDetails = new PersonDetails(credential.get());
String jwtToken = jwtService.generateToken(userDetails);
System.out.println(jwtToken);
return AuthenticationResponse.builder()
.accessToken(jwtToken)
.refreshToken(refreshToken)

View File

@@ -1,63 +0,0 @@
package com.faf223.expensetrackerfaf.util;
import com.faf223.expensetrackerfaf.model.IMoneyTransaction;
import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;
import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class DataExtender {
public static List<BigDecimal> interpolate(List<? extends IMoneyTransaction> transactions) {
List<BigDecimal> values = new ArrayList<>();
// Perform linear interpolation on the amount field
if (transactions.size() > 1) {
LinearInterpolator interpolator = new LinearInterpolator();
double[] xValues = new double[transactions.size()];
double[] yValues = new double[transactions.size()];
for (int i = 0; i < transactions.size(); i++) {
xValues[i] = i;
yValues[i] = transactions.get(i).getAmount().doubleValue();
}
PolynomialSplineFunction splineFunction = interpolator.interpolate(xValues, yValues);
// Interpolate values between the first and last data points
for (int i = 1; i < transactions.size() - 1; i++)
values.add(BigDecimal.valueOf(splineFunction.value(i + 0.5))); // Interpolate at the midpoint
}
return values;
}
public static List<BigDecimal> extrapolate(List<? extends IMoneyTransaction> transactions, int count) {
List<BigDecimal> values = new ArrayList<>();
// Perform linear extrapolation on the amount field
if (transactions.size() > 1) {
LinearInterpolator interpolator = new LinearInterpolator();
double[] xValues = new double[transactions.size()];
double[] yValues = new double[transactions.size()];
for (int i = 0; i < transactions.size(); i++) {
xValues[i] = i;
yValues[i] = transactions.get(i).getAmount().doubleValue();
}
PolynomialSplineFunction splineFunction = interpolator.interpolate(xValues, yValues);
// Extrapolate values beyond the last data point
for (int i = transactions.size(); i < transactions.size() + count; i++)
values.add(BigDecimal.valueOf(splineFunction.value(i))); // Extrapolate by extending the x-axis
}
return values;
}
}

View File

@@ -1,7 +0,0 @@
package com.faf223.expensetrackerfaf.util.exceptions;
public class RequiredParamMissingException extends RuntimeException {
public RequiredParamMissingException(String message) {
super(message);
}
}

View File

@@ -1,7 +0,0 @@
package com.faf223.expensetrackerfaf.util.exceptions;
public class WrongParamValueException extends RuntimeException {
public WrongParamValueException(String message) {
super(message);
}
}