diff --git a/src/main/java/net/skhu/tastyinventory_be/config/MvcConfigurer.java b/src/main/java/net/skhu/tastyinventory_be/config/MvcConfigurer.java index bceca21..0c91abe 100644 --- a/src/main/java/net/skhu/tastyinventory_be/config/MvcConfigurer.java +++ b/src/main/java/net/skhu/tastyinventory_be/config/MvcConfigurer.java @@ -1,27 +1,27 @@ -//package net.skhu.tastyinventory_be.config; -// -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.http.HttpMethod; -//import org.springframework.web.servlet.config.annotation.CorsRegistry; -//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -// -//@Configuration -//public class MvcConfigurer implements WebMvcConfigurer { -// @Value("${client.origins}") -// private String[] allowedOrigins; -// -// @Override -// public void addCorsMappings(CorsRegistry registry) { -// registry.addMapping("/**") -// .allowedOrigins(allowedOrigins) -// .allowedMethods( -// HttpMethod.GET.name(), -// HttpMethod.HEAD.name(), -// HttpMethod.POST.name(), -// HttpMethod.PUT.name(), -// HttpMethod.DELETE.name()) -// .maxAge(3600) -// .allowCredentials(true); -// } -//} +package net.skhu.tastyinventory_be.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class MvcConfigurer implements WebMvcConfigurer { + @Value("${client.origins}") + private String[] allowedOrigins; + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins(allowedOrigins) + .allowedMethods( + HttpMethod.GET.name(), + HttpMethod.HEAD.name(), + HttpMethod.POST.name(), + HttpMethod.PUT.name(), + HttpMethod.DELETE.name()) + .maxAge(3600) + .allowCredentials(true); + } +} diff --git a/src/main/java/net/skhu/tastyinventory_be/config/SecurityConfigurer.java b/src/main/java/net/skhu/tastyinventory_be/config/SecurityConfigurer.java index d7fb4a1..51ded2a 100644 --- a/src/main/java/net/skhu/tastyinventory_be/config/SecurityConfigurer.java +++ b/src/main/java/net/skhu/tastyinventory_be/config/SecurityConfigurer.java @@ -48,8 +48,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers(HttpMethod.OPTIONS,"/**").permitAll() .requestMatchers("/csrf-token").permitAll() .requestMatchers(HttpMethod.POST, "/users", "/authorize").permitAll() - .requestMatchers(HttpMethod.GET, "/users").authenticated() - .anyRequest().authenticated()) + .requestMatchers(HttpMethod.GET, "/users").permitAll() + .anyRequest().permitAll()) .exceptionHandling(a -> a .accessDeniedHandler((request, response, accessDeniedException) -> { log.error("403: {}", accessDeniedException.getMessage(), accessDeniedException); diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/HackathonController.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/HackathonController.java new file mode 100644 index 0000000..6c75c19 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/HackathonController.java @@ -0,0 +1,201 @@ +package net.skhu.tastyinventory_be.controller.hackathon; + +import lombok.RequiredArgsConstructor; +import net.skhu.tastyinventory_be.common.dto.BaseResponse; +import net.skhu.tastyinventory_be.controller.hackathon.dto.request.FitnessRequestDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.request.FoodRequestDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.request.WeightRequestDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.response.FitnessResponseDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.response.FoodResponseDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.response.UserInfoResponseDto; +import net.skhu.tastyinventory_be.domain.user.User; +import net.skhu.tastyinventory_be.domain.user.UserRepository; +import net.skhu.tastyinventory_be.exception.ErrorCode; +import net.skhu.tastyinventory_be.exception.SuccessCode; +import net.skhu.tastyinventory_be.exception.model.NotFoundException; +import net.skhu.tastyinventory_be.security.UserDetailsImpl; +import net.skhu.tastyinventory_be.service.HackathonService; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; + +@RequiredArgsConstructor +@RequestMapping +@RestController +public class HackathonController { + + private final HackathonService hackathonService; + private final UserRepository userRepository; + + @PostMapping("/food") + @ResponseStatus(HttpStatus.CREATED) + public BaseResponse insertFood( + @RequestParam String meal, + @RequestParam String date, + @RequestBody FoodRequestDto requestDto, + @AuthenticationPrincipal UserDetailsImpl loginUser + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + + hackathonService.insertFood(requestDto, meal, localDate, user); + + return BaseResponse.success(SuccessCode.MENU_CREATE_SUCCESS); + } + + @GetMapping("/food") + @ResponseStatus(HttpStatus.OK) + public BaseResponse checkFood( + @RequestParam String date, + @AuthenticationPrincipal UserDetailsImpl loginUser + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + final FoodResponseDto data = hackathonService.checkFood(localDate, user); + return BaseResponse.success(SuccessCode.GET_SUCCESS, data); + } + + @PostMapping("/weight") + @ResponseStatus(HttpStatus.CREATED) + public BaseResponse insertWeight( + @RequestParam String date, + @AuthenticationPrincipal UserDetailsImpl loginUser, + @RequestBody WeightRequestDto requestDto + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + hackathonService.insertWeight(requestDto, localDate, user); + + return BaseResponse.success(SuccessCode.SOLD_CREATE_SUCCESS); + } + + @GetMapping("/weight") + @ResponseStatus(HttpStatus.OK) + public BaseResponse getWeight( + @RequestParam String date, + @AuthenticationPrincipal UserDetailsImpl loginUser + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + final Integer data = hackathonService.getWeight(localDate, user); + + return BaseResponse.success(SuccessCode.GET_SUCCESS, data); + } + + @PostMapping("/fitness") + @ResponseStatus(HttpStatus.CREATED) + public BaseResponse insertFitness( + @RequestParam String date, + @AuthenticationPrincipal UserDetailsImpl loginUser, + @RequestBody FitnessRequestDto requestDto + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + hackathonService.insertFitness(localDate, user, requestDto); + return BaseResponse.success(SuccessCode.MENU_CREATE_SUCCESS); + } + + @GetMapping("/fitness") + @ResponseStatus(HttpStatus.OK) + public BaseResponse getFitness( + @RequestParam String date, + @AuthenticationPrincipal UserDetailsImpl loginUser + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + final FitnessResponseDto data = hackathonService.getFitness(localDate, user); + return BaseResponse.success(SuccessCode.GET_SUCCESS, data); + } + + @GetMapping("/user-info") + @ResponseStatus(HttpStatus.OK) + public BaseResponse getUserInfo( + @RequestParam String date, + @AuthenticationPrincipal UserDetailsImpl loginUser + ) { + String[] dateInfo = date.split("-"); + + LocalDate localDate = LocalDate.of( + Integer.parseInt(dateInfo[0]), + Integer.parseInt(dateInfo[1]), + Integer.parseInt(dateInfo[2]) + ); + + User user = userRepository.findByUsername(loginUser.getUsername()) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + final UserInfoResponseDto data = hackathonService.getUserInfo(localDate, user); + return BaseResponse.success(SuccessCode.GET_SUCCESS, data); + } + +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/FitnessRequestDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/FitnessRequestDto.java new file mode 100644 index 0000000..9059d6a --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/FitnessRequestDto.java @@ -0,0 +1,14 @@ +package net.skhu.tastyinventory_be.controller.hackathon.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class FitnessRequestDto { + private String name; + private Integer minute; + private Integer calories; +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/FoodRequestDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/FoodRequestDto.java new file mode 100644 index 0000000..4e86997 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/FoodRequestDto.java @@ -0,0 +1,15 @@ +package net.skhu.tastyinventory_be.controller.hackathon.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class FoodRequestDto { + private String name; + private Integer carbohydrate; + private Integer protein; + private Integer fat; +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/WeightRequestDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/WeightRequestDto.java new file mode 100644 index 0000000..9b16bef --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/request/WeightRequestDto.java @@ -0,0 +1,12 @@ +package net.skhu.tastyinventory_be.controller.hackathon.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class WeightRequestDto { + private Integer weight; +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/FitnessResponseDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/FitnessResponseDto.java new file mode 100644 index 0000000..1fb7ba4 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/FitnessResponseDto.java @@ -0,0 +1,22 @@ +package net.skhu.tastyinventory_be.controller.hackathon.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import net.skhu.tastyinventory_be.domain.fitness.Fitness; + +@Getter +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class FitnessResponseDto { + + private String name; + private Integer minute; + private Integer calories; + + public static FitnessResponseDto from(Fitness fitness) { + return new FitnessResponseDto(fitness.getName(), fitness.getMinute(), fitness.getCalories()); + } + +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/FoodResponseDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/FoodResponseDto.java new file mode 100644 index 0000000..c0de6be --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/FoodResponseDto.java @@ -0,0 +1,20 @@ +package net.skhu.tastyinventory_be.controller.hackathon.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class FoodResponseDto { + private Boolean breakfast; + private Boolean lunch; + private Boolean dinner; + private Boolean snack; + + public static FoodResponseDto of(Boolean breakfast, Boolean lunch, Boolean dinner, Boolean snack) { + return new FoodResponseDto(breakfast, lunch, dinner, snack); + } +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/UserInfoResponseDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/UserInfoResponseDto.java new file mode 100644 index 0000000..350b51d --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/controller/hackathon/dto/response/UserInfoResponseDto.java @@ -0,0 +1,27 @@ +package net.skhu.tastyinventory_be.controller.hackathon.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class UserInfoResponseDto { + private Integer consumedCalories; + private Integer remainCalories; + private Integer carbohydrate; + private Integer protein; + private Integer fat; + + public static UserInfoResponseDto of( + Integer consumedCalories, + Integer remainCalories, + Integer carbohydrate, + Integer protein, + Integer fat + ) { + return new UserInfoResponseDto(consumedCalories, remainCalories, carbohydrate, protein, fat); + } +} diff --git a/src/main/java/net/skhu/tastyinventory_be/controller/user/dto/request/SignUpRequestDto.java b/src/main/java/net/skhu/tastyinventory_be/controller/user/dto/request/SignUpRequestDto.java index 9b6b893..267e5b1 100644 --- a/src/main/java/net/skhu/tastyinventory_be/controller/user/dto/request/SignUpRequestDto.java +++ b/src/main/java/net/skhu/tastyinventory_be/controller/user/dto/request/SignUpRequestDto.java @@ -19,6 +19,16 @@ public class SignUpRequestDto { @Email(message = "이메일 형식이 잘못되었습니다.") private String email; + private String gender; + + private Integer age; + + private Integer height; + + private Integer weight; + + private String activity; + @Pattern(regexp = "[a-zA-z!@#$%^&*-_]{6,20}", message = "6~20 길이의 알파벳과 숫자, 특수문자만 사용할 수 있습니다.") private String password; } diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/fitness/Fitness.java b/src/main/java/net/skhu/tastyinventory_be/domain/fitness/Fitness.java new file mode 100644 index 0000000..ef676b8 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/domain/fitness/Fitness.java @@ -0,0 +1,43 @@ +package net.skhu.tastyinventory_be.domain.fitness; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import net.skhu.tastyinventory_be.domain.BaseEntity; +import net.skhu.tastyinventory_be.domain.user.User; + +import java.time.LocalDate; + +@Entity +@Getter +@Table(name = "FITNESS") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Fitness extends BaseEntity { + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(nullable = false) + private LocalDate date; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private Integer minute; + + @Column(nullable = false) + private Integer calories; + + @Builder + public Fitness(User user, LocalDate date, String name, Integer minute, Integer calories) { + this.user = user; + this.date = date; + this.name = name; + this.minute = minute; + this.calories = calories; + } +} diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/fitness/FitnessRepository.java b/src/main/java/net/skhu/tastyinventory_be/domain/fitness/FitnessRepository.java new file mode 100644 index 0000000..b279222 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/domain/fitness/FitnessRepository.java @@ -0,0 +1,12 @@ +package net.skhu.tastyinventory_be.domain.fitness; + +import net.skhu.tastyinventory_be.domain.user.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; +import java.util.Date; +import java.util.Optional; + +public interface FitnessRepository extends JpaRepository { + Optional findByUserAndDate(User user, LocalDate date); +} diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/food/Food.java b/src/main/java/net/skhu/tastyinventory_be/domain/food/Food.java new file mode 100644 index 0000000..d3fd7ae --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/domain/food/Food.java @@ -0,0 +1,50 @@ +package net.skhu.tastyinventory_be.domain.food; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import net.skhu.tastyinventory_be.domain.BaseEntity; +import net.skhu.tastyinventory_be.domain.user.User; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "FOOD") +@Entity +public class Food extends BaseEntity { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(nullable = false) + private LocalDate date; + + @Column(nullable = false) + private String meal; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private Integer carbohydrate; + + @Column(nullable = false) + private Integer protein; + + @Column(nullable = false) + private Integer fat; + + @Builder + public Food(User user, LocalDate date, String meal, String name, Integer carbohydrate, Integer protein, Integer fat) { + this.user = user; + this.date = date; + this.meal = meal; + this.name = name; + this.carbohydrate = carbohydrate; + this.protein = protein; + this.fat = fat; + } +} diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/food/FoodRepository.java b/src/main/java/net/skhu/tastyinventory_be/domain/food/FoodRepository.java new file mode 100644 index 0000000..c6a93fe --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/domain/food/FoodRepository.java @@ -0,0 +1,11 @@ +package net.skhu.tastyinventory_be.domain.food; + +import net.skhu.tastyinventory_be.domain.user.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; +import java.util.List; + +public interface FoodRepository extends JpaRepository { + List findAllByDateAndUser(LocalDate date, User user); +} diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/user/User.java b/src/main/java/net/skhu/tastyinventory_be/domain/user/User.java index b30cec4..f714817 100644 --- a/src/main/java/net/skhu/tastyinventory_be/domain/user/User.java +++ b/src/main/java/net/skhu/tastyinventory_be/domain/user/User.java @@ -29,6 +29,21 @@ public class User extends BaseEntity { @Column(nullable = false, unique = true) private String username; + @Column(nullable = false) + private String gender; + + @Column(nullable = false) + private Integer age; + + @Column(nullable = false) + private Integer height; + + @Column(nullable = false) + private Integer weight; + + @Column(nullable = false) + private String activity; + private String password; @Enumerated(value = EnumType.STRING) @@ -44,10 +59,15 @@ public class User extends BaseEntity { private OAuth2Account social; @Builder - public User(String username, String name, String email, String password, UserType type) { + public User(String username, String name, String email, String gender, Integer height, Integer age, Integer weight, String activity, String password, UserType type) { this.username = username; this.name = name; this.email = email; + this.gender = gender; + this.height = height; + this.weight = weight; + this.age = age; + this.activity = activity; this.password = password; this.authorities.add(AuthorityType.ROLE_MEMBER); this.type = type; diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/weight/Weight.java b/src/main/java/net/skhu/tastyinventory_be/domain/weight/Weight.java new file mode 100644 index 0000000..4319b55 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/domain/weight/Weight.java @@ -0,0 +1,35 @@ +package net.skhu.tastyinventory_be.domain.weight; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import net.skhu.tastyinventory_be.domain.BaseEntity; +import net.skhu.tastyinventory_be.domain.user.User; + +import java.time.LocalDate; + +@Entity +@Getter +@Table(name = "WEIGHT") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Weight extends BaseEntity { + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(nullable = false) + private LocalDate date; + + @Column(nullable = false) + private Integer weight; + + @Builder + public Weight(User user, LocalDate date, Integer weight) { + this.user = user; + this.date = date; + this.weight = weight; + } +} diff --git a/src/main/java/net/skhu/tastyinventory_be/domain/weight/WeightRepository.java b/src/main/java/net/skhu/tastyinventory_be/domain/weight/WeightRepository.java new file mode 100644 index 0000000..38cd0f0 --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/domain/weight/WeightRepository.java @@ -0,0 +1,11 @@ +package net.skhu.tastyinventory_be.domain.weight; + +import net.skhu.tastyinventory_be.domain.user.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; +import java.util.Optional; + +public interface WeightRepository extends JpaRepository { + Optional findByUserAndDate(User user, LocalDate date); +} diff --git a/src/main/java/net/skhu/tastyinventory_be/service/HackathonService.java b/src/main/java/net/skhu/tastyinventory_be/service/HackathonService.java new file mode 100644 index 0000000..8f56bef --- /dev/null +++ b/src/main/java/net/skhu/tastyinventory_be/service/HackathonService.java @@ -0,0 +1,137 @@ +package net.skhu.tastyinventory_be.service; + +import lombok.RequiredArgsConstructor; +import net.skhu.tastyinventory_be.controller.hackathon.dto.request.FitnessRequestDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.request.FoodRequestDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.request.WeightRequestDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.response.FitnessResponseDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.response.FoodResponseDto; +import net.skhu.tastyinventory_be.controller.hackathon.dto.response.UserInfoResponseDto; +import net.skhu.tastyinventory_be.domain.fitness.Fitness; +import net.skhu.tastyinventory_be.domain.fitness.FitnessRepository; +import net.skhu.tastyinventory_be.domain.food.Food; +import net.skhu.tastyinventory_be.domain.food.FoodRepository; +import net.skhu.tastyinventory_be.domain.user.User; +import net.skhu.tastyinventory_be.domain.weight.Weight; +import net.skhu.tastyinventory_be.domain.weight.WeightRepository; +import net.skhu.tastyinventory_be.exception.ErrorCode; +import net.skhu.tastyinventory_be.exception.model.NotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; + +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Service +public class HackathonService { + + private final FitnessRepository fitnessRepository; + private final FoodRepository foodRepository; + private final WeightRepository weightRepository; + + @Transactional + public void insertFood(FoodRequestDto foodRequestDto, String meal, LocalDate date, User user) { + Food food = Food.builder() + .name(foodRequestDto.getName()) + .carbohydrate(foodRequestDto.getCarbohydrate()) + .protein(foodRequestDto.getProtein()) + .fat(foodRequestDto.getFat()) + .meal(meal) + .date(date) + .user(user) + .build(); + + foodRepository.save(food); + } + + public FoodResponseDto checkFood(LocalDate date, User user) { + List foodList = foodRepository.findAllByDateAndUser(date, user); + + boolean breakfast = false; + boolean lunch = false; + boolean dinner = false; + boolean snack = false; + + for (Food food : foodList) { + if (food.getMeal().equalsIgnoreCase("breakfast")) { + breakfast = true; + } else if (food.getMeal().equalsIgnoreCase("lunch")) { + lunch = true; + } else if (food.getMeal().equalsIgnoreCase("dinner")) { + dinner = true; + } else { + snack = true; + } + } + + return FoodResponseDto.of(breakfast, lunch, dinner, snack); + } + + @Transactional + public void insertWeight(WeightRequestDto requestDto, LocalDate date, User user) { + Weight weight = Weight.builder() + .weight(requestDto.getWeight()) + .date(date) + .user(user) + .build(); + + weightRepository.save(weight); + } + + public Integer getWeight(LocalDate date, User user) { + Weight weight = weightRepository.findByUserAndDate(user, date) + .orElseThrow(() -> new NotFoundException(ErrorCode.NOT_FOUND_USER_EXCEPTION, ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage())); + + return weight.getWeight(); + } + + @Transactional + public void insertFitness(LocalDate date, User user, FitnessRequestDto requestDto) { + Fitness fitness = Fitness.builder() + .name(requestDto.getName()) + .minute(requestDto.getMinute()) + .calories(requestDto.getCalories()) + .date(date) + .user(user) + .build(); + + fitnessRepository.save(fitness); + } + + public FitnessResponseDto getFitness(LocalDate date, User user) { + Fitness fitness = fitnessRepository.findByUserAndDate(user, date) + .orElseThrow(() -> new NotFoundException( + ErrorCode.NOT_FOUND_USER_EXCEPTION, + ErrorCode.NOT_FOUND_USER_EXCEPTION.getMessage() + )); + + return FitnessResponseDto.from(fitness); + } + + public UserInfoResponseDto getUserInfo(LocalDate date, User user) { + Integer remainCalories = 66 + (14 * user.getWeight()) + (5 * user.getHeight()) - (7 * user.getAge()); + List foodList = foodRepository.findAllByDateAndUser(date, user); + int carbo = 0; + int protein = 0; + int fat = 0; + + for (Food food : foodList) { + carbo += food.getCarbohydrate(); + protein += food.getProtein(); + fat += food.getFat(); + } + + Integer consumedCalories = (protein * 4) + (carbo * 4) + (fat * 9); + + return UserInfoResponseDto.of( + consumedCalories, + remainCalories, + carbo, + protein, + fat + ); + } + +} diff --git a/src/main/java/net/skhu/tastyinventory_be/service/UserService.java b/src/main/java/net/skhu/tastyinventory_be/service/UserService.java index 8f3cb0f..7b9c8cb 100644 --- a/src/main/java/net/skhu/tastyinventory_be/service/UserService.java +++ b/src/main/java/net/skhu/tastyinventory_be/service/UserService.java @@ -36,6 +36,11 @@ public void saveUser(SignUpRequestDto signUpRequestDto) { .username(signUpRequestDto.getEmail()) .name(signUpRequestDto.getName()) .email(signUpRequestDto.getEmail()) + .age(signUpRequestDto.getAge()) + .gender(signUpRequestDto.getGender()) + .activity(signUpRequestDto.getActivity()) + .height(signUpRequestDto.getHeight()) + .weight(signUpRequestDto.getWeight()) .password(passwordEncoder.encode(signUpRequestDto.getPassword())) .type(UserType.DEFAULT) .build();