Skip to content
Merged
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
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'com.h2database:h2'
Expand All @@ -48,4 +49,4 @@ dependencies {

tasks.named('test') {
useJUnitPlatform()
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package app.dearobjet.backend.domain.artist.entity;

import app.dearobjet.backend.domain.user.entity.User;
import app.dearobjet.backend.domain.user.enums.BusinessCategory;
import app.dearobjet.backend.domain.user.enums.BusinessType;
import app.dearobjet.backend.domain.user.enums.Specialty;
import app.dearobjet.backend.global.common.entity.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.*;
Expand All @@ -16,7 +19,7 @@ public class Artist extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "artists_id")
private Long artistsId;
private Long id;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false, unique = true)
Expand All @@ -25,20 +28,40 @@ public class Artist extends BaseTimeEntity {
@Column(name = "business_number")
private String businessNumber;

// 상호명
@Column(name = "business_name")
private String businessName;

// 대표자명
@Column(name = "owner_name")
private String ownerName;

@Column(name = "business_adress")
private String businessAddress;

@Column(name = "business_license_url")
private String businessLicenseUrl;

@Column(columnDefinition = "TEXT")
private String bio;

@Column(name = "portfolio_url")
private String portfolioUrl;

@Column(name = "field6")
private String field6;
@Enumerated(EnumType.STRING)
@Column(name = "business_type", nullable = false)
private BusinessType businessType;

@Enumerated(EnumType.STRING)
@Column(name = "business_category", nullable = false)
private BusinessCategory businessCategory;

@Enumerated(EnumType.STRING)
@Column(name = "specialty", nullable = false)
private Specialty specialty;

@Column(name="review_data_agreement", nullable=false)
private Boolean reviewDataAgreement = false;

// 비즈니스 메서드
public void updateProfile(String businessName, String bio, String portfolioUrl) {
Expand Down
36 changes: 32 additions & 4 deletions src/main/java/app/dearobjet/backend/domain/shop/entity/Shop.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package app.dearobjet.backend.domain.shop.entity;

import app.dearobjet.backend.domain.user.entity.User;
import app.dearobjet.backend.domain.user.enums.BusinessCategory;
import app.dearobjet.backend.domain.user.enums.BusinessType;
import app.dearobjet.backend.domain.user.enums.Specialty;
import app.dearobjet.backend.global.common.entity.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.*;
Expand All @@ -11,7 +14,6 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder

public class Shop extends BaseTimeEntity {

@Id
Expand All @@ -23,14 +25,40 @@ public class Shop extends BaseTimeEntity {
@JoinColumn(name = "user_id", nullable = false, unique = true)
private User user;

// 사업자 정보
@Column(name = "business_number", nullable = false, unique = true)
private String businessNumber;

@Column(name = "business_name")
private String businessName;

@Column(name = "business_adress")
private String businessAddress;

@Column(name = "owner_name")
private String ownerName;

@Column(name = "business_license_url")
private String businessLicenseUrl;

@Column(name = "shop_name")
private String shopName;

@Column(name = "shop_description")
private String shopDescription;

@Column(name = "phone_number")
private String phoneNumber;
@Enumerated(EnumType.STRING)
@Column(name = "business_type", nullable = false)
private BusinessType businessType;

@Enumerated(EnumType.STRING)
@Column(name = "business_category", nullable = false)
private BusinessCategory businessCategory;

@Enumerated(EnumType.STRING)
@Column(name = "specialty", nullable = false)
private Specialty specialty;

private String address;
@Column(name="review_data_agreement", nullable=false)
private Boolean reviewDataAgreement = false;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package app.dearobjet.backend.domain.user.controller;

import app.dearobjet.backend.domain.user.dto.CompleteSignupRequest;
import app.dearobjet.backend.domain.user.dto.BusinessSignupRequest;
import app.dearobjet.backend.domain.user.dto.UserSignupRequest;
import app.dearobjet.backend.domain.user.service.UserService;
import app.dearobjet.backend.global.api.ApiResponse;
import app.dearobjet.backend.global.auth.security.CustomUserDetails;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand All @@ -12,29 +17,56 @@
@RestController
@RequiredArgsConstructor
@RequestMapping("/users")
@Tag(name = "User", description = "사용자 가입 API")
public class UserController {

private final UserService userService;

/**
* 추가 회원가입 (TEMP → CUSTOMER / ARTIST / SHOP)
*/
// CUSTOMER 가입 완료
@PostMapping("/complete")
public ResponseEntity<ApiResponse<Void>> completeSignup(
@Operation(summary = "일반 사용자 가입")
public ResponseEntity<ApiResponse<Void>> completeCustomerSignup(
@Parameter(hidden = true)
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestBody CompleteSignupRequest request
@Valid @RequestBody UserSignupRequest request
) {
Long userId = userDetails.getUserId();

userService.completeSignup(
userId,
request.getName(),
request.getEmail(),
request.getPhoneNumber(),
request.getSmsAgreement(),
request.getMarketingAgreement(),
request.getRole()
userDetails.getUserId(),
request
);

return ResponseEntity.ok(ApiResponse.of(null));
}

// ARTIST 가입 완료
@PostMapping("/complete/artist")
@Operation(summary = "작가 사용자 가입")
public ResponseEntity<ApiResponse<Void>> completeArtistSignup(
@Parameter(hidden = true)
@AuthenticationPrincipal CustomUserDetails userDetails,
@Valid @RequestBody BusinessSignupRequest request
) {
userService.completeArtistSignup(
userDetails.getUserId(),
request
);

return ResponseEntity.ok(ApiResponse.of(null));
}

// SHOP 가입 완료
@PostMapping("/complete/shop")
@Operation(summary = "상점 사용자 가입")
public ResponseEntity<ApiResponse<Void>> completeShopSignup(
@Parameter(hidden = true)
@AuthenticationPrincipal CustomUserDetails userDetails,
@Valid @RequestBody BusinessSignupRequest request
) {
userService.completeShopSignup(
userDetails.getUserId(),
request
);

return ResponseEntity.ok(ApiResponse.of(null));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package app.dearobjet.backend.domain.user.dto;

import app.dearobjet.backend.domain.user.enums.BusinessCategory;
import app.dearobjet.backend.domain.user.enums.BusinessType;
import app.dearobjet.backend.domain.user.enums.Specialty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BusinessSignupRequest {


// 공통 필드
@Schema(description = "표시 이름", example = "디어오브제")
private String name;

@Schema(description = "전화번호(숫자만)", example = "01012345678")
@NotBlank(message = "전화번호는 필수입니다.")
@Pattern(
regexp = "^[0-9]{9,11}$",
message = "전화번호 형식이 올바르지 않습니다. 숫자만 입력하세요."
)
private String phoneNumber;

@Schema(description = "SMS 수신 동의", example = "true")
@NotNull(message = "SMS 수신 동의 여부는 필수입니다.")
private Boolean smsAgreement;

@Schema(description = "마케팅 수신 동의", example = "false")
private Boolean marketingAgreement;

// 사업자 필드
@Schema(description = "사업자등록번호", example = "1234567890")
@NotBlank(message = "사업자등록번호는 필수입니다.")
private String businessNumber;

@Schema(description = "상호명", example = "디어오브제 스튜디오")
@NotBlank(message = "상호명은 필수입니다.")
private String businessName;

@Schema(description = "대표자명", example = "홍길동")
@NotBlank(message = "대표자명은 필수입니다.")
private String ownerName;

@Schema(description = "사업장 주소", example = "서울특별시 강남구 테헤란로 123")
@NotBlank(message = "사업장 주소는 필수입니다.")
private String businessAddress;

@Schema(description = "사업자등록증 URL", example = "https://cdn.example.com/license.png")
private String businessLicenseUrl;

@Schema(description = "업태", example = "SERVICE")
@NotNull(message = "업태는 필수입니다.")
private BusinessType businessType;

@Schema(description = "종목", example = "CRAFT_RETAIL")
@NotNull(message = "종목은 필수입니다.")
private BusinessCategory businessCategory;

@Schema(description = "전문 분야", example = "HANDMADE_CRAFT")
@NotNull(message = "전문 분야는 필수입니다.")
private Specialty specialty;

@Schema(description = "리뷰 데이터 활용 동의", example = "true")
private Boolean reviewDataAgreement;
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package app.dearobjet.backend.domain.user.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class UserSignupRequest {

@Schema(description = "사용자 이름", example = "홍길동")
@NotBlank(message = "이름은 필수입니다.")
private String name;

@Schema(description = "이메일", example = "user@example.com")
private String email;

@Schema(description = "전화번호(숫자만)", example = "01012345678")
@NotBlank(message = "전화번호는 필수입니다.")
@Pattern(
regexp = "^[0-9]{9,11}$",
message = "전화번호 형식이 올바르지 않습니다. 숫자만 입력하세요."
)
private String phoneNumber;

@Schema(description = "SMS 수신 동의", example = "true")
@NotNull(message = "SMS 수신 동의 여부는 필수입니다.")
private Boolean smsAgreement;

@Schema(description = "마케팅 수신 동의", example = "false")
private Boolean marketingAgreement;
}
Loading