Skip to content

Commit 7246aaf

Browse files
authored
Merge pull request #94 from sayingpotato/feat/post-owner(#93)
Feat/post owner(#93)
2 parents da66782 + 80732ab commit 7246aaf

13 files changed

+277
-7
lines changed

src/main/java/iampotato/iampotato/InitDb.java

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import iampotato.iampotato.domain.order.domain.Order;
1313
import iampotato.iampotato.domain.order.domain.OrderStatus;
1414
import iampotato.iampotato.domain.orderitem.domain.OrderItem;
15+
import iampotato.iampotato.domain.owner.domain.Owner;
16+
import iampotato.iampotato.domain.owner.domain.OwnerStatus;
1517
import iampotato.iampotato.domain.review.domain.Review;
1618
import iampotato.iampotato.domain.review.domain.Reviews;
1719
import iampotato.iampotato.domain.store.domain.*;
@@ -649,6 +651,16 @@ public void dbStores3() throws ParseException {
649651
.build();
650652
em.persist(customer);
651653

654+
Owner owner = Owner.builder()
655+
.loginId("owner1")
656+
.password("123")
657+
.nickname("CafeMaster")
658+
.ownerStatus(OwnerStatus.UNAUTHORIZED)
659+
.ownerBusinessNumber("773-49-00806")
660+
.ssn("934920")
661+
.build();
662+
em.persist(owner);
663+
652664
Order order1 = Order.builder()
653665
.customer(customer)
654666
.orderStatus(OrderStatus.FINISH)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package iampotato.iampotato.domain.owner.api;
2+
3+
import iampotato.iampotato.domain.owner.application.OwnerService;
4+
import iampotato.iampotato.domain.owner.domain.Owner;
5+
import iampotato.iampotato.domain.owner.dto.*;
6+
import iampotato.iampotato.global.util.Result;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.PutMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
18+
@RestController
19+
@RequiredArgsConstructor
20+
public class OwnerApi {
21+
22+
private final OwnerService ownerService;
23+
24+
@Tag(name = "점주")
25+
@Operation(summary = "점주 회원가입", description = "점주의 정보를 등록할때 사용되는 API 입니다.")
26+
@PostMapping("/api/v1/owner/signUp")
27+
public Result<OwnerSignUpResponse> signUp(OwnerSignUpRequest request) { //회원 가입하는 POST API
28+
29+
//Spring security로 Password Hash 암호화 로직 추가하기
30+
Owner owner = Owner.builder()
31+
.loginId(request.getLoginId())
32+
.password(request.getPassword())
33+
.nickname(request.getNickname())
34+
.ownerBusinessNumber(request.getOwnerBusinessNumber())
35+
.build();
36+
OwnerSignUpResponse response = new OwnerSignUpResponse(ownerService.signUp(owner));
37+
38+
return new Result<>(Result.CODE_SUCCESS, Result.MESSAGE_OK, response);
39+
}
40+
41+
@Tag(name = "점주")
42+
@Operation(summary = "비인증 점주 가져오기", description = "관리자페이지에서 인증되지 않은 점주들의 정보를 가져올때 사용되는 API 입니다.")
43+
@GetMapping("/api/v1/owner/unauthorization")
44+
public Result<List<OwnerUnauthorizedResponse>> getUnauthorizedOwner() {
45+
46+
List<Owner> unauthorizedOwners = ownerService.getUnauthorizedOwners();
47+
48+
List<OwnerUnauthorizedResponse> responses = unauthorizedOwners.stream()
49+
.map(OwnerUnauthorizedResponse::new)
50+
.collect(Collectors.toList());
51+
52+
return new Result<>(Result.CODE_SUCCESS, Result.MESSAGE_OK, responses);
53+
}
54+
55+
@Tag(name = "점주")
56+
@Operation(summary = "인증하기", description = "인증되지 않은 점주를 인증할때 사용되는 API 입니다.")
57+
@PutMapping("/api/v1/owner/authorization")
58+
public Result<OwnerAuthorizeResponse> authorizeOwner(OwnerAuthorizeRequest request) {
59+
60+
Owner owner = ownerService.authorizeOwner(request.getId());
61+
OwnerAuthorizeResponse response = new OwnerAuthorizeResponse(owner);
62+
63+
return new Result<>(Result.CODE_SUCCESS, Result.MESSAGE_OK, response);
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package iampotato.iampotato.domain.owner.application;
2+
3+
import iampotato.iampotato.domain.owner.dao.OwnerRepository;
4+
import iampotato.iampotato.domain.owner.domain.Owner;
5+
import iampotato.iampotato.domain.owner.exception.OwnerException;
6+
import iampotato.iampotato.domain.owner.exception.OwnerExceptionGroup;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.List;
12+
import java.util.Optional;
13+
14+
@Service
15+
@Transactional(readOnly = true)
16+
@RequiredArgsConstructor
17+
public class OwnerService {
18+
19+
private final OwnerRepository ownerRepository;
20+
21+
@Transactional
22+
public Owner signUp(Owner owner) {
23+
validateDuplicatedOwnerByLoginId(owner);
24+
ownerRepository.save(owner);
25+
return owner;
26+
}
27+
28+
private void validateDuplicatedOwnerByLoginId(Owner owner) {
29+
Optional<Owner> id = ownerRepository.findByLoginId(owner.getLoginId());
30+
if (id.isPresent())
31+
throw new OwnerException(OwnerExceptionGroup.OWNER_DUPLICATION);
32+
}
33+
34+
public List<Owner> getUnauthorizedOwners() {
35+
List<Owner> owners = ownerRepository.findUnauthorizedOwners();
36+
if (owners == null || owners.isEmpty()) {
37+
throw new OwnerException(OwnerExceptionGroup.OWNER_NULL);
38+
}
39+
return owners;
40+
}
41+
42+
@Transactional
43+
public Owner authorizeOwner(String id) {
44+
Owner owner = ownerRepository.findById(id);
45+
owner.authorizeOwner();
46+
return owner;
47+
}
48+
}

src/main/java/iampotato/iampotato/domain/owner/dao/OwnerRepository.java

+23
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package iampotato.iampotato.domain.owner.dao;
22

33
import iampotato.iampotato.domain.owner.domain.Owner;
4+
import iampotato.iampotato.domain.owner.domain.OwnerStatus;
45
import lombok.RequiredArgsConstructor;
56
import org.springframework.stereotype.Repository;
67

78
import javax.persistence.EntityManager;
9+
import java.util.List;
10+
import java.util.Optional;
811

912
@Repository
1013
@RequiredArgsConstructor
@@ -15,4 +18,24 @@ public class OwnerRepository {
1518
public Owner findById(String id) {
1619
return em.find(Owner.class, id);
1720
}
21+
22+
public void save(Owner owner) {
23+
em.persist(owner);
24+
}
25+
26+
public Optional<Owner> findByLoginId(String loginId) { //LoginId를 통해 모든 Customer 조회
27+
List<Owner> result = em.createQuery("select o from Owner o where o.loginId = :loginId", Owner.class) //:loginId라고 하여 밑에서 setParameter를 통해 "loginId"의 value와 바인딩
28+
.setParameter("loginId", loginId) //위에 있는 :loginId가 여기 파리미터의 Key값과 바인딩 되어서 value가 위로 넘어가게 됌
29+
.getResultList();
30+
return result.stream().findAny();
31+
}
32+
33+
public List<Owner> findUnauthorizedOwners() {
34+
return em.createQuery("select o from Owner o " +
35+
"where o.ownerStatus = :ownerStatus", Owner.class)
36+
.setParameter("ownerStatus", OwnerStatus.UNAUTHORIZED)
37+
.getResultList();
38+
}
39+
40+
1841
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package iampotato.iampotato.domain.owner.domain;
22

3-
import lombok.AccessLevel;
4-
import lombok.Getter;
5-
import lombok.NoArgsConstructor;
3+
import lombok.*;
4+
import org.hibernate.annotations.GenericGenerator;
65

76
import javax.persistence.*;
87
import java.time.LocalDateTime;
98

109
@Entity
1110
@Getter
11+
@Builder
12+
@AllArgsConstructor
1213
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1314
public class Owner {
1415

15-
@Id @GeneratedValue
16+
@Id
17+
@GeneratedValue(generator = "system-uuid")
18+
@GenericGenerator(name = "system-uuid", strategy = "uuid")
1619
@Column(name = "owner_id")
17-
private Long id;
20+
private String id;
1821

1922
private String loginId;
2023

@@ -24,13 +27,18 @@ public class Owner {
2427

2528
private String nickname;
2629

30+
@Builder.Default
2731
@Enumerated(EnumType.STRING)
28-
private OwnerStatus ownerStatus; //회원 가입 상태 [COMPLETE, UNAUTHORIZED]
32+
private OwnerStatus ownerStatus = OwnerStatus.UNAUTHORIZED; //회원 가입 상태 [COMPLETE, UNAUTHORIZED]
2933

30-
private LocalDateTime createdDate;
34+
@Builder.Default
35+
private LocalDateTime createdDate = LocalDateTime.now();
3136

3237
private LocalDateTime modifiedDate;
3338

3439
private String ownerBusinessNumber;
3540

41+
public void authorizeOwner() {
42+
this.ownerStatus = OwnerStatus.COMPLETE;
43+
}
3644
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package iampotato.iampotato.domain.owner.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class OwnerAuthorizeRequest {
7+
8+
private String id;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package iampotato.iampotato.domain.owner.dto;
2+
3+
import iampotato.iampotato.domain.owner.domain.Owner;
4+
import lombok.Data;
5+
6+
@Data
7+
public class OwnerAuthorizeResponse {
8+
9+
private String id;
10+
11+
public OwnerAuthorizeResponse(Owner owner) {
12+
this.id = owner.getId();
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package iampotato.iampotato.domain.owner.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class OwnerSignUpRequest {
7+
8+
private String loginId;
9+
10+
private String password;
11+
12+
private String nickname;
13+
14+
private String ownerBusinessNumber;
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package iampotato.iampotato.domain.owner.dto;
2+
3+
import iampotato.iampotato.domain.owner.domain.Owner;
4+
import lombok.Data;
5+
6+
@Data
7+
public class OwnerSignUpResponse {
8+
9+
private String id;
10+
11+
public OwnerSignUpResponse(Owner owner) {
12+
this.id = owner.getId();
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package iampotato.iampotato.domain.owner.dto;
2+
3+
import iampotato.iampotato.domain.owner.domain.Owner;
4+
import lombok.Data;
5+
6+
@Data
7+
public class OwnerUnauthorizedResponse {
8+
9+
private String id;
10+
11+
private String ssn;
12+
13+
private String businessNumber;
14+
15+
public OwnerUnauthorizedResponse(Owner owner) {
16+
id = owner.getId();
17+
ssn = owner.getSsn();
18+
businessNumber = owner.getOwnerBusinessNumber();
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package iampotato.iampotato.domain.owner.exception;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class OwnerException extends RuntimeException {
7+
8+
private final OwnerExceptionGroup ownerExceptionGroup;
9+
10+
public OwnerException(OwnerExceptionGroup ownerExceptionGroup) {
11+
this.ownerExceptionGroup = ownerExceptionGroup;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package iampotato.iampotato.domain.owner.exception;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum OwnerExceptionGroup {
7+
8+
OWNER_DUPLICATION(400, "OW001", "이미 가입된 점주입니다."),
9+
10+
OWNER_NULL(400, "OW002", "인증을 요청한 점주가 없습니다");
11+
12+
private final int httpCode;
13+
private final String errorCode;
14+
private final String message;
15+
16+
OwnerExceptionGroup(int httpCode, String errorCode, String message) {
17+
this.httpCode = httpCode;
18+
this.errorCode = errorCode;
19+
this.message = message;
20+
}
21+
}

src/main/java/iampotato/iampotato/global/exception/ExceptionController.java

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import iampotato.iampotato.domain.item.exception.ItemException;
44
import iampotato.iampotato.domain.order.exception.OrderException;
5+
import iampotato.iampotato.domain.owner.exception.OwnerException;
56
import iampotato.iampotato.domain.store.exception.StoreException;
67
import iampotato.iampotato.global.util.ErrorResult;
78
import org.springframework.validation.BindException;
@@ -38,6 +39,13 @@ public ErrorResult ItemExceptionHandler(ItemException e) {
3839
e.getItemExceptionGroup().getMessage());
3940
}
4041

42+
@ExceptionHandler(OwnerException.class)
43+
public ErrorResult OwnerExceptionHandler(OwnerException e) {
44+
return new ErrorResult(e.getOwnerExceptionGroup().getHttpCode(),
45+
e.getOwnerExceptionGroup().getErrorCode(),
46+
e.getOwnerExceptionGroup().getMessage());
47+
}
48+
4149
/**
4250
* MethodArgumentNotValidException.class
4351
* &#064;Valid 사용시에 @RequestBody 어노테이션으로 받은 파라미터의 경우 호출되는 예외입니다.

0 commit comments

Comments
 (0)