diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 30eb8a1..b6fb8ef 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -53,65 +53,66 @@ jobs: - name: Publish image to docker hub run: docker push ${{ secrets.DOCKER_USERNAME }}/qpin_server:latest - deploy: - needs: build - runs-on: ubuntu-latest - steps: - - name: Set Target IP - run: | - STATUS=$(curl -o /dev/null -w "%{http_code}" "http://${{ secrets.QPIN_SERVER_IP }}/env") - echo $STATUS - if [ $STATUS = 200 ]; then - CURRENT_UPSTREAM=$(curl -s "http://${{ secrets.QPIN_SERVER_IP }}/env") - else - CURRENT_UPSTREAM=green - fi - echo CURRENT_UPSTREAM=$CURRENT_UPSTREAM >> $GITHUB_ENV - if [ $CURRENT_UPSTREAM = blue ]; then - echo "CURRENT_PORT=8080" >> $GITHUB_ENV - echo "STOPPED_PORT=8081" >> $GITHUB_ENV - echo "TARGET_UPSTREAM=green" >> $GITHUB_ENV - else - echo "CURRENT_PORT=8081" >> $GITHUB_ENV - echo "STOPPED_PORT=8080" >> $GITHUB_ENV - echo "TARGET_UPSTREAM=blue" >> $GITHUB_ENV - fi - - - name: Docker Compose - uses: appleboy/ssh-action@master - with: - username: ubuntu - host: ${{ secrets.QPIN_SERVER_IP }} - key: ${{ secrets.EC2_SSH_KEY }} - script_stop: true - script: | - sudo docker pull ${{ secrets.DOCKER_USERNAME }}/qpin_server:latest - sudo docker-compose -f docker-compose-${{env.TARGET_UPSTREAM}}.yml up -d - - - name: Check deploy server URL - uses: jtalk/url-health-check-action@v3 - with: - url: http://${{ secrets.QPIN_SERVER_IP }}:${{ env.STOPPED_PORT }}/env - max-attempts: 5 - retry-delay: 10s - - - name: Change nginx upstream - uses: appleboy/ssh-action@master - with: - username: ubuntu - host: ${{ secrets.QPIN_SERVER_IP }} - key: ${{ secrets.EC2_SSH_KEY }} - script_stop: true - script: | - sudo docker exec -i nginxserver bash -c 'echo "set \$service_url ${{env.TARGET_UPSTREAM}};" > etc/nginx/conf.d/service-env.inc && nginx -s reload' - - - name: Stop current server - uses: appleboy/ssh-action@master - with: - username: ubuntu - host: ${{ secrets.QPIN_SERVER_IP }} - key: ${{ secrets.EC2_SSH_KEY }} - script_stop: true - script: | - sudo docker stop ${{ env.CURRENT_UPSTREAM }} - sudo docker rm ${{ env.CURRENT_UPSTREAM }} \ No newline at end of file +# CD 임시 삭제 +# deploy: +# needs: build +# runs-on: ubuntu-latest +# steps: +# - name: Set Target IP +# run: | +# STATUS=$(curl -o /dev/null -w "%{http_code}" "http://${{ secrets.QPIN_SERVER_IP }}/env") +# echo $STATUS +# if [ $STATUS = 200 ]; then +# CURRENT_UPSTREAM=$(curl -s "http://${{ secrets.QPIN_SERVER_IP }}/env") +# else +# CURRENT_UPSTREAM=green +# fi +# echo CURRENT_UPSTREAM=$CURRENT_UPSTREAM >> $GITHUB_ENV +# if [ $CURRENT_UPSTREAM = blue ]; then +# echo "CURRENT_PORT=8080" >> $GITHUB_ENV +# echo "STOPPED_PORT=8081" >> $GITHUB_ENV +# echo "TARGET_UPSTREAM=green" >> $GITHUB_ENV +# else +# echo "CURRENT_PORT=8081" >> $GITHUB_ENV +# echo "STOPPED_PORT=8080" >> $GITHUB_ENV +# echo "TARGET_UPSTREAM=blue" >> $GITHUB_ENV +# fi +# +# - name: Docker Compose +# uses: appleboy/ssh-action@master +# with: +# username: ubuntu +# host: ${{ secrets.QPIN_SERVER_IP }} +# key: ${{ secrets.EC2_SSH_KEY }} +# script_stop: true +# script: | +# sudo docker pull ${{ secrets.DOCKER_USERNAME }}/qpin_server:latest +# sudo docker-compose -f docker-compose-${{env.TARGET_UPSTREAM}}.yml up -d +# +# - name: Check deploy server URL +# uses: jtalk/url-health-check-action@v3 +# with: +# url: http://${{ secrets.QPIN_SERVER_IP }}:${{ env.STOPPED_PORT }}/env +# max-attempts: 5 +# retry-delay: 10s +# +# - name: Change nginx upstream +# uses: appleboy/ssh-action@master +# with: +# username: ubuntu +# host: ${{ secrets.QPIN_SERVER_IP }} +# key: ${{ secrets.EC2_SSH_KEY }} +# script_stop: true +# script: | +# sudo docker exec -i nginxserver bash -c 'echo "set \$service_url ${{env.TARGET_UPSTREAM}};" > etc/nginx/conf.d/service-env.inc && nginx -s reload' +# +# - name: Stop current server +# uses: appleboy/ssh-action@master +# with: +# username: ubuntu +# host: ${{ secrets.QPIN_SERVER_IP }} +# key: ${{ secrets.EC2_SSH_KEY }} +# script_stop: true +# script: | +# sudo docker stop ${{ env.CURRENT_UPSTREAM }} +# sudo docker rm ${{ env.CURRENT_UPSTREAM }} \ No newline at end of file diff --git a/src/main/java/org/example/qpin/domain/member/entity/Member.java b/src/main/java/org/example/qpin/domain/member/entity/Member.java index 01a47ed..f188c7f 100644 --- a/src/main/java/org/example/qpin/domain/member/entity/Member.java +++ b/src/main/java/org/example/qpin/domain/member/entity/Member.java @@ -6,7 +6,6 @@ import org.example.qpin.domain.scrap.entity.Scrap; import org.example.qpin.global.common.BaseEntity; -import java.security.Timestamp; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -69,4 +68,13 @@ public Member (String name, String password, String role){ this.role = role; // this.phoneNumber = phoneNumber; } + + // 주차 여부 + @Column(nullable = false) + private boolean isParking; + + // 주차 여부를 설정 + public void setParking(boolean isParking) { + this.isParking = isParking; + } } diff --git a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java index fc57131..73c2bc2 100644 --- a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java +++ b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java @@ -1,14 +1,13 @@ package org.example.qpin.domain.parking.controller; import lombok.RequiredArgsConstructor; +import org.example.qpin.domain.parking.dto.ParkingInfoResDto; import org.example.qpin.domain.parking.dto.ParkingSearchReqDto; import org.example.qpin.domain.parking.dto.ParkingSearchResDto; import org.example.qpin.domain.parking.service.ParkingService; import org.example.qpin.global.common.response.CommonResponse; import org.example.qpin.global.common.response.ResponseCode; import org.json.simple.parser.ParseException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -19,38 +18,37 @@ public class ParkingController { private final ParkingService parkingService; - /** - * 주변 주차장 정보 탐색 - */ + // [Get] 주변 주차장 검색 @GetMapping("/parking/selectList") - public ResponseEntity> findParkingNearby(@RequestBody ParkingSearchReqDto parkingSearchReqDto) throws ParseException { + public CommonResponse> findParkingNearby(@RequestParam ParkingSearchReqDto parkingSearchReqDto) throws ParseException { - double latitude=parkingSearchReqDto.getLatitude(); - double longitude=parkingSearchReqDto.getLongtitude(); - double distance=parkingSearchReqDto.getDistance(); + Double latitude=parkingSearchReqDto.getLatitude(); + Double longitude=parkingSearchReqDto.getLongitude(); + Double distance=parkingSearchReqDto.getDistance(); String regionCode=parkingSearchReqDto.getRegionCode(); - return ResponseEntity.status(HttpStatus.OK).body(parkingService.findParkingNearby(latitude, longitude, distance,regionCode )); + + List parkingList = parkingService.findParkingNearby(latitude, longitude, distance, regionCode); + return new CommonResponse<>(ResponseCode.SUCCESS, parkingList); } - // [Post] 주차하기 버튼 + // [Post] 주차 등록 @PostMapping("/parking/{parkingAreaId}/{memberId}") - @ResponseBody - public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") String parkingAreaId) { - parkingService.postParking(memberId, parkingAreaId); - return new CommonResponse<>(ResponseCode.SUCCESS); + public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId, @RequestBody String type) { + parkingService.postParking(memberId, parkingAreaId, type); + return new CommonResponse<>(ResponseCode.SUCCESS, "주차가 완료되었습니다."); } - // [Delete] 주차하기 버튼 해제 + // [Delete] 주차 해제 @DeleteMapping("/parking/{parkingAreaId}/{memberId}") @ResponseBody - public CommonResponse deleteParking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") String parkingAreaId) { + public CommonResponse deleteParking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { parkingService.deleteParking(memberId, parkingAreaId); - return new CommonResponse<>(ResponseCode.SUCCESS); + return new CommonResponse<>(ResponseCode.SUCCESS, "주차 해제가 완료되었습니다."); } - // [Get] 간편 주차 주차장 정보 - @GetMapping("/parking/select/{parkingAreaId}/{memberId}") - public CommonResponse parkingInfo(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") String parkingAreaId) { - return new CommonResponse<>(ResponseCode.SUCCESS, parkingService.getParkingInfo(memberId, parkingAreaId)); + // [Get] 현재 주차한 주차장 정보 + @GetMapping("/parking/select/{memberId}") + public CommonResponse parkingInfo(@PathVariable("memberId") Long memberId) { + return new CommonResponse<>(ResponseCode.SUCCESS, parkingService.getParkingInfo(memberId)); } } diff --git a/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java b/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java index a083396..5f5442d 100644 --- a/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java +++ b/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java @@ -13,9 +13,8 @@ @Builder public class ParkingInfoResDto { - private boolean parkingStatus; - private boolean scrapStatus; - private LocalDateTime parkingDate; - private int parkingTime; - + private LocalDateTime parkingDate; // 주차 시작 시간 + private int parkingTime; // 주차한 시간(분 단위) + private Long parkingAreaId; // 주차장 ID + private String parkingType; // 주차장 유형 } diff --git a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java index c9fc228..7b3b074 100644 --- a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java +++ b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java @@ -2,15 +2,14 @@ import lombok.Builder; import lombok.Getter; -import lombok.Setter; @Getter -@Setter @Builder +// 주차장 검색 요청 public class ParkingSearchReqDto { - private double latitude; - private double longtitude; - private double distance; - private String regionCode; //지역코드 5자리 문자열 + private Double latitude; // 위도 + private Double longitude; // 경도 + private Double distance; // 검색 기준 거리 + private String regionCode; // 지역코드 5자리 문자열 -} +} \ No newline at end of file diff --git a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java index 2bd99c6..400a55a 100644 --- a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java +++ b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java @@ -7,21 +7,21 @@ @Builder @NoArgsConstructor @AllArgsConstructor +// 주차장 검색 응답 public class ParkingSearchResDto { + private Double longitude; // 경도 + private Double latitude; // 위도 + private String address; // 도로명주소 + private String name; // 주차장명 + private String price; // 가격 + private Long parkId; //주차장 아이디 + private Double parkingDistance; // 현위치와의 거리 - private double longtitude; //경도 - private double latitude; //위도 - private String address; //도로명주소 - private String name; //주차장명 - private String price; //무료,유료 - private Long parkId; - private double parkingDistance; - - private String weekStartTime; - private String weekEndTime; - private String SaturdayStartTime; - private String SaturdayEndTime; - private String HolidayStartTime; - private String HolidayEndTime; + private String weekStartTime; // 평일 오픈 + private String weekEndTime; // 평일 마감 + private String SaturdayStartTime; // 토요일 오픈 + private String SaturdayEndTime; // 토요일 마감 + private String HolidayStartTime; // 공휴일/일요일 오픈 + private String HolidayEndTime; // 공휴일/일요일 마감 } diff --git a/src/main/java/org/example/qpin/domain/parking/entity/Parking.java b/src/main/java/org/example/qpin/domain/parking/entity/Parking.java index f631966..c6fd300 100644 --- a/src/main/java/org/example/qpin/domain/parking/entity/Parking.java +++ b/src/main/java/org/example/qpin/domain/parking/entity/Parking.java @@ -1,8 +1,10 @@ package org.example.qpin.domain.parking.entity; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.*; -import org.example.qpin.domain.member.entity.Member; import org.example.qpin.global.common.BaseEntity; @Entity @@ -14,13 +16,7 @@ public class Parking extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long parkingId; + private Long parkingAreaId; - @Column(length = 50, nullable = false) - private String parkingAreaId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; - -} + private String type; +} \ No newline at end of file diff --git a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java index 710fd9d..2be2124 100644 --- a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java +++ b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java @@ -5,11 +5,11 @@ import org.example.qpin.domain.parking.dto.ParkingInfoResDto; import org.example.qpin.domain.parking.dto.ParkingSearchResDto; import org.example.qpin.domain.parking.entity.Parking; -import org.example.qpin.domain.scrap.entity.Scrap; import org.example.qpin.global.common.repository.MemberRepository; import org.example.qpin.global.common.repository.ParkingRepository; import org.example.qpin.global.common.repository.ScrapRepository; import org.example.qpin.global.exception.BadRequestException; +import org.example.qpin.global.exception.ExceptionCode; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -22,9 +22,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Optional; - -import static org.example.qpin.global.exception.ExceptionCode.NOT_FOUND_PARKING; @Service @RequiredArgsConstructor @@ -35,19 +32,28 @@ public class ParkingService { private final ScrapRepository scrapRepository; public Member findMemberById(Long memberId) { - return memberRepository.findById(memberId).orElseThrow(); + return memberRepository.findById(memberId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_MEMBER_ID)); + } + + public Parking findParkingById(Long parkingAreaId) { + return parkingRepository.findById(parkingAreaId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); } - //latitude: 위도, longtitude: 경도 + //latitude: 위도, longitude: 경도 - /** - * 위도와 경도, 거리, 지역 코드를 입력하면 + /* + * 위도, 경도, 거리, 지역 코드를 입력하면 * 해당 위치로부터 입력한 거리 이내의 주차장의 정보를 반환함. */ - public List findParkingNearby(double mylatitude, double mylongtitude, double distance, String regionCode) throws ParseException { + public List findParkingNearby(Double myLatitude, Double myLongitude, Double distance, String regionCode) throws ParseException { + if (myLatitude == null || myLongitude == null || distance == null || regionCode == null) { + throw new BadRequestException(ExceptionCode.NOT_FOUND); + } + + // 공공포털에서 데이터 가져오기 final int page=1; final int perPage=150; - final String DECODING_KEY="yncOh3M5FtqbW1UwmQmkBKpkkyYqZMj1FddwHcalnFzVCFtnlwkDOhRPFHkhnJPRKYy4scMVfbJMxn954Ym/Eg=="; //키 암호화 필요 + final String DECODING_KEY="yncOh3M5FtqbW1UwmQmkBKpkkyYqZMj1FddwHcalnFzVCFtnlwkDOhRPFHkhnJPRKYy4scMVfbJMxn954Ym/Eg=="; // 키 암호화 필요 final String API_URL="https://api.odcloud.kr/api/15050093/v1/uddi:d19c8e21-4445-43fe-b2a6-865dff832e08?" +"page=" + page +"&perPage=" + perPage @@ -63,35 +69,55 @@ public List findParkingNearby(double mylatitude, double myl .baseUrl(API_URL) .build(); - String response=webClient.get() - .retrieve() - .bodyToMono(String.class) - .block(); + String response; + try { + response = webClient.get() + .retrieve() + .bodyToMono(String.class) + .block(); + } catch (Exception e) { + // 서버 연결 실패 + throw new BadRequestException(ExceptionCode.INTERNAL_SEVER_ERROR); + } - JSONParser jsonParser=new JSONParser(); - JSONObject jsonObject=(JSONObject) jsonParser.parse(response); //예외처리? - JSONArray dataList=(JSONArray) jsonObject.get("data"); + JSONParser jsonParser = new JSONParser(); + JSONObject jsonObject; + JSONArray dataList; + + try { + jsonObject = (JSONObject) jsonParser.parse(response); + dataList = (JSONArray) jsonObject.get("data"); + } catch (Exception e) { + // JSON 파싱 오류 시 500번대 에러 반환 + throw new BadRequestException(ExceptionCode.INTERNAL_SEVER_ERROR); + } + + // 데이터가 없으면 빈 리스트로 반환 + if (dataList == null || dataList.isEmpty()) { + return new ArrayList<>(); + } List parkingSearchResDtoList =new ArrayList<>(); - for(int i=0; i=parkingDistance){ - ParkingSearchResDto parkingSearchResDto = new ParkingSearchResDto().builder() + double parkingDistance = distance(myLatitude, myLongitude, latitude, longitude); + if(distance>=parkingDistance) { + ParkingSearchResDto parkingSearchResDto = ParkingSearchResDto.builder() .latitude(latitude) - .longtitude(longtitude) - .parkId(Long.parseLong((String) data.get("주차장관리번호"))) + .longitude(longitude) + .parkId(Long.parseLong((String) data.get("주차장번호"))) .name((String) data.get("주차장명")) .address((String) data.get("주차장도로명주소")) .price((String) data.get("요금정보")) - .parkingDistance(parkingDistance) + .parkingDistance((Double) data.get("현위치와의 거리")) + .weekStartTime((String) data.get("평일운영시작시각")) .weekEndTime((String) data.get("평일운영종료시각")) .SaturdayStartTime((String) data.get("토요일운영시작시각")) @@ -104,11 +130,10 @@ public List findParkingNearby(double mylatitude, double myl } return parkingSearchResDtoList; - } // 두 좌표 사이의 거리를 구하는 함수 - // dsitance(첫번쨰 좌표의 위도, 첫번째 좌표의 경도, 두번째 좌표의 위도, 두번째 좌표의 경도) + // dsitance(첫번째 좌표의 위도, 첫번째 좌표의 경도, 두번째 좌표의 위도, 두번째 좌표의 경도) private static double distance(double lat1, double lon1, double lat2, double lon2){ double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1))* Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1))*Math.cos(deg2rad(lat2))*Math.cos(deg2rad(theta)); @@ -123,68 +148,71 @@ private static double distance(double lat1, double lon1, double lat2, double lon private static double deg2rad(double deg){ return (deg * Math.PI/180.0); } + //radian(라디안)을 10진수로 변환 private static double rad2deg(double rad){ return (rad * 180 / Math.PI); } - public void postParking(Long memberId, String parkingAreaId) { + + // 주차 등록하기 + public void postParking(Long memberId, Long parkingAreaId, String type) { Member member = findMemberById(memberId); + Parking parking = findParkingById(parkingAreaId); + + // 해당 멤버가 이미 주차 중인 상태인지 확인 + if (member.isParking()) { + throw new BadRequestException(ExceptionCode.DUPLICATED_ADMIN_USERID); + } Parking newParking = Parking.builder() - .member(member) .parkingAreaId(parkingAreaId) + .type(type) .build(); - parkingRepository.save(newParking); - return; + + member.setParking(true); + memberRepository.save(member); } - public void deleteParking(Long memberId, String parkingAreaId) { + // 주차 삭제하기 + public void deleteParking(Long memberId, Long parkingAreaId) { Member member = findMemberById(memberId); + Parking parking = findParkingById(parkingAreaId); + + Parking parkingToDelete = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, memberId) + .orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); - Parking parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, member) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PARKING)); + parkingRepository.delete(parkingToDelete); - parkingRepository.delete(parking); - return; + member.setParking(false); + memberRepository.save(member); } - public ParkingInfoResDto getParkingInfo(Long memberId, String parkingAreaId) { + // 현재 주차된 주차장 정보 불러오기 + public ParkingInfoResDto getParkingInfo(Long memberId) { Member member = findMemberById(memberId); - // parkingStatus, parkingDate, parkingTime - boolean parkingStatus; - LocalDateTime parkingDate = null; - int parkingTime = 0; - - Optional parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, member); - if (parking.isPresent()) { - parkingStatus = true; - parkingDate = parking.get().getCreatedAt(); - - LocalDateTime now = LocalDateTime.now(); - Duration duration = Duration.between(parkingDate, now); - parkingTime = (int) duration.toMinutes(); // 분 단위로 반환하여 전송 - } else { - parkingStatus = false; + // 멤버가 주차 중인 상태인지를 확인 + if (!member.isParking()) { + throw new BadRequestException(ExceptionCode.NOT_FOUND_PARKING); } - // scrapStatus - boolean scrapStatus; - Optional scrap = scrapRepository.findScrapByParkIdAndMember(parkingAreaId, member); - if (scrap.isPresent()) { - scrapStatus = true; - } else { - scrapStatus = false; - } + // 멤버가 주차 중인 주차장 정보를 가져옴 + Parking parking = parkingRepository.findParkingByMemberIdAndIsParkingTrue(memberId) + .orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); + + // 주차 시작 시간 및 기타 정보를 가져옴 + LocalDateTime parkingDate = parking.getCreatedAt(); + int parkingTime = (int) Duration.between(parkingDate, LocalDateTime.now()).toMinutes(); + // 주차장 정보 반환 return ParkingInfoResDto.builder() - .parkingStatus(parkingStatus) - .scrapStatus(scrapStatus) .parkingDate(parkingDate) .parkingTime(parkingTime) + .parkingAreaId(parking.getParkingAreaId()) + .parkingType(parking.getType()) .build(); } diff --git a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java index 00dcbfc..c022d9f 100644 --- a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java +++ b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.*; import org.example.qpin.domain.member.entity.Member; +import org.example.qpin.domain.parking.entity.Parking; import org.example.qpin.global.common.BaseEntity; @Entity @@ -16,7 +17,11 @@ public class Scrap extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; - @Column(length = 20, nullable = false) + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parking_id") + private Parking parking; + + @Column(name = "parking_id") private String parkId; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java b/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java index b2636a8..dec5016 100644 --- a/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java +++ b/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java @@ -1,6 +1,5 @@ package org.example.qpin.global.common.repository; -import org.example.qpin.domain.member.entity.Member; import org.example.qpin.domain.parking.entity.Parking; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,5 +7,6 @@ public interface ParkingRepository extends JpaRepository { - Optional findParkingByParkingAreaIdAndMember(String parkingAreaId, Member member); + Optional findParkingByParkingAreaIdAndMember(Long parkingAreaId, Long memberId); + Optional findParkingByMemberIdAndIsParkingTrue(Long memberId); } diff --git a/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java b/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java index 17e55e5..c495a15 100644 --- a/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java +++ b/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java @@ -1,7 +1,5 @@ package org.example.qpin.global.common.repository; -import org.example.qpin.domain.member.entity.Member; -import org.example.qpin.domain.parking.entity.Parking; import org.example.qpin.domain.scrap.entity.Scrap; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,6 +7,5 @@ public interface ScrapRepository extends JpaRepository { - Optional findScrapByParkIdAndMember(String parkId, Member member); - + Optional findScrapByParkIdAndMember(Long parkId, Long member); } diff --git a/src/main/java/org/example/qpin/global/common/response/ResponseCode.java b/src/main/java/org/example/qpin/global/common/response/ResponseCode.java index 887c245..e33b7f8 100644 --- a/src/main/java/org/example/qpin/global/common/response/ResponseCode.java +++ b/src/main/java/org/example/qpin/global/common/response/ResponseCode.java @@ -5,15 +5,16 @@ @Getter public enum ResponseCode { /* - 2000번대 : 성공 관련 + 200번대 : 성공 관련 */ - SUCCESS(2000, true, "요청에 성공하였습니다."); + SUCCESS(2000, true, "요청에 성공하였습니다."), + NOTFOUND(4000, false, "요청값이 잘못됐습니다."), + FAILED(5000, false, "서버에러. 요청에 실패하였습니다."); private int code; private boolean inSuccess; private String message; - /* 해당되는 코드 매핑 @param code @@ -26,4 +27,4 @@ public enum ResponseCode { this.code = code; this.message = message; } -} +} \ No newline at end of file diff --git a/src/main/java/org/example/qpin/global/exception/ExceptionCode.java b/src/main/java/org/example/qpin/global/exception/ExceptionCode.java index 0743c22..370ab6d 100644 --- a/src/main/java/org/example/qpin/global/exception/ExceptionCode.java +++ b/src/main/java/org/example/qpin/global/exception/ExceptionCode.java @@ -9,6 +9,7 @@ public enum ExceptionCode { INVALID_REQUEST(1000, "올바르지 않은 요청입니다."), + NOT_FOUND(4000, "입력한 데이터가 올바르지 않습니다."), // 멤버 에러 NOT_FOUND_MEMBER_ID(1010, "요청한 ID에 해당하는 멤버가 존재하지 않습니다."), diff --git a/src/test/java/org/example/qpin/serviceTest/serviceTest.java b/src/test/java/org/example/qpin/serviceTest/serviceTest.java index e9159db..7ecc0ac 100644 --- a/src/test/java/org/example/qpin/serviceTest/serviceTest.java +++ b/src/test/java/org/example/qpin/serviceTest/serviceTest.java @@ -4,21 +4,20 @@ import org.example.qpin.global.common.repository.ParkingRepository; import org.json.simple.parser.ParseException; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.mockito.InjectMocks; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; @SpringBootTest public class serviceTest { + @MockBean + private ParkingRepository parkingRepository; - private final ParkingService parkingService; - - @Autowired - serviceTest(ParkingRepository parkingRepository){ - parkingService=new ParkingService(parkingRepository); - } + @InjectMocks + private ParkingService parkingService; @Test public void 주변주차장찾기() throws ParseException { - System.out.println(parkingService.findParkingNearby(35.4816746,129.4085415,10, "11110")); + System.out.println(parkingService.findParkingNearby(35.4816746,129.4085415, 10.0, "11110")); } }