@RestController
@RequestMapping("/api/stores")
@RequiredArgsConstructor
public class StoreController {
private final StoreService storeService;
private final AuthenticationUtil authenticationUtil;
/**
* 매장 등록 API (파트너 전용)
*/
@PostMapping("/partners/{partnerId}")
@PreAuthorize("hasRole('ROLE_PARTNER')")
public ResponseEntity<ApiResponse<StoreDto.CreateResponse>> createStore(
@PathVariable Long partnerId,
@Valid @RequestBody StoreDto.CreateRequest request
) {
// 현재 인증된 사용자가 해당 파트너인지 확인
authenticationUtil.validatePartnerOwnership(partnerId);
// 매장 등록 서비스 호출
StoreDto.CreateResponse response = storeService.createStore(partnerId, request);
// 응답 반환
return ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success("매장이 성공적으로 등록되었습니다.", response));
}
}
@Service
@RequiredArgsConstructor
public class StoreService {
private final StoreRepository storeRepository;
private final PartnerRepository partnerRepository;
/**
* 매장 등록 메서드
*/
@Transactional
public StoreDto.CreateResponse createStore(Long partnerId, StoreDto.CreateRequest request) {
// 매장 이름 중복 확인
if (storeRepository.existsByName(request.getName())) {
throw new CustomException(ErrorCode.STORE_NAME_ALREADY_EXISTS);
}
// 파트너 확인
Partner partner = partnerRepository.findById(partnerId)
.orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND));
// 매장 엔티티 생성
Store store = Store.builder()
.name(request.getName())
.address(request.getAddress())
.description(request.getDescription())
.phoneNumber(request.getPhoneNumber())
.businessHours(request.getBusinessHours())
.partner(partner)
.active(true)
.build();
// 매장 저장
Store savedStore = storeRepository.save(store);
// 응답 DTO 생성 및 반환
return StoreDto.CreateResponse.builder()
.storeId(savedStore.getId())
.name(savedStore.getName())
.address(savedStore.getAddress())
.description(savedStore.getDescription())
.phoneNumber(savedStore.getPhoneNumber())
.businessHours(savedStore.getBusinessHours())
.partnerId(partner.getId())
.createdAt(savedStore.getCreatedAt())
.build();
}
}




