Skip to content

Commit

Permalink
Merge branch 'dev' into feat/#25
Browse files Browse the repository at this point in the history
  • Loading branch information
2hy2on authored Jul 4, 2024
2 parents c6507b1 + dd2e131 commit e653fa9
Show file tree
Hide file tree
Showing 12 changed files with 233 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,54 @@
package com.umc.hackaton.snapspot.savespot.controller;

import com.umc.hackaton.snapspot.savespot.dto.SpotSaveReqeustDto;
import com.umc.hackaton.snapspot.savespot.dto.SpotSaveResponseDto;
import com.umc.hackaton.snapspot.savespot.service.SpotSaveService;
import com.umc.hackaton.snapspot.savespot.service.UserFolderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/savespot")
@Slf4j
public class SaveSpotController {

private final SpotSaveService spotSaveService;
private final UserFolderService userFolderService;

@PostMapping
public ResponseEntity<?> saveSpotSave(@RequestBody SpotSaveReqeustDto spotSaveRequestDto) {
try {
spotSaveService.save(spotSaveRequestDto);
return ResponseEntity.ok().body("Userfolder에 Spot 저장 성공");
} catch (Exception e) {
log.error("스팟 저장에 실패하였습니다.", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Userfolder에 Spot 저장에 실패하였습니다.");
}
}

@DeleteMapping
public ResponseEntity<?> deleteSpotSave(@RequestParam Long spotSaveId) {
try {
spotSaveService.delete(spotSaveId);
return ResponseEntity.ok().body("Userfolder에 Spot 삭제 성공");
} catch (Exception e) {
log.info("스팟 삭제에 실패하였습니다.", e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Userfolder에 Spot 삭제에 실패하였습니다.");
}
}

@GetMapping("/{id}")
public ResponseEntity<?> getSpotSave(@PathVariable("id") Long id) {
try {
SpotSaveResponseDto spotSaveList = spotSaveService.getSpotsByFolderId(id);
return ResponseEntity.ok().body(spotSaveList);
} catch (Exception e) {
log.info("스팟 조회에 실패하였습니다.", e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Userfolder에 Spot 조회에 실패하였습니다.");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.umc.hackaton.snapspot.savespot.dto;

import com.umc.hackaton.snapspot.savespot.entity.SpotSave;
import com.umc.hackaton.snapspot.savespot.entity.UserFolder;
import com.umc.hackaton.snapspot.spot.entity.Spot;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;

@Getter
public class SpotSaveReqeustDto {
@NotNull private Long folderId;
@NotNull private Long spotId;

@Builder
public SpotSave toEntity(UserFolder userFolder, Spot spot){
return SpotSave.builder()
.userFolder(userFolder)
.spot(spot)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.umc.hackaton.snapspot.savespot.dto;

import com.umc.hackaton.snapspot.spot.entity.Spot;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Builder
@Getter
@Setter
public class SpotSaveResponseDto {
private Long folderId;
private List<Spot> spots;

public static SpotSaveResponseDto fromEntity(Long folderId, List<Spot> spots) {
return SpotSaveResponseDto.builder()
.folderId(folderId)
.spots(spots)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.umc.hackaton.snapspot.savespot.entity;

import com.umc.hackaton.snapspot.config.entity.BaseEntity;
import com.umc.hackaton.snapspot.spot.entity.Spot;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SpotSave extends BaseEntity {

@Id
@GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "userfolder_id")
private UserFolder userFolder;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "spot_id")
private Spot spot;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.umc.hackaton.snapspot.savespot.repository;

import com.umc.hackaton.snapspot.savespot.dto.SpotSaveResponseDto;
import com.umc.hackaton.snapspot.savespot.entity.SpotSave;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface SpotSaveRepository extends JpaRepository<SpotSave, Long> {
List<SpotSave> findAllByUserFolder_Id(Long userFolderId);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.umc.hackaton.snapspot.savespot.repository;

import com.umc.hackaton.snapspot.savespot.entity.UserFolder;
import com.umc.hackaton.snapspot.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface UserFolderRepository extends JpaRepository<UserFolder, Long> {
List<UserFolder> findAllByUserIdAndIsDeletedFalse(Long userId);
UserFolder findByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.umc.hackaton.snapspot.savespot.service;

import com.umc.hackaton.snapspot.savespot.dto.SpotSaveReqeustDto;
import com.umc.hackaton.snapspot.savespot.dto.SpotSaveResponseDto;
import com.umc.hackaton.snapspot.savespot.entity.SpotSave;
import com.umc.hackaton.snapspot.savespot.entity.UserFolder;
import com.umc.hackaton.snapspot.savespot.repository.SpotSaveRepository;
import com.umc.hackaton.snapspot.savespot.repository.UserFolderRepository;
import com.umc.hackaton.snapspot.spot.entity.Spot;
import com.umc.hackaton.snapspot.spot.repository.SpotRepository;
import com.umc.hackaton.snapspot.user.entity.User;
import com.umc.hackaton.snapspot.user.repository.UserRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@RequiredArgsConstructor
@Service
public class SpotSaveService {

private final SpotSaveRepository spotSaveRepository;
private final UserFolderRepository userFolderRepository;
private final SpotRepository spotRepository;
private final UserRepository userRepository;

@Transactional
public SpotSaveResponseDto save(SpotSaveReqeustDto dto) {
UserFolder userFolder = userFolderRepository.findById(dto.getFolderId())
.orElseThrow(() -> new IllegalArgumentException("Invalid folder ID"));
Spot spot = spotRepository.findById(dto.getSpotId())
.orElseThrow(() -> new IllegalArgumentException("Invalid spot ID"));
SpotSave spotSave = dto.toEntity(userFolder, spot);
SpotSave savedSpotSave = spotSaveRepository.save(spotSave);
return SpotSaveResponseDto.fromEntity(userFolder.getId(), List.of(spot));
}

@Transactional
public void delete(Long spotSaveId) {
spotSaveRepository.deleteById(spotSaveId);
}

@Transactional
public SpotSaveResponseDto getSpotsByFolderId(Long folderId) {
List<SpotSave> spotSaves = spotSaveRepository.findAllByUserFolder_Id(folderId);
List<Spot> spots = spotSaves.stream()
.map(SpotSave::getSpot)
.collect(Collectors.toList());
return SpotSaveResponseDto.fromEntity(folderId, spots);
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package com.umc.hackaton.snapspot.savespot.service;

import com.umc.hackaton.snapspot.savespot.dto.UserFolderRequestDto;
import com.umc.hackaton.snapspot.savespot.entity.SpotSave;
import com.umc.hackaton.snapspot.savespot.entity.UserFolder;
import com.umc.hackaton.snapspot.savespot.repository.SpotSaveRepository;
import com.umc.hackaton.snapspot.savespot.repository.UserFolderRepository;
import com.umc.hackaton.snapspot.spot.entity.Spot;
import com.umc.hackaton.snapspot.user.entity.User;
import com.umc.hackaton.snapspot.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class UserFolderService {
private final UserFolderRepository userFolderRepository;
private final UserRepository userRepository;
private final SpotSaveRepository spotSaveRepository;

@Transactional
public void save(UserFolderRequestDto userFolder) {
Expand All @@ -39,4 +44,11 @@ public UserFolder update(Long folderId, UserFolderRequestDto userFolderRequestDt
public List<UserFolder> getAllFoldersByUserId(Long userId) {
return userFolderRepository.findAllByUserIdAndIsDeletedFalse(userId);
}

public List<Spot> getSpotsByFolderId(Long folderId) {
List<SpotSave> spotSaves = spotSaveRepository.findAllByUserFolder_Id(folderId);
return spotSaves.stream()
.map(SpotSave::getSpot)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@
import com.umc.hackaton.snapspot.spot.service.SpotService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequiredArgsConstructor
@RestController
Expand All @@ -23,23 +21,29 @@ public class SpotController {
private final SpotService spotService;

@PostMapping
public ResponseEntity<?> upload(@RequestBody SpotRequestDto dto){
public ResponseEntity<?> upload(@RequestBody SpotRequestDto dto) {
try {
spotService.upload(dto);
return ResponseEntity.ok().body("스팟 업로드 성공.");
Spot spot = spotService.upload(dto);
return ResponseEntity.ok().body(spot);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("스팟 업로드에 실패하였습니다.");
}
}

@GetMapping("/list/{spotId}")
public Spot getSpotById(@PathVariable Long spotId) {
return spotService.getSpotById(spotId);

}

@GetMapping("/{spotId}")
public ResponseEntity<?> showSpot(
@PathVariable("spotId") Long spotId
) {
try {
Spot spot = spotService.getSpot(spotId);
return ResponseEntity.ok().body(spot);
} catch (Exception e){
} catch (Exception e) {
log.info("스팟 조회에 실패하였습니다.", e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("스팟 조회에 실패하였습니다.");
}
Expand All @@ -52,13 +56,12 @@ public ResponseEntity<?> deleteSpot(
try {
spotService.deleteSpot(spotId);
return ResponseEntity.ok().body("success");
} catch (Exception e){
} catch (Exception e) {
log.info("스팟 삭제에 실패하였습니다.", e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("스팟 삭제에 실패하였습니다.");
}
}


@PatchMapping("/{spotId}")
public ResponseEntity<?> patchSpot(
@PathVariable("spotId") Long spotId,
Expand All @@ -67,14 +70,19 @@ public ResponseEntity<?> patchSpot(
try {
Spot spot = spotService.updateSpot(spotId, dto);
return ResponseEntity.ok().body(spot);
} catch (Exception e){
} catch (Exception e) {
log.info("스팟 수정에 실패하였습니다.", e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("스팟 수정에 실패하였습니다.");
}
}

@GetMapping("list")
public ResponseEntity<List<SpotResponseDto>> readNearSpotList(@RequestParam("latitude") double latitude, @RequestParam("logitude") double logitude){
return ResponseEntity.ok(spotService.readNearSpotList(latitude, logitude));
public ResponseEntity<List<SpotResponseDto>> readNearSpotList(@RequestParam("latitude") double latitude, @RequestParam("longitude") double longitude){
return ResponseEntity.ok(spotService.readNearSpotList(latitude, longitude));
}

@GetMapping("list/category")
public ResponseEntity<List<SpotResponseDto>> readCategoryNearSpotList(@RequestParam("latitude") double latitude, @RequestParam("longitude") double longitude, @RequestParam("categoryId") Long categoryId){
List<SpotResponseDto> list = spotService.readNearSpotList(latitude, longitude);
return ResponseEntity.ok(spotService.readCategoryNearSpotList(list, categoryId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class Spot extends BaseEntity {
@Column(name = "longitude", nullable = false)
private Double longitude;

@Column(name = "img_url", nullable = false)
@Column(name = "img_url", nullable = false, length = 1000)
private String imgUrl;

@Column(name = "like_num")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;

public interface SpotRepository extends JpaRepository<Spot, Long> {
List<Spot> findAllByUser(User user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@
import com.umc.hackaton.snapspot.spot.dto.SpotRequestDto;
import com.umc.hackaton.snapspot.spot.dto.SpotResponseDto;
import com.umc.hackaton.snapspot.spot.entity.Spot;
import com.umc.hackaton.snapspot.user.entity.User;
import com.umc.hackaton.snapspot.spot.repository.SpotRepository;
import com.umc.hackaton.snapspot.user.entity.User;
import com.umc.hackaton.snapspot.user.repository.UserRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
Expand All @@ -31,7 +29,7 @@ public class SpotService {
private final CategorySpotRepository categorySpotRepository;

@Transactional
public void upload(SpotRequestDto dto) {
public Spot upload(SpotRequestDto dto) {

User user = userRepository.findUserById(dto.getUserId());

Expand Down Expand Up @@ -59,7 +57,14 @@ public void upload(SpotRequestDto dto) {

// CategorySpot 저장
categorySpotRepository.saveAll(categorySpots);
return savedSpot;
}

@Transactional
public Spot getSpotById(Long spotId) {
// spotId를 사용하여 Repository를 통해 Spot을 가져옴
return spotRepository.findById(spotId)
.orElseThrow(() -> new RuntimeException("Spot not found with id: " + spotId));
}

public Spot getSpot(Long spotId) {
Expand Down

0 comments on commit e653fa9

Please sign in to comment.