Skip to content

Commit

Permalink
[refactor] 취향과 인기도 리팩토링
Browse files Browse the repository at this point in the history
[refactor] 취향과 인기도 리팩토링
  • Loading branch information
elive7 authored Aug 7, 2024
2 parents 8cd2ed5 + e3d7046 commit 747363b
Show file tree
Hide file tree
Showing 62 changed files with 839 additions and 517 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import org.recordy.server.auth.domain.Auth;
import org.recordy.server.auth.domain.AuthPlatform;
import org.recordy.server.auth.domain.AuthToken;
import org.recordy.server.auth.security.UserAuthentication;
import org.recordy.server.auth.service.impl.token.AuthTokenGenerator;
import org.recordy.server.user.domain.usecase.UserSignIn;
import org.recordy.server.auth.exception.AuthException;
import org.recordy.server.auth.repository.AuthRepository;
Expand All @@ -15,17 +13,20 @@
import org.recordy.server.common.message.ErrorMessage;
import org.recordy.server.user.domain.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static org.recordy.server.user.domain.UserStatus.ACTIVE;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class AuthServiceImpl implements AuthService {

private final AuthRepository authRepository;
private final AuthPlatformServiceFactory platformServiceFactory;
private final AuthTokenService authTokenService;

@Transactional
@Override
public Auth create(User user, AuthPlatform platform) {
AuthToken token = authTokenService.issueToken(user.getId());
Expand All @@ -38,6 +39,7 @@ public Auth create(User user, AuthPlatform platform) {
.build());
}

@Transactional
@Override
public void signOut(String platformId) {
Auth auth = authRepository.findByPlatformId(platformId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package org.recordy.server.bookmark.repository;

import org.recordy.server.bookmark.domain.Bookmark;
import org.recordy.server.keyword.domain.Keyword;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

import java.util.Map;

public interface BookmarkRepository {
// command
Bookmark save(Bookmark bookmark);
void delete(long userId, long recordId);
void deleteByUserId(long userId);

// query
Slice<Bookmark> findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable);
Slice<Bookmark> findAllByBookmarksOrderByIdDesc(long userId, Long cursor, Pageable pageable);
boolean existsByUserIdAndRecordId(Long userId, Long recordId);
long countByUserId(Long userId);
Map<Keyword, Long> countAllByUserIdGroupByKeyword(long userId);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package org.recordy.server.bookmark.repository.impl;

import com.querydsl.core.Tuple;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import lombok.RequiredArgsConstructor;
import org.recordy.server.common.util.QueryDslUtils;
import org.recordy.server.bookmark.domain.BookmarkEntity;
import org.recordy.server.keyword.domain.KeywordEntity;
import org.recordy.server.user.domain.QUserEntity;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
Expand All @@ -14,16 +18,15 @@

import static org.recordy.server.record.domain.QRecordEntity.recordEntity;
import static org.recordy.server.bookmark.domain.QBookmarkEntity.bookmarkEntity;
import static org.recordy.server.record.domain.QUploadEntity.uploadEntity;

@RequiredArgsConstructor
@Repository
public class BookmarkQueryDslRepository {

private final JPAQueryFactory jpaQueryFactory;

public Slice<BookmarkEntity> findAllByUserOrderByIdDesc(long userId, long cursor, Pageable pageable) {
cursor = QueryDslUtils.cursorIdCheck(cursor);

public Slice<BookmarkEntity> findAllByUserOrderByIdDesc(long userId, Long cursor, Pageable pageable) {
List<BookmarkEntity> bookmarkEntities = jpaQueryFactory
.selectFrom(bookmarkEntity)
.join(bookmarkEntity.record, recordEntity)
Expand All @@ -39,12 +42,20 @@ public Slice<BookmarkEntity> findAllByUserOrderByIdDesc(long userId, long cursor
return new SliceImpl<>(bookmarkEntities, pageable, QueryDslUtils.hasNext(pageable, bookmarkEntities));
}

public long countByUserId(long userId) {
return jpaQueryFactory
.select(bookmarkEntity.id.count())
public Map<KeywordEntity, Long> countAllByUserIdGroupByKeyword(long userId) {
List<Tuple> result = jpaQueryFactory
.select(uploadEntity.keyword, bookmarkEntity.count())
.from(bookmarkEntity)
.join(bookmarkEntity.user, QUserEntity.userEntity)
.where(QUserEntity.userEntity.id.eq(userId))
.fetchOne();
.join(bookmarkEntity.record, recordEntity)
.join(recordEntity.uploads, uploadEntity)
.where(bookmarkEntity.user.id.eq(userId))
.groupBy(uploadEntity.keyword)
.fetch();

return result.stream()
.collect(Collectors.toMap(
tuple -> tuple.get(uploadEntity.keyword),
tuple -> tuple.get(bookmarkEntity.count())
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
import org.recordy.server.bookmark.domain.Bookmark;
import org.recordy.server.bookmark.domain.BookmarkEntity;
import org.recordy.server.bookmark.repository.BookmarkRepository;
import org.recordy.server.keyword.domain.Keyword;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;
import java.util.stream.Collectors;

@RequiredArgsConstructor
@Repository
public class BookmarkRepositoryImpl implements BookmarkRepository {
Expand All @@ -34,7 +38,7 @@ public void deleteByUserId(long userId) {
}

@Override
public Slice<Bookmark> findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable) {
public Slice<Bookmark> findAllByBookmarksOrderByIdDesc(long userId, Long cursor, Pageable pageable) {
return bookmarkQueryDslRepository.findAllByUserOrderByIdDesc(userId, cursor, pageable)
.map(BookmarkEntity::toDomain);
}
Expand All @@ -48,4 +52,14 @@ public boolean existsByUserIdAndRecordId(Long userId, Long recordId) {
public long countByUserId(Long userId) {
return bookmarkJpaRepository.countAllByUserId(userId);
}

@Override
public Map<Keyword, Long> countAllByUserIdGroupByKeyword(long userId) {
return bookmarkQueryDslRepository.countAllByUserIdGroupByKeyword(userId)
.entrySet().stream()
.collect(Collectors.toMap(
entry -> entry.getKey().toDomain(),
Map.Entry::getValue
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ public interface BookmarkService {
// query
List<Boolean> findBookmarks(long userId, List<Record> records);
Long countBookmarks(long userId);
Slice<Bookmark> getBookmarks(long userId, long cursorId, int size);
Slice<Bookmark> getBookmarks(long userId, Long cursorId, int size);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,18 @@
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class BookmarkServiceImpl implements BookmarkService {

private final UserRepository userRepository;
private final RecordRepository recordRepository;
private final BookmarkRepository bookmarkRepository;

@Transactional
@Override
public boolean bookmark(long userId, long recordId) {
if (bookmarkRepository.existsByUserIdAndRecordId(userId, recordId)) {
Expand Down Expand Up @@ -58,7 +61,7 @@ public Long countBookmarks(long userId) {
}

@Override
public Slice<Bookmark> getBookmarks(long userId, long cursorId, int size) {
public Slice<Bookmark> getBookmarks(long userId, Long cursorId, int size) {
return bookmarkRepository.findAllByBookmarksOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,4 @@ public static <T> boolean hasNext(Pageable pageable, List<T> content) {

return false;
}

public static long cursorIdCheck(Long cursor){
if (cursor > 0) {
return cursor;
}
return Long.MAX_VALUE;
}
}
31 changes: 19 additions & 12 deletions src/main/java/org/recordy/server/keyword/domain/Keyword.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
package org.recordy.server.keyword.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.stream.Collectors;

@AllArgsConstructor
@Getter
public enum Keyword {

감각적인,
강렬한,
귀여운,
깔끔한,
덕후몰이,
아늑한,
이색적인,
재밌는,
조용한,
집중하기_좋은,
클래식한,
트렌디한,
감각적인(1),
강렬한(2),
귀여운(3),
깔끔한(4),
덕후몰이(5),
아늑한(6),
이색적인(7),
재밌는(8),
조용한(9),
집중하기_좋은(10),
클래식한(11),
트렌디한(12),
;

private final long id;

public static List<Keyword> decode(String utf8Bytes) {
String[] keywords = new String(Base64.getDecoder().decode(utf8Bytes), StandardCharsets.UTF_8).split(",");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@ public class KeywordEntity extends JpaMetaInfoEntity {
@Enumerated(EnumType.STRING)
private Keyword keyword;

public KeywordEntity(Keyword keyword) {
public KeywordEntity(Long id, Keyword keyword) {
this.id = id;
this.keyword = keyword;
}

public static KeywordEntity from(Keyword keyword) {
return new KeywordEntity(keyword);
return new KeywordEntity(keyword.getId(), keyword);
}

public Keyword toDomain() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import org.recordy.server.auth.security.resolver.UserId;
import org.recordy.server.common.message.ErrorMessage;
import org.recordy.server.preference.domain.usecase.Preference;
import org.recordy.server.preference.controller.dto.response.PreferenceGetResponse;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

@Tag(name = "Preference Api")
public interface PreferenceApi {

@Operation(
security = @SecurityRequirement(name = "Authorization"),
summary = "유저 취향 키워드 Top 3 API",
Expand All @@ -25,7 +26,7 @@ public interface PreferenceApi {
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(
implementation = Preference.class
implementation = PreferenceGetResponse.class
)
)
),
Expand All @@ -51,7 +52,7 @@ public interface PreferenceApi {
)
}
)
public ResponseEntity<Preference> getPreference(
public ResponseEntity<PreferenceGetResponse> getPreference(
@UserId Long userId
);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package org.recordy.server.preference.controller;

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.recordy.server.auth.security.resolver.UserId;
import org.recordy.server.preference.domain.usecase.Preference;
import org.recordy.server.preference.controller.dto.response.PreferenceGetResponse;
import org.recordy.server.preference.service.PreferenceService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand All @@ -20,12 +19,12 @@ public class PreferenceController implements PreferenceApi {

@Override
@GetMapping
public ResponseEntity<Preference> getPreference(
public ResponseEntity<PreferenceGetResponse> getPreference(
@UserId Long userId
) {
return ResponseEntity
.status(HttpStatus.OK)
.body(preferenceService.getPreference(userId));
.body(PreferenceGetResponse.from(preferenceService.getPreference(userId)));
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.recordy.server.preference.controller.dto.response;

import org.recordy.server.preference.domain.Preference;

import java.util.List;

public record PreferenceGetResponse(
List<List<String>> preference
) {

public static PreferenceGetResponse from(Preference preference) {
return new PreferenceGetResponse(
preference.getNormalizedTopKeywords(3)
.entrySet().stream()
.map(entry ->
List.of(entry.getKey().name(), String.valueOf(entry.getValue()))
)
.toList()
);
}
}
39 changes: 39 additions & 0 deletions src/main/java/org/recordy/server/preference/domain/Preference.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.recordy.server.preference.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.recordy.server.keyword.domain.Keyword;

import java.util.LinkedHashMap;
import java.util.Map;

@AllArgsConstructor
@Getter
public class Preference {

Map<Keyword, Long> keywordAndCounts;
long sum;

public static Preference from(Map<Keyword, Long> keywordAndCounts) {
return new Preference(keywordAndCounts, sum(keywordAndCounts));
}

private static long sum(Map<Keyword, Long> preference) {
return preference.values().stream()
.mapToLong(Long::longValue)
.sum();
}

public Map<Keyword, Long> getNormalizedTopKeywords(int size) {
return keywordAndCounts.entrySet().stream()
.sorted(Map.Entry.<Keyword, Long>comparingByValue().reversed())
.limit(size)
.collect(LinkedHashMap::new,
(map, entry) -> map.put(entry.getKey(), normalize(entry.getValue())),
Map::putAll);
}

private long normalize(long value) {
return value * 100 / sum;
}
}
Loading

0 comments on commit 747363b

Please sign in to comment.