java 배우기/TIL

배달 서비스 만들어보기

checkuu 2024. 9. 23. 10:52

배달 웹서비스 제작에서 menu 부분을 만들어보았다.

 

menu entity

@Entity
@Getter
@NoArgsConstructor
public class Menu extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "menu_id")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name = "store")
    private Store store;

    @Column(name = "menuName")
    private String menuName;

    @Column(name = "menuInfo")
    private String menuInfo;

    @Column(name = "menuPrice")
    private int menuPrice;

    @Column(name = "menuImg")
    private String menuImg;

    @Column(nullable = false)
    @Enumerated(value = EnumType.STRING)
    private MenuPossibleEnum possibleEnum;

    public Menu (MenuRequestDto requestDto,Store store){
        this.menuName = requestDto.getMenuName();
        this.menuInfo = requestDto.getMenuInfo();
        this.menuPrice = requestDto.getMenuPrice();
        this.menuImg = requestDto.getMenuImg();
        this.possibleEnum = requestDto.getMenuPossibleEnum();
        this.store = store;
    }

    public void updateMenu(MenuUpdateRequestDto requestDto,Store store){
        this.menuName = requestDto.getMenuName();
        this.menuInfo = requestDto.getMenuInfo();
        this.menuPrice = requestDto.getMenuPrice();
        this.menuImg = requestDto.getMenuImg();
        this.possibleEnum = requestDto.getMenuPossibleEnum();
        this.store=store;
    }

    public void deleteMenu(MenuPossibleEnum possibleEnum){
        this.possibleEnum = possibleEnum;
    }

 

menu controller

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

    private final MenuService menuService;

    @PostMapping("/stores/{storeId}/menus")
    public ResponseEntity<String> saveMenu(@Auth AuthUser authUser, @PathVariable Long storeId, @RequestBody MenuRequestDto requestDto){
        menuService.saveMenu(authUser,storeId,requestDto);
        return ResponseEntity.ok().body(HttpStatus.OK + "메뉴 등록이 정상적으로 되었습니다.");
    }

    @PutMapping("/stores/{storeId}/menus/{menuId}")
    public ResponseEntity<String> updateMenu(@Auth AuthUser authUser,@PathVariable Long storeId,@PathVariable Long menuId,@RequestBody MenuUpdateRequestDto requestDto){
        menuService.updateMenu(authUser,storeId,menuId,requestDto);
        return ResponseEntity.ok().body(HttpStatus.OK + "메뉴 수정이 정상적으로 작동 하였습니다.");
    }

    @GetMapping("/store/{storeId}/menus/{menuId}")
    public ResponseEntity<String> deleteMenu(@Auth AuthUser authUser,@PathVariable Long storeId,@PathVariable Long menuId){
        menuService.deleteMenu(authUser,storeId,menuId);
        return ResponseEntity.ok().body(HttpStatus.OK + "메뉴 삭제가 정상적으로 작동 하였습니다.");
    }

}

 

menu service

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

    private final MenuRepository menuRepository;
    private final StoreRepository storeRepository;
    private final UserRepository userRepository;

    @Transactional
    public void saveMenu(AuthUser authUser, Long storeId, MenuRequestDto requestDto) {
        //가게 주인 확인 메서드
        Store store = validateStoreOwner(authUser,storeId);
        //등록할 메뉴 생성
        Menu menu = new Menu(requestDto,store);
        //메뉴 저장
        menuRepository.save(menu);
    }

    @Transactional
    public void updateMenu(AuthUser authUser, Long storeId, Long menuId, MenuUpdateRequestDto requestDto) {
        Store store = validateStoreOwner(authUser,storeId);
        //등록되어있는지 메뉴 확인
        Menu menu = menuRepository.findById(menuId).orElseThrow(() -> new NullPointerException("해당 메뉴가 존재 하지 않습니다."));
        //업데이트 된 request를 받아서 저장
        menu.updateMenu(requestDto,store);
        menuRepository.save(menu);
    }

    @Transactional
    public void deleteMenu(AuthUser authUser, Long storeId, Long menuId) {
        Store store = validateStoreOwner(authUser,storeId);
        //등록되어있는지 메뉴 확인
        Menu menu = menuRepository.findById(menuId).orElseThrow(()->new NullPointerException("해당 메뉴가 존재 하지 않습니다."));
        menu.deleteMenu(DELETE);
        //등록되어있는 메뉴 상태 변화
        menuRepository.save(menu);
    }

    private Store validateStoreOwner(AuthUser authUser, Long storeId) {
        // 가게 존재 확인
        Store store = storeRepository.findById(storeId).orElseThrow(() -> new NullPointerException("해당 가게가 존재하지 않습니다."));
        // 가게 주인 확인
        User user = userRepository.findById(authUser.getId()).orElseThrow(() -> new EntityNotFoundException("해당 유저가 존재하지 않습니다."));
        // 가게의 주인과 유저가 일치하는지 확인
        if (!user.getId().equals(store.getUser().getId())) {
            throw new NullPointerException("해당 가게의 주인이 아닙니다.");
        }
        return store;
    }
}

 

 위 코드로 메뉴 생성 , 수정 ,삭제를 구현하였다.