Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/main/java/com/satwik/splitora/configuration/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.satwik.splitora.configuration;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:5173")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600); // 1 hour
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
import com.satwik.splitora.persistence.dto.user.RefreshTokenRequest;
import com.satwik.splitora.service.interfaces.AuthService;
import com.satwik.splitora.util.ResponseUtil;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Slf4j
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/v1/auth")
public class AuthController {
Expand All @@ -31,7 +31,7 @@ public AuthController(
* @return a ResponseEntity containing a ResponseModel with the authentication response.
*/
@PostMapping("/login")
public ResponseEntity<ResponseModel<AuthenticationResponse>> loginUser(@RequestBody LoginRequest loginRequest) {
public ResponseEntity<ResponseModel<AuthenticationResponse>> loginUser(@RequestBody @Valid LoginRequest loginRequest) {
log.info("Post Endpoint: login user with request: {}", loginRequest);
AuthenticationResponse response = authService.authenticateUser(loginRequest);
ResponseModel<AuthenticationResponse> responseModel = ResponseUtil.success(response, HttpStatus.OK, "User logged in successfully");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.satwik.splitora.persistence.dto.ResponseModel;
import com.satwik.splitora.persistence.dto.expense.ExpenseDTO;
import com.satwik.splitora.persistence.dto.expense.ExpenseMembersRequest;
import com.satwik.splitora.service.interfaces.ExpenseService;
import com.satwik.splitora.util.ResponseUtil;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down Expand Up @@ -88,15 +90,15 @@ public ResponseEntity<ResponseModel<String>> deleteExpense(@PathVariable UUID ex
* to an expense identified by the given expense ID. It logs the incoming request and
* the resulting response.
*
* @param owerId the UUID of the ower to be added to the expense.
* @param expenseMembersRequest the request body containing the ower details to be added.
* @param expenseId the UUID of the expense to which the ower will be added.
* @return a ResponseEntity containing a string response message indicating the
* result of the operation.
*/
@PostMapping("/add-ower/{expenseId}")
public ResponseEntity<ResponseModel<String>> addOwerToExpense(@RequestParam UUID owerId, @PathVariable UUID expenseId) {
log.info("Post Endpoint: add ower with owerId: {}, to an expense with expenseId: {}", owerId, expenseId);
String response = expenseService.addUserToExpense(expenseId, owerId);
public ResponseEntity<ResponseModel<String>> addOwerToExpense(@Valid @RequestBody ExpenseMembersRequest expenseMembersRequest, @PathVariable UUID expenseId) {
log.info("Post Endpoint: add owers to an expense with expenseId: {}", expenseId);
String response = expenseService.addOwersToExpense(expenseId, expenseMembersRequest);
ResponseModel<String> responseModel = ResponseUtil.success(response, HttpStatus.OK, "Ower added to expense successfully");
log.info("Post Endpoint: add ower to expense with response: {}", responseModel);
return ResponseEntity.status(HttpStatus.OK).body(responseModel);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.satwik.splitora.controller;

import com.satwik.splitora.persistence.dto.ResponseModel;
import com.satwik.splitora.persistence.dto.group.BalanceTransaction;
import com.satwik.splitora.persistence.dto.group.GroupDTO;
import com.satwik.splitora.persistence.dto.group.GroupListDTO;
import com.satwik.splitora.persistence.dto.group.GroupUpdateRequest;
import com.satwik.splitora.persistence.dto.group.*;
import com.satwik.splitora.persistence.dto.user.UserDTO;
import com.satwik.splitora.service.interfaces.GroupService;
import com.satwik.splitora.util.ResponseUtil;
Expand Down Expand Up @@ -129,14 +126,14 @@ public ResponseEntity<ResponseModel<GroupListDTO>> findAllGroup() {
* the resulting response.
*
* @param groupId the UUID of the group to which the member will be added.
* @param memberId the UUID of the member to be added to the group.
* @param addMemberRequest the data transfer object containing the details of the member to be added.
* @return a ResponseEntity containing a string response message indicating the
* result of the member addition process.
*/
@PostMapping("/add-member/{groupId}")
public ResponseEntity<ResponseModel<String>> addGroupMembers(@PathVariable UUID groupId, @RequestParam UUID memberId) {
log.info("Post Endpoint: add member with memberId: {} to the group with groupId: {}", memberId, groupId);
String response = groupService.addGroupMembers(groupId, memberId);
public ResponseEntity<ResponseModel<String>> addGroupMembers(@PathVariable UUID groupId, @RequestBody GroupMemberDTO addMemberRequest) {
log.info("Post Endpoint: add member with groupId: {}", groupId);
String response = groupService.addGroupMembers(groupId, addMemberRequest);
ResponseModel<String> responseModel = ResponseUtil.success(response, HttpStatus.OK, "Member added to group successfully");
log.info("Post Endpoint: add member with response: {}", responseModel);
return ResponseEntity.status(HttpStatus.OK).body(responseModel);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import org.springframework.web.bind.annotation.*;

@Slf4j
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/v1/oauth2")
public class OAuthController {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

Expand All @@ -17,6 +18,15 @@ public class ApiExceptionHandler {

@ExceptionHandler(BadRequestException.class)
public ResponseEntity<ErrorResponseModel> handleBadRequestException(RuntimeException ex) {
return buildBadRequestResponse(ex);
}

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponseModel> handleInvalidArgumentException(RuntimeException ex) {
return buildBadRequestResponse(ex);
}

private ResponseEntity<ErrorResponseModel> buildBadRequestResponse(RuntimeException ex) {
log.info("Runtime exception occurred: ", ex);
ErrorResponseModel errorResponse = ResponseUtil.error(ex.getMessage(), HttpStatus.BAD_REQUEST, new ErrorDetails(
ErrorCode.INVALID_REQUEST.getCode(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.satwik.splitora.persistence.dto.expense;

import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.util.List;
import java.util.UUID;

@Data
public class ExpenseMembersRequest {

@NotNull (message = "Expense ID should not be null")
private List<UUID> membersId;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.satwik.splitora.persistence.dto.group;

import com.satwik.splitora.settlement.model.Transaction;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Expand All @@ -15,5 +14,5 @@ public class BalanceTransaction {

private UUID groupId;
private String groupName;
private List<Transaction<UUID>> transactions;
private List<UserTransaction> transactions;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.satwik.splitora.persistence.dto.group;

import com.satwik.splitora.persistence.dto.user.PhoneDTO;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Expand All @@ -13,10 +16,13 @@ public class GroupMemberDTO {

UUID groupMemberId;

UUID memberId;
@NotNull(message = "Name cannot be null")
@NotBlank(message = "Name cannot be blank")
String name;

String username;

String email;

PhoneDTO phone;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.satwik.splitora.persistence.dto.group;

import lombok.Data;

import java.util.UUID;

@Data
public class UserTransaction {

private UUID debtorId;

private String debtorName;

private UUID creditorId;

private String creditorName;

private Double amount;
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
public class LoginRequest {

@NotBlank(message = "User email should not be blank or null")
String userEmail;
String email;

@NotBlank(message = "Password should not be null or empty.")
@Size(min = 8)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ public class OwerDTO {

UUID userId;

String username;

double amount;

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class Expense extends BaseEntity {

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "payer_id")
private User payer;
private GroupMembers payer;

@Column(name = "amount")
private double amount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ public class ExpenseShare extends BaseEntity {
private Expense expense;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@JoinColumn(name = "group_members_id")
private GroupMembers groupMembers;

@Column(name = "shared_amount")
private double sharedAmount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import jakarta.persistence.*;
import lombok.*;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
Expand All @@ -11,14 +13,25 @@
@Table(name = "group_members") // add unique constraint to avoid multiple entries of same user in same group
public class GroupMembers extends BaseEntity {

@Column(name = "name", nullable = false)
private String name;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id")
private Group group;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "unregistered_member_id")
private UnregisteredUser unregisteredMember;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private User member;

@OneToMany(mappedBy = "groupMembers", fetch = FetchType.LAZY)
private List<ExpenseShare> userInvolvedInExpenses;

@OneToMany(mappedBy = "payer", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Expense> expenseList;

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.satwik.splitora.persistence.entities;

import com.satwik.splitora.validator.EmailOrPhoneRequired;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.Check;

import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EmailOrPhoneRequired
@Entity
@Table(name = "unregistered_user", uniqueConstraints = {
@UniqueConstraint(columnNames = {"phone_country_code", "phone_number"})
})
@Check(constraints = "email IS NOT NULL OR (phone_country_code IS NOT NULL AND phone_number IS NOT NULL)")
public class UnregisteredUser extends BaseEntity {

@Column(name = "email", unique = true)
private String email;

@Column(name = "phone_country_code")
private String countryCode;

@Column(name = "phone_number")
private long phoneNumber;

@OneToMany(mappedBy = "unregisteredMember", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<GroupMembers> groupMembers = new ArrayList<>();

}
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,9 @@ public class User extends BaseEntity {
@Column(name = "user_role", nullable = false, length = 20)
private UserRole userRole;

@OneToMany(mappedBy = "payer", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Expense> expenseList;

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Group> groupList;

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<ExpenseShare> userInvolvedInExpenses;

@OneToMany(mappedBy = "member", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<GroupMembers> groupMembers = new ArrayList<>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public interface ExpenseRepository extends JpaRepository<Expense, UUID> {
List<Expense> findByGroupId(UUID groupId);

@Query("SELECT NEW com.satwik.splitora.settlement.model.Transaction("+
"es.user.id, " +
"es.groupMembers.id, " +
"e.payer.id, " +
"es.sharedAmount) " +
"FROM Expense e " +
Expand Down
Loading