Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.umc9th.domain.mission.controller;

import com.example.umc9th.domain.mission.dto.MissionReqDto;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.domain.mission.service.MissionService;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.apiPayload.code.SuccessCode;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/missions")
@RequiredArgsConstructor
public class MissionController {

private final MissionService missionService;

@PostMapping
public ResponseEntity<ApiResponse<Long>> createMission(
@RequestBody MissionReqDto request
) {
Mission newMission = missionService.createMission(request);

return ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.onSuccess(SuccessCode._CREATED, newMission.getId()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.umc9th.domain.mission.converter;

import com.example.umc9th.domain.mission.dto.MissionReqDto;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.domain.restaurants.entity.Restaurant;

public class MissionConverter {

public static Mission toMission(MissionReqDto reqDto, Restaurant restaurant) {
return Mission.builder()
.deadline(reqDto.getDeadline())
.content(reqDto.getContent())
.point(reqDto.getPoint())
.restaurant(restaurant)
.build();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.umc9th.domain.mission.dto;

import lombok.Builder;
import lombok.Getter;
import java.util.Date;

@Builder
@Getter
public class MissionReqDto {
private Long restaurantId;
private Date deadline;
private String content;
private float point;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.umc9th.domain.mission.repository;

import com.example.umc9th.domain.mission.entity.Mission;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MissionRepository extends JpaRepository<Mission, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.umc9th.domain.mission.service;

import com.example.umc9th.domain.mission.converter.MissionConverter;
import com.example.umc9th.domain.mission.dto.MissionReqDto;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.domain.mission.repository.MissionRepository;
import com.example.umc9th.domain.restaurants.entity.Restaurant;
import com.example.umc9th.domain.restaurants.repository.RestaurantRepository;
import com.example.umc9th.global.apiPayload.code.GeneralErrorCode;
import com.example.umc9th.global.apiPayload.exception.GeneralException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MissionService {

private final MissionRepository missionRepository;
private final RestaurantRepository restaurantRepository;

@Transactional
public Mission createMission(MissionReqDto reqDto) {
Restaurant restaurant = restaurantRepository.findById(reqDto.getRestaurantId())
.orElseThrow(() -> new GeneralException(GeneralErrorCode.RESTAURANT_NOT_FOUND));

Mission mission = MissionConverter.toMission(reqDto, restaurant);

return missionRepository.save(mission);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.example.umc9th.domain.restaurants.controller;

import com.example.umc9th.domain.restaurants.dto.RestaurantReqDto;
import com.example.umc9th.domain.restaurants.entity.Restaurant;
import com.example.umc9th.domain.restaurants.service.RestaurantService;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.apiPayload.code.SuccessCode;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/restaurants")
@RequiredArgsConstructor
public class RestaurantController {
private final RestaurantService restaurantService;

@PostMapping
public ResponseEntity<ApiResponse<Long>> createRestaurant(
@RequestBody RestaurantReqDto request
) {
Restaurant newRestaurant = restaurantService.createRestaurant(request);

return ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.onSuccess(SuccessCode._CREATED, newRestaurant.getId()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.umc9th.domain.restaurants.converter;

import com.example.umc9th.domain.restaurants.dto.RestaurantReqDto;
import com.example.umc9th.domain.restaurants.entity.Location;
import com.example.umc9th.domain.restaurants.entity.Restaurant;

public class RestaurantConverter {

public static Restaurant toRestaurant(RestaurantReqDto reqDto, Location location) {
return Restaurant.builder()
.name(reqDto.getName())
.detailAddress(reqDto.getDetailAddress())
.category(reqDto.getCategory())
.location(location)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.umc9th.domain.restaurants.dto;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class RestaurantReqDto {
private String name;
private String detailAddress;
private String category;
private Long locationId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.umc9th.domain.restaurants.repository;

import com.example.umc9th.domain.restaurants.entity.Location;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LocationRepository extends JpaRepository<Location, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.umc9th.domain.restaurants.repository;

import com.example.umc9th.domain.restaurants.entity.Restaurant;
import org.springframework.data.jpa.repository.JpaRepository;

public interface RestaurantRepository extends JpaRepository<Restaurant, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.umc9th.domain.restaurants.service;

import com.example.umc9th.domain.restaurants.converter.RestaurantConverter;
import com.example.umc9th.domain.restaurants.dto.RestaurantReqDto;
import com.example.umc9th.domain.restaurants.entity.Location;
import com.example.umc9th.domain.restaurants.entity.Restaurant;
import com.example.umc9th.domain.restaurants.repository.LocationRepository;
import com.example.umc9th.domain.restaurants.repository.RestaurantRepository;
import com.example.umc9th.global.apiPayload.code.GeneralErrorCode;
import com.example.umc9th.global.apiPayload.exception.GeneralException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
public class RestaurantService {

private final RestaurantRepository restaurantRepository;
private final LocationRepository locationRepository;

@Transactional
public Restaurant createRestaurant(RestaurantReqDto reqDto) {
Location location = locationRepository.findById(reqDto.getLocationId())
.orElseThrow(() -> new GeneralException(GeneralErrorCode.NOT_FOUND));

Restaurant restaurant = RestaurantConverter.toRestaurant(reqDto, location);

return restaurantRepository.save(restaurant);
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,38 @@
package com.example.umc9th.domain.review.controller;

import com.example.umc9th.domain.review.dto.ReviewCreateReqDto;
import com.example.umc9th.domain.review.dto.ReviewSearchResDto;
import com.example.umc9th.domain.review.entity.Review;
import com.example.umc9th.domain.review.service.ReviewQueryService;
import com.example.umc9th.domain.review.service.ReviewService;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.apiPayload.code.SuccessCode;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/reviews")
@RequiredArgsConstructor
public class ReviewController {
private final ReviewQueryService reviewQueryService;
private final ReviewService reviewService;

@GetMapping("/search")
public ResponseEntity<ApiResponse<ReviewSearchResDto>> searchReviews(
@RequestParam String type,
@RequestParam String query
) {
ReviewSearchResDto result = reviewQueryService.searchReview(type, query);
return ResponseEntity.ok(ApiResponse.success(SuccessCode.REVIEW_SEARCHED, result));
return ResponseEntity.ok(ApiResponse.onSuccess(SuccessCode.READ_SUCCESS, result));
}

@PostMapping()
public ResponseEntity<ApiResponse<ReviewCreateReqDto>> createReview(@RequestBody ReviewCreateReqDto req) {
long userId = 1; //임시 유저
reviewService.createReview(req, userId);

return ResponseEntity.ok(ApiResponse.onSuccess(SuccessCode._CREATED));
}


}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.example.umc9th.domain.review.converter;

import com.example.umc9th.domain.restaurants.entity.Restaurant;
import com.example.umc9th.domain.review.dto.ReviewCreateReqDto;
import com.example.umc9th.domain.review.dto.ReviewDetailDto;
import com.example.umc9th.domain.review.dto.ReviewSearchResDto;
import com.example.umc9th.domain.review.entity.Review;
import com.example.umc9th.domain.review.entity.mapping.ReviewImage;
import com.example.umc9th.domain.user.entity.User;

import java.util.List;

Expand Down Expand Up @@ -50,4 +53,14 @@ private static List<String> extractImageUrls(List<ReviewImage> images) {
.map(ReviewImage::getImgUrl)
.toList();
}

/** ReviewCreateReqDto → Review */
public static Review toReview(ReviewCreateReqDto reqDto, User user, Restaurant restaurant) {
return Review.builder()
.user(user)
.rating(reqDto.getRating())
.content(reqDto.getContent())
.restaurant(restaurant)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.umc9th.domain.review.dto;

import lombok.Builder;
import lombok.Getter;

import java.util.List;

@Builder
@Getter
public class ReviewCreateReqDto {
private long restaurantId;
private String content;
private float rating;
private List<String> imgUrl;
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,41 @@
package com.example.umc9th.domain.review.service;

import com.example.umc9th.domain.restaurants.entity.Restaurant;
import com.example.umc9th.domain.restaurants.repository.RestaurantRepository;
import com.example.umc9th.domain.review.converter.ReviewConverter;
import com.example.umc9th.domain.review.dto.ReviewCreateReqDto;
import com.example.umc9th.domain.review.entity.Review;
import com.example.umc9th.domain.review.repository.ReviewRepository;
import com.example.umc9th.domain.user.entity.User;
import com.example.umc9th.domain.user.repository.UserRepository;
import com.example.umc9th.global.apiPayload.code.GeneralErrorCode;
import com.example.umc9th.global.apiPayload.exception.GeneralException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class ReviewService {

private ReviewRepository reviewRepository;
private final ReviewRepository reviewRepository;
private final UserRepository userRepository;
private final RestaurantRepository restaurantRepository;

public void createReview(Restaurant restaurant, User user, int rating, String content){
@Transactional
public void createReview(ReviewCreateReqDto reqDto, long userId){
// User 엔티티 조회
User user = userRepository.findById(userId)
.orElseThrow(() -> new GeneralException(GeneralErrorCode.USER_NOT_FOUND));

Review review = Review.builder()
.user(user)
.rating(rating)
.content(content)
.restaurant(restaurant)
.build();
// Restaurant 엔티티 조회
Restaurant restaurant = restaurantRepository.findById(reqDto.getRestaurantId())
.orElseThrow(() -> new GeneralException(GeneralErrorCode.NOT_FOUND)); // RESTAURANT_NOT_FOUND가 없으면 NOT_FOUND 사용

// Converter를 사용하여 Review
Review review = ReviewConverter.toReview(reqDto, user, restaurant);

// 4. 저장
reviewRepository.save(review);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.umc9th.domain.user.controller;

import com.example.umc9th.domain.user.entity.mapping.UserMission;
import com.example.umc9th.domain.user.service.UserMissionService;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.apiPayload.code.SuccessCode;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserMissionService userMissionService;

@PostMapping("/{userId}/missions/{missionId}/challenge")
public ResponseEntity<ApiResponse<Long>> challengeMission(
@PathVariable Long userId,
@PathVariable Long missionId
) {
UserMission newUserMission = userMissionService.challengeMission(userId, missionId);

return ResponseEntity.ok(ApiResponse.onSuccess(SuccessCode._CREATED, newUserMission.getId()));
}
}
Loading