Skip to content

Commit 2b53a1f

Browse files
committed
feat: #89 판매자 정보 조회 API 구현
1 parent 9821467 commit 2b53a1f

File tree

4 files changed

+95
-0
lines changed

4 files changed

+95
-0
lines changed

src/main/java/com/ajou/hertz/domain/instrument/repository/InstrumentRepository.java

+4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
import org.springframework.data.jpa.repository.JpaRepository;
44

5+
import com.ajou.hertz.domain.instrument.constant.InstrumentProgressStatus;
56
import com.ajou.hertz.domain.instrument.entity.Instrument;
67

78
public interface InstrumentRepository extends JpaRepository<Instrument, Long>, InstrumentRepositoryCustom {
9+
10+
long countBySellerIdAndProgressStatus(Long sellerid, InstrumentProgressStatus progressStatus);
11+
812
}

src/main/java/com/ajou/hertz/domain/instrument/service/InstrumentQueryService.java

+22
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.ajou.hertz.domain.instrument.audio_equipment.dto.request.AudioEquipmentFilterConditions;
1414
import com.ajou.hertz.domain.instrument.bass_guitar.dto.BassGuitarDto;
1515
import com.ajou.hertz.domain.instrument.bass_guitar.dto.request.BassGuitarFilterConditions;
16+
import com.ajou.hertz.domain.instrument.constant.InstrumentProgressStatus;
1617
import com.ajou.hertz.domain.instrument.constant.InstrumentSortOption;
1718
import com.ajou.hertz.domain.instrument.dto.InstrumentDto;
1819
import com.ajou.hertz.domain.instrument.effector.dto.EffectorDto;
@@ -194,4 +195,25 @@ public Page<AudioEquipmentDto> findAudioEquipmentDtos(
194195
.findAudioEquipments(page, pageSize, sort, filterConditions)
195196
.map(InstrumentMapper::toAmplifierDto);
196197
}
198+
199+
/**
200+
* 판매자가 판매중인 물품의 수를 조회합니다
201+
*
202+
* @param sellerId 판매자 id
203+
*
204+
* @return 판매중인 물품의 수
205+
*/
206+
public long countSellingItemsBySellerId(Long sellerId) {
207+
return instrumentRepository.countBySellerIdAndProgressStatus(sellerId, InstrumentProgressStatus.SELLING);
208+
}
209+
210+
/**
211+
* 판매자가 판매완료한 물품들을 조회한다
212+
*
213+
* @param sellerId 판매자 id
214+
* @return 판매완료한 물품의 수
215+
*/
216+
public long countSoldItemsBySellerId(Long sellerId) {
217+
return instrumentRepository.countBySellerIdAndProgressStatus(sellerId, InstrumentProgressStatus.SOLD_OUT);
218+
}
197219
}

src/main/java/com/ajou/hertz/domain/user/controller/UserController.java

+19
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1010
import org.springframework.validation.annotation.Validated;
1111
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.PathVariable;
1213
import org.springframework.web.bind.annotation.PostMapping;
1314
import org.springframework.web.bind.annotation.PutMapping;
1415
import org.springframework.web.bind.annotation.RequestBody;
@@ -20,10 +21,12 @@
2021

2122
import com.ajou.hertz.common.auth.UserPrincipal;
2223
import com.ajou.hertz.common.validator.PhoneNumber;
24+
import com.ajou.hertz.domain.instrument.service.InstrumentQueryService;
2325
import com.ajou.hertz.domain.user.dto.UserDto;
2426
import com.ajou.hertz.domain.user.dto.request.SignUpRequest;
2527
import com.ajou.hertz.domain.user.dto.request.UpdateContactLinkRequest;
2628
import com.ajou.hertz.domain.user.dto.request.UpdatePasswordRequest;
29+
import com.ajou.hertz.domain.user.dto.response.SellerInfoResponse;
2730
import com.ajou.hertz.domain.user.dto.response.UserEmailResponse;
2831
import com.ajou.hertz.domain.user.dto.response.UserExistenceResponse;
2932
import com.ajou.hertz.domain.user.dto.response.UserResponse;
@@ -52,6 +55,7 @@ public class UserController {
5255

5356
private final UserCommandService userCommandService;
5457
private final UserQueryService userQueryService;
58+
private final InstrumentQueryService instrumentQueryService;
5559

5660
@Operation(
5761
summary = "내 정보 조회",
@@ -171,5 +175,20 @@ public UserResponse updatePasswordV1(
171175
return UserResponse.from(userUpdated);
172176
}
173177

178+
@Operation(
179+
summary = "판매자 정보 조회",
180+
description = "판매자 정보(유저 정보 + 판매 중인 매물 수 + 판매 완료 매물 수)를 조회합니다.",
181+
security = @SecurityRequirement(name = "access-token")
182+
)
183+
@GetMapping(value = "/{userId}/seller", headers = API_VERSION_HEADER_NAME + "=" + 1)
184+
public SellerInfoResponse getSellerInfoV1(
185+
@PathVariable Long userId
186+
) {
187+
UserDto userDto = userQueryService.getDtoById(userId);
188+
long sellingCount = instrumentQueryService.countSellingItemsBySellerId(userId);
189+
long soldCount = instrumentQueryService.countSoldItemsBySellerId(userId);
190+
return SellerInfoResponse.from(userDto, sellingCount, soldCount);
191+
}
192+
174193
}
175194

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.ajou.hertz.domain.user.dto.response;
2+
3+
import java.time.LocalDateTime;
4+
5+
import com.ajou.hertz.domain.user.dto.UserDto;
6+
7+
import io.swagger.v3.oas.annotations.media.Schema;
8+
import lombok.AccessLevel;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Getter;
11+
import lombok.NoArgsConstructor;
12+
13+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
14+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
15+
@Getter
16+
public class SellerInfoResponse {
17+
18+
@Schema(description = "Id of user", example = "1")
19+
private Long id;
20+
21+
@Schema(description = "이메일", example = "[email protected]")
22+
private String email;
23+
24+
@Schema(description = "프로필 이미지 url", example = "https://user-profile-image")
25+
private String profileImage;
26+
27+
@Schema(description = "연락 수단", example = "https://contack-link")
28+
private String contactLink;
29+
30+
@Schema(description = "가입일", example = "2024.01.01")
31+
private LocalDateTime createdAt;
32+
33+
@Schema(description = "판매중인 물품의 수", example = "10")
34+
private long sellingItemCount;
35+
36+
@Schema(description = "판매완료한 물품의 수", example = "10")
37+
private long soldItemCount;
38+
39+
public static SellerInfoResponse from(UserDto userDto, long sellingItemCount, long soldItemCount) {
40+
return new SellerInfoResponse(
41+
userDto.getId(),
42+
userDto.getEmail(),
43+
userDto.getProfileImageUrl(),
44+
userDto.getContactLink(),
45+
userDto.getCreatedAt(),
46+
sellingItemCount,
47+
soldItemCount
48+
);
49+
}
50+
}

0 commit comments

Comments
 (0)