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
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package com.kusitms.website.domain.blog.service;

import com.kusitms.website.domain.blog.dto.response.BlogResponse;
import com.kusitms.website.domain.blog.entity.BlogPost;
import com.kusitms.website.domain.blog.entity.Category;
import com.kusitms.website.domain.blog.entity.Position;
import com.kusitms.website.domain.blog.repository.BlogPostQueryRepository;
import com.kusitms.website.domain.blog.repository.BlogPostRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/com/kusitms/website/domain/email/Email.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.kusitms.website.domain.email;

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

import javax.persistence.*;

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Email {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "email_id", nullable = false)
private Long id;

@Column(nullable = false, unique = true)
private String email;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.kusitms.website.domain.email.controller;

import com.kusitms.website.domain.email.dto.response.EmailResponse;
import com.kusitms.website.domain.email.service.EmailService;
import com.kusitms.website.domain.introduction.IntroService;
import com.kusitms.website.domain.introduction.dto.response.IntroResponse;
import com.kusitms.website.global.common.BaseResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
@Tag(name = "Email", description = "이메일 API Document")
public class EmailController {

private final EmailService emailService;

@PostMapping("/emails")
@Operation(summary = "이메일 저장 API", description = "학회 모집 소식 전송 이메일을 저장합니다.")
@ApiResponses(value = {
@ApiResponse(
responseCode = "200",
description = "저장 성공",
content = @Content(schema = @Schema(implementation = EmailResponse.class))
),
@ApiResponse(
responseCode = "400",
description = "잘못된 요청 (이메일 형식 오류, 중복 이메일 등)",
content = @Content(schema = @Schema(implementation = BaseResponse.class))
)
})
public ResponseEntity<BaseResponse<EmailResponse>> saveEmail(
@RequestParam String email
) {
return ResponseEntity.ok(
new BaseResponse<>(emailService.saveEmail(email))
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.kusitms.website.domain.email.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@Schema
public class EmailResponse {
@Schema(description = "Id")
private String id;

@Schema(description = "이메일")
private String email;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.kusitms.website.domain.email.repository;

import com.kusitms.website.domain.email.Email;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmailRepository extends JpaRepository<Email, Long> {
boolean existsByEmail(String email);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.kusitms.website.domain.email.service;

import com.kusitms.website.domain.email.Email;
import com.kusitms.website.domain.email.dto.response.EmailResponse;
import com.kusitms.website.domain.email.repository.EmailRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.regex.Pattern;

@Service
@RequiredArgsConstructor
public class EmailService {

private final EmailRepository emailRepository;

private static final Pattern EMAIL_PATTERN = Pattern.compile(
"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"
);

@Transactional
public EmailResponse saveEmail(String email) {

if (email == null || email.trim().isEmpty()) {
throw new IllegalArgumentException("이메일은 필수 입력값입니다.");
}

if (!EMAIL_PATTERN.matcher(email).matches()) {
throw new IllegalArgumentException("유효하지 않은 이메일 형식입니다.");
}

if (emailRepository.existsByEmail(email)) {
throw new IllegalArgumentException("이미 등록된 이메일입니다.");
}

Email savedEmail = emailRepository.save(
Email.builder()
.email(email)
.build()
);

return EmailResponse.builder()
.id(String.valueOf(savedEmail.getId()))
.email(savedEmail.getEmail())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
package com.kusitms.website.global.exception;

import com.kusitms.website.global.common.BaseException;
import com.kusitms.website.global.common.BaseExceptionStatus;
import com.kusitms.website.global.common.BaseResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<BaseResponse<BaseException>> handleIllegalArgument(
IllegalArgumentException ex
) {
return ResponseEntity
.badRequest()
.body(BaseResponse.error(
BaseExceptionStatus.BAD_REQUEST,
ex.getMessage()
));
}

@ExceptionHandler(RuntimeException.class)
public BaseResponse handleException(RuntimeException ex) {
return BaseResponse.error(BaseExceptionStatus.INTER_SERVER_ERROR);
Expand Down
Loading