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
@@ -0,0 +1,61 @@
package com._data._data.common.util.language;

import com._data._data.auth.entity.CustomUserDetails;
import com._data._data.user.entity.Users;
import com._data._data.user.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

/**
* 사용자에 따른 언어 설정 조회
*/
@Slf4j
@Component
public class UserLanguageResolver {
private static final String DEFAULT_LANGUAGE = "ko";

private final UserRepository userRepository;

public UserLanguageResolver(UserRepository userRepository) {
this.userRepository = userRepository;
}

/**
* 언어 설정 반환
* */
public String getCurrentUserLanguage() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (isAnonymousUser(auth)) {
log.debug("익명 사용자, 기본 언어 '{}' 사용", DEFAULT_LANGUAGE);
return DEFAULT_LANGUAGE;
}

return getAuthenticatedUserLanguage(auth);
}

/**
* 익명 유저면 기본값 반환
* */
private boolean isAnonymousUser(Authentication auth) {
return auth == null
|| !auth.isAuthenticated()
|| !(auth.getPrincipal() instanceof CustomUserDetails);
}

/**
* 로그인 사용자 설정언어 반환
* */
private String getAuthenticatedUserLanguage(Authentication auth) {
CustomUserDetails userDetails = (CustomUserDetails) auth.getPrincipal();
String email = userDetails.getUsername();

Users user = userRepository.findByEmailAndIsDeletedFalse(email);
String language = user.getTranslationLang();

log.debug("사용자={} 언어 설정={}", email, language);
return language != null ? language : DEFAULT_LANGUAGE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com._data._data.common.util.translation;

import com._data._data.eduinfo.entity.EduProgram;
import org.springframework.stereotype.Component;

/**
* 다국어 제목 선택을 위한 전략 패턴 구현
*/

@Component
public class MultiLanguageTitleSelector {
/**
* 사용자 언어에 따라 적절한 제목을 선택
*
* @param program 교육 프로그램 엔티티
* @param language 사용자 언어 코드
* @return 선택된 언어의 제목
*/
public String selectTitle(EduProgram program, String language) {
if (program == null || language == null) {
return program != null ? program.getTitleNm() : null;
}

return switch (language.toLowerCase()) {
case "en", "en-us", "en-gb" -> getValueOrDefault(program.getTitleEn(), program.getTitleNm());
case "zh", "zh-cn", "zh-tw" -> getValueOrDefault(program.getTitleZh(), program.getTitleNm());
case "ja", "jp" -> getValueOrDefault(program.getTitleJa(), program.getTitleNm());
case "vi", "vn" -> getValueOrDefault(program.getTitleVi(), program.getTitleNm());
case "id" -> getValueOrDefault(program.getTitleId(), program.getTitleNm());
default -> program.getTitleNm();
};
}

/**
* 번역된 값이 없으면 기본값을 반환
*/
private String getValueOrDefault(String translatedValue, String defaultValue) {
return (translatedValue != null && !translatedValue.isBlank())
? translatedValue
: defaultValue;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import com._data._data.community.entity.Post;
import com._data._data.community.entity.Comment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import com._data._data.user.entity.Users;
import org.springframework.data.repository.query.Param;

@Repository
public interface CommentRepository extends JpaRepository<Comment, Long> {
Expand All @@ -14,4 +16,10 @@ public interface CommentRepository extends JpaRepository<Comment, Long> {
List<Comment> findByPostOrderByCreatedAtAsc(Post post);
List<Comment> findByPostOrderByCreatedAtDesc(Post post);

// 포스트의 댓글들을 댓글 작성자 정보와 함께 조회
@Query("SELECT c FROM Comment c " +
"JOIN FETCH c.commenter " +
"WHERE c.post = :post " +
"ORDER BY c.createdAt ASC")
List<Comment> findByPostWithCommenterOrderByCreatedAtAsc(@Param("post") Post post);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -26,4 +28,9 @@ public interface FollowRepository extends JpaRepository<Follow, Long> {
@Transactional
void deleteByFollowee(Users followee);

// 특정 팔로워가 여러 유저들을 팔로우하는지 한 번에 조회
@Query("SELECT f FROM Follow f WHERE f.follower = :follower AND f.followee.id IN :followeeIds")
List<Follow> findByFollowerAndFolloweeIdIn(@Param("follower") Users follower, @Param("followeeIds") List<Long> followeeIds);


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
import com._data._data.community.entity.Like;
import com._data._data.community.entity.Post;
import com._data._data.user.entity.Users;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -19,4 +22,9 @@ public interface LikeRepository extends JpaRepository<Like, Long> {
@Modifying
@Transactional
void deleteByUser(Users user);

// 여러 포스트에 대한 한 유저의 좋아요 조회
@Query("SELECT l FROM Like l WHERE l.post.id IN :postIds AND l.user = :user")
List<Like> findByPostIdInAndUser(@Param("postIds") List<Long> postIds, @Param("user") Users user);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,45 @@
import com._data._data.community.entity.Post;
import com._data._data.user.entity.Users;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;


@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByAuthor(Users author);
List<Post> findAllByOrderByCreatedAtDesc();
List<Post> findByAuthorInOrderByCreatedAtDesc(List<Users> authors);
List<Post> findByAuthor_NationsOrderByCreatedAtDesc(Long nations);
List<Post> findByAuthorOrderByCreatedAtDesc(Users author);
// 모든 포스트를 Author + Nation과 함께 조회
@Query("SELECT p FROM Post p " +
"JOIN FETCH p.author " +
"ORDER BY p.createdAt DESC")
List<Post> findAllWithAuthorAndNation();

// 특정 작성자들의 포스트를 Author + Nation과 함께 조회
@Query("SELECT p FROM Post p " +
"JOIN FETCH p.author a " +
"WHERE a IN :authors " +
"ORDER BY p.createdAt DESC")
List<Post> findByAuthorInWithAuthorAndNation(@Param("authors") List<Users> authors);

// 특정 국가의 포스트를 Author + Nation과 함께 조회
@Query("SELECT p FROM Post p " +
"JOIN FETCH p.author " +
"WHERE p.author.nations = :nationId " +
"ORDER BY p.createdAt DESC")
List<Post> findByAuthorNationsWithAuthorAndNation(@Param("nationId") Long nationId);

// 특정 작성자의 포스트를 Author + Nation과 함께 조회
@Query("SELECT p FROM Post p " +
"JOIN FETCH p.author " +
"WHERE p.author = :author " +
"ORDER BY p.createdAt DESC")
List<Post> findByAuthorWithAuthorAndNation(@Param("author") Users author);

@Query("SELECT p FROM Post p " +
"JOIN FETCH p.author " +
"WHERE p.id = :postId")
Optional<Post> findByIdWithAuthor(@Param("postId") Long postId);
}
Loading
Loading