Skip to content

Commit

Permalink
refactor: updateTag 로직 수정 validator에서 update할 tag의 index를 가져옴
Browse files Browse the repository at this point in the history
  • Loading branch information
Gyaak committed Sep 29, 2024
1 parent f22b485 commit 6673721
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package kernel360.techpick.feature.tag.service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -41,7 +42,7 @@ public TagResponse createTag(Long userId, TagCreateRequest request) throws ApiTa
@Transactional(readOnly = true)
public List<TagResponse> getTagListByUser(Long userId) {

List<Tag> tagList = tagProvider.findAllByUserId(userId);
List<Tag> tagList = tagProvider.findAllByUserIdOrderByTagOrder(userId);

return tagList.stream()
.map(tagMapper::createTagResponse)
Expand All @@ -52,18 +53,21 @@ public List<TagResponse> getTagListByUser(Long userId) {
public List<TagResponse> updateTagList(Long userId, List<TagUpdateRequest> tagUpdateRequests) throws
ApiTagException {

Map<Long, Tag> tagMap = tagProvider.getTagMapByUserId(userId);

for (var req : tagUpdateRequests) {
// 만약 자신의 태그가 아니라면 tagMap.get(req.id()) == null
tagValidator.validateTagAccess(userId, tagMap.get(req.id()));
tagMapper.updateTag(req, tagMap.get(req.id()));
// immutable list로 들어올 경우 sort가 불가능해 ArrayList로 변환
// 항상 mutable list라는것이 보장된다면 삭제해주세요..
List<TagUpdateRequest> mutableTagUpdateRequests = new ArrayList<>(tagUpdateRequests);
mutableTagUpdateRequests.sort(Comparator.comparingLong(TagUpdateRequest::id));

List<Tag> userTagList = tagProvider.findAllByUserIdOrderByTagId(userId);

int idx = 0;
for (var req : mutableTagUpdateRequests) {
idx = tagValidator.findUpdateTagIdx(idx, req, userTagList);
tagMapper.updateTag(req, userTagList.get(idx));
idx++;
}

// 수정한 태그들 중 order 가 중복되는지 검증
tagValidator.validateTagOrder(tagMap);

return tagProvider.saveAll(tagMap.values())
return tagProvider.saveAll(userTagList)
.stream()
.map(tagMapper::createTagResponse)
.toList();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package kernel360.techpick.feature.tag.validator;

import java.util.HashSet;
import java.util.Map;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import org.springframework.stereotype.Component;

import kernel360.techpick.core.exception.feature.tag.ApiTagException;
import kernel360.techpick.core.model.tag.Tag;
import kernel360.techpick.feature.tag.model.TagProvider;
import kernel360.techpick.feature.tag.model.dto.TagUpdateRequest;
import lombok.RequiredArgsConstructor;

@Component
Expand All @@ -32,16 +31,17 @@ public void validateTagNameExists(Long userId, String name) throws ApiTagExcepti
}
}

public void validateTagOrder(Map<Long, Tag> tagMap) throws ApiTagException {
// 업데이트 대상이 되는 태그의 userTagList에서의 index 반환
// 만약 userTagList에 업데이트 하려는 태그가 존재하지 않으면,
// 본인이 등록하지 않은 태그에 접근하려는 것이므로 ApiTagException.UNAUTHORIZED_TAG_ACCESS() 발생
public int findUpdateTagIdx(int startIdx, TagUpdateRequest req, List<Tag> userTagList) throws ApiTagException {

Set<Integer> orderSet = new HashSet<>();

for (Tag tag : tagMap.values()) {
// 중복되거나 음수면 유효하지 않은 tag order
if (!orderSet.add(tag.getOrder()) || tag.getOrder() < 0) {
throw ApiTagException.TAG_INVALID_ORDER();
for (int i = startIdx; i < userTagList.size(); i++) {
if (req.id().equals(userTagList.get(i).getId())) {
return i;
}
}
throw ApiTagException.UNAUTHORIZED_TAG_ACCESS();
}

}
Expand Down

0 comments on commit 6673721

Please sign in to comment.