Skip to content

Commit e8a47c6

Browse files
authored
[농장] 카테고리 생성 및 누락 칼럼 추가 (#187)
* feat: 농장 누락 칼럼 추가 - 작물 유형 - 전화번호 #148 * feat: 농장 카테고리 조회 #148 * feat: 농장 카테고리 조회 API 작업 #148 * feat: 농장 카테고리 넘기도록 수정 #148 * feat: 카테고리 추가 #148
1 parent eb5afc4 commit e8a47c6

File tree

10 files changed

+121
-10
lines changed

10 files changed

+121
-10
lines changed

src/main/java/poomasi/domain/auth/config/SecurityConfig.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,11 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
8080

8181
// 기본 경로 및 테스트 경로
8282
http.authorizeHttpRequests((authorize) -> authorize
83-
.requestMatchers(HttpMethod.POST, "/api/farm/**").permitAll()
8483
.requestMatchers(HttpMethod.GET, "/api/product/**").permitAll()
8584
.requestMatchers(HttpMethod.GET, "/api/review/**").permitAll()
8685
.requestMatchers(HttpMethod.GET, "/health").permitAll()
8786
.requestMatchers(HttpMethod.GET, "/api/image/**").permitAll()
88-
.requestMatchers("/api/member/sign-up", "/api/login", "api/reissue", "api/payment/**", "api/order/**", "api/reservation/**", "/api/v1/farmer/reservations").permitAll()
87+
.requestMatchers("/api/farm/**", "/api/member/sign-up", "/api/login", "api/reissue", "api/payment/**", "api/order/**", "api/reservation/**", "/api/v1/farmer/reservations").permitAll()
8988
.requestMatchers("/api/need-auth/**").authenticated()
9089
.anyRequest().
9190
authenticated()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package poomasi.domain.farm._category.controller;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RestController;
8+
import poomasi.domain.farm._category.dto.response.FarmCategoryResponse;
9+
import poomasi.domain.farm._category.service.FarmCategoryService;
10+
11+
import java.util.List;
12+
13+
@RestController
14+
@RequiredArgsConstructor
15+
@RequestMapping("/api/farm/category")
16+
public class FarmCategoryController {
17+
private final FarmCategoryService farmCategoryService;
18+
19+
@GetMapping
20+
public ResponseEntity<List<FarmCategoryResponse>> getFarmCategories() {
21+
return ResponseEntity.ok(
22+
farmCategoryService.getFarmCategories().stream()
23+
.map(FarmCategoryResponse::toResponse)
24+
.toList()
25+
);
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package poomasi.domain.farm._category.domain;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
import lombok.Getter;
8+
import org.hibernate.annotations.Comment;
9+
10+
@Entity
11+
@Getter
12+
public class FarmCategory {
13+
@Id
14+
@GeneratedValue(strategy = GenerationType.IDENTITY)
15+
private Long id;
16+
17+
@Comment("농장 카테고리 이름")
18+
private String name;
19+
20+
@Comment("농장 카테고리 이미지 URL")
21+
private String imageUrl;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package poomasi.domain.farm._category.dto.response;
2+
3+
import lombok.Builder;
4+
import poomasi.domain.farm._category.domain.FarmCategory;
5+
6+
@Builder
7+
public record FarmCategoryResponse(
8+
Long id,
9+
String name,
10+
String imageUrl
11+
) {
12+
public static FarmCategoryResponse toResponse(FarmCategory farmCategory) {
13+
return FarmCategoryResponse.builder()
14+
.id(farmCategory.getId())
15+
.name(farmCategory.getName())
16+
.imageUrl(farmCategory.getImageUrl())
17+
.build();
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package poomasi.domain.farm._category.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
import poomasi.domain.farm._category.domain.FarmCategory;
6+
7+
@Repository
8+
public interface FarmCategoryRepository extends JpaRepository<FarmCategory, Long> {
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package poomasi.domain.farm._category.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import poomasi.domain.farm._category.domain.FarmCategory;
6+
import poomasi.domain.farm._category.repository.FarmCategoryRepository;
7+
8+
import java.util.List;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class FarmCategoryService {
13+
private final FarmCategoryRepository farmCategoryRepository;
14+
15+
public List<FarmCategory> getFarmCategories() {
16+
return farmCategoryRepository.findAll();
17+
}
18+
}

src/main/java/poomasi/domain/farm/dto/FarmRegisterRequest.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public record FarmRegisterRequest(
1313
int experiencePrice,
1414
Integer maxCapacity,
1515
Integer maxReservation,
16-
String businessNumber
16+
Long categoryId
1717
) {
1818
public Farm toEntity(Long memberId) {
1919
return Farm.builder()
@@ -27,7 +27,8 @@ public Farm toEntity(Long memberId) {
2727
.experiencePrice(experiencePrice)
2828
.maxCapacity(maxCapacity)
2929
.maxReservation(maxReservation)
30-
.businessNumber(businessNumber)
30+
.categoryId(categoryId)
31+
.phoneNumber(phoneNumber)
3132
.build();
3233
}
3334
}

src/main/java/poomasi/domain/farm/entity/Farm.java

+15-5
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import jakarta.persistence.OneToMany;
1414
import jakarta.persistence.OneToOne;
1515
import jakarta.persistence.Table;
16+
1617
import java.time.LocalDateTime;
1718
import java.util.ArrayList;
1819
import java.util.List;
20+
1921
import lombok.AccessLevel;
2022
import lombok.Builder;
2123
import lombok.Getter;
@@ -25,6 +27,9 @@
2527
import org.hibernate.annotations.SQLDelete;
2628
import org.hibernate.annotations.UpdateTimestamp;
2729
import poomasi.domain.farm.dto.FarmUpdateRequest;
30+
31+
import java.time.LocalDateTime;
32+
2833
import poomasi.domain.order.entity._farm.OrderedFarm;
2934
import poomasi.domain.review.entity.Review;
3035

@@ -34,7 +39,6 @@
3439
@NoArgsConstructor(access = AccessLevel.PROTECTED)
3540
@SQLDelete(sql = "UPDATE farm SET deleted_at=current_timestamp WHERE id = ?")
3641
public class Farm {
37-
3842
@Id
3943
@GeneratedValue(strategy = GenerationType.IDENTITY)
4044
private Long id;
@@ -67,6 +71,10 @@ public class Farm {
6771
@Enumerated(EnumType.STRING)
6872
private FarmStatus status = FarmStatus.OPEN;
6973

74+
@Comment("카테고리 ID")
75+
@Column(name = "category_id")
76+
private Long categoryId;
77+
7078
@Comment("체험 비용")
7179
private int experiencePrice;
7280

@@ -87,6 +95,9 @@ public class Farm {
8795
@UpdateTimestamp
8896
private LocalDateTime updatedAt = LocalDateTime.now();
8997

98+
@Column(name = "phone_number")
99+
private String phoneNumber;
100+
90101
@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)
91102
@JoinColumn(name = "entityId")
92103
private List<Review> reviewList = new ArrayList<>();
@@ -98,10 +109,7 @@ public class Farm {
98109
private double averageRating;
99110

100111
@Builder
101-
public Farm(Long id, String name, Long ownerId, String address, String addressDetail,
102-
Double latitude, Double longitude, String description, int experiencePrice,
103-
Integer maxCapacity, Integer maxReservation, String businessNumber,
104-
LocalDateTime deletedAt) {
112+
public Farm(Long id, String name, Long ownerId, String address, String addressDetail, Double latitude, Double longitude, String description, int experiencePrice, Integer maxCapacity, Integer maxReservation, String businessNumber, LocalDateTime deletedAt, Long categoryId, String phoneNumber) {
105113
this.id = id;
106114
this.name = name;
107115
this.ownerId = ownerId;
@@ -115,6 +123,8 @@ public Farm(Long id, String name, Long ownerId, String address, String addressDe
115123
this.maxReservation = maxReservation;
116124
this.businessNumber = businessNumber;
117125
this.deletedAt = deletedAt;
126+
this.categoryId = categoryId;
127+
this.phoneNumber = phoneNumber;
118128
averageRating = 0.0f;
119129
}
120130

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package poomasi.global.common;
2+
3+
public enum ProduceType {
4+
FRUIT, VEGETABLE
5+
}

src/test/java/poomasi/domain/farm/service/FarmFarmerServiceTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import poomasi.domain.member.entity.Member;
1515
import poomasi.global.error.BusinessError;
1616
import poomasi.global.error.BusinessException;
17+
import poomasi.payment.entity.ItemType;
1718

1819
import java.util.Optional;
1920

@@ -48,7 +49,7 @@ void should_throwException_when_farmAlreadyExists() {
4849

4950
given(farmRepository.getFarmByOwnerIdAndDeletedAtIsNull(member.getId())).willReturn(Optional.of(existingFarm));
5051

51-
FarmRegisterRequest request = new FarmRegisterRequest("New Farm", "Address", "Detail", 1.0, 1.0, "010-1234-5678", "Description", 10000, 10, 5, "1234-1234");
52+
FarmRegisterRequest request = new FarmRegisterRequest("New Farm", "Address", "Detail", 1.0, 1.0, "010-1234-5678", "Description", 10000, 10, 5, 1L);
5253

5354
// when & then
5455
assertThatThrownBy(() -> farmFarmerService.registerFarm(member, request))

0 commit comments

Comments
 (0)