Skip to content
Merged

. #15

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
12 changes: 11 additions & 1 deletion src/main/java/com/example/umc9th/config/AppConfig.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
package com.example.umc9th.config;

import com.example.umc9th.global.resolver.PageArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
@EnableAsync
public class AppConfig {
public class AppConfig implements WebMvcConfigurer {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new PageArgumentResolver());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,38 @@

import com.example.umc9th.domain.mission.dto.MissionRequestDto;
import com.example.umc9th.domain.mission.dto.MissionResponseDto;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.domain.mission.service.MissionService;
import com.example.umc9th.domain.review.dto.ReviewRequestDto;
import com.example.umc9th.domain.review.dto.ReviewResponseDto;
import com.example.umc9th.global.annotation.CheckPage;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.apiPayload.code.status.GeneralSuccessCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.example.umc9th.global.dto.PageResponseDto;
import lombok.RequiredArgsConstructor;
import org.hibernate.annotations.Check;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/missions")
@Tag(name = "λ―Έμ…˜")
public class MissionController {
public class MissionController implements MissionControllerDocs{
private final MissionService missionService;

@Operation(
summary = "λ―Έμ…˜ μΆ”κ°€",
description = "κ΄€λ¦¬μžμš©")
@PostMapping("/admin")
public ApiResponse<String> addMission(@RequestBody MissionRequestDto.CreateMission req) {
public ApiResponse<String> createMission(@RequestBody MissionRequestDto.CreateMission req) {
return ApiResponse.onSuccess(GeneralSuccessCode._CREATED, missionService.createMission(req));
}

@Operation(
summary = "μ‚¬μš©μž λ―Έμ…˜ μΆ”κ°€",
description = "μ‚¬μš©μžκ°€ κ°€κ²Œ λ―Έμ…˜μ„ 본인의 도전 λ―Έμ…˜μ— μΆ”κ°€ν•©λ‹ˆλ‹€.")
@PostMapping("/{mission-id}")
public ApiResponse<MissionResponseDto.AddUserMission> addMission(@RequestParam @PathVariable("mission-id")Long missionId) {
public ApiResponse<MissionResponseDto.MissionInfo> addMission(@PathVariable("mission-id")Long missionId) {
return ApiResponse.onSuccess(GeneralSuccessCode._CREATED, missionService.addUserMission(missionId));
}

@GetMapping("/{store-id}")
public ApiResponse<PageResponseDto<MissionResponseDto.MissionInfo>> getMissions(@PathVariable("store-id")Long storeId,
@CheckPage Integer page,
Integer size) {
return ApiResponse.onSuccess(GeneralSuccessCode._OK, missionService.getStoreMissions(storeId, page, size));
}


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

import com.example.umc9th.domain.mission.dto.MissionRequestDto;
import com.example.umc9th.domain.mission.dto.MissionResponseDto;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.dto.PageResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

@Tag(name = "λ―Έμ…˜")
public interface MissionControllerDocs {

@Operation(
summary = "λ―Έμ…˜ μΆ”κ°€",
description = "κ΄€λ¦¬μžμš©")
public ApiResponse<String> createMission(MissionRequestDto.CreateMission req);

@Operation(
summary = "μ‚¬μš©μž λ―Έμ…˜ μΆ”κ°€",
description = "μ‚¬μš©μžκ°€ κ°€κ²Œ λ―Έμ…˜μ„ 본인의 도전 λ―Έμ…˜μ— μΆ”κ°€ν•©λ‹ˆλ‹€.")
public ApiResponse<MissionResponseDto.MissionInfo> addMission(Long missionId);

@Operation(
summary = "νŠΉμ • κ°€κ²Œ λ―Έμ…˜ λͺ©λ‘",
description = "νŠΉμ • κ°€κ²Œ λ―Έμ…˜ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€.")
public ApiResponse<PageResponseDto<MissionResponseDto.MissionInfo>> getMissions(Long storeId, Integer page, Integer size);



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

import com.example.umc9th.domain.mission.dto.MissionRequestDto;
import com.example.umc9th.domain.mission.dto.MissionResponseDto;
import com.example.umc9th.domain.mission.dto.UserMissionDTO;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.domain.mission.entity.UserMission;
import com.example.umc9th.domain.user.entity.User;

public class MissionConverter {
public static MissionResponseDto.MissionInfo toMissionInfo(Mission mission){
return MissionResponseDto.MissionInfo.builder()
.missionId(mission.getId())
.content(mission.getContent())
.createdAt(mission.getCreatedAt().toString())
.build();
}

public static UserMissionDTO toUserMissionDto(UserMission um){
return UserMissionDTO.builder().
id(um.getMission().getId())
.point(um.getMission().getPoint())
.storeName(um.getMission().getStore().getName())
.missionContent(um.getMission().getContent())
.isCompleted(um.getIsCompleted())
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ private MissionResponseDto() {}
@Builder
@Getter
@AllArgsConstructor
public static class AddUserMission{
public static class MissionInfo{
private Long missionId;
private String content;
private String createdAt;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.example.umc9th.domain.mission.dto;

import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
@Builder
public class UserMissionDTO {
private final Long id;
private final Integer point;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,7 @@ public class UserMission extends BaseEntity {
@Builder.Default
private Boolean isCompleted = false;

public void complete() {
this.isCompleted = true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.example.umc9th.domain.mission.dto.MissionInAreaDTO;
import com.example.umc9th.domain.mission.entity.Mission;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -17,4 +18,6 @@ public interface MissionRepository extends JpaRepository<Mission, Long> {
"WHERE s.address LIKE CONCAT(:regionName, '%') AND m.createdAt < :lastCreatedAt " +
"ORDER BY m.createdAt DESC")
Slice<MissionInAreaDTO> findMissionsInArea(@Param("regionName") String regionName, @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable);

Page<Mission> findByStoreId(Long storeId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.example.umc9th.domain.mission.dto.UserMissionDTO;
import com.example.umc9th.domain.mission.entity.UserMission;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -22,4 +23,7 @@ public interface UserMissionRepository extends JpaRepository<UserMission, Long>
"WHERE um.user.id = :userId AND um.isCompleted = :isCompleted AND um.id < :lastMissionId " +
"ORDER BY um.id DESC")
Slice<UserMissionDTO> findUserMissionsByIsCompleted(@Param("userId") Long userId, @Param("isCompleted") Boolean isCompleted, @Param("lastMissionId") Long lastMissionId, Pageable pageable);

Page<UserMission> findByUserIdAndIsCompleted(Long userId, Boolean isCompleted, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import com.example.umc9th.domain.mission.dto.MissionRequestDto;
import com.example.umc9th.domain.mission.dto.MissionResponseDto;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.global.dto.PageResponseDto;

public interface MissionService {
String createMission(MissionRequestDto.CreateMission req);
MissionResponseDto.AddUserMission addUserMission(Long missionId);
MissionResponseDto.MissionInfo addUserMission(Long missionId);
PageResponseDto<MissionResponseDto.MissionInfo> getStoreMissions(Long storeId, Integer page, Integer size);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.umc9th.domain.mission.service;

import com.example.umc9th.domain.mission.converter.MissionConverter;
import com.example.umc9th.domain.mission.dto.MissionRequestDto;
import com.example.umc9th.domain.mission.dto.MissionResponseDto;
import com.example.umc9th.domain.mission.entity.Mission;
Expand All @@ -8,7 +9,11 @@
import com.example.umc9th.domain.mission.repository.UserMissionRepository;
import com.example.umc9th.domain.store.repository.StoreRepository;
import com.example.umc9th.domain.user.repository.UserRepository;
import com.example.umc9th.global.dto.PageResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
Expand All @@ -33,18 +38,25 @@ public String createMission(MissionRequestDto.CreateMission req) {
}

@Override
public MissionResponseDto.AddUserMission addUserMission(Long missionId) {
public MissionResponseDto.MissionInfo addUserMission(Long missionId) {
UserMission um = UserMission.builder()
.user(userRepository.getReferenceById(1L))
.mission(missionRepository.getReferenceById(missionId))
.build();

userMissionRepository.save(um);

return MissionResponseDto.AddUserMission.builder()
return MissionResponseDto.MissionInfo.builder()
.missionId(missionId)
.content(um.getMission().getContent())
.createdAt(um.getMission().getCreatedAt().toString())
.build();
}

@Override
public PageResponseDto<MissionResponseDto.MissionInfo> getStoreMissions(Long storeId, Integer page, Integer size) {
Page<Mission> result = missionRepository.findByStoreId(storeId, PageRequest.of(page, size));
Page<MissionResponseDto.MissionInfo> missionInfoPage = result.map(MissionConverter::toMissionInfo);
return new PageResponseDto<>(missionInfoPage);
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,37 @@
package com.example.umc9th.domain.user.controller;

import com.example.umc9th.domain.mission.dto.UserMissionDTO;
import com.example.umc9th.domain.user.service.UserService;
import com.example.umc9th.global.annotation.CheckPage;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.apiPayload.code.BaseSuccessCode;
import com.example.umc9th.global.apiPayload.code.status.GeneralSuccessCode;
import com.example.umc9th.global.dto.PageResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/users")
public class UserController {

public class UserController implements UserControllerDocs {
private final UserService userService;

@DeleteMapping("/{userId}")
public ApiResponse<String> deleteUser(@PathVariable("userId") Long userId) {
return ApiResponse.onSuccess(GeneralSuccessCode._DELETED, userService.deleteUser(userId));
}

@Override
@GetMapping("/missions/{isCompleted}")
public ApiResponse<PageResponseDto<UserMissionDTO>> getMyMissions(@PathVariable("isCompleted")Boolean isCompleted,
@CheckPage Integer page,
Integer size) {
return ApiResponse.onSuccess(GeneralSuccessCode._OK, userService.getUserMissions(isCompleted, page, size));
}

@PatchMapping("/{userMissionId}")
public ApiResponse<String> completeMission(@PathVariable("userMissionId")Long userMissionId) {
return ApiResponse.onSuccess(GeneralSuccessCode._OK, userService.completeMission(userMissionId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.umc9th.domain.user.controller;

import com.example.umc9th.domain.mission.dto.MissionRequestDto;
import com.example.umc9th.domain.mission.dto.MissionResponseDto;
import com.example.umc9th.domain.mission.dto.UserMissionDTO;
import com.example.umc9th.global.apiPayload.ApiResponse;
import com.example.umc9th.global.dto.PageResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

@Tag(name = "μ‚¬μš©μž")
public interface UserControllerDocs {
@Operation(
summary = "λ‚΄κ°€ 진행쀑인 λ―Έμ…˜ λͺ©λ‘",
description = "isCompleted에 따라 진행쀑/μ™„λ£Œλœ λ―Έμ…˜ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€")
public ApiResponse<PageResponseDto<UserMissionDTO>> getMyMissions(Boolean isCompleted, Integer page, Integer size);

@Operation(
summary = "λ―Έμ…˜ μ™„λ£Œ",
description = "진행쀑인 μ‚¬μš©μž λ―Έμ…˜μ„ μ§„ν–‰ μ™„λ£Œλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€")
public ApiResponse<String> completeMission(Long userMissionId);

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.example.umc9th.domain.user.service;

import com.example.umc9th.domain.mission.dto.UserMissionDTO;
import com.example.umc9th.global.dto.PageResponseDto;

public interface UserService {
String deleteUser(Long userId);
PageResponseDto<UserMissionDTO> getUserMissions(Boolean isCompleted, Integer page, Integer size);
String completeMission(Long userMissionId);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package com.example.umc9th.domain.user.service;

import com.example.umc9th.domain.inqury.repository.InquiryRepository;
import com.example.umc9th.domain.mission.converter.MissionConverter;
import com.example.umc9th.domain.mission.dto.UserMissionDTO;
import com.example.umc9th.domain.mission.entity.Mission;
import com.example.umc9th.domain.mission.entity.UserMission;
import com.example.umc9th.domain.mission.repository.MissionRepository;
import com.example.umc9th.domain.mission.repository.UserMissionRepository;
import com.example.umc9th.domain.review.repository.ReviewRepository;
import com.example.umc9th.domain.user.repository.*;
import com.example.umc9th.global.apiPayload.code.status.GeneralErrorCode;
import com.example.umc9th.global.apiPayload.code.status.MissionErrorCode;
import com.example.umc9th.global.apiPayload.exception.GeneralException;
import com.example.umc9th.global.dto.PageResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -35,4 +46,26 @@ public String deleteUser(Long userId) {

return "μœ μ €" + userId.toString() + "이 μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.";
}

@Override
public PageResponseDto<UserMissionDTO> getUserMissions(Boolean isCompleted, Integer page, Integer size) {
Page<UserMission> missions = userMissionRepository.findByUserIdAndIsCompleted(1L, isCompleted, PageRequest.of(page, size));
Page<UserMissionDTO> result = missions.map(MissionConverter::toUserMissionDto);
return new PageResponseDto<>(result);
}

@Override
@Transactional
public String completeMission(Long userMissionId) {
UserMission um = userMissionRepository.findById(userMissionId)
.orElseThrow(()-> new GeneralException(GeneralErrorCode.NO_RESULT));

if(um.getIsCompleted()) {
throw new GeneralException(MissionErrorCode.ALREADY_COMPLETED);
}else{
um.complete();
}

return um.getId().toString() + "번 λ―Έμ…˜μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.umc9th.global.annotation;

import java.lang.annotation.*;

@Documented
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPage {
}
Loading
Loading