Skip to content

Commit

Permalink
Merge branch 'develop' into nft
Browse files Browse the repository at this point in the history
  • Loading branch information
yerim216 authored Nov 15, 2023
2 parents 82ada40 + 3bc1ed9 commit a1f488e
Show file tree
Hide file tree
Showing 23 changed files with 327 additions and 36 deletions.
5 changes: 4 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,16 @@ 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")

//web3j
implementation 'org.web3j:core:4.9.6'

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

// s3
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package zerobibim.flory.domain.Image.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 org.springframework.web.multipart.MultipartFile;
import zerobibim.flory.domain.Image.dto.response.ImageIdResponse;
import zerobibim.flory.domain.Image.service.ImageService;
import zerobibim.flory.global.common.ApiPayload.ApiResponse;

@Tag(name = "Image API", description = "이미지 관련 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/image")
public class ImageConroller {
private final ImageService imageService;

@PostMapping
@Operation(summary = "이미지 생성 API")
public ApiResponse<ImageIdResponse> createImage(@RequestPart("flower_image") MultipartFile flowerImage) {
return ApiResponse.onSuccess(imageService.createImage(flowerImage));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package zerobibim.flory.domain.Image.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ImageIdResponse {
private Long ImageId;
}
41 changes: 41 additions & 0 deletions src/main/java/zerobibim/flory/domain/Image/entity/Image.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package zerobibim.flory.domain.Image.entity;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.Where;
import zerobibim.flory.global.common.BaseTime;

@Entity
@Getter
@Where(clause = "deleted_at is null")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Image extends BaseTime {

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

@Column(nullable = false)
private String url;

private Long senderId;

private Long receiverId;

private Boolean isNFT;

@Builder
public Image(String url) {
this.url = url;
this.senderId = null;
this.receiverId = null;
this.isNFT = Boolean.FALSE;
}

public void updateImage(Long senderId, Long receiverId) {
this.senderId = senderId;
this.receiverId = receiverId;
this.isNFT = Boolean.TRUE;
}
}
13 changes: 13 additions & 0 deletions src/main/java/zerobibim/flory/domain/Image/mapper/ImageMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package zerobibim.flory.domain.Image.mapper;

import org.springframework.stereotype.Component;
import zerobibim.flory.domain.Image.entity.Image;

@Component
public class ImageMapper {
public Image toEntity(String url) {
return Image.builder()
.url(url)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package zerobibim.flory.domain.Image.repository;

import zerobibim.flory.domain.Image.entity.Image;

import java.util.Optional;

public interface ImageRepository {

Image save(Image image);

Optional<Image> findImageById(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package zerobibim.flory.domain.Image.repository;

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

public interface JpaImageRepository extends JpaRepository<Image, Long>, ImageRepository {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package zerobibim.flory.domain.Image.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import zerobibim.flory.domain.Image.dto.response.ImageIdResponse;
import zerobibim.flory.domain.Image.entity.Image;
import zerobibim.flory.domain.Image.mapper.ImageMapper;
import zerobibim.flory.domain.Image.repository.ImageRepository;
import zerobibim.flory.global.common.ApiPayload.code.status.ErrorStatus;
import zerobibim.flory.global.common.EntityLoader;
import zerobibim.flory.global.common.ExceptionHandler;
import zerobibim.flory.utils.S3ImageComponent;

import java.util.Optional;

@Service
@RequiredArgsConstructor
public class ImageService implements EntityLoader<Image, Long> {

private final ImageMapper imageMapper;
private final ImageRepository imageRepository;
private final S3ImageComponent s3ImageComponent;

@Transactional
public ImageIdResponse createImage(final MultipartFile flowerImage) {
String imageUrl = uploadImage(flowerImage);

Image newImage = imageRepository.save(
imageMapper.toEntity(imageUrl));
return new ImageIdResponse(newImage.getId());
}

private String uploadImage(final MultipartFile flowerImage) {
if(flowerImage.isEmpty()) {
throw new ExceptionHandler(ErrorStatus.IMAGE_BLANK);
}
return s3ImageComponent.uploadImage("flower-image", flowerImage);
}

@Transactional
public void makeNft(Long imageId, Long senderId, Long receiverId) {
Image image = loadEntity(imageId);
image.updateImage(senderId, receiverId);
}

@Override
public Image loadEntity(Long id) {
Optional<Image> image = imageRepository.findImageById(id);
if(image.isEmpty()) throw new ExceptionHandler(ErrorStatus.IMAGE_NOT_FOUND);
return image.get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import zerobibim.flory.domain.flower.dto.request.FlowerInsertImageRequest;
import zerobibim.flory.domain.flower.dto.request.FlowerCreateReqeust;
import zerobibim.flory.domain.flower.dto.request.FlowerUpdateRequest;
import zerobibim.flory.domain.flower.dto.response.FlowerDetailResponse;
Expand Down Expand Up @@ -42,6 +43,17 @@ public ApiResponse<FlowerIdResponse> updateFlower(@RequestBody FlowerUpdateReque
return ApiResponse.onSuccess(flowerService.updateFlower(request));
}

/**
* 꽃 이미지를 업데이트합니다.
* @param request 업데이트 할 꽃과 이미지에 대한 DTO입니다.
* @return 업데이트된 꽃의 id가 반환됩니다.
*/
@PostMapping("/image")
@Operation(summary = "꽃 이미지 생성 API")
public ApiResponse<FlowerIdResponse> insertImage(@RequestBody FlowerInsertImageRequest request) {
return ApiResponse.onSuccess(flowerService.insertImage(request));
}

/**
* 꽃 전체 정보를 조회합니다.
* @return 꽃 전체 정보를 리스트로 반환합니다.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package zerobibim.flory.domain.flower.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class FlowerInsertImageRequest {
private Long flowerId;
private Long imageId;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.Where;
import zerobibim.flory.domain.Image.entity.Image;
import zerobibim.flory.global.common.BaseTime;

@Entity
Expand All @@ -24,6 +25,10 @@ public class Flower extends BaseTime {
@Column(nullable = false)
private Long price;

@OneToOne
@JoinColumn
private Image image;

@Builder
public Flower(String name, String description, Long price) {
this.name = name;
Expand All @@ -35,4 +40,8 @@ public void update(String description, Long price) {
this.description = description;
this.price = price;
}

public void updateFlowerImage(Image image) {
this.image = image;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import zerobibim.flory.domain.Image.entity.Image;
import zerobibim.flory.domain.Image.service.ImageService;
import zerobibim.flory.domain.flower.dto.request.FlowerInsertImageRequest;
import zerobibim.flory.domain.flower.dto.request.FlowerCreateReqeust;
import zerobibim.flory.domain.flower.dto.request.FlowerUpdateRequest;
import zerobibim.flory.domain.flower.dto.response.FlowerDetailResponse;
Expand All @@ -22,6 +25,7 @@
public class FlowerService implements EntityLoader<Flower, Long> {
private final FlowerRepository flowerRepository;
private final FlowerMapper flowerMapper;
private final ImageService imageService;

public FlowerIdResponse createFlower(FlowerCreateReqeust reqeust) {
// 중복 꽃 여부 확인
Expand All @@ -45,6 +49,15 @@ public FlowerIdResponse updateFlower(FlowerUpdateRequest request) {
return new FlowerIdResponse(flower.getId());
}

@Transactional
public FlowerIdResponse insertImage(FlowerInsertImageRequest request) {
Flower flower = loadEntity(request.getFlowerId());
Image image = imageService.loadEntity(request.getImageId());

flower.updateFlowerImage(image);
return new FlowerIdResponse(flower.getId());
}

public List<FlowerDetailResponse> findAllFlower() {
return flowerRepository.findAll().stream().map(flowerMapper::toResponse).toList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,4 @@ public class MemberSignUpRequest {
private String phoneNumber;
private String nickname;
private String walletAddress;
private String walletPassword;
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,16 @@ public class Member extends BaseTime {

@Column(nullable = false)
private String walletAddress;
@Column(nullable = false)
private String walletPassword;


@Builder
public Member(String name, String email, String password, String phoneNumber,
String nickname, String walletAddress, String walletPassword) {
String nickname, String walletAddress) {
this.name = name;
this.email = email;
this.password = password;
this.phoneNumber = phoneNumber;
this.nickname = nickname;
this.walletAddress = walletAddress;
this.walletPassword = walletPassword;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@
@Component
public class MemberMapper {
public Member toEntity(String name, String email, String password, String phoneNumber,
String nickname, String walletAddress, String walletPassword) {
String nickname, String walletAddress) {
return Member.builder()
.name(name)
.email(email)
.password(password)
.phoneNumber(phoneNumber)
.nickname(nickname)
.walletAddress(walletAddress)
.walletPassword(walletPassword)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,19 @@ public class MemberService implements EntityLoader<Member, Long> {
private final MemberMapper memberMapper;

public MemberIdResponse createMember(MemberSignUpRequest request) {
// TODO Validation 추가하기
// 닉네임 공백 여부 체크
if(request.getNickname().isBlank()) throw new ExceptionHandler(ErrorStatus.NICKNAME_BLANK);

// 이메일, 닉네임 중복 여부 체크
Optional<Member> member = memberRepository.findMemberByEmail(request.getEmail());
if(member.isPresent()) throw new ExceptionHandler(ErrorStatus.MEMBER_EXISTED);
member = memberRepository.findMemberByNickname(request.getNickname());
// 닉네임 중복 여부 체크
Optional<Member> member = memberRepository.findMemberByNickname(request.getNickname());
if(member.isPresent()) throw new ExceptionHandler(ErrorStatus.NICKNAME_DUPLICATED);

// TODO 비밀번호 암호화

Member newMember = memberRepository.save(
memberMapper.toEntity(
request.getName(), request.getEmail(), request.getPassword(), request.getPhoneNumber(),
request.getNickname(), request.getWalletAddress(), request.getWalletPassword()));
request.getNickname(), request.getWalletAddress()));

return new MemberIdResponse(newMember.getId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,7 @@
@AllArgsConstructor
public class PurchaseCreateRequest {
private Long memberId;
private String receiverName;
private String receiverAddress;
private String receiverNickname;
private Long flowerId;
private int flowerQuentity;
private String nftComment;
private LocalDate receiveDate;
private int deliveryTip;
private int totalPrice;
}
Loading

0 comments on commit a1f488e

Please sign in to comment.