Skip to content

Commit

Permalink
Merge pull request #8 from Team-Flory/feat/#7/essential-api
Browse files Browse the repository at this point in the history
[Feat] 필수 API 생성
  • Loading branch information
junseokkim authored Oct 28, 2023
2 parents c4021f0 + 12489af commit 9ca1187
Show file tree
Hide file tree
Showing 33 changed files with 703 additions and 18 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'


// swagger
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package zerobibim.flory.domain.flower.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import zerobibim.flory.domain.flower.dto.request.FlowerCreateReqeust;
import zerobibim.flory.domain.flower.dto.request.FlowerUpdateRequest;
import zerobibim.flory.domain.flower.dto.response.FlowerDetailResponse;
import zerobibim.flory.domain.flower.dto.response.FlowerIdResponse;
import zerobibim.flory.domain.flower.service.FlowerService;
import zerobibim.flory.global.common.ApiPayload.ApiResponse;

import java.util.List;

@Tag(name = "Flower API", description = "꽃 관련 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/flowers")
public class FlowerController {
private final FlowerService flowerService;

/**
* 새로운 꽃을 생성합니다.
* @param reqeust 새로운 꽃을 생성하기 위한 DTO입니다.
* @return 생성된 꽃의 id가 반환됩니다.
*/
@PostMapping
@Operation(summary = "꽃 생성 API")
public ApiResponse<FlowerIdResponse> createFlower(@RequestBody FlowerCreateReqeust reqeust) {
return ApiResponse.onSuccess(flowerService.createFlower(reqeust));
}

/**
* 꽃 정보를 업데이트합니다.
* @param request 업데이트할 꽃 정보에 대한 DTO입니다.
* @return 업데이트된 꽃의 id가 반환됩니다.
*/
@PostMapping("/update")
@Operation(summary = "꽃 수정 API")
public ApiResponse<FlowerIdResponse> updateFlower(@RequestBody FlowerUpdateRequest request) {
return ApiResponse.onSuccess(flowerService.updateFlower(request));
}

/**
* 꽃 전체 정보를 조회합니다.
* @return 꽃 전체 정보를 리스트로 반환합니다.
*/
@GetMapping
@Operation(summary = "꽃 전체 조회 API")
public ApiResponse<List<FlowerDetailResponse>> findAllFlower() {
return ApiResponse.onSuccess(flowerService.findAllFlower());
}

/**
* 꽃 상세 정보를 조회합니다.
* @return 해당 꽃 상세 정보를 반환합니다.
*/
@GetMapping("/detail")
@Operation(summary = "꽃 상세 조회 API")
public ApiResponse<FlowerDetailResponse> findFlowerDetail(@RequestParam Long flowerId) {
return ApiResponse.onSuccess(flowerService.findFlowerDetail(flowerId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package zerobibim.flory.domain.flower.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class FlowerCreateReqeust {
private String name;
private String description;
private Long price;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package zerobibim.flory.domain.flower.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class FlowerUpdateRequest {
private Long flowerId;
private String description;
private Long price;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package zerobibim.flory.domain.flower.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class FlowerDetailResponse {
private Long flowerId;
private String name;
private String description;
private Long price;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package zerobibim.flory.domain.flower.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class FlowerIdResponse {
private Long FlowerId;
}
14 changes: 13 additions & 1 deletion src/main/java/zerobibim/flory/domain/flower/entity/Flower.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,23 @@ public class Flower extends BaseTime {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
@Column(unique = true, nullable = false)
private String name;

private String description;

@Column(nullable = false)
private Long price;

@Builder
public Flower(String name, String description, Long price) {
this.name = name;
this.description = description;
this.price = price;
}

public void update(String description, Long price) {
this.description = description;
this.price = price;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package zerobibim.flory.domain.flower.mapper;

import org.springframework.stereotype.Component;
import zerobibim.flory.domain.flower.dto.response.FlowerDetailResponse;
import zerobibim.flory.domain.flower.entity.Flower;

@Component
public class FlowerMapper {
public Flower toEntity(String name, String description, Long price) {
return Flower.builder()
.name(name)
.description(description)
.price(price)
.build();
}

public FlowerDetailResponse toResponse(Flower flower) {
return new FlowerDetailResponse(flower.getId(), flower.getName(), flower.getDescription(), flower.getPrice());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package zerobibim.flory.domain.flower.repository;

import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import zerobibim.flory.domain.flower.entity.Flower;
/*
@Component
public class FlowerInitializer {
private final FlowerRepository flowerRepository;
public FlowerInitializer(FlowerRepository flowerRepository) {
this.flowerRepository = flowerRepository;
}
@PostConstruct
public void init() {
// 데이터 작성
flowerRepository.save(Flower.builder()
.name("빨간 장미")
.description("열정, 기쁨, 완전한 아름다움, 욕망, 절정, 열렬한 사랑")
.price(1500L)
.build());
flowerRepository.save(Flower.builder()
.name("분홍 장미")
.description("사랑의 맹세, 우아함, 행복한 사랑, 감명")
.price(1500L)
.build());
flowerRepository.save(Flower.builder()
.name("주황 장미")
.description("꽃말 수줍음, 첫사랑의 고백")
.price(1500L)
.build());
flowerRepository.save(Flower.builder()
.name("노란 장미")
.description("완벽한 성취,질투,시기")
.price(1000L)
.build());
flowerRepository.save(Flower.builder()
.name("빨간 튤립")
.description("사랑의 고백, 사랑의 표현")
.price(1500L)
.build());
flowerRepository.save(Flower.builder()
.name("보라색 튤립")
.description("영원한 사랑")
.price(1500L)
.build());
flowerRepository.save(Flower.builder()
.name("노란 튤립")
.description("바라볼 수 없는 사랑, 헛된 사랑")
.price(1500L)
.build());
flowerRepository.save(Flower.builder()
.name("프리지아")
.description("천진난만, 자기자랑, 청함")
.price(2000L)
.build());
flowerRepository.save(Flower.builder()
.name("무궁화")
.description("일편단심, 영원, 미묘한 아름다움, 섬세한 아름다움")
.price(2000L)
.build());
flowerRepository.save(Flower.builder()
.name("코스모스")
.description("순정")
.price(2000L)
.build());
flowerRepository.save(Flower.builder()
.name("물망초")
.description("진실한 사랑, 나를 잊지 마세요")
.price(2000L)
.build());
}
}
*/
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package zerobibim.flory.domain.flower.repository;

import zerobibim.flory.domain.flower.entity.Flower;

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

public interface FlowerRepository {

Flower save(Flower flower);
Optional<Flower> findFlowerById(Long id);

Boolean existsFlowerByName(String name);

List<Flower> findAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package zerobibim.flory.domain.flower.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import zerobibim.flory.domain.flower.entity.Flower;

import java.util.List;

public interface JpaFlowerRepository extends JpaRepository<Flower, Long>, FlowerRepository {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package zerobibim.flory.domain.flower.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import zerobibim.flory.domain.flower.dto.request.FlowerCreateReqeust;
import zerobibim.flory.domain.flower.dto.request.FlowerUpdateRequest;
import zerobibim.flory.domain.flower.dto.response.FlowerDetailResponse;
import zerobibim.flory.domain.flower.dto.response.FlowerIdResponse;
import zerobibim.flory.domain.flower.entity.Flower;
import zerobibim.flory.domain.flower.mapper.FlowerMapper;
import zerobibim.flory.domain.flower.repository.FlowerRepository;
import zerobibim.flory.global.common.ApiPayload.code.status.ErrorStatus;
import zerobibim.flory.global.common.EntityLoader;
import zerobibim.flory.global.common.ExceptionHandler;

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

@Service
@RequiredArgsConstructor
public class FlowerService implements EntityLoader<Flower, Long> {
private final FlowerRepository flowerRepository;
private final FlowerMapper flowerMapper;

public FlowerIdResponse createFlower(FlowerCreateReqeust reqeust) {
// 중복 꽃 여부 확인
if(flowerRepository.existsFlowerByName(reqeust.getName()))
throw new ExceptionHandler(ErrorStatus.FLOWER_EXISTED);

Flower newflower = flowerRepository.save(
flowerMapper.toEntity(reqeust.getName()
, reqeust.getDescription()
, reqeust.getPrice()));

return new FlowerIdResponse(newflower.getId());
}

@Transactional
public FlowerIdResponse updateFlower(FlowerUpdateRequest request) {
// 꽃 존재 여부 확인
Flower flower = loadEntity(request.getFlowerId());

flower.update(request.getDescription(), request.getPrice());
return new FlowerIdResponse(flower.getId());
}

public List<FlowerDetailResponse> findAllFlower() {
return flowerRepository.findAll().stream().map(flowerMapper::toResponse).toList();
}

public FlowerDetailResponse findFlowerDetail(Long flowerId) {
return flowerMapper.toResponse(loadEntity(flowerId));
}

@Override
public Flower loadEntity(Long id) {
Optional<Flower> flower = flowerRepository.findFlowerById(id);
if(flower.isEmpty()) throw new ExceptionHandler(ErrorStatus.FLOWER_NOT_FOUND);
return flower.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package zerobibim.flory.domain.member.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
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;
import zerobibim.flory.domain.member.dto.request.MemberSignInRequest;
import zerobibim.flory.domain.member.dto.request.MemberSignUpRequest;
import zerobibim.flory.domain.member.dto.response.MemberIdResponse;
import zerobibim.flory.domain.member.service.MemberService;
import zerobibim.flory.global.common.ApiPayload.ApiResponse;

@Tag(name = " Member API", description = "멤버 관련 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService;

/**
* 회원가입 : 새로운 멤버를 생성합니다.
* @param request 새로운 멤버를 생성하기 위한 DTO입니다.
* @return 생성된 멤버의 id가 반환됩니다.
*/
@PostMapping
@Operation(summary = "회원가입 API")
public ApiResponse<MemberIdResponse> singUpMember(@RequestBody MemberSignUpRequest request) {
return ApiResponse.onSuccess(memberService.createMember(request));
}

/**
* 로그인 : 가입이 된 상태라면 로그인 수행
* @param request 로그인을 하기 위한 DTO입니다.
* @return 기존의 멤버의 id가 반환됩니다.
*/
@PostMapping("/login")
@Operation(summary = "로그인 API")
public ApiResponse<MemberIdResponse> signInMember(@RequestBody MemberSignInRequest request) {
return ApiResponse.onSuccess(memberService.checkMember(request));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package zerobibim.flory.domain.member.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class MemberSignInRequest {
private String email;
private String password;
}
Loading

0 comments on commit 9ca1187

Please sign in to comment.