diff --git a/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java b/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java index 83a35e6..eb2c6ce 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java @@ -1,5 +1,9 @@ package org.sopt.lequuServer.domain.book.facade; +import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.BOOK_FAVORITE_IMAGE_FOLDER_NAME; + +import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.book.dto.request.BookCreateRequestDto; import org.sopt.lequuServer.domain.book.dto.response.BookCreateResponseDto; @@ -19,11 +23,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - -import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.BOOK_FAVORITE_IMAGE_FOLDER_NAME; - @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -59,10 +58,10 @@ public BookCreateResponseDto createBook(BookCreateRequestDto request, Long membe Book book = Book.builder() .uuid(bookUuid) - .favoriteName(badWordFilterService.badWordChange(request.favoriteName())) + .favoriteName(badWordFilterService.badWordChange(memberId, request.favoriteName())) .favoriteImage(imageUrl) - .title(badWordFilterService.badWordChange(request.title())) - .description(badWordFilterService.badWordChange(request.description())) + .title(badWordFilterService.badWordChange(memberId, request.title())) + .description(badWordFilterService.badWordChange(memberId, request.description())) .backgroundColor(request.backgroundColor()) .member(member) .build(); diff --git a/src/main/java/org/sopt/lequuServer/domain/log/model/BadWordLog.java b/src/main/java/org/sopt/lequuServer/domain/log/model/BadWordLog.java new file mode 100644 index 0000000..3ae9545 --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/log/model/BadWordLog.java @@ -0,0 +1,39 @@ +package org.sopt.lequuServer.domain.log.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.sopt.lequuServer.global.common.model.BaseTimeEntity; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "bad_word_log") +public class BadWordLog extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "bad_word_log_id") + private Long id; + + private Long memberId; + + private String originText; + + @Builder + public BadWordLog(Long memberId, String originText) { + this.memberId = memberId; + this.originText = originText; + } + + public static BadWordLog of(Long memberId, String originText) { + return new BadWordLog(memberId, originText); + } +} diff --git a/src/main/java/org/sopt/lequuServer/domain/log/repository/BadWordLogRepository.java b/src/main/java/org/sopt/lequuServer/domain/log/repository/BadWordLogRepository.java new file mode 100644 index 0000000..a7fc265 --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/log/repository/BadWordLogRepository.java @@ -0,0 +1,7 @@ +package org.sopt.lequuServer.domain.log.repository; + +import org.sopt.lequuServer.domain.log.model.BadWordLog; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BadWordLogRepository extends JpaRepository { +} diff --git a/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java b/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java index a04905c..5534139 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/service/MemberService.java @@ -127,7 +127,7 @@ public MemberNicknameResponseDto setMemberNickname(Long memberId, MemberNickname } Member member = memberRepository.findByIdOrThrow(memberId); - member.updateNickname(badWordFilterService.badWordChange(request.nickname().strip())); + member.updateNickname(badWordFilterService.badWordChange(memberId, request.nickname().strip())); return MemberNicknameResponseDto.of(memberId); } diff --git a/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java b/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java index 3e93175..044e5eb 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java @@ -28,8 +28,8 @@ public class NoteFacade { private final BadWordFilterService badWordFilterService; @Transactional - public NoteCreateResponseDto createNote(Long userId, NoteCreateDto request) { - Member member = memberRepository.findByIdOrThrow(userId); + public NoteCreateResponseDto createNote(Long memberId, NoteCreateDto request) { + Member member = memberRepository.findByIdOrThrow(memberId); Book book = bookRepository.findByIdOrThrow(request.bookId()); String background = request.background(); @@ -38,6 +38,6 @@ public NoteCreateResponseDto createNote(Long userId, NoteCreateDto request) { background = s3Service.getCloudFrontURL(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue() + request.background()); } - return noteService.saveNote(Note.of(badWordFilterService.badWordChange(request.content()), background, request.textColor(), member, book), member, book); + return noteService.saveNote(Note.of(badWordFilterService.badWordChange(memberId, request.content()), background, request.textColor(), member, book), member, book); } } diff --git a/src/main/java/org/sopt/lequuServer/global/BadWordFilterService.java b/src/main/java/org/sopt/lequuServer/global/BadWordFilterService.java index 655e2df..728b74b 100644 --- a/src/main/java/org/sopt/lequuServer/global/BadWordFilterService.java +++ b/src/main/java/org/sopt/lequuServer/global/BadWordFilterService.java @@ -1,14 +1,18 @@ package org.sopt.lequuServer.global; import com.vane.badwordfiltering.BadWordFiltering; -import org.springframework.stereotype.Service; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.List; +import org.sopt.lequuServer.domain.log.model.BadWordLog; +import org.sopt.lequuServer.domain.log.repository.BadWordLogRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @@ -17,13 +21,14 @@ public class BadWordFilterService { private final BadWordFiltering badWordFiltering; private final HashSet badWords; private final String[] symbols; + private final BadWordLogRepository badWordLogRepository; - public BadWordFilterService() throws IOException { - badWordFiltering = new BadWordFiltering(); + public BadWordFilterService(BadWordLogRepository badWordLogRepository) throws IOException { + badWordFiltering = new BadWordFiltering("♡"); symbols = new String[]{"!", "@", "#", "$", "%", "^", "&", "*", "_"}; // 비속어 필터링을 제외할 단어 설정 가능 - String[] enableList = new String[]{"똥"}; + String[] enableList = new String[]{"똥", "바보"}; for (String s : enableList) { badWordFiltering.remove(s); } @@ -33,10 +38,31 @@ public BadWordFilterService() throws IOException { readBadWords("BadWord.txt"); badWordFiltering.addAll(badWords); + + this.badWordLogRepository = badWordLogRepository; } - public String badWordChange(String string) { - return badWordFiltering.change(string, symbols); + @Transactional + public String badWordChange(Long memberId, String string) { + String changedWord = badWordFiltering.change(string, symbols); + + if (!changedWord.equals(string)) { + badWordLogRepository.save(BadWordLog.of(memberId, string)); + + String[] split = changedWord.split(" "); + List result = new ArrayList<>(); + + for (String s : split) { + if (s.contains("♡")){ + result.add(s.replaceAll(".", "♡")); + continue; + } + result.add(s); + } + return String.join(" ", result); + } + + return changedWord; } private void readBadWords(String fileName) throws IOException {