diff --git a/README.md b/README.md new file mode 100644 index 0000000..5216c44 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# How to run +1 open using intellij idea
+2 run the following file src/main/java/com/example/slimfitbackend/SlimFitBackendApplication.java diff --git a/pom.xml b/pom.xml index c1a5e19..31feab0 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,8 @@ org.projectlombok lombok - true + 1.18.8 + provided org.springframework.boot @@ -44,14 +45,6 @@ org.projectlombok lombok - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-data-jpa - org.pmml4s pmml4s_3 @@ -132,6 +125,16 @@ mapstruct-processor 1.5.5.Final + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + diff --git a/src/main/java/com/example/slimfitbackend/config/SecurityConfiguration.java b/src/main/java/com/example/slimfitbackend/config/SecurityConfiguration.java index 0ec0eba..e648d38 100644 --- a/src/main/java/com/example/slimfitbackend/config/SecurityConfiguration.java +++ b/src/main/java/com/example/slimfitbackend/config/SecurityConfiguration.java @@ -22,19 +22,9 @@ @RequiredArgsConstructor public class SecurityConfiguration { - private static final String[] WHITE_LIST_URL = {"/api/v1/auth/**", - "/v2/api-docs", - "/v3/api-docs", - "/v3/api-docs/**", - "/swagger-resources", - "/swagger-resources/**", - "/configuration/ui", - "/configuration/security", - "/swagger-ui/**", - "/webjars/**", - "/swagger-ui.html"}; @Autowired private JwtAuthFilter jwtAuthFilter; + @Autowired private AuthenticationProvider authenticationProvider; @@ -53,7 +43,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .sessionCreationPolicy(STATELESS) .and() .authenticationProvider(authenticationProvider) - .addFilterBefore(jwtAuthFilter,UsernamePasswordAuthenticationFilter.class); + .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } } diff --git a/src/main/java/com/example/slimfitbackend/controller/AuthenticationController.java b/src/main/java/com/example/slimfitbackend/controller/AuthenticationController.java index 3920d3d..a3808fe 100644 --- a/src/main/java/com/example/slimfitbackend/controller/AuthenticationController.java +++ b/src/main/java/com/example/slimfitbackend/controller/AuthenticationController.java @@ -5,8 +5,6 @@ import com.example.slimfitbackend.payload.AuthenticationResponse; import com.example.slimfitbackend.payload.RegisterRequest; import com.example.slimfitbackend.service.AuthenticationService; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -22,15 +20,12 @@ public class AuthenticationController { private AuthenticationService service; @PostMapping("/register") - public ResponseEntity register( - @RequestBody RegisterRequest request - ) { + public ResponseEntity register(@RequestBody RegisterRequest request) { return ResponseEntity.ok(service.register(request)); } + @PostMapping("/authenticate") - public ResponseEntity authenticate( - @RequestBody AuthenticationRequest request - ) { + public ResponseEntity authenticate(@RequestBody AuthenticationRequest request) { return ResponseEntity.ok(service.authenticate(request)); } diff --git a/src/main/java/com/example/slimfitbackend/controller/IntakeRecordController.java b/src/main/java/com/example/slimfitbackend/controller/IntakeRecordController.java index 6b0564c..f0aff3f 100644 --- a/src/main/java/com/example/slimfitbackend/controller/IntakeRecordController.java +++ b/src/main/java/com/example/slimfitbackend/controller/IntakeRecordController.java @@ -20,7 +20,7 @@ public class IntakeRecordController { @PostMapping("/newRecord") public IntakeRecordResponse addNewRecord(@RequestBody IntakeRecordRequest intakeRecordRequest) throws Exception { - return intakeRecordService.saveNewIntakeRecord(intakeRecordRequest); + return intakeRecordService.saveNewIntakeRecord(intakeRecordRequest); } } diff --git a/src/main/java/com/example/slimfitbackend/controller/ProgressController.java b/src/main/java/com/example/slimfitbackend/controller/ProgressController.java new file mode 100644 index 0000000..5b4d693 --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/controller/ProgressController.java @@ -0,0 +1,28 @@ +package com.example.slimfitbackend.controller; + +import com.example.slimfitbackend.payload.UserWeightResponse; +import com.example.slimfitbackend.service.ProgressService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/v1/progress") +public class ProgressController { + + @Autowired + private ProgressService progressService; + + @GetMapping("/actual") + private List getAllUserWeight() throws Exception { + return progressService.getActualWeightProgress(); + } + + @GetMapping("/goal") + private List getUserGoal() throws Exception { + return progressService.getUserGoal(); + } +} diff --git a/src/main/java/com/example/slimfitbackend/controller/UserActivityController.java b/src/main/java/com/example/slimfitbackend/controller/UserActivityController.java index d905a51..2b51e04 100644 --- a/src/main/java/com/example/slimfitbackend/controller/UserActivityController.java +++ b/src/main/java/com/example/slimfitbackend/controller/UserActivityController.java @@ -20,12 +20,12 @@ public class UserActivityController { private UserActivityService userActivityService; @PostMapping("/newActivity") - public NewActivityResponse addNewActivity(@RequestBody NewActivityRequest newActivityRequest) throws Exception { + public NewActivityResponse addNewActivity(@RequestBody NewActivityRequest newActivityRequest) { return userActivityService.addNewActivity(newActivityRequest); } @GetMapping("/calorie") - public PredictCalorieResponse getPredictedCal(@Valid PredictCalorieRequest predictCalorieRequest) throws Exception { + public PredictCalorieResponse getPredictedCal(@Valid PredictCalorieRequest predictCalorieRequest) { return userActivityService.getPredictedCalForAct(predictCalorieRequest); } diff --git a/src/main/java/com/example/slimfitbackend/controller/UserController.java b/src/main/java/com/example/slimfitbackend/controller/UserController.java index 6b277e3..03b2a44 100644 --- a/src/main/java/com/example/slimfitbackend/controller/UserController.java +++ b/src/main/java/com/example/slimfitbackend/controller/UserController.java @@ -1,6 +1,8 @@ package com.example.slimfitbackend.controller; import com.example.slimfitbackend.payload.GetUserResponse; +import com.example.slimfitbackend.payload.SaveUserWeightRequest; +import com.example.slimfitbackend.payload.UserWeightResponse; import com.example.slimfitbackend.payload.SaveUserRequest; import com.example.slimfitbackend.service.UserService; import org.springframework.beans.factory.annotation.Autowired; @@ -20,8 +22,17 @@ public boolean createNewUser(@RequestBody SaveUserRequest saveUserRequest) { } @GetMapping("") - private GetUserResponse getUser() throws Exception { + private GetUserResponse getUser() { return userService.getUser(); } + @GetMapping("/weight") + private UserWeightResponse getUserWeight() { + return userService.getUserWeightResponse(); + } + + @PostMapping("/weight") + private UserWeightResponse saveUserWeight(@RequestBody SaveUserWeightRequest saveUserWeightRequest) throws Exception { + return userService.saveUserWeight(saveUserWeightRequest); + } } diff --git a/src/main/java/com/example/slimfitbackend/exceptions/CustomException.java b/src/main/java/com/example/slimfitbackend/exceptions/CustomException.java new file mode 100644 index 0000000..03f2b35 --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/exceptions/CustomException.java @@ -0,0 +1,20 @@ +package com.example.slimfitbackend.exceptions; + +public class CustomException extends RuntimeException { + + public CustomException() { + super(); + } + + public CustomException(String message) { + super(message); + } + + public CustomException(String message, Throwable cause) { + super(message, cause); + } + + public CustomException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/slimfitbackend/exceptions/GlobalExceptionHandler.java b/src/main/java/com/example/slimfitbackend/exceptions/GlobalExceptionHandler.java new file mode 100644 index 0000000..111c131 --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/exceptions/GlobalExceptionHandler.java @@ -0,0 +1,15 @@ +package com.example.slimfitbackend.exceptions; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity handleException(Exception e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/slimfitbackend/model/DailyCalorie.java b/src/main/java/com/example/slimfitbackend/model/DailyCalorie.java index d2933a6..80e3abe 100644 --- a/src/main/java/com/example/slimfitbackend/model/DailyCalorie.java +++ b/src/main/java/com/example/slimfitbackend/model/DailyCalorie.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import java.util.ArrayList; @@ -9,7 +11,8 @@ import java.util.List; @Entity -@Data +@Getter +@Setter @EnableAutoConfiguration @Table(name = "daily_calorie") public class DailyCalorie { @@ -50,132 +53,4 @@ public class DailyCalorie { private long dailyActivityActual; private Date date; - - public long getDailyActivityGoal() { - return dailyActivityGoal; - } - - public void setDailyActivityGoal(long dailyActivityGoal) { - this.dailyActivityGoal = dailyActivityGoal; - } - - public long getDailyActivityActual() { - return dailyActivityActual; - } - - public void setDailyActivityActual(long dailyActivityActual) { - this.dailyActivityActual = dailyActivityActual; - } - - public long getDailyCalorieId() { - return dailyCalorieId; - } - - public void setDailyCalorieId(long dailyCalorieId) { - this.dailyCalorieId = dailyCalorieId; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - public List getIntakeRecords() { - return intakeRecords; - } - - public void setIntakeRecords(List intakeRecords) { - this.intakeRecords = intakeRecords; - } - - public long getBreakfastGoal() { - return breakfastGoal; - } - - public void setBreakfastGoal(long breakfastGoal) { - this.breakfastGoal = breakfastGoal; - } - - public long getBreakfastActual() { - return breakfastActual; - } - - public void setBreakfastActual(long breakfastActual) { - this.breakfastActual = breakfastActual; - } - - public long getLunchGoal() { - return lunchGoal; - } - - public void setLunchGoal(long lunchGoal) { - this.lunchGoal = lunchGoal; - } - - public long getLunchActual() { - return lunchActual; - } - - public void setLunchActual(long lunchActual) { - this.lunchActual = lunchActual; - } - - public long getDinnerGoal() { - return dinnerGoal; - } - - public void setDinnerGoal(long dinnerGoal) { - this.dinnerGoal = dinnerGoal; - } - - public long getDinnerActual() { - return dinnerActual; - } - - public void setDinnerActual(long dinnerActual) { - this.dinnerActual = dinnerActual; - } - - public long getSnackGoal() { - return snackGoal; - } - - public void setSnackGoal(long snackGoal) { - this.snackGoal = snackGoal; - } - - public long getSnackActual() { - return snackActual; - } - - public void setSnackActual(long snackActual) { - this.snackActual = snackActual; - } - - public long getDailyGoal() { - return dailyGoal; - } - - public void setDailyGoal(long dailyGoal) { - this.dailyGoal = dailyGoal; - } - - public long getDailyActual() { - return dailyActual; - } - - public void setDailyActual(long dailyActual) { - this.dailyActual = dailyActual; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } } diff --git a/src/main/java/com/example/slimfitbackend/model/IntakeRecord.java b/src/main/java/com/example/slimfitbackend/model/IntakeRecord.java index 293a0a9..7abcf1f 100644 --- a/src/main/java/com/example/slimfitbackend/model/IntakeRecord.java +++ b/src/main/java/com/example/slimfitbackend/model/IntakeRecord.java @@ -2,11 +2,15 @@ import jakarta.persistence.*; import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import javax.validation.constraints.NotNull; + @Entity -@Data -@EnableAutoConfiguration +@Getter +@Setter @Table(name = "intake_record") public class IntakeRecord { @@ -18,59 +22,14 @@ public class IntakeRecord { @JoinColumn(name = "daily_calorie_id") private DailyCalorie dailyCalorie; + @NotNull private long calorieCount; private String MealName; private String note; + @NotNull private long meal; - public long getIntakeRecordId() { - return IntakeRecordId; - } - - public void setIntakeRecordId(long intakeRecordId) { - IntakeRecordId = intakeRecordId; - } - - public DailyCalorie getDailyCalorie() { - return dailyCalorie; - } - - public void setDailyCalorie(DailyCalorie dailyCalorie) { - this.dailyCalorie = dailyCalorie; - } - - public long getCalorieCount() { - return calorieCount; - } - - public void setCalorieCount(long calorieCount) { - this.calorieCount = calorieCount; - } - - public String getMealName() { - return MealName; - } - - public void setMealName(String mealName) { - MealName = mealName; - } - - public String getNote() { - return note; - } - - public void setNote(String note) { - this.note = note; - } - - public long getMeal() { - return meal; - } - - public void setMeal(long meal) { - this.meal = meal; - } } diff --git a/src/main/java/com/example/slimfitbackend/model/Message.java b/src/main/java/com/example/slimfitbackend/model/Message.java index 569f017..f0f00ba 100644 --- a/src/main/java/com/example/slimfitbackend/model/Message.java +++ b/src/main/java/com/example/slimfitbackend/model/Message.java @@ -4,12 +4,17 @@ import jakarta.persistence.*; import lombok.Builder; import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; import java.util.Date; +@Getter +@Setter @Entity -@Data @EnableAutoConfiguration @Table(name = "message") public class Message { @@ -18,43 +23,15 @@ public class Message { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @NotNull private String message; + @Past + @NotNull private Date date; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } } diff --git a/src/main/java/com/example/slimfitbackend/model/User.java b/src/main/java/com/example/slimfitbackend/model/User.java index 74d6c0f..1d5765d 100644 --- a/src/main/java/com/example/slimfitbackend/model/User.java +++ b/src/main/java/com/example/slimfitbackend/model/User.java @@ -7,38 +7,46 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +import javax.validation.constraints.*; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; +@Getter +@Setter @Entity -@Data -@EnableAutoConfiguration @Table(name = "\"user\"") -@Builder public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long userId; + @Email + @NotNull private String email; + @NotNull private String firstName; + @NotNull private String lastName; + @Min(20) private int age; + @Past private Date dateOfBirth; + @Min(0) + @Max(2) + private int gender; + private double height; private double weight; - private int gender; - private double bmr; private int weeklyWeightLossGoal; @@ -47,6 +55,12 @@ public class User implements UserDetails { private String password; + private Date startDate; + + private double startWeight; + + private double targetWeight; + @Enumerated(EnumType.STRING) private Role role; @@ -88,110 +102,6 @@ public User(Long userId, String email, String firstName, String lastName, int ag this.weightProgresses = weightProgresses; } - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } - - public double getHeight() { - return height; - } - - public void setHeight(double height) { - this.height = height; - } - - public double getWeight() { - return weight; - } - - public void setWeight(double weight) { - this.weight = weight; - } - - public int getGender() { - return gender; - } - - public void setGender(int gender) { - this.gender = gender; - } - - public double getBmr() { - return bmr; - } - - public void setBmr(double bmr) { - this.bmr = bmr; - } - - public int getWeeklyWeightLossGoal() { - return weeklyWeightLossGoal; - } - - public void setWeeklyWeightLossGoal(int weeklyWeightLossGoal) { - this.weeklyWeightLossGoal = weeklyWeightLossGoal; - } - - public List getUserActivities() { - return userActivities; - } - - public void setUserActivities(List userActivities) { - this.userActivities = userActivities; - } - - public List getWeightProgresses() { - return weightProgresses; - } - - public void setWeightProgresses(List weightProgresses) { - this.weightProgresses = weightProgresses; - } - - public int getDailyActivityGoal() { - return dailyActivityGoal; - } - - public void setDailyActivityGoal(int dailyActivityGoal) { - this.dailyActivityGoal = dailyActivityGoal; - } - @Override public Collection getAuthorities() { return List.of(new SimpleGrantedAuthority(Role.User.name())); diff --git a/src/main/java/com/example/slimfitbackend/model/UserActivity.java b/src/main/java/com/example/slimfitbackend/model/UserActivity.java index efb81c8..0ed38fd 100644 --- a/src/main/java/com/example/slimfitbackend/model/UserActivity.java +++ b/src/main/java/com/example/slimfitbackend/model/UserActivity.java @@ -4,11 +4,13 @@ import lombok.Data; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; import java.util.Date; + @Entity @Data -@EnableAutoConfiguration @Table(name = "user_activity") public class UserActivity { @@ -24,67 +26,17 @@ public class UserActivity { @JoinColumn(name = "act_id") private ActivityType activityType; + @NotNull private long calorie; + @NotNull private long duration; + @NotNull private long intensity; + @Past + @NotNull private Date date; - public Long getUserActivityId() { - return userActivityId; - } - - public void setUserActivityId(Long userActivityId) { - this.userActivityId = userActivityId; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - public ActivityType getActivityType() { - return activityType; - } - - public void setActivityType(ActivityType activityType) { - this.activityType = activityType; - } - - public long getCalorie() { - return calorie; - } - - public void setCalorie(long calorie) { - this.calorie = calorie; - } - - public long getDuration() { - return duration; - } - - public void setDuration(long duration) { - this.duration = duration; - } - - public long getIntensity() { - return intensity; - } - - public void setIntensity(long intensity) { - this.intensity = intensity; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } } diff --git a/src/main/java/com/example/slimfitbackend/model/WeightProgress.java b/src/main/java/com/example/slimfitbackend/model/WeightProgress.java index 489a1e7..eff6fbe 100644 --- a/src/main/java/com/example/slimfitbackend/model/WeightProgress.java +++ b/src/main/java/com/example/slimfitbackend/model/WeightProgress.java @@ -2,14 +2,17 @@ import jakarta.persistence.*; import lombok.Data; +import lombok.NoArgsConstructor; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import java.util.Date; + @Entity @Data @EnableAutoConfiguration @Table(name = "weight_progress") +@NoArgsConstructor public class WeightProgress { @Id @@ -24,4 +27,8 @@ public class WeightProgress { private Date date; + public WeightProgress(User user, double weight) { + this.user = user; + this.weight = weight; + } } diff --git a/src/main/java/com/example/slimfitbackend/payload/AuthenticationRequest.java b/src/main/java/com/example/slimfitbackend/payload/AuthenticationRequest.java index ddf6689..3bd0e8f 100644 --- a/src/main/java/com/example/slimfitbackend/payload/AuthenticationRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/AuthenticationRequest.java @@ -1,29 +1,16 @@ package com.example.slimfitbackend.payload; -import lombok.Builder; -import lombok.Data; +import lombok.*; -@Data +@Setter +@Getter @Builder +@AllArgsConstructor public class AuthenticationRequest { String email; - String password; - - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } + String password; - public void setPassword(String password) { - this.password = password; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/AuthenticationResponse.java b/src/main/java/com/example/slimfitbackend/payload/AuthenticationResponse.java index 32e00a0..4ebcc92 100644 --- a/src/main/java/com/example/slimfitbackend/payload/AuthenticationResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/AuthenticationResponse.java @@ -18,15 +18,4 @@ public class AuthenticationResponse { @JsonProperty("token") private String token; - public AuthenticationResponse(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } } \ No newline at end of file diff --git a/src/main/java/com/example/slimfitbackend/payload/DailyCalorieResponseDto.java b/src/main/java/com/example/slimfitbackend/payload/DailyCalorieResponseDto.java index 52c6c8c..906ccb0 100644 --- a/src/main/java/com/example/slimfitbackend/payload/DailyCalorieResponseDto.java +++ b/src/main/java/com/example/slimfitbackend/payload/DailyCalorieResponseDto.java @@ -6,6 +6,8 @@ import java.util.Date; +@Setter +@Getter public class DailyCalorieResponseDto { private long dailyCalorieId; @@ -32,99 +34,9 @@ public class DailyCalorieResponseDto { private Date date; - public long getDailyCalorieId() { - return dailyCalorieId; - } + private double currentWeight; - public void setDailyCalorieId(long dailyCalorieId) { - this.dailyCalorieId = dailyCalorieId; - } + private double targetWeight; - public long getBreakfastGoal() { - return breakfastGoal; - } - - public void setBreakfastGoal(long breakfastGoal) { - this.breakfastGoal = breakfastGoal; - } - - public long getBreakfastActual() { - return breakfastActual; - } - - public void setBreakfastActual(long breakfastActual) { - this.breakfastActual = breakfastActual; - } - - public long getLunchGoal() { - return lunchGoal; - } - - public void setLunchGoal(long lunchGoal) { - this.lunchGoal = lunchGoal; - } - - public long getLunchActual() { - return lunchActual; - } - - public void setLunchActual(long lunchActual) { - this.lunchActual = lunchActual; - } - - public long getDinnerGoal() { - return dinnerGoal; - } - - public void setDinnerGoal(long dinnerGoal) { - this.dinnerGoal = dinnerGoal; - } - - public long getDinnerActual() { - return dinnerActual; - } - - public void setDinnerActual(long dinnerActual) { - this.dinnerActual = dinnerActual; - } - - public long getSnackGoal() { - return snackGoal; - } - - public void setSnackGoal(long snackGoal) { - this.snackGoal = snackGoal; - } - - public long getSnackActual() { - return snackActual; - } - - public void setSnackActual(long snackActual) { - this.snackActual = snackActual; - } - - public long getDailyGoal() { - return dailyGoal; - } - - public void setDailyGoal(long dailyGoal) { - this.dailyGoal = dailyGoal; - } - - public long getDailyActual() { - return dailyActual; - } - - public void setDailyActual(long dailyActual) { - this.dailyActual = dailyActual; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } + private int totalActiveMinutes; } diff --git a/src/main/java/com/example/slimfitbackend/payload/FoodCalResponse.java b/src/main/java/com/example/slimfitbackend/payload/FoodCalResponse.java index 9b1039b..9c315af 100644 --- a/src/main/java/com/example/slimfitbackend/payload/FoodCalResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/FoodCalResponse.java @@ -1,28 +1,16 @@ package com.example.slimfitbackend.payload; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@AllArgsConstructor public class FoodCalResponse { private String foodName; - private double cal; - - public FoodCalResponse(String foodName, double cal) { - this.foodName = foodName; - this.cal = cal; - } - public String getFoodName() { - return foodName; - } - - public void setFoodName(String foodName) { - this.foodName = foodName; - } - - public double getCal() { - return cal; - } + private double cal; - public void setCal(double cal) { - this.cal = cal; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/GetActivitiesResponse.java b/src/main/java/com/example/slimfitbackend/payload/GetActivitiesResponse.java index 471eca0..363b848 100644 --- a/src/main/java/com/example/slimfitbackend/payload/GetActivitiesResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/GetActivitiesResponse.java @@ -4,29 +4,12 @@ import lombok.Getter; import lombok.Setter; +@Setter +@Getter +@AllArgsConstructor public class GetActivitiesResponse { private String label; private long value; - public GetActivitiesResponse(String label, long value) { - this.label = label; - this.value = value; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public long getValue() { - return value; - } - - public void setValue(long value) { - this.value = value; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/GetDailyCalorieDto.java b/src/main/java/com/example/slimfitbackend/payload/GetDailyCalorieDto.java index e15ba23..1515ef5 100644 --- a/src/main/java/com/example/slimfitbackend/payload/GetDailyCalorieDto.java +++ b/src/main/java/com/example/slimfitbackend/payload/GetDailyCalorieDto.java @@ -15,11 +15,4 @@ public class GetDailyCalorieDto { @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) private Date date; - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/GetUserResponse.java b/src/main/java/com/example/slimfitbackend/payload/GetUserResponse.java index 39004a1..cb72c4a 100644 --- a/src/main/java/com/example/slimfitbackend/payload/GetUserResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/GetUserResponse.java @@ -1,7 +1,12 @@ package com.example.slimfitbackend.payload; +import lombok.Getter; +import lombok.Setter; + import java.util.Date; +@Setter +@Getter public class GetUserResponse { private Long userId; @@ -28,99 +33,8 @@ public class GetUserResponse { private int dailyActivityGoal; - public Long getUserId() { - return userId; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } - - public double getHeight() { - return height; - } - - public void setHeight(double height) { - this.height = height; - } - - public double getWeight() { - return weight; - } - - public void setWeight(double weight) { - this.weight = weight; - } - - public int getGender() { - return gender; - } - - public void setGender(int gender) { - this.gender = gender; - } - - public double getBmr() { - return bmr; - } - - public void setBmr(double bmr) { - this.bmr = bmr; - } - - public int getWeeklyWeightLossGoal() { - return weeklyWeightLossGoal; - } - - public void setWeeklyWeightLossGoal(int weeklyWeightLossGoal) { - this.weeklyWeightLossGoal = weeklyWeightLossGoal; - } + private double targetWeight; - public int getDailyActivityGoal() { - return dailyActivityGoal; - } + private Date startDate; - public void setDailyActivityGoal(int dailyActivityGoal) { - this.dailyActivityGoal = dailyActivityGoal; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/IntakeRecordRequest.java b/src/main/java/com/example/slimfitbackend/payload/IntakeRecordRequest.java index 925551e..3bb5757 100644 --- a/src/main/java/com/example/slimfitbackend/payload/IntakeRecordRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/IntakeRecordRequest.java @@ -1,7 +1,12 @@ package com.example.slimfitbackend.payload; +import lombok.Getter; +import lombok.Setter; + import java.util.Date; +@Setter +@Getter public class IntakeRecordRequest { private Date date; @@ -14,43 +19,4 @@ public class IntakeRecordRequest { private long meal; - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public long getCalorieCount() { - return calorieCount; - } - - public void setCalorieCount(long calorieCount) { - this.calorieCount = calorieCount; - } - - public String getMealName() { - return mealName; - } - - public void setMealName(String mealName) { - this.mealName = mealName; - } - - public String getNote() { - return note; - } - - public void setNote(String note) { - this.note = note; - } - - public long getMeal() { - return meal; - } - - public void setMeal(long meal) { - this.meal = meal; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/MessageResponse.java b/src/main/java/com/example/slimfitbackend/payload/MessageResponse.java index 9426281..764fdf0 100644 --- a/src/main/java/com/example/slimfitbackend/payload/MessageResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/MessageResponse.java @@ -1,7 +1,12 @@ package com.example.slimfitbackend.payload; +import lombok.Getter; +import lombok.Setter; + import java.util.Date; +@Setter +@Getter public class MessageResponse { private Long id; @@ -12,35 +17,4 @@ public class MessageResponse { private String username; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/NewActivityRequest.java b/src/main/java/com/example/slimfitbackend/payload/NewActivityRequest.java index 7457238..a2a7d23 100644 --- a/src/main/java/com/example/slimfitbackend/payload/NewActivityRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/NewActivityRequest.java @@ -1,9 +1,13 @@ package com.example.slimfitbackend.payload; import com.example.slimfitbackend.model.ActivityType; +import lombok.Getter; +import lombok.Setter; import java.util.Date; +@Setter +@Getter public class NewActivityRequest { private long activityType; @@ -16,43 +20,4 @@ public class NewActivityRequest { private Date date; - public long getActivityType() { - return activityType; - } - - public void setActivityType(long activityType) { - this.activityType = activityType; - } - - public long getCalorie() { - return calorie; - } - - public void setCalorie(long calorie) { - this.calorie = calorie; - } - - public long getDuration() { - return duration; - } - - public void setDuration(long duration) { - this.duration = duration; - } - - public long getIntensity() { - return intensity; - } - - public void setIntensity(long intensity) { - this.intensity = intensity; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/NewActivityResponse.java b/src/main/java/com/example/slimfitbackend/payload/NewActivityResponse.java index a5c761e..63a6f78 100644 --- a/src/main/java/com/example/slimfitbackend/payload/NewActivityResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/NewActivityResponse.java @@ -1,7 +1,12 @@ package com.example.slimfitbackend.payload; +import lombok.Getter; +import lombok.Setter; + import java.util.Date; +@Setter +@Getter public class NewActivityResponse { private long calorie; @@ -12,35 +17,4 @@ public class NewActivityResponse { private Date date; - public long getCalorie() { - return calorie; - } - - public void setCalorie(long calorie) { - this.calorie = calorie; - } - - public long getDuration() { - return duration; - } - - public void setDuration(long duration) { - this.duration = duration; - } - - public long getIntensity() { - return intensity; - } - - public void setIntensity(long intensity) { - this.intensity = intensity; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/PredictCalorieRequest.java b/src/main/java/com/example/slimfitbackend/payload/PredictCalorieRequest.java index b195bd0..ba1aebd 100644 --- a/src/main/java/com/example/slimfitbackend/payload/PredictCalorieRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/PredictCalorieRequest.java @@ -8,32 +8,7 @@ public class PredictCalorieRequest { private int intensity; - private Long actId; - private long duration; - public int getIntensity() { - return intensity; - } - - public void setIntensity(int intensity) { - this.intensity = intensity; - } - - public Long getActId() { - return actId; - } - - public void setActId(Long actId) { - this.actId = actId; - } - - public long getDuration() { - return duration; - } - - public void setDuration(long duration) { - this.duration = duration; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/PredictCalorieResponse.java b/src/main/java/com/example/slimfitbackend/payload/PredictCalorieResponse.java index 85c0018..942f92d 100644 --- a/src/main/java/com/example/slimfitbackend/payload/PredictCalorieResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/PredictCalorieResponse.java @@ -9,11 +9,4 @@ public class PredictCalorieResponse { private double calorie; - public double getCalorie() { - return calorie; - } - - public void setCalorie(double calorie) { - this.calorie = calorie; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/RegisterRequest.java b/src/main/java/com/example/slimfitbackend/payload/RegisterRequest.java index 82b8f48..13995d6 100644 --- a/src/main/java/com/example/slimfitbackend/payload/RegisterRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/RegisterRequest.java @@ -1,15 +1,12 @@ package com.example.slimfitbackend.payload; import com.example.slimfitbackend.model.Role; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; -@Data +@Setter +@Getter @Builder @AllArgsConstructor -@NoArgsConstructor public class RegisterRequest { private String firstname; @@ -17,36 +14,4 @@ public class RegisterRequest { private String email; private String password; - public String getFirstname() { - return firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - public String getLastname() { - return lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - } \ No newline at end of file diff --git a/src/main/java/com/example/slimfitbackend/payload/SaveUserRequest.java b/src/main/java/com/example/slimfitbackend/payload/SaveUserRequest.java index 72edcbf..0885455 100644 --- a/src/main/java/com/example/slimfitbackend/payload/SaveUserRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/SaveUserRequest.java @@ -5,18 +5,10 @@ import java.util.Date; -@Getter @Setter +@Getter public class SaveUserRequest { - private String email; - - private String firstName; - - private String lastName; - - private int age; - private Date dateOfBirth; private double height; @@ -29,83 +21,6 @@ public class SaveUserRequest { private int dailyActivityGoal; - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } - - public double getHeight() { - return height; - } - - public void setHeight(double height) { - this.height = height; - } - - public double getWeight() { - return weight; - } - - public void setWeight(double weight) { - this.weight = weight; - } - - public int getGender() { - return gender; - } - - public void setGender(int gender) { - this.gender = gender; - } - - public int getWeeklyWeightLossGoal() { - return weeklyWeightLossGoal; - } - - public void setWeeklyWeightLossGoal(int weeklyWeightLossGoal) { - this.weeklyWeightLossGoal = weeklyWeightLossGoal; - } - - public int getDailyActivityGoal() { - return dailyActivityGoal; - } + private double targetWeight; - public void setDailyActivityGoal(int dailyActivityGoal) { - this.dailyActivityGoal = dailyActivityGoal; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/SaveUserWeightRequest.java b/src/main/java/com/example/slimfitbackend/payload/SaveUserWeightRequest.java new file mode 100644 index 0000000..f2cfd97 --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/payload/SaveUserWeightRequest.java @@ -0,0 +1,12 @@ +package com.example.slimfitbackend.payload; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SaveUserWeightRequest { + + private double weight; + +} diff --git a/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalRequest.java b/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalRequest.java index 66bda08..f2dcb0e 100644 --- a/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalRequest.java @@ -1,14 +1,12 @@ package com.example.slimfitbackend.payload; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter public class SearchFoodCalRequest { private String foodName; - public String getFoodName() { - return foodName; - } - - public void setFoodName(String foodName) { - this.foodName = foodName; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalResponse.java b/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalResponse.java index f465603..4c0c992 100644 --- a/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalResponse.java +++ b/src/main/java/com/example/slimfitbackend/payload/SearchFoodCalResponse.java @@ -1,31 +1,16 @@ package com.example.slimfitbackend.payload; +import lombok.Getter; +import lombok.Setter; + import java.util.List; +@Setter +@Getter public class SearchFoodCalResponse { private FoodCalResponse matchFood; private List hintedFoods; - public SearchFoodCalResponse(FoodCalResponse matchFood, List hintedFoods) { - this.matchFood = matchFood; - this.hintedFoods = hintedFoods; - } - - public FoodCalResponse getMatchFood() { - return matchFood; - } - - public void setMatchFood(FoodCalResponse matchFood) { - this.matchFood = matchFood; - } - - public List getHintedFoods() { - return hintedFoods; - } - - public void setHintedFoods(List hintedFoods) { - this.hintedFoods = hintedFoods; - } } diff --git a/src/main/java/com/example/slimfitbackend/payload/SendMessageRequest.java b/src/main/java/com/example/slimfitbackend/payload/SendMessageRequest.java index a8b70f8..470db91 100644 --- a/src/main/java/com/example/slimfitbackend/payload/SendMessageRequest.java +++ b/src/main/java/com/example/slimfitbackend/payload/SendMessageRequest.java @@ -1,17 +1,12 @@ package com.example.slimfitbackend.payload; -import java.util.Date; +import lombok.Getter; +import lombok.Setter; +@Setter +@Getter public class SendMessageRequest { private String message; - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - } diff --git a/src/main/java/com/example/slimfitbackend/payload/UserWeightResponse.java b/src/main/java/com/example/slimfitbackend/payload/UserWeightResponse.java new file mode 100644 index 0000000..4a0e593 --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/payload/UserWeightResponse.java @@ -0,0 +1,22 @@ +package com.example.slimfitbackend.payload; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Setter +@Getter +@AllArgsConstructor +public class UserWeightResponse { + + private double weight; + + private Date date; + + public UserWeightResponse(double weight) { + this.weight = weight; + } + +} diff --git a/src/main/java/com/example/slimfitbackend/payload/common/MapStructMapper.java b/src/main/java/com/example/slimfitbackend/payload/common/MapStructMapper.java index 56de146..dfee531 100644 --- a/src/main/java/com/example/slimfitbackend/payload/common/MapStructMapper.java +++ b/src/main/java/com/example/slimfitbackend/payload/common/MapStructMapper.java @@ -10,6 +10,9 @@ @Mapper(componentModel = "spring") public interface MapStructMapper { + @Mapping(target = "currentWeight", ignore = true) + @Mapping(target = "targetWeight", ignore = true) + @Mapping(target = "totalActiveMinutes", ignore = true) DailyCalorieResponseDto dailyCalorietoDailyCalorieResponseDto(DailyCalorie dailyCalorie); User createUserRequestToUser(SaveUserRequest saveUserRequest); diff --git a/src/main/java/com/example/slimfitbackend/repository/UserActivityRepository.java b/src/main/java/com/example/slimfitbackend/repository/UserActivityRepository.java index 32773c7..4ee6782 100644 --- a/src/main/java/com/example/slimfitbackend/repository/UserActivityRepository.java +++ b/src/main/java/com/example/slimfitbackend/repository/UserActivityRepository.java @@ -1,9 +1,15 @@ package com.example.slimfitbackend.repository; +import com.example.slimfitbackend.model.User; import com.example.slimfitbackend.model.UserActivity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Date; +import java.util.List; + @Repository public interface UserActivityRepository extends JpaRepository { + + List findAllByDateBetweenAndUser(Date startDate, Date endDate, User user); } diff --git a/src/main/java/com/example/slimfitbackend/repository/WeightProgressRepository.java b/src/main/java/com/example/slimfitbackend/repository/WeightProgressRepository.java index 8d3de36..8dbafa4 100644 --- a/src/main/java/com/example/slimfitbackend/repository/WeightProgressRepository.java +++ b/src/main/java/com/example/slimfitbackend/repository/WeightProgressRepository.java @@ -1,9 +1,16 @@ package com.example.slimfitbackend.repository; +import com.example.slimfitbackend.model.User; import com.example.slimfitbackend.model.WeightProgress; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + @Repository public interface WeightProgressRepository extends JpaRepository { + + List findAllByUserOrderByDate(User user); + } diff --git a/src/main/java/com/example/slimfitbackend/security/JwtAuthFilter.java b/src/main/java/com/example/slimfitbackend/security/JwtAuthFilter.java index e132c1d..5fb966d 100644 --- a/src/main/java/com/example/slimfitbackend/security/JwtAuthFilter.java +++ b/src/main/java/com/example/slimfitbackend/security/JwtAuthFilter.java @@ -26,6 +26,7 @@ public class JwtAuthFilter extends OncePerRequestFilter { @Autowired private UserDetailsService userDetailsService; + @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { final String authHeader = request.getHeader("Authorization"); diff --git a/src/main/java/com/example/slimfitbackend/service/AuthenticationService.java b/src/main/java/com/example/slimfitbackend/service/AuthenticationService.java index 14691a7..ba62754 100644 --- a/src/main/java/com/example/slimfitbackend/service/AuthenticationService.java +++ b/src/main/java/com/example/slimfitbackend/service/AuthenticationService.java @@ -1,5 +1,6 @@ package com.example.slimfitbackend.service; +import com.example.slimfitbackend.exceptions.CustomException; import com.example.slimfitbackend.model.User; import com.example.slimfitbackend.payload.AuthenticationRequest; import com.example.slimfitbackend.payload.AuthenticationResponse; @@ -12,6 +13,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.Optional; + @Service @RequiredArgsConstructor public class AuthenticationService { @@ -30,21 +33,28 @@ public class AuthenticationService { public AuthenticationResponse register(RegisterRequest request) { - var user = new User(request.getEmail(),request.getFirstname(),request.getLastname(),passwordEncoder.encode(request.getPassword())); + var user = new User(request.getEmail(), request.getFirstname(), request.getLastname(), passwordEncoder.encode(request.getPassword())); + Optional optUser = userRepository.findByEmail(request.getEmail()); + if(optUser.isPresent()){ + throw new CustomException("User already exist"); + } userRepository.save(user); var jwtToken = jwtService.generateToken(user); return new AuthenticationResponse(jwtToken); } public AuthenticationResponse authenticate(AuthenticationRequest request) { + Optional user = userRepository.findByEmail(request.getEmail()); + if(user.isEmpty()){ + throw new CustomException("Invalid email or password"); + } + authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( request.getEmail(), request.getPassword() ) ); - User user = userRepository.findByEmail(request.getEmail()).orElseThrow(); - String token = jwtService.generateToken(user); - return new AuthenticationResponse(token); + return new AuthenticationResponse(jwtService.generateToken(user.get())); } } diff --git a/src/main/java/com/example/slimfitbackend/service/DailyCalorieService.java b/src/main/java/com/example/slimfitbackend/service/DailyCalorieService.java index b19a227..6ef9d39 100644 --- a/src/main/java/com/example/slimfitbackend/service/DailyCalorieService.java +++ b/src/main/java/com/example/slimfitbackend/service/DailyCalorieService.java @@ -2,15 +2,19 @@ import com.example.slimfitbackend.model.DailyCalorie; import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.UserActivity; import com.example.slimfitbackend.payload.DailyCalorieResponseDto; import com.example.slimfitbackend.payload.GetDailyCalorieDto; import com.example.slimfitbackend.payload.common.MapStructMapper; import com.example.slimfitbackend.repository.DailyCalorieRepository; +import com.example.slimfitbackend.repository.UserActivityRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; +import java.util.List; import java.util.Optional; +import java.util.Calendar; @Service public class DailyCalorieService { @@ -24,11 +28,10 @@ public class DailyCalorieService { @Autowired private MapStructMapper mapStructMapper; - private int calorieDeficitPerToday(int weightLossPerWeekInG) { + @Autowired + private UserActivityRepository userActivityRepository; - if (weightLossPerWeekInG > 500) { - // throw exception not recommended - } + private int calorieDeficitPerToday(int weightLossPerWeekInG) { double weightLossPerWeekInKG = (double) weightLossPerWeekInG / 1000; @@ -64,10 +67,42 @@ public DailyCalorieResponseDto getDailyCalorieResponse(GetDailyCalorieDto getDai if (optDailyCal.isEmpty()) { dailyCalorie = createNewDailyCalorie(user, getDailyCalorieDto.getDate()); dailyCalorieRepository.save(dailyCalorie); - return mapStructMapper.dailyCalorietoDailyCalorieResponseDto(dailyCalorie); + DailyCalorieResponseDto returnObject = mapStructMapper.dailyCalorietoDailyCalorieResponseDto(dailyCalorie); + returnObject.setCurrentWeight(userService.getUserWeight().getWeight()); + returnObject.setTargetWeight(user.getTargetWeight()); + returnObject.setTotalActiveMinutes(getDailyActiveMinutes(getDailyCalorieDto.getDate(),user)); + return returnObject; } // get from db comparing date if not found create - return mapStructMapper.dailyCalorietoDailyCalorieResponseDto(optDailyCal.get()); + DailyCalorieResponseDto returnObject = mapStructMapper.dailyCalorietoDailyCalorieResponseDto(optDailyCal.get()); + returnObject.setCurrentWeight(userService.getUserWeight().getWeight()); + returnObject.setTargetWeight(user.getTargetWeight()); + returnObject.setTotalActiveMinutes(getDailyActiveMinutes(getDailyCalorieDto.getDate(),user)); + return returnObject; + } + + public int getDailyActiveMinutes(Date currentDate, User user){ + + // Set the time to midnight represent the start of the day + Calendar calendar = Calendar.getInstance(); + calendar.setTime(currentDate); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + Date startDate = calendar.getTime(); + + // Set the time to just before midnight to represent the end of the day + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + Date endDate = calendar.getTime(); + + List todayActivities = userActivityRepository.findAllByDateBetweenAndUser(startDate,endDate,user); + int totalMinutes = 0; + for (UserActivity todayActivity : todayActivities) { + totalMinutes += (int) todayActivity.getDuration(); + } + return totalMinutes; } public DailyCalorie getDailyCalorie(User user, Date date) { @@ -86,8 +121,6 @@ private DailyCalorie createNewDailyCalorie(User user, Date date) { devideCaloriesForMeals(dailyCalorieIntake, dailyCalorie); dailyCalorie.setDailyActivityActual(0); dailyCalorie.setDailyActivityGoal(user.getDailyActivityGoal()); - dailyCalorie.setDailyActual(0); - dailyCalorie.setDailyGoal(user.getDailyActivityGoal()); return dailyCalorie; } } diff --git a/src/main/java/com/example/slimfitbackend/service/IntakeRecordService.java b/src/main/java/com/example/slimfitbackend/service/IntakeRecordService.java index 5807124..22e5b21 100644 --- a/src/main/java/com/example/slimfitbackend/service/IntakeRecordService.java +++ b/src/main/java/com/example/slimfitbackend/service/IntakeRecordService.java @@ -5,10 +5,7 @@ import com.example.slimfitbackend.model.User; import com.example.slimfitbackend.payload.*; import com.example.slimfitbackend.payload.common.MapStructMapper; -import com.example.slimfitbackend.repository.ActivityTypeRepository; -import com.example.slimfitbackend.repository.DailyCalorieRepository; import com.example.slimfitbackend.repository.IntakeRecordRepository; -import com.fasterxml.jackson.core.JsonProcessingException; import org.json.JSONArray; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -17,7 +14,7 @@ import org.json.JSONObject; import java.util.ArrayList; -import java.util.Optional; +import java.util.Objects; @Service public class IntakeRecordService { @@ -34,44 +31,64 @@ public class IntakeRecordService { @Autowired private IntakeRecordRepository intakeRecordRepository; - public SearchFoodCalResponse getCalorieForFood(SearchFoodCalRequest searchFoodCalRequest) throws JsonProcessingException { - String apiUrl = "https://api.edamam.com/api/food-database/parser?nutrition-type=logging&app_id=07d50733&app_key=80fcb49b500737827a9a23f7049653b9&ingr=" + searchFoodCalRequest.getFoodName(); - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.getForEntity(apiUrl, String.class); - JSONObject json = new JSONObject(response); - Object json1 = json.get("body"); - JSONObject body = new JSONObject(json1.toString()); - Object parsed = body.get("parsed"); - JSONArray jsonArray = new JSONArray(parsed.toString()); - JSONObject jsonObject = jsonArray.getJSONObject(0); - JSONObject foodObject = jsonObject.getJSONObject("food"); - JSONObject nutrientsObject = foodObject.getJSONObject("nutrients"); - String name = foodObject.getString("label"); - double enercKcal = nutrientsObject.getDouble("ENERC_KCAL"); - - Object hints = body.get("hints"); - JSONArray hintsJsonArray = new JSONArray(hints.toString()); - - ArrayList foodCalResponses = new ArrayList<>(); - - for (int i = 0; i < hintsJsonArray.length(); i++) { - JSONObject hintJsonObject = hintsJsonArray.getJSONObject(0); - JSONObject hintFoodObject = hintJsonObject.getJSONObject("food"); - JSONObject hintNutrientsObject = hintFoodObject.getJSONObject("nutrients"); - - foodCalResponses.add(new FoodCalResponse(hintFoodObject.getString("label"), hintNutrientsObject.getDouble("ENERC_KCAL"))); + public SearchFoodCalResponse getCalorieForFood(SearchFoodCalRequest searchFoodCalRequest) { + try{ + String apiUrl = "https://api.edamam.com/api/food-database/parser?nutrition-type=logging&app_id=f0a49c1a&app_key=e34b74716a82c88c26a7353d340b90b4&ingr=" + searchFoodCalRequest.getFoodName(); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.getForEntity(apiUrl, String.class); + JSONObject json = new JSONObject(response); + Object json1 = json.get("body"); + JSONObject body = new JSONObject(json1.toString()); + Object parsed = body.get("parsed"); + JSONArray jsonArray = new JSONArray(parsed.toString()); + + SearchFoodCalResponse searchFoodCalResponse = new SearchFoodCalResponse(); + try { + JSONObject jsonObject = jsonArray.getJSONObject(0); + JSONObject foodObject = jsonObject.getJSONObject("food"); + JSONObject nutrientsObject = foodObject.getJSONObject("nutrients"); + String name = foodObject.getString("label"); + double enercKcal = nutrientsObject.getDouble("ENERC_KCAL"); + searchFoodCalResponse.setMatchFood(new FoodCalResponse(name, enercKcal)); + } catch (Exception ignored) { + searchFoodCalResponse.setMatchFood(null); + } + + Object hints = body.get("hints"); + JSONArray hintsJsonArray = new JSONArray(hints.toString()); + + ArrayList foodCalResponses = new ArrayList<>(); + + for (int i = 0; i < hintsJsonArray.length(); i++) { + JSONObject hintJsonObject = hintsJsonArray.getJSONObject(0); + JSONObject hintFoodObject = hintJsonObject.getJSONObject("food"); + JSONObject hintNutrientsObject = hintFoodObject.getJSONObject("nutrients"); + String foodLabel = hintFoodObject.getString("label"); + if (!doesFoodAlreadyExist(foodCalResponses, foodLabel)) + foodCalResponses.add(new FoodCalResponse(foodLabel, hintNutrientsObject.getDouble("ENERC_KCAL"))); + } + searchFoodCalResponse.setHintedFoods(foodCalResponses); + return searchFoodCalResponse; + }catch (Exception e){ + e.printStackTrace(); } + return new SearchFoodCalResponse(); + } - return new SearchFoodCalResponse(new FoodCalResponse(name, enercKcal), foodCalResponses); + private boolean doesFoodAlreadyExist(ArrayList foodCalResponses, String name) { + for (FoodCalResponse foodCalResponse : foodCalResponses) { + if (Objects.equals(foodCalResponse.getFoodName(), name)) + return true; + } + return false; } public IntakeRecordResponse saveNewIntakeRecord(IntakeRecordRequest intakeRecordRequest) throws Exception { - + User user = userService.getCurrentUser(); IntakeRecord intakeRecord = new IntakeRecord(); intakeRecord.setCalorieCount(intakeRecordRequest.getCalorieCount()); intakeRecord.setMealName(intakeRecordRequest.getMealName()); intakeRecord.setNote(intakeRecordRequest.getNote()); - User user = userService.getCurrentUser(); DailyCalorie dailyCal = dailyCalorieService.getDailyCalorie(user, intakeRecordRequest.getDate()); switch ((int) intakeRecordRequest.getMeal()) { @@ -83,7 +100,7 @@ public IntakeRecordResponse saveNewIntakeRecord(IntakeRecordRequest intakeRecord default -> { } } - + dailyCal.setDailyActual(dailyCal.getDailyActual() + intakeRecordRequest.getCalorieCount()); intakeRecord.setDailyCalorie(dailyCal); intakeRecord = intakeRecordRepository.save(intakeRecord); return mapStructMapper.itakeRecordToIntakeRecordResponse(intakeRecord); diff --git a/src/main/java/com/example/slimfitbackend/service/MLModelService.java b/src/main/java/com/example/slimfitbackend/service/MLModelService.java index bf93965..ced34bb 100644 --- a/src/main/java/com/example/slimfitbackend/service/MLModelService.java +++ b/src/main/java/com/example/slimfitbackend/service/MLModelService.java @@ -22,7 +22,7 @@ private static Object getRegressionValue(Map values) { public static double getCalorie(double gender, double age, double height, double weight, double duration, double exercise_type_num, double intensity) { Map values = new HashMap<>(); - values.put("Gender",gender); + values.put("Gender", gender); values.put("Age", age); values.put("Height", height); values.put("Weight", weight); diff --git a/src/main/java/com/example/slimfitbackend/service/MyUserDetailsService.java b/src/main/java/com/example/slimfitbackend/service/MyUserDetailsService.java index 297547f..cd93834 100644 --- a/src/main/java/com/example/slimfitbackend/service/MyUserDetailsService.java +++ b/src/main/java/com/example/slimfitbackend/service/MyUserDetailsService.java @@ -24,6 +24,6 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx if (optionalUser.isPresent()){ return new org.springframework.security.core.userdetails.User(optionalUser.get().getEmail(),"foo",new ArrayList<>()); } - return null; + throw new UsernameNotFoundException("User not found"); } } diff --git a/src/main/java/com/example/slimfitbackend/service/ProgressService.java b/src/main/java/com/example/slimfitbackend/service/ProgressService.java new file mode 100644 index 0000000..a53db2c --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/service/ProgressService.java @@ -0,0 +1,68 @@ +package com.example.slimfitbackend.service; + + +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.WeightProgress; +import com.example.slimfitbackend.payload.UserWeightResponse; +import com.example.slimfitbackend.repository.WeightProgressRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.time.LocalDate; +import java.time.ZoneId; + +@Service +public class ProgressService { + + @Autowired + private WeightProgressRepository weightProgressRepository; + + @Autowired + private UserService userService; + + public List getActualWeightProgress() throws Exception { + User user = userService.getCurrentUser(); + List weightProgresses = weightProgressRepository.findAllByUserOrderByDate(user); + List userWeightResponses = new ArrayList<>(); + for (WeightProgress weightProgress : weightProgresses) { + userWeightResponses.add(new UserWeightResponse(weightProgress.getWeight(), weightProgress.getDate())); + } + if(userWeightResponses.size()>5){ + return userWeightResponses.subList(userWeightResponses.size() - 5, userWeightResponses.size()); + } + return userWeightResponses; + } + + public List getUserGoal() throws Exception { + User user = userService.getCurrentUser(); + List dateList = generateDateListPerWeek(user.getStartDate(), new Date()); + List userWeightResponses = new ArrayList<>(); + double currentWeight = user.getStartWeight(); + for (Date date : dateList) { + userWeightResponses.add(new UserWeightResponse(currentWeight, date)); + currentWeight = ((currentWeight * 1000) - user.getWeeklyWeightLossGoal()) / 1000; + } + return userWeightResponses; + } + + public static List generateDateListPerWeek(Date startDate, Date endDate) { + List dateList = new ArrayList<>(); + + // Convert input Date objects to LocalDate + LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + + LocalDate currentDate = startLocalDate; + + while (currentDate.isBefore(endLocalDate)) { + // Convert LocalDate back to Date + dateList.add(Date.from(currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); + currentDate = currentDate.plusWeeks(1); + } + + return dateList; + } +} diff --git a/src/main/java/com/example/slimfitbackend/service/UserActivityService.java b/src/main/java/com/example/slimfitbackend/service/UserActivityService.java index 6faa4ae..a931ed4 100644 --- a/src/main/java/com/example/slimfitbackend/service/UserActivityService.java +++ b/src/main/java/com/example/slimfitbackend/service/UserActivityService.java @@ -42,7 +42,7 @@ public class UserActivityService { private MapStructMapper mapStructMapper; - public NewActivityResponse addNewActivity(NewActivityRequest newActivityRequest) throws Exception { + public NewActivityResponse addNewActivity(NewActivityRequest newActivityRequest) { UserActivity userActivity = new UserActivity(); User user = userService.getCurrentUser(); userActivity.setUser(user); @@ -54,15 +54,15 @@ public NewActivityResponse addNewActivity(NewActivityRequest newActivityRequest) activityType.ifPresent(userActivity::setActivityType); userActivityRepository.save(userActivity); - DailyCalorie daily = dailyCalorieService.getDailyCalorie(user,newActivityRequest.getDate()); + DailyCalorie daily = dailyCalorieService.getDailyCalorie(user, newActivityRequest.getDate()); daily.setDailyActivityActual(daily.getDailyActivityActual() + newActivityRequest.getCalorie()); - daily.setDailyActual(daily.getDailyActual() + newActivityRequest.getCalorie()); + daily.setDailyActual(daily.getDailyActual() - newActivityRequest.getCalorie()); dailyCalorieRepository.save(daily); return mapStructMapper.userActivityToNewActivityResponse(userActivity); } - public PredictCalorieResponse getPredictedCalForAct(PredictCalorieRequest predictCalorieRequest) throws Exception { + public PredictCalorieResponse getPredictedCalForAct(PredictCalorieRequest predictCalorieRequest) { User user = userService.getCurrentUser(); double results = MLModelService.getCalorie(user.getGender(), user.getAge(), user.getHeight(), user.getWeight(), predictCalorieRequest.getDuration(), predictCalorieRequest.getActId(), predictCalorieRequest.getIntensity()); PredictCalorieResponse predictCalorieResponse = new PredictCalorieResponse(); @@ -70,11 +70,11 @@ public PredictCalorieResponse getPredictedCalForAct(PredictCalorieRequest predic return predictCalorieResponse; } - public List getActivities(){ + public List getActivities() { List activities = activityTypeRepository.findAll(); List getActivitiesResponseList = new ArrayList<>(); for (ActivityType activity : activities) { - getActivitiesResponseList.add(new GetActivitiesResponse(activity.getName(),activity.getActId())); + getActivitiesResponseList.add(new GetActivitiesResponse(activity.getName(), activity.getActId())); } return getActivitiesResponseList; } diff --git a/src/main/java/com/example/slimfitbackend/service/UserService.java b/src/main/java/com/example/slimfitbackend/service/UserService.java index 94965ae..4a7d86a 100644 --- a/src/main/java/com/example/slimfitbackend/service/UserService.java +++ b/src/main/java/com/example/slimfitbackend/service/UserService.java @@ -1,17 +1,26 @@ package com.example.slimfitbackend.service; +import com.example.slimfitbackend.exceptions.CustomException; import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.WeightProgress; import com.example.slimfitbackend.payload.GetUserResponse; +import com.example.slimfitbackend.payload.SaveUserWeightRequest; +import com.example.slimfitbackend.payload.UserWeightResponse; import com.example.slimfitbackend.payload.SaveUserRequest; import com.example.slimfitbackend.payload.common.MapStructMapper; import com.example.slimfitbackend.repository.UserRepository; +import com.example.slimfitbackend.repository.WeightProgressRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.List; import java.util.Optional; +import static com.example.slimfitbackend.util.Util.yearCountBetweenDates; + @Service public class UserService { @@ -21,33 +30,33 @@ public class UserService { @Autowired private UserRepository userRepository; + @Autowired + private WeightProgressRepository weightProgressRepository; + @Transactional public boolean createNewUser(SaveUserRequest saveUserRequest) { try { - Optional optUser = userRepository.findByEmail(saveUserRequest.getEmail()); - - if (optUser.isPresent()) { - User user = optUser.get(); - user.setFirstName(saveUserRequest.getFirstName()); - user.setLastName(saveUserRequest.getLastName()); - user.setAge(saveUserRequest.getAge()); - user.setDateOfBirth(saveUserRequest.getDateOfBirth()); - user.setHeight(saveUserRequest.getHeight()); - user.setWeight(saveUserRequest.getWeight()); - user.setGender(saveUserRequest.getGender()); - - //1 == male 2 == female - if (user.getGender() == 1) { - user.setBmr(88.362 + (13.397 * user.getWeight()) + (4.799 * user.getHeight()) - (5.677 * user.getAge())); - } else if (user.getGender() == 2) { - user.setBmr(447.593 + (9.247 * user.getWeight()) + (3.098 * user.getHeight()) - (4.330 * user.getAge())); - } - user.setWeeklyWeightLossGoal(saveUserRequest.getWeeklyWeightLossGoal()); - - user.setDailyActivityGoal(saveUserRequest.getDailyActivityGoal()); - userRepository.save(user); + User user = getCurrentUser(); + user.setAge(yearCountBetweenDates(saveUserRequest.getDateOfBirth(), new Date())); + user.setDateOfBirth(saveUserRequest.getDateOfBirth()); + user.setHeight(saveUserRequest.getHeight()); + user.setWeight(saveUserRequest.getWeight()); + user.setStartWeight(saveUserRequest.getWeight()); + user.setGender(saveUserRequest.getGender()); + user.setStartDate(new Date()); + user.setTargetWeight(saveUserRequest.getTargetWeight()); + + //1 == male 2 == female + if (user.getGender() == 1) { + user.setBmr(88.362 + (13.397 * user.getWeight()) + (4.799 * user.getHeight()) - (5.677 * user.getAge())); + } else if (user.getGender() == 2) { + user.setBmr(447.593 + (9.247 * user.getWeight()) + (3.098 * user.getHeight()) - (4.330 * user.getAge())); } + user.setWeeklyWeightLossGoal(saveUserRequest.getWeeklyWeightLossGoal()); + + user.setDailyActivityGoal(saveUserRequest.getDailyActivityGoal()); + userRepository.save(user); return true; } catch (Exception e) { @@ -55,56 +64,42 @@ public boolean createNewUser(SaveUserRequest saveUserRequest) { } } - public User getCurrentUser() throws Exception { + public User getCurrentUser() { String email = SecurityContextHolder.getContext().getAuthentication().getName(); Optional optUser = userRepository.findByEmail(email); - if (optUser.isPresent()){ + if (optUser.isPresent()) { return optUser.get(); } else { - throw new Exception(); + throw new CustomException("User do not exist"); } } - public GetUserResponse getUser() throws Exception { + public GetUserResponse getUser() { return mapStructMapper.userToGetUserResponse(getCurrentUser()); } -} - - -// User user = optUser.get(); -// if(saveUserRequest.getFirstName() != null){ -// user.setFirstName(saveUserRequest.getFirstName()); -// } -// if(saveUserRequest.getLastName() != null){ -// user.setLastName(saveUserRequest.getLastName()); -// } -// if(saveUserRequest.getAge() != 0){ -// user.setAge(saveUserRequest.getAge()); -// } -// if(saveUserRequest.getDateOfBirth() != null){ -// user.setDateOfBirth(saveUserRequest.getDateOfBirth()); -// } -// if(saveUserRequest.getHeight() != 0){ -// user.setHeight(saveUserRequest.getHeight()); -// } -// if(saveUserRequest.getWeight() != 0){ -// user.setWeight(saveUserRequest.getWeight()); -// } -// if(saveUserRequest.getGender() != 0){ -// user.setGender(saveUserRequest.getGender()); -// -// //1 == male 2 == female -// if(user.getGender() == 1){ -// user.setBmr(88.362 + (13.397 * user.getWeight()) + (4.799 * user.getHeight()) - (5.677 * user.getAge())); -// } else if (user.getGender() == 2){ -// user.setBmr(447.593 + (9.247 * user.getWeight()) + (3.098 * user.getHeight()) - (4.330 * user.getAge())); -// } -// } -// if(saveUserRequest.getWeeklyWeightLossGoal() != 0){ -// user.setWeeklyWeightLossGoal(saveUserRequest.getWeeklyWeightLossGoal()); -// } -// -// user.setDailyActivityGoal(saveUserRequest.getDailyActivityGoal()); -// userRepository.save(user); \ No newline at end of file + + public UserWeightResponse getUserWeightResponse() { + return new UserWeightResponse(getUserWeight().getWeight()); + } + + public WeightProgress getUserWeight(){ + User user = getCurrentUser(); + List userWeightLogs = weightProgressRepository.findAllByUserOrderByDate(user); + if(!userWeightLogs.isEmpty()){ + return userWeightLogs.get(userWeightLogs.size() - 1); + } + return new WeightProgress(user, user.getWeight()); + } + + public UserWeightResponse saveUserWeight(SaveUserWeightRequest saveUserWeightRequest) throws Exception { + WeightProgress weightProgress = new WeightProgress(); + weightProgress.setWeight(saveUserWeightRequest.getWeight()); + weightProgress.setDate(new Date()); + weightProgress.setUser(getCurrentUser()); + weightProgressRepository.save(weightProgress); + return new UserWeightResponse(weightProgress.getWeight()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/slimfitbackend/util/Util.java b/src/main/java/com/example/slimfitbackend/util/Util.java new file mode 100644 index 0000000..8773745 --- /dev/null +++ b/src/main/java/com/example/slimfitbackend/util/Util.java @@ -0,0 +1,16 @@ +package com.example.slimfitbackend.util; + +import java.time.LocalDate; +import java.time.Period; +import java.time.ZoneId; +import java.util.Date; + +public class Util { + + public static int yearCountBetweenDates(Date startDate, Date endDate){ + LocalDate localDate1 = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate localDate2 = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + Period period = Period.between(localDate1, localDate2); + return period.getYears(); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b057688..ee6b8b2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,5 +2,6 @@ spring.datasource.url=jdbc:mysql://localhost:3306/slimfit spring.datasource.username=root spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update +logging.level.root=DEBUG diff --git a/src/test/java/com/example/slimfitbackend/service/AuthenticationServiceTest.java b/src/test/java/com/example/slimfitbackend/service/AuthenticationServiceTest.java new file mode 100644 index 0000000..df01759 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/AuthenticationServiceTest.java @@ -0,0 +1,71 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.payload.AuthenticationRequest; +import com.example.slimfitbackend.payload.AuthenticationResponse; +import com.example.slimfitbackend.payload.RegisterRequest; +import com.example.slimfitbackend.repository.UserRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.password.PasswordEncoder; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +public class AuthenticationServiceTest { + + @Mock + private UserRepository userRepository; + + @Mock + private JwtService jwtService; + + @Mock + private AuthenticationManager authenticationManager; + + @Mock + private PasswordEncoder passwordEncoder; + + @InjectMocks + private AuthenticationService authenticationService; + + @BeforeEach + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testRegister() { + RegisterRequest request = new RegisterRequest("test@example.com", "John", "Doe", "password"); + User user = new User(request.getEmail(), request.getFirstname(), request.getLastname(), "encoded_password"); + + when(passwordEncoder.encode("password")).thenReturn("encoded_password"); + when(userRepository.save(any(User.class))).thenReturn(user); + when(jwtService.generateToken(any(User.class))).thenReturn("jwt_token"); + + AuthenticationResponse response = authenticationService.register(request); + + assertEquals("jwt_token", response.getToken()); + verify(userRepository, times(1)).save(any(User.class)); + } + + @Test + public void testAuthenticate() { + AuthenticationRequest request = new AuthenticationRequest("test@example.com", "password"); + User user = new User("test@example.com", "John", "Doe", "encoded_password"); + + when(userRepository.findByEmail("test@example.com")).thenReturn(Optional.of(user)); + when(jwtService.generateToken(any(User.class))).thenReturn("jwt_token"); + + AuthenticationResponse response = authenticationService.authenticate(request); + + assertEquals("jwt_token", response.getToken()); + verify(authenticationManager, times(1)).authenticate(any()); + } +} diff --git a/src/test/java/com/example/slimfitbackend/service/DailyCalorieServiceTest.java b/src/test/java/com/example/slimfitbackend/service/DailyCalorieServiceTest.java new file mode 100644 index 0000000..ce559b4 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/DailyCalorieServiceTest.java @@ -0,0 +1,91 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.DailyCalorie; +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.WeightProgress; +import com.example.slimfitbackend.payload.DailyCalorieResponseDto; +import com.example.slimfitbackend.payload.GetDailyCalorieDto; +import com.example.slimfitbackend.payload.common.MapStructMapper; +import com.example.slimfitbackend.repository.DailyCalorieRepository; +import com.example.slimfitbackend.repository.UserActivityRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +class DailyCalorieServiceTest { + + @Mock + private DailyCalorieRepository dailyCalorieRepository; + + @Mock + private UserService userService; + + @Mock + private MapStructMapper mapStructMapper; + + @Mock + private UserActivityRepository userActivityRepository; + + @InjectMocks + private DailyCalorieService dailyCalorieService; + + @BeforeEach + void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + void testGetDailyCalorieResponse() throws Exception { + // Mocking user + User user = new User(); + user.setUserId(1L); + user.setBmr(2000); + user.setDailyActivityGoal(500); + user.setWeeklyWeightLossGoal(1000); + + // Mocking current date + Date currentDate = new Date(); + + // Mocking user service to return current user + when(userService.getCurrentUser()).thenReturn(user); + + // Mocking daily calorie response DTO + DailyCalorieResponseDto mockedResponseDto = new DailyCalorieResponseDto(); + mockedResponseDto.setDailyGoal(1800); + mockedResponseDto.setCurrentWeight(70); + mockedResponseDto.setTargetWeight(65); + mockedResponseDto.setTotalActiveMinutes(60); + + WeightProgress weightProgress = new WeightProgress(); + weightProgress.setWeight(10.0); + + // Mocking daily calorie repository + when(dailyCalorieRepository.findByDateAndUser(any(Date.class), eq(user))).thenReturn(Optional.empty()); + DailyCalorie newDailyCalorie = new DailyCalorie(); + when(dailyCalorieRepository.save(any(DailyCalorie.class))).thenReturn(newDailyCalorie); + when(mapStructMapper.dailyCalorietoDailyCalorieResponseDto(any())).thenReturn(mockedResponseDto); + when(userService.getUserWeight()).thenReturn(weightProgress); + + // Test + GetDailyCalorieDto getDailyCalorieDto = new GetDailyCalorieDto(); + getDailyCalorieDto.setDate(currentDate); + DailyCalorieResponseDto responseDto = dailyCalorieService.getDailyCalorieResponse(getDailyCalorieDto); + + mockedResponseDto.setCurrentWeight(weightProgress.getWeight()); + mockedResponseDto.setTotalActiveMinutes(0); + + // Verify + assertEquals(mockedResponseDto, responseDto); + verify(userService, times(1)).getCurrentUser(); + verify(dailyCalorieRepository, times(1)).findByDateAndUser(any(Date.class), eq(user)); + verify(dailyCalorieRepository, times(1)).save(any(DailyCalorie.class)); + } + +} diff --git a/src/test/java/com/example/slimfitbackend/service/IntakeRecordServiceTest.java b/src/test/java/com/example/slimfitbackend/service/IntakeRecordServiceTest.java new file mode 100644 index 0000000..2d33fc8 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/IntakeRecordServiceTest.java @@ -0,0 +1,80 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.DailyCalorie; +import com.example.slimfitbackend.model.IntakeRecord; +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.payload.*; +import com.example.slimfitbackend.payload.common.MapStructMapper; +import com.example.slimfitbackend.repository.IntakeRecordRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestTemplate; + +import java.util.Date; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +class IntakeRecordServiceTest { + + @Mock + private DailyCalorieService dailyCalorieService; + + @Mock + private UserService userService; + + @Mock + private IntakeRecordRepository intakeRecordRepository; + + @Mock + private MapStructMapper mapStructMapper; + + @Mock + private RestTemplate restTemplate; + + @InjectMocks + private IntakeRecordService intakeRecordService; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void saveNewIntakeRecord_Success() throws Exception { + IntakeRecordRequest request = new IntakeRecordRequest(); + request.setCalorieCount(200); + request.setMealName("Breakfast"); + request.setNote("Test note"); + request.setDate(new Date()); + request.setMeal(1); + + User user = new User(); // create a mock user + + DailyCalorie dailyCalorie = new DailyCalorie(); + dailyCalorie.setBreakfastActual(0); + dailyCalorie.setLunchActual(0); + dailyCalorie.setDinnerActual(0); + dailyCalorie.setSnackActual(0); + dailyCalorie.setDailyActual(0); + + when(userService.getCurrentUser()).thenReturn(user); + when(dailyCalorieService.getDailyCalorie(user, request.getDate())).thenReturn(dailyCalorie); + + IntakeRecord savedIntakeRecord = new IntakeRecord(); + + + when(intakeRecordRepository.save(any())).thenReturn(savedIntakeRecord); + IntakeRecordResponse expectedResponse = new IntakeRecordResponse(); + when(mapStructMapper.itakeRecordToIntakeRecordResponse(any())).thenReturn(expectedResponse); + + IntakeRecordResponse actualResponse = intakeRecordService.saveNewIntakeRecord(request); + + assertEquals(expectedResponse, actualResponse); + assertEquals(200, dailyCalorie.getBreakfastActual()); + assertEquals(200, dailyCalorie.getDailyActual()); + } +} diff --git a/src/test/java/com/example/slimfitbackend/service/MLModelServiceTest.java b/src/test/java/com/example/slimfitbackend/service/MLModelServiceTest.java new file mode 100644 index 0000000..97cc442 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/MLModelServiceTest.java @@ -0,0 +1,25 @@ +package com.example.slimfitbackend.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MLModelServiceTest { + + @Test + void getCalorie_ReturnsCorrectCalorieValue() { + double gender = 1.0; + double age = 30; + double height = 175; + double weight = 70; + double duration = 60; + double exerciseTypeNum = 1; + double intensity = 3; + + double expectedCalorie = 93.86078800514693; // An output value from the model + + double actualCalorie = MLModelService.getCalorie(gender, age, height, weight, duration, exerciseTypeNum, intensity); + + assertEquals(expectedCalorie, actualCalorie, 0.01); + } +} diff --git a/src/test/java/com/example/slimfitbackend/service/MessageServiceTest.java b/src/test/java/com/example/slimfitbackend/service/MessageServiceTest.java new file mode 100644 index 0000000..7848887 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/MessageServiceTest.java @@ -0,0 +1,122 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.Message; +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.payload.MessageResponse; +import com.example.slimfitbackend.payload.SendMessageRequest; +import com.example.slimfitbackend.payload.common.MapStructMapper; +import com.example.slimfitbackend.repository.MessageRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +public class MessageServiceTest { + + @Mock + private MessageRepository messageRepository; + + @Mock + private MapStructMapper mapStructMapper; + + @Mock + private UserService userService; + + @InjectMocks + private MessageService messageService; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testGetAllMessageResponse() { + // Mocking data + Message message1 = new Message(); + message1.setId(1L); + message1.setMessage("Test message 1"); + User user1 = new User(); + user1.setUserId(1L); + user1.setFirstName("John"); + message1.setUser(user1); + + MessageResponse messageResponse1 = new MessageResponse(); + messageResponse1.setId(1L); + messageResponse1.setMessage("Test message 1"); + messageResponse1.setUsername("John"); + + List messages = new ArrayList<>(); + messages.add(message1); + + List expectedResponse = new ArrayList<>(); + expectedResponse.add(messageResponse1); + + // Mocking repository behavior + when(messageRepository.findAll()).thenReturn(messages); + when(mapStructMapper.messageToMessageResponse(message1)).thenReturn(messageResponse1); + + // Calling the service method + List actualResponse = messageService.getAllMessageResponse(); + + // Verifying the result + assertEquals(expectedResponse.size(), actualResponse.size()); + assertEquals(expectedResponse.get(0).getId(), actualResponse.get(0).getId()); + assertEquals(expectedResponse.get(0).getMessage(), actualResponse.get(0).getMessage()); + assertEquals(expectedResponse.get(0).getUsername(), actualResponse.get(0).getUsername()); + + // Verifying interactions with mocks + verify(messageRepository, times(1)).findAll(); + verify(mapStructMapper, times(1)).messageToMessageResponse(message1); + } + + @Test + public void testSendMessage() throws Exception { + // Mocking data + SendMessageRequest request = new SendMessageRequest(); + request.setMessage("Test message"); + + User user = new User(); + user.setUserId(1L); + user.setFirstName("John"); + + Message message = new Message(); + message.setId(1L); + message.setMessage("Test message"); + message.setUser(user); + message.setDate(new Date()); + + MessageResponse expectedResponse = new MessageResponse(); + expectedResponse.setId(1L); + expectedResponse.setMessage("Test message"); + expectedResponse.setUsername("John"); + + // Mocking getCurrentUser() method of UserService + when(userService.getCurrentUser()).thenReturn(user); + + // Mocking repository behavior + when(messageRepository.save(any(Message.class))).thenReturn(message); + when(mapStructMapper.messageToMessageResponse(message)).thenReturn(expectedResponse); + + // Calling the service method + MessageResponse actualResponse = messageService.sendMessage(request); + + // Verifying the result + assertEquals(expectedResponse.getId(), actualResponse.getId()); + assertEquals(expectedResponse.getMessage(), actualResponse.getMessage()); + assertEquals(expectedResponse.getUsername(), actualResponse.getUsername()); + + // Verifying interactions with mocks + verify(userService, times(1)).getCurrentUser(); + verify(messageRepository, times(1)).save(any(Message.class)); + verify(mapStructMapper, times(1)).messageToMessageResponse(message); + } +} diff --git a/src/test/java/com/example/slimfitbackend/service/MyUserDetailsServiceTest.java b/src/test/java/com/example/slimfitbackend/service/MyUserDetailsServiceTest.java new file mode 100644 index 0000000..2c98f16 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/MyUserDetailsServiceTest.java @@ -0,0 +1,58 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.repository.UserRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class MyUserDetailsServiceTest { + + @Mock + private UserRepository userRepository; + + @InjectMocks + private MyUserDetailsService userDetailsService; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void loadUserByUsername_UserFound_ReturnsUserDetails() { + String username = "test@example.com"; + User user = new User(); + user.setEmail(username); + user.setPassword("hashedPassword"); + + when(userRepository.findByEmail(username)).thenReturn(Optional.of(user)); + + UserDetails userDetails = userDetailsService.loadUserByUsername(username); + + assertNotNull(userDetails); + assertEquals(username, userDetails.getUsername()); + assertEquals("foo", userDetails.getPassword()); // Assuming password is always "foo" for testing purposes + assertTrue(userDetails.getAuthorities().isEmpty()); // Assuming no authorities for simplicity + } + + @Test + void loadUserByUsername_UserNotFound_ThrowsUsernameNotFoundException() { + String username = "nonexistent@example.com"; + + when(userRepository.findByEmail(username)).thenReturn(Optional.empty()); + + assertThrows(UsernameNotFoundException.class, () -> { + userDetailsService.loadUserByUsername(username); + }); + } +} diff --git a/src/test/java/com/example/slimfitbackend/service/ProgressServiceTest.java b/src/test/java/com/example/slimfitbackend/service/ProgressServiceTest.java new file mode 100644 index 0000000..efc4bcd --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/ProgressServiceTest.java @@ -0,0 +1,88 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.WeightProgress; +import com.example.slimfitbackend.payload.UserWeightResponse; +import com.example.slimfitbackend.repository.WeightProgressRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class ProgressServiceTest { + + @Mock + private WeightProgressRepository weightProgressRepository; + + @Mock + private UserService userService; + + @InjectMocks + private ProgressService progressService; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void getActualWeightProgress_ReturnsUserWeightResponseList() throws Exception { + User user = new User(); + user.setUserId(1L); + + WeightProgress weightProgress1 = new WeightProgress(); + weightProgress1.setWeight(70.0); + weightProgress1.setDate(new Date()); + + WeightProgress weightProgress2 = new WeightProgress(); + weightProgress2.setWeight(68.5); + weightProgress2.setDate(new Date()); + + List weightProgressList = new ArrayList<>(); + weightProgressList.add(weightProgress1); + weightProgressList.add(weightProgress2); + + when(userService.getCurrentUser()).thenReturn(user); + when(weightProgressRepository.findAllByUserOrderByDate(user)).thenReturn(weightProgressList); + + List actualWeightProgress = progressService.getActualWeightProgress(); + + assertEquals(2, actualWeightProgress.size()); + assertEquals(70.0, actualWeightProgress.get(0).getWeight()); + assertEquals(68.5, actualWeightProgress.get(1).getWeight()); + } + + @Test + void getUserGoal_ReturnsUserWeightResponseList() throws Exception { + User user = new User(); + + LocalDate today = LocalDate.now(); + LocalDate oneWeekAgo = today.minusWeeks(1); + LocalDate untilDate = oneWeekAgo.minusDays(1); + Date untilUtilDate = Date.from(untilDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); + + user.setStartDate(untilUtilDate); + user.setStartWeight(75.0); + user.setWeeklyWeightLossGoal(500); + + when(userService.getCurrentUser()).thenReturn(user); + + List userGoal = progressService.getUserGoal(); + + assertEquals(2, userGoal.size()); + assertEquals(75.0, userGoal.get(0).getWeight()); + + assertEquals(74.5, userGoal.get(1).getWeight()); + } + +} diff --git a/src/test/java/com/example/slimfitbackend/service/UserActivityServiceTest.java b/src/test/java/com/example/slimfitbackend/service/UserActivityServiceTest.java new file mode 100644 index 0000000..c5fb02e --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/UserActivityServiceTest.java @@ -0,0 +1,95 @@ +package com.example.slimfitbackend.service; + +import com.example.slimfitbackend.model.ActivityType; +import com.example.slimfitbackend.model.DailyCalorie; +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.UserActivity; +import com.example.slimfitbackend.payload.NewActivityRequest; +import com.example.slimfitbackend.payload.NewActivityResponse; +import com.example.slimfitbackend.payload.common.MapStructMapper; +import com.example.slimfitbackend.repository.ActivityTypeRepository; +import com.example.slimfitbackend.repository.DailyCalorieRepository; +import com.example.slimfitbackend.repository.UserActivityRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Date; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class UserActivityServiceTest { + + @Mock + private UserService userService; + + @Mock + private DailyCalorieRepository dailyCalorieRepository; + + @Mock + private ActivityTypeRepository activityTypeRepository; + + @Mock + private DailyCalorieService dailyCalorieService; + + @Mock + private UserActivityRepository userActivityRepository; + + @Mock + private MapStructMapper mapStructMapper; + + @InjectMocks + private UserActivityService userActivityService; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void addNewActivity_ReturnsNewActivityResponse() { + User user = new User(); + user.setUserId(1L); + + NewActivityRequest newActivityRequest = new NewActivityRequest(); + newActivityRequest.setDate(new Date()); + newActivityRequest.setDuration(60); + newActivityRequest.setIntensity(2); + newActivityRequest.setCalorie(300); + newActivityRequest.setActivityType(1L); + + ActivityType activityType = new ActivityType(); + activityType.setActId(1L); + activityType.setName("Running"); + + UserActivity userActivity = new UserActivity(); + userActivity.setUser(user); + userActivity.setDate(newActivityRequest.getDate()); + userActivity.setDuration(newActivityRequest.getDuration()); + userActivity.setIntensity(newActivityRequest.getIntensity()); + userActivity.setCalorie(newActivityRequest.getCalorie()); + userActivity.setActivityType(activityType); + + when(userService.getCurrentUser()).thenReturn(user); + when(activityTypeRepository.findById(newActivityRequest.getActivityType())).thenReturn(Optional.of(activityType)); + when(userActivityRepository.save(any(UserActivity.class))).thenReturn(userActivity); + when(dailyCalorieService.getDailyCalorie(any(),any())).thenReturn(new DailyCalorie()); + + NewActivityResponse expectedResponse = new NewActivityResponse(); + expectedResponse.setDate(userActivity.getDate()); + expectedResponse.setDuration(userActivity.getDuration()); + expectedResponse.setIntensity(userActivity.getIntensity()); + expectedResponse.setCalorie(userActivity.getCalorie()); + + when(mapStructMapper.userActivityToNewActivityResponse(userActivity)).thenReturn(expectedResponse); + + NewActivityResponse actualResponse = userActivityService.addNewActivity(newActivityRequest); + + assertEquals(expectedResponse, actualResponse); + } + +} diff --git a/src/test/java/com/example/slimfitbackend/service/UserServiceTest.java b/src/test/java/com/example/slimfitbackend/service/UserServiceTest.java new file mode 100644 index 0000000..8b28db8 --- /dev/null +++ b/src/test/java/com/example/slimfitbackend/service/UserServiceTest.java @@ -0,0 +1,165 @@ +package com.example.slimfitbackend.service; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import com.example.slimfitbackend.exceptions.CustomException; +import com.example.slimfitbackend.model.User; +import com.example.slimfitbackend.model.WeightProgress; +import com.example.slimfitbackend.payload.GetUserResponse; +import com.example.slimfitbackend.payload.SaveUserWeightRequest; +import com.example.slimfitbackend.payload.UserWeightResponse; +import com.example.slimfitbackend.payload.common.MapStructMapper; +import com.example.slimfitbackend.repository.UserRepository; +import com.example.slimfitbackend.repository.WeightProgressRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.List; + +class UserServiceTest { + + @Mock + private MapStructMapper mapStructMapper; + + @Mock + private UserRepository userRepository; + + @Mock + private WeightProgressRepository weightProgressRepository; + + @InjectMocks + private UserService userService; + + @BeforeEach + void setUp() { + MockitoAnnotations.initMocks(this); + } + + + @Test + void testGetCurrentUser() { + // Arrange + User user = new User(); + user.setEmail("test@example.com"); + + UserService userServiceSpy = spy(userService); + doReturn(user).when(userServiceSpy).getCurrentUser(); + + // Act + User currentUser = userServiceSpy.getCurrentUser(); + + // Assert + assertNotNull(currentUser); + assertEquals(user.getEmail(), currentUser.getEmail()); + verify(userServiceSpy, times(1)).getCurrentUser(); + verifyNoMoreInteractions(userServiceSpy); + } + + @Test + void testGetUser() { + // Arrange + User user = new User(); + user.setEmail("test@example.com"); + + GetUserResponse expectedResponse = new GetUserResponse(); + expectedResponse.setEmail("test@example.com"); + + UserService userServiceSpy = spy(userService); + doReturn(user).when(userServiceSpy).getCurrentUser(); + when(mapStructMapper.userToGetUserResponse(user)).thenReturn(expectedResponse); + + // Act + GetUserResponse response = userServiceSpy.getUser(); + + // Assert + assertNotNull(response); + assertEquals(expectedResponse.getEmail(), response.getEmail()); + verify(userServiceSpy, times(1)).getCurrentUser(); + verify(mapStructMapper, times(1)).userToGetUserResponse(user); + } + + @Test + void testGetUserWeightResponse() { + // Arrange + User user = new User(); + user.setEmail("test@example.com"); + + WeightProgress weightProgress = new WeightProgress(); + weightProgress.setWeight(70); + + UserService userServiceSpy = spy(userService); + doReturn(user).when(userServiceSpy).getCurrentUser(); + when(userServiceSpy.getUserWeight()).thenReturn(weightProgress); + + // Act + UserWeightResponse response = userServiceSpy.getUserWeightResponse(); + + // Assert + assertNotNull(response); + assertEquals(70, response.getWeight()); + } + + @Test + void testGetUserWeight() { + // Arrange + User user = new User(); + user.setEmail("test@example.com"); + + WeightProgress weightProgress = new WeightProgress(); + weightProgress.setWeight(70); + + UserService userServiceSpy = spy(userService); + doReturn(user).when(userServiceSpy).getCurrentUser(); + when(weightProgressRepository.findAllByUserOrderByDate(user)).thenReturn(List.of(weightProgress)); + + // Act + WeightProgress result = userServiceSpy.getUserWeight(); + + // Assert + assertNotNull(result); + assertEquals(70, result.getWeight()); + verify(userServiceSpy, times(1)).getCurrentUser(); + verify(weightProgressRepository, times(1)).findAllByUserOrderByDate(user); + } + + @Test + void testSaveUserWeight() throws Exception { + // Arrange + SaveUserWeightRequest saveUserWeightRequest = new SaveUserWeightRequest(); + saveUserWeightRequest.setWeight(70); + + User user = new User(); + user.setEmail("test@example.com"); + + UserService userServiceSpy = spy(userService); + doReturn(user).when(userServiceSpy).getCurrentUser(); + + // Act + UserWeightResponse response = userServiceSpy.saveUserWeight(saveUserWeightRequest); + + // Assert + assertNotNull(response); + assertEquals(70, response.getWeight()); + verify(userServiceSpy, times(1)).getCurrentUser(); + verify(weightProgressRepository, times(1)).save(any(WeightProgress.class)); + } + + @Test + void testSaveUserWeight_ThrowsException() { + // Arrange + SaveUserWeightRequest saveUserWeightRequest = new SaveUserWeightRequest(); + saveUserWeightRequest.setWeight(70); + + UserService userServiceSpy = spy(userService); + doThrow(CustomException.class).when(userServiceSpy).getCurrentUser(); + + // Act & Assert + assertThrows(CustomException.class, () -> userServiceSpy.saveUserWeight(saveUserWeightRequest)); + verify(userServiceSpy, times(1)).getCurrentUser(); + verifyNoInteractions(weightProgressRepository); + } +}