diff --git a/src/main/java/com/satwik/splitora/constants/ErrorMessages.java b/src/main/java/com/satwik/splitora/constants/ErrorMessages.java new file mode 100644 index 0000000..f402312 --- /dev/null +++ b/src/main/java/com/satwik/splitora/constants/ErrorMessages.java @@ -0,0 +1,11 @@ +package com.satwik.splitora.constants; + +public final class ErrorMessages { + + private ErrorMessages() {} + + public static final String EXPENSE_NOT_FOUND = "Expense not found"; + + public static final String GROUP_NOT_FOUND = "Group not found"; + +} diff --git a/src/main/java/com/satwik/splitora/controller/AuthController.java b/src/main/java/com/satwik/splitora/controller/AuthController.java index 087de60..a2f9547 100644 --- a/src/main/java/com/satwik/splitora/controller/AuthController.java +++ b/src/main/java/com/satwik/splitora/controller/AuthController.java @@ -1,19 +1,14 @@ package com.satwik.splitora.controller; -import com.satwik.splitora.configuration.jwt.JwtUtil; import com.satwik.splitora.persistence.dto.ResponseModel; import com.satwik.splitora.persistence.dto.user.AuthenticationResponse; import com.satwik.splitora.persistence.dto.user.LoginRequest; import com.satwik.splitora.persistence.dto.user.RefreshTokenRequest; -import com.satwik.splitora.repository.UserRepository; import com.satwik.splitora.service.interfaces.AuthService; import com.satwik.splitora.util.ResponseUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; @Slf4j @@ -22,20 +17,12 @@ @RequestMapping("/api/v1/auth") public class AuthController { - @Autowired - private AuthenticationManager authenticationManager; + private final AuthService authService; - @Autowired - private AuthService authService; - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private JwtUtil jwtUtil; + public AuthController( + AuthService authService) { + this.authService = authService; + } /** * Handles the login request for a user. diff --git a/src/main/java/com/satwik/splitora/controller/ExpenseController.java b/src/main/java/com/satwik/splitora/controller/ExpenseController.java index b2757fc..21f4de0 100644 --- a/src/main/java/com/satwik/splitora/controller/ExpenseController.java +++ b/src/main/java/com/satwik/splitora/controller/ExpenseController.java @@ -5,7 +5,6 @@ import com.satwik.splitora.service.interfaces.ExpenseService; import com.satwik.splitora.util.ResponseUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,8 +17,11 @@ @RequestMapping("/api/v1/expense") public class ExpenseController { - @Autowired - ExpenseService expenseService; + private final ExpenseService expenseService; + + public ExpenseController (ExpenseService expenseService) { + this.expenseService = expenseService; + } /** * Creates a new expense which is not grouped. diff --git a/src/main/java/com/satwik/splitora/controller/GroupController.java b/src/main/java/com/satwik/splitora/controller/GroupController.java index 3dd0fd5..817aad8 100644 --- a/src/main/java/com/satwik/splitora/controller/GroupController.java +++ b/src/main/java/com/satwik/splitora/controller/GroupController.java @@ -1,6 +1,5 @@ package com.satwik.splitora.controller; -import com.satwik.splitora.configuration.security.LoggedInUser; import com.satwik.splitora.persistence.dto.ResponseModel; import com.satwik.splitora.persistence.dto.group.GroupDTO; import com.satwik.splitora.persistence.dto.group.GroupListDTO; @@ -10,7 +9,6 @@ import com.satwik.splitora.util.ResponseUtil; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -23,11 +21,11 @@ @RequestMapping("/api/v1/group") public class GroupController { - @Autowired - GroupService groupService; + private final GroupService groupService; - @Autowired - LoggedInUser loggedInUser; + public GroupController (GroupService groupService) { + this.groupService = groupService; + } /** * Creates a group for a user. diff --git a/src/main/java/com/satwik/splitora/controller/OAuthController.java b/src/main/java/com/satwik/splitora/controller/OAuthController.java index 8ccee65..fe3c7b5 100644 --- a/src/main/java/com/satwik/splitora/controller/OAuthController.java +++ b/src/main/java/com/satwik/splitora/controller/OAuthController.java @@ -5,7 +5,6 @@ import com.satwik.splitora.service.interfaces.OAuthService; import com.satwik.splitora.util.ResponseUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -16,8 +15,11 @@ @RequestMapping("/api/v1/oauth2") public class OAuthController { - @Autowired - OAuthService oAuthService; + private final OAuthService oAuthService; + + public OAuthController(OAuthService oAuthService) { + this.oAuthService = oAuthService; + } /** * Handles the OAuth2 callback. diff --git a/src/main/java/com/satwik/splitora/controller/ReportController.java b/src/main/java/com/satwik/splitora/controller/ReportController.java index 3140793..d6f45c8 100644 --- a/src/main/java/com/satwik/splitora/controller/ReportController.java +++ b/src/main/java/com/satwik/splitora/controller/ReportController.java @@ -19,11 +19,11 @@ @RequestMapping("/api/v1/report") public class ReportController { - @Autowired ReportService reportService; - @Autowired - LoggedInUser loggedInUser; + public ReportController (ReportService reportService) { + this.reportService = reportService; + } /** * Generates a report for a specific group. diff --git a/src/main/java/com/satwik/splitora/controller/UserController.java b/src/main/java/com/satwik/splitora/controller/UserController.java index e6ee896..36ca659 100644 --- a/src/main/java/com/satwik/splitora/controller/UserController.java +++ b/src/main/java/com/satwik/splitora/controller/UserController.java @@ -8,7 +8,6 @@ import com.satwik.splitora.util.ResponseUtil; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,11 +17,14 @@ @RequestMapping("/api/v1/user") public class UserController { - @Autowired - private UserService userService; + private final UserService userService; - @Autowired - private LoggedInUser loggedInUser; + private final LoggedInUser loggedInUser; + + public UserController (UserService userService, LoggedInUser loggedInUser) { + this.userService = userService; + this.loggedInUser = loggedInUser; + } /** * Registers a new user. @@ -59,7 +61,7 @@ public ResponseEntity> getUser() { * @param updateUserRequest the request object containing updated user details. * @return a ResponseEntity containing a ResponseModel with the result of the update process. */ - @PutMapping("update/{userId}") + @PutMapping("/update") public ResponseEntity> updateUser(@Valid @RequestBody RegisterUserRequest updateUserRequest) { log.info("Put Endpoint: update user with id: {}, and register user request: {}", loggedInUser.getUserId(), updateUserRequest); String response = userService.updateUser(updateUserRequest); @@ -73,7 +75,7 @@ public ResponseEntity> updateUser(@Valid @RequestBody Regi * * @return a ResponseEntity containing a ResponseModel with the result of the deletion process. */ - @DeleteMapping("delete") + @DeleteMapping("/delete") public ResponseEntity> deleteUser() { log.info("Delete Endpoint: delete user"); String response = userService.deleteUser(); diff --git a/src/main/java/com/satwik/splitora/persistence/dto/user/UserDTO.java b/src/main/java/com/satwik/splitora/persistence/dto/user/UserDTO.java index 21cd33d..36ec3d3 100644 --- a/src/main/java/com/satwik/splitora/persistence/dto/user/UserDTO.java +++ b/src/main/java/com/satwik/splitora/persistence/dto/user/UserDTO.java @@ -24,11 +24,4 @@ public class UserDTO { @NotNull PhoneDTO phone; - - UserDTO(UUID userId, String username, String email, String countryCode, Long phoneNumber) { - this.userId = userId; - this.username = username; - this.email = email; - this.phone = new PhoneDTO(countryCode, phoneNumber); - } } diff --git a/src/main/java/com/satwik/splitora/persistence/entities/BaseEntity.java b/src/main/java/com/satwik/splitora/persistence/entities/BaseEntity.java index 80738f2..28c3d07 100644 --- a/src/main/java/com/satwik/splitora/persistence/entities/BaseEntity.java +++ b/src/main/java/com/satwik/splitora/persistence/entities/BaseEntity.java @@ -18,7 +18,7 @@ public class BaseEntity { @Id - @GenericGenerator(name = "uuid", strategy = "uuid2") + @GenericGenerator(name = "uuid") @GeneratedValue(generator = "uuid") private UUID id; diff --git a/src/main/java/com/satwik/splitora/repository/UserRepository.java b/src/main/java/com/satwik/splitora/repository/UserRepository.java index 50106fc..dedfb38 100644 --- a/src/main/java/com/satwik/splitora/repository/UserRepository.java +++ b/src/main/java/com/satwik/splitora/repository/UserRepository.java @@ -12,5 +12,4 @@ public interface UserRepository extends JpaRepository { Optional findByEmail(String email); - boolean existsByEmail(String email); } diff --git a/src/main/java/com/satwik/splitora/service/implementations/AuthServiceImpl.java b/src/main/java/com/satwik/splitora/service/implementations/AuthServiceImpl.java index 725b88f..a992bba 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/AuthServiceImpl.java +++ b/src/main/java/com/satwik/splitora/service/implementations/AuthServiceImpl.java @@ -9,22 +9,24 @@ import com.satwik.splitora.persistence.entities.User; import com.satwik.splitora.repository.UserRepository; import com.satwik.splitora.service.interfaces.AuthService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service public class AuthServiceImpl implements AuthService { - @Autowired JwtUtil jwtUtil; - @Autowired UserRepository userRepository; - @Autowired PasswordEncoder passwordEncoder; + public AuthServiceImpl(JwtUtil jwtUtil, UserRepository userRepository, PasswordEncoder passwordEncoder) { + this.jwtUtil = jwtUtil; + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + } + @Override public AuthenticationResponse authenticateUser(LoginRequest loginRequest) { User user = userRepository.findByEmail(loginRequest.getUserEmail()).orElseThrow(() -> new DataNotFoundException("User not found.")); diff --git a/src/main/java/com/satwik/splitora/service/implementations/AuthorizationService.java b/src/main/java/com/satwik/splitora/service/implementations/AuthorizationService.java index 356311b..24ce294 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/AuthorizationService.java +++ b/src/main/java/com/satwik/splitora/service/implementations/AuthorizationService.java @@ -1,6 +1,7 @@ package com.satwik.splitora.service.implementations; import com.satwik.splitora.configuration.security.LoggedInUser; +import com.satwik.splitora.constants.ErrorMessages; import com.satwik.splitora.constants.enums.UserRole; import com.satwik.splitora.exception.DataNotFoundException; import com.satwik.splitora.persistence.entities.Expense; @@ -9,7 +10,6 @@ import com.satwik.splitora.repository.ExpenseRepository; import com.satwik.splitora.repository.GroupRepository; import com.satwik.splitora.repository.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; @@ -17,18 +17,23 @@ @Component("authorizationService") public class AuthorizationService { - @Autowired - LoggedInUser loggedInUser; + private final LoggedInUser loggedInUser; - @Autowired - UserRepository userRepository; + private final UserRepository userRepository; - @Autowired - GroupRepository groupRepository; + private final GroupRepository groupRepository; - @Autowired - ExpenseRepository expenseRepository; + private final ExpenseRepository expenseRepository; + public AuthorizationService(LoggedInUser loggedInUser, + UserRepository userRepository, + GroupRepository groupRepository, + ExpenseRepository expenseRepository) { + this.loggedInUser = loggedInUser; + this.userRepository = userRepository; + this.groupRepository = groupRepository; + this.expenseRepository = expenseRepository; + } public User getAuthorizedUser() { return userRepository.findByEmail(loggedInUser.getUserEmail()).orElseThrow(() -> new DataNotFoundException("User not found")); @@ -38,7 +43,7 @@ public boolean isGroupOwner(UUID groupId) { if (loggedInUser.hasRole(UserRole.ADMIN)) return true; - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); UUID ownerId = group.getUser().getId(); return loggedInUser.getUserId().equals(ownerId); } @@ -47,7 +52,7 @@ public boolean isExpenseOwner(UUID expenseId) { if (loggedInUser.hasRole(UserRole.ADMIN)) return true; - Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException("Expense not found")); + Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.EXPENSE_NOT_FOUND)); UUID ownerId = expense.getPayer().getId(); return loggedInUser.getUserId().equals(ownerId); } diff --git a/src/main/java/com/satwik/splitora/service/implementations/CustomUserDetailsService.java b/src/main/java/com/satwik/splitora/service/implementations/CustomUserDetailsService.java index b4cc175..96c79b4 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/CustomUserDetailsService.java +++ b/src/main/java/com/satwik/splitora/service/implementations/CustomUserDetailsService.java @@ -2,7 +2,6 @@ import com.satwik.splitora.persistence.entities.User; import com.satwik.splitora.repository.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -11,8 +10,11 @@ @Service public class CustomUserDetailsService implements UserDetailsService { - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; + + public CustomUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } @Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { diff --git a/src/main/java/com/satwik/splitora/service/implementations/ExpenseServiceImpl.java b/src/main/java/com/satwik/splitora/service/implementations/ExpenseServiceImpl.java index e6cc4eb..c3ecdaf 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/ExpenseServiceImpl.java +++ b/src/main/java/com/satwik/splitora/service/implementations/ExpenseServiceImpl.java @@ -1,5 +1,6 @@ package com.satwik.splitora.service.implementations; +import com.satwik.splitora.constants.ErrorMessages; import com.satwik.splitora.exception.BadRequestException; import com.satwik.splitora.exception.DataNotFoundException; import com.satwik.splitora.persistence.dto.expense.*; @@ -8,7 +9,6 @@ import com.satwik.splitora.repository.*; import com.satwik.splitora.service.interfaces.ExpenseService; import jakarta.transaction.Transactional; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; @@ -19,24 +19,31 @@ @Service public class ExpenseServiceImpl implements ExpenseService { - @Autowired - private AuthorizationService authorizationService; + private final AuthorizationService authorizationService; - @Autowired - private ExpenseRepository expenseRepository; + private final ExpenseRepository expenseRepository; - @Autowired - private GroupRepository groupRepository; + private final GroupRepository groupRepository; - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; - @Autowired - private GroupMembersRepository groupMembersRepository; + private final GroupMembersRepository groupMembersRepository; - @Autowired - private ExpenseShareRepository expenseShareRepository; + private final ExpenseShareRepository expenseShareRepository; + public ExpenseServiceImpl (AuthorizationService authorizationService, + ExpenseRepository expenseRepository, + GroupRepository groupRepository, + UserRepository userRepository, + GroupMembersRepository groupMembersRepository, + ExpenseShareRepository expenseShareRepository) { + this.authorizationService = authorizationService; + this.expenseRepository = expenseRepository; + this.groupRepository = groupRepository; + this.userRepository = userRepository; + this.groupMembersRepository = groupMembersRepository; + this.expenseShareRepository = expenseShareRepository; + } @Override @Transactional @@ -44,7 +51,7 @@ public class ExpenseServiceImpl implements ExpenseService { public ExpenseDTO createGroupedExpense(UUID groupId, ExpenseDTO expenseDTO) { User payer = expenseDTO.getPayerId() != null ? userRepository.findById(expenseDTO.getPayerId()).orElseThrow(() -> new DataNotFoundException("Payer not found!")) : authorizationService.getAuthorizedUser(); - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); // checking if payer is a member of the group if(!groupMembersRepository.existsByGroupIdAndMemberId(group.getId(), payer.getId())) @@ -72,7 +79,7 @@ public ExpenseDTO createNonGroupedExpense(ExpenseDTO expenseDTO) { User user = authorizationService.getAuthorizedUser(); User payer = expenseDTO.getPayerId() != null ? userRepository.findById(expenseDTO.getPayerId()).orElseThrow(() -> new DataNotFoundException("Payer not found!")) : authorizationService.getAuthorizedUser(); - Group group = groupRepository.findDefaultGroup(user.getId()).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findDefaultGroup(user.getId()).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); Expense expense = new Expense(); expense.setAmount(expenseDTO.getAmount()); @@ -88,7 +95,6 @@ public ExpenseDTO createNonGroupedExpense(ExpenseDTO expenseDTO) { response.setPayerName(expense.getPayer().getUsername()); response.setPayerId(expense.getPayer().getId()); - // TODO: add owner itself for return response; } @@ -105,7 +111,7 @@ public String deleteExpenseById(UUID expenseId) { @PreAuthorize("@authorizationService.isExpenseOwner(#expenseId)") public String addUserToExpense(UUID expenseId, UUID owerId) { - Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException("Expense not found")); + Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.EXPENSE_NOT_FOUND)); User ower = userRepository.findById(owerId).orElseThrow(() -> new DataNotFoundException("Ower not found")); if(expense.getPayer().getId().equals(ower.getId())) throw new BadRequestException("Payer cannot be added as ower to the expense!"); @@ -128,7 +134,7 @@ public String addUserToExpense(UUID expenseId, UUID owerId) { @Transactional @PreAuthorize("@authorizationService.isExpenseOwner(#expenseId)") public String removeUserFromExpense(UUID expenseId, UUID owerId) { - Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException("Expense not found")); + Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.EXPENSE_NOT_FOUND)); User ower = userRepository.findById(owerId).orElseThrow(() -> new DataNotFoundException("Ower not found")); if(!expenseShareRepository.existsByExpenseIdAndUserId(expense.getId(), ower.getId())) throw new BadRequestException("Ower is not part of the expense. Hence, cannot be removed!"); @@ -145,7 +151,7 @@ public String removeUserFromExpense(UUID expenseId, UUID owerId) { @Override @PreAuthorize("@authorizationService.isExpenseOwner(#expenseId)") public ExpenseDTO findExpenseById(UUID expenseId) { - Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException("Expense not found")); + Expense expense = expenseRepository.findById(expenseId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.EXPENSE_NOT_FOUND)); ExpenseDTO expenseDTO = new ExpenseDTO(); List owerDTOS = expenseShareRepository.findOwersWithAmountByExpenseId(expense.getId()); expenseDTO.setExpenseId(expense.getId()); @@ -161,7 +167,7 @@ public ExpenseDTO findExpenseById(UUID expenseId) { @Override @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public List findAllExpense(UUID groupId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); List expenses = expenseRepository.findByGroupId(group.getId()); List expenseDTOS = new ArrayList<>(); for (Expense expense : expenses) { diff --git a/src/main/java/com/satwik/splitora/service/implementations/GroupServiceImpl.java b/src/main/java/com/satwik/splitora/service/implementations/GroupServiceImpl.java index 2313b1e..13c7627 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/GroupServiceImpl.java +++ b/src/main/java/com/satwik/splitora/service/implementations/GroupServiceImpl.java @@ -1,5 +1,6 @@ package com.satwik.splitora.service.implementations; +import com.satwik.splitora.constants.ErrorMessages; import com.satwik.splitora.exception.DataNotFoundException; import com.satwik.splitora.persistence.dto.expense.ExpenseListDTO; import com.satwik.splitora.persistence.dto.group.*; @@ -15,7 +16,6 @@ import com.satwik.splitora.repository.UserRepository; import com.satwik.splitora.service.interfaces.GroupService; import jakarta.transaction.Transactional; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; @@ -25,20 +25,28 @@ @Service public class GroupServiceImpl implements GroupService { - @Autowired - private AuthorizationService authorizationService; + private final AuthorizationService authorizationService; - @Autowired - private GroupRepository groupRepository; + private final GroupRepository groupRepository; - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; - @Autowired - private ExpenseRepository expenseRepository; + private final ExpenseRepository expenseRepository; - @Autowired - private GroupMembersRepository groupMembersRepository; + private final GroupMembersRepository groupMembersRepository; + + public GroupServiceImpl ( + AuthorizationService authorizationService, + GroupRepository groupRepository, + UserRepository userRepository, + ExpenseRepository expenseRepository, + GroupMembersRepository groupMembersRepository) { + this.authorizationService = authorizationService; + this.groupRepository = groupRepository; + this.userRepository = userRepository; + this.expenseRepository = expenseRepository; + this.groupMembersRepository = groupMembersRepository; + } @Override @@ -73,7 +81,7 @@ public GroupListDTO findAllGroup() { @Transactional @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public String addGroupMembers(UUID groupId, UUID memberId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found!")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); User member = userRepository.findById(memberId).orElseThrow(() -> new DataNotFoundException("User not found to add as member!")); // TODO : add check to avoid add members to default group GroupMembers groupMembers = new GroupMembers(); @@ -86,7 +94,7 @@ public String addGroupMembers(UUID groupId, UUID memberId) { @Override @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public List findMembers(UUID groupId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found!")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); List groupMembersList = groupMembersRepository.findByGroupId(group.getId()); List userDTOS = new ArrayList<>(); for (GroupMembers groupMembers : groupMembersList) { @@ -112,7 +120,7 @@ public String deleteMembers(UUID groupId, UUID groupMemberId) { @Transactional @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public String deleteGroupByGroupId(UUID groupId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found!")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); if(!group.isDefaultGroup()) groupRepository.deleteById(groupId); @@ -125,7 +133,7 @@ public String deleteGroupByGroupId(UUID groupId) { @Override @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public GroupDTO findGroupByGroupId(UUID groupId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found!")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); GroupDTO groupDTO = new GroupDTO(); groupDTO.setGroupId(group.getId()); groupDTO.setGroupName(group.getGroupName()); @@ -173,7 +181,7 @@ private static List getGroupMemberDTOS(Group group) { @Transactional @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public String updateGroup(GroupUpdateRequest groupUpdateRequest, UUID groupId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); group.setGroupName(groupUpdateRequest.getGroupName()); groupRepository.save(group); return "%s - Group update successfully!".formatted(group.getId()); diff --git a/src/main/java/com/satwik/splitora/service/implementations/ReportServiceImpl.java b/src/main/java/com/satwik/splitora/service/implementations/ReportServiceImpl.java index b3ac627..e315a29 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/ReportServiceImpl.java +++ b/src/main/java/com/satwik/splitora/service/implementations/ReportServiceImpl.java @@ -1,5 +1,6 @@ package com.satwik.splitora.service.implementations; +import com.satwik.splitora.constants.ErrorMessages; import com.satwik.splitora.exception.DataNotFoundException; import com.satwik.splitora.persistence.dto.report.ReportDTO; import com.satwik.splitora.persistence.dto.report.TempReport; @@ -7,13 +8,11 @@ import com.satwik.splitora.persistence.entities.User; import com.satwik.splitora.repository.ExpenseShareRepository; import com.satwik.splitora.repository.GroupRepository; -import com.satwik.splitora.repository.UserRepository; import com.satwik.splitora.service.interfaces.ReportService; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; @@ -28,26 +27,28 @@ @Service public class ReportServiceImpl implements ReportService { - @Autowired - private AuthorizationService authorizationService; + private final AuthorizationService authorizationService; - @Autowired - private GroupRepository groupRepository; + private final GroupRepository groupRepository; - @Autowired - private UserRepository userRepository; + private final ExpenseShareRepository expenseShareRepository; - @Autowired - private ExpenseShareRepository expenseShareRepository; + public ReportServiceImpl(AuthorizationService authorizationService, + GroupRepository groupRepository, + ExpenseShareRepository expenseShareRepository) { + this.authorizationService = authorizationService; + this.groupRepository = groupRepository; + this.expenseShareRepository = expenseShareRepository; + } @Value("${my.reportFilePath}") - private String REPORT_FILE_PATH; + private String reportFilePath; @Override @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public List generateReport(UUID groupId) { - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); // preparing report List tempReportList = groupRepository.generateReportById(group.getId()); List reportDTOS = new ArrayList<>(); @@ -72,7 +73,7 @@ public List generateReport(UUID groupId) { @PreAuthorize("@authorizationService.isGroupOwner(#groupId)") public String exportReport(UUID groupId, String fileType) { User user = authorizationService.getAuthorizedUser(); - Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException("Group not found")); + Group group = groupRepository.findById(groupId).orElseThrow(() -> new DataNotFoundException(ErrorMessages.GROUP_NOT_FOUND)); if(user == null || user.getId() != group.getUser().getId()) throw new AccessDeniedException("Access Denied"); @@ -83,7 +84,7 @@ else if (fileType.equals("CSV")) else throw new RuntimeException("Invalid file type"); - return "File successfully created at path - " + REPORT_FILE_PATH; + return "File successfully created at path - " + reportFilePath; } private void exportToCSV(UUID groupId) { @@ -104,7 +105,7 @@ private void exportToCSV(UUID groupId) { reportDTOS.add(reportDTO); } - try (FileOutputStream fos = new FileOutputStream(REPORT_FILE_PATH + "data.csv")) { + try (FileOutputStream fos = new FileOutputStream(reportFilePath + "data.csv")) { StringBuilder csvData = new StringBuilder(); csvData.append("groupName,expenseName,expenseOwner,expenseContributors,totalExpenseAmount\n"); for (ReportDTO reportDTO : reportDTOS) { @@ -138,7 +139,7 @@ private void exportToXLSX(UUID groupId) { reportDTOS.add(reportDTO); } - try (FileOutputStream outputStream = new FileOutputStream(REPORT_FILE_PATH + "data.xlsx")) { + try (FileOutputStream outputStream = new FileOutputStream(reportFilePath + "data.xlsx")) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Data"); diff --git a/src/main/java/com/satwik/splitora/service/implementations/UserServiceImpl.java b/src/main/java/com/satwik/splitora/service/implementations/UserServiceImpl.java index 8b8a767..92a72a9 100644 --- a/src/main/java/com/satwik/splitora/service/implementations/UserServiceImpl.java +++ b/src/main/java/com/satwik/splitora/service/implementations/UserServiceImpl.java @@ -11,7 +11,6 @@ import com.satwik.splitora.repository.UserRepository; import com.satwik.splitora.service.interfaces.UserService; import jakarta.transaction.Transactional; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -19,17 +18,20 @@ @Service public class UserServiceImpl implements UserService { - @Autowired - private AuthorizationService authorizationService; + private final AuthorizationService authorizationService; - @Autowired - private UserRepository userRepository; + private final UserRepository userRepository; - @Autowired - private GroupRepository groupRepository; + private final GroupRepository groupRepository; - @Autowired - private BCryptPasswordEncoder pwdEncoder; + private final BCryptPasswordEncoder pwdEncoder; + + public UserServiceImpl(AuthorizationService authorizationService, UserRepository userRepository, GroupRepository groupRepository, BCryptPasswordEncoder pwdEncoder) { + this.authorizationService = authorizationService; + this.userRepository = userRepository; + this.groupRepository = groupRepository; + this.pwdEncoder = pwdEncoder; + } // for save and update @Override diff --git a/src/main/java/com/satwik/splitora/util/ResponseUtil.java b/src/main/java/com/satwik/splitora/util/ResponseUtil.java index cd8f7b0..cc97bce 100644 --- a/src/main/java/com/satwik/splitora/util/ResponseUtil.java +++ b/src/main/java/com/satwik/splitora/util/ResponseUtil.java @@ -7,7 +7,9 @@ import java.time.LocalDateTime; -public class ResponseUtil { +public final class ResponseUtil { + + private ResponseUtil() {} public static ResponseModel success(T data, HttpStatus status, String message) { return ResponseModel.builder() diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ae5cec3..6c56e3f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -10,6 +10,7 @@ spring: hibernate: ddl-auto: none naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy + open-in-view: false liquibase: enabled: true