Skip to content

Commit a96f5ac

Browse files
authored
Feature/domain (#4)
* feat: domain * feat: medication, meal crud * chore: 컨트롤러 응답 엔티티 + 예외 처리 패키지 * test: MealService, MedicationService * fix: jpa 설정 충돌 해결 * chore: ide, gradle파일 버전 추적 제거 * chore: gitignore 업데이트, 충돌 보완 * fix: 의존성 누락 해결
1 parent db18b79 commit a96f5ac

File tree

20 files changed

+603
-3
lines changed

20 files changed

+603
-3
lines changed

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
HELP.md
2-
.gradle
2+
./gradle
3+
.gradle/*
4+
.ideal/
5+
*.iml
36
build/
47
!gradle/wrapper/gradle-wrapper.jar
58
!**/src/main/**/build/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.solution.Ongi.domain.meal;
2+
3+
import com.solution.Ongi.domain.user.User;
4+
import com.solution.Ongi.domain.user.enums.MealType;
5+
import jakarta.persistence.*;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
import java.time.LocalTime;
12+
13+
@Entity
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@Getter
18+
public class Meal {
19+
20+
@Id @GeneratedValue
21+
@Column(name = "meal_id")
22+
private Long id;
23+
24+
@Enumerated(EnumType.STRING)
25+
private MealType meal_type;
26+
27+
private LocalTime meal_time;
28+
29+
@ManyToOne(fetch = FetchType.LAZY)//지연 로딩
30+
@JoinColumn(name = "user_id")
31+
private User user;
32+
33+
//일정-달력 삭제 미반영 -> CASCADE 막기
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.solution.Ongi.domain.meal.controller;
2+
3+
import com.solution.Ongi.domain.meal.dto.CreateMealRequest;
4+
import com.solution.Ongi.domain.meal.Meal;
5+
import com.solution.Ongi.domain.meal.dto.CreateMealResponse;
6+
import com.solution.Ongi.domain.meal.service.MealService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.*;
10+
11+
import java.net.URI;
12+
import java.util.List;
13+
14+
@RestController
15+
@RequestMapping("/meals")
16+
@RequiredArgsConstructor
17+
public class MealController {
18+
19+
private final MealService mealService;
20+
21+
@PostMapping("/post/{userId}/meals")
22+
public ResponseEntity<CreateMealResponse> createMeal(
23+
@PathVariable("userId") Long userId,
24+
@RequestBody CreateMealRequest request) {
25+
26+
Meal meal = mealService.createMeal(userId, request);
27+
28+
//location 헤더 리소스
29+
URI location= URI.create("/users/"+userId+"/meals/"+meal.getId());
30+
31+
return ResponseEntity
32+
.created(location)
33+
.body(new CreateMealResponse(meal.getId(),"식사가 등록되었습니다."));
34+
}
35+
36+
@GetMapping("/users/{userId}/meals")
37+
public ResponseEntity<List<Meal>> getAllMeals(@PathVariable("userId") Long user_id) {
38+
List<Meal> meals = mealService.getAllMeals(user_id);
39+
return ResponseEntity.ok(meals);
40+
}
41+
42+
//Meal 삭제 엔드포인트
43+
@DeleteMapping("/delete/{mealId}")
44+
public ResponseEntity<Void> deleteMeal(@PathVariable Long mealId) {
45+
mealService.deleteMeal(mealId);
46+
return ResponseEntity.noContent().build();//204 no
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.solution.Ongi.domain.meal.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Builder
9+
@Getter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class CreateMealRequest {
13+
private String meal_type;
14+
private String meal_time; //HH:mm 형식
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.solution.Ongi.domain.meal.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public class CreateMealResponse {
9+
private Long mealId;
10+
private String message;
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.solution.Ongi.domain.meal.repository;
2+
3+
import com.solution.Ongi.domain.meal.Meal;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.List;
8+
9+
@Repository
10+
public interface MealRepository extends JpaRepository<Meal,Long> {
11+
List<Meal> findByUserId(Long userId);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.solution.Ongi.domain.meal.service;
2+
3+
import com.solution.Ongi.domain.meal.dto.CreateMealRequest;
4+
import com.solution.Ongi.domain.meal.Meal;
5+
import com.solution.Ongi.domain.meal.repository.MealRepository;
6+
import com.solution.Ongi.domain.user.User;
7+
import com.solution.Ongi.domain.user.enums.MealType;
8+
import com.solution.Ongi.domain.user.repository.UserRepository;
9+
import com.solution.Ongi.domain.user.service.UserService;
10+
import jakarta.transaction.Transactional;
11+
import lombok.RequiredArgsConstructor;
12+
import org.springframework.stereotype.Service;
13+
14+
import java.time.LocalTime;
15+
import java.time.format.DateTimeFormatter;
16+
import java.util.List;
17+
18+
@Service
19+
@Transactional
20+
@RequiredArgsConstructor
21+
public class MealService {
22+
private final UserRepository userRepository;
23+
private final UserService userService;
24+
private final MealRepository mealRepository;
25+
private final DateTimeFormatter timeFormatter=DateTimeFormatter.ofPattern("HH:mm");
26+
27+
//Meal 생성
28+
public Meal createMeal(Long userId, CreateMealRequest createMealRequest){
29+
User user=userService.getUserByIdOrThrow(userId);
30+
31+
Meal meal=Meal.builder()
32+
.meal_type(MealType.valueOf(createMealRequest.getMeal_type().toUpperCase()))
33+
.meal_time(LocalTime.parse(createMealRequest.getMeal_time(), timeFormatter))
34+
.user(user)
35+
.build();
36+
37+
return mealRepository.save(meal);
38+
}
39+
40+
//유저의 Meal 전체 조회
41+
public List<Meal> getAllMeals(Long userId){
42+
userService.getUserByIdOrThrow(userId);
43+
return mealRepository.findByUserId(userId);
44+
}
45+
46+
//Meal 삭제
47+
public void deleteMeal(Long mealId){
48+
Meal meal=mealRepository.findById(mealId)
49+
.orElseThrow(()->new RuntimeException("식사가 존재하지 않습니다."));
50+
mealRepository.delete(meal);
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.solution.Ongi.domain.medication;
2+
3+
import com.solution.Ongi.domain.user.User;
4+
import jakarta.persistence.*;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.time.LocalTime;
11+
12+
@Entity
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@Getter
17+
public class Medication {
18+
19+
@Id
20+
@GeneratedValue
21+
@Column(name = "medication_id")
22+
private Long id;
23+
24+
private String medication_title;
25+
private LocalTime medication_time;
26+
27+
@ManyToOne(fetch = FetchType.LAZY)//지연 로딩
28+
@JoinColumn(name = "user_id")
29+
private User user;
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.solution.Ongi.domain.medication.controller;
2+
3+
import com.solution.Ongi.domain.medication.Medication;
4+
import com.solution.Ongi.domain.medication.dto.CreateMedicationResponse;
5+
import com.solution.Ongi.domain.medication.service.MedicationService;
6+
import com.solution.Ongi.domain.medication.dto.CreateMedicationRequest;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.*;
10+
11+
import java.net.URI;
12+
import java.util.List;
13+
14+
@RestController
15+
@RequestMapping("/medications")
16+
@RequiredArgsConstructor
17+
public class MedicationController {
18+
19+
private final MedicationService medicationService;
20+
21+
@PostMapping("/post/{userId}/medications")
22+
public ResponseEntity<CreateMedicationResponse> createMedication(
23+
@PathVariable("userId") Long userId,
24+
@RequestBody CreateMedicationRequest createMedicationRequest) {
25+
26+
Medication medication=medicationService.createMedication(userId,createMedicationRequest);
27+
28+
URI location= URI.create("/users/"+userId+"/medications/"+medication.getId());
29+
30+
return ResponseEntity
31+
.created(location)
32+
.body(new CreateMedicationResponse(medication.getId(),"복약이 등록되었습니다."));
33+
}
34+
35+
@GetMapping("/users/{user_id}/medications")
36+
public ResponseEntity<List<Medication>> getAllMedications(@PathVariable("user_id") Long user_id) {
37+
List<Medication> medications = medicationService.getAllMedication(user_id);
38+
return ResponseEntity.ok(medications);
39+
}
40+
41+
// Meal 삭제 엔드포인트
42+
@DeleteMapping("/delete/{medication_id}")
43+
public ResponseEntity<Void> deleteMeal(@PathVariable Long medication_id) {
44+
medicationService.deleteMedication(medication_id);
45+
return ResponseEntity.noContent().build();//204 no
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.solution.Ongi.domain.medication.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.RequiredArgsConstructor;
7+
8+
@Getter
9+
@Builder
10+
@RequiredArgsConstructor
11+
@AllArgsConstructor
12+
public class CreateMedicationRequest {
13+
private String medication_title;
14+
private String medication_time; //HH:mm 형식
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.solution.Ongi.domain.medication.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public class CreateMedicationResponse {
9+
private Long medicationId;
10+
private String message;
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.solution.Ongi.domain.medication.repository;
2+
3+
import com.solution.Ongi.domain.medication.Medication;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.List;
8+
9+
@Repository
10+
public interface MedicationRepository extends JpaRepository<Medication,Long> {
11+
List<Medication> findByUserId(Long userId);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.solution.Ongi.domain.medication.service;
2+
3+
import com.solution.Ongi.domain.medication.Medication;
4+
import com.solution.Ongi.domain.medication.dto.CreateMedicationRequest;
5+
import com.solution.Ongi.domain.medication.repository.MedicationRepository;
6+
import com.solution.Ongi.domain.user.User;
7+
import com.solution.Ongi.domain.user.repository.UserRepository;
8+
import com.solution.Ongi.domain.user.service.UserService;
9+
import jakarta.transaction.Transactional;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.stereotype.Service;
12+
13+
import java.time.LocalTime;
14+
import java.time.format.DateTimeFormatter;
15+
import java.util.List;
16+
17+
@Service
18+
@Transactional
19+
@RequiredArgsConstructor
20+
public class MedicationService {
21+
22+
private final UserRepository userRepository;
23+
private final UserService userService;
24+
private final MedicationRepository medicationRepository;
25+
private final DateTimeFormatter timeFormatter=DateTimeFormatter.ofPattern("HH:mm");
26+
27+
//Meal 생성
28+
public Medication createMedication(Long userId, CreateMedicationRequest createMedicationRequest){
29+
User user=userService.getUserByIdOrThrow(userId);
30+
31+
Medication medication=Medication.builder()
32+
.medication_title(createMedicationRequest.getMedication_title())
33+
.medication_time(LocalTime.parse(createMedicationRequest.getMedication_time(),timeFormatter))
34+
.user(user)
35+
.build();
36+
37+
return medicationRepository.save(medication);
38+
}
39+
40+
//유저의 Meal 전체 조회
41+
public List<Medication> getAllMedication(Long userId){
42+
userService.getUserByIdOrThrow(userId);
43+
return medicationRepository.findByUserId(userId);
44+
}
45+
46+
//Meal 삭제
47+
public void deleteMedication(Long medication_id){
48+
Medication medication=medicationRepository.findById(medication_id)
49+
.orElseThrow(()->new RuntimeException("약이 존재하지 않습니다."));
50+
medicationRepository.delete(medication);
51+
}
52+
}

0 commit comments

Comments
 (0)