Skip to content

Commit

Permalink
[DDING-000] 페이지네이션 오류 수정 및 FileMetaData 로직 수정 (#178)
Browse files Browse the repository at this point in the history
  • Loading branch information
KoSeonJe authored Nov 15, 2024
1 parent 3c97183 commit 9de5f36
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface DocumentRepository extends JpaRepository<Document, Long> {
FROM document AS d
ORDER BY d.id DESC
LIMIT :limit
OFFSET :offsetValue
OFFSET :offset
""",
nativeQuery = true
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,11 @@ public void updateCoupledEntityInfo(DomainType domainType, Long entityId) {
this.entityId = entityId;
}

public boolean isCoupled() {
return this.fileStatus == FileStatus.COUPLED;
}

public boolean isPending() {
return this.fileStatus == FileStatus.PENDING;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ public List<FileMetaData> getCoupledAllByDomainTypeAndEntityId(DomainType domain
@Transactional
@Override
public void updateStatusToCoupled(List<String> ids, DomainType domainType, Long entityId) {
if (ids.isEmpty()) {
if (ids == null || ids.isEmpty()) {
return;
}
List<UUID> fileMetaDataId = toUUIDs(ids);
List<FileMetaData> fileMetaDatas = fileMetaDataRepository.findByIdIn(fileMetaDataId);
if (ids.size() != fileMetaDatas.size()) {
throw new ResourceNotFound("해당 FileMetaData(id: " + fileMetaDataId + ")를 찾을 수 없습니다.");
}
fileMetaDatas.forEach(fileMetaData -> {
fileMetaDatas.stream()
.filter(FileMetaData::isPending)
.forEach(fileMetaData -> {
fileMetaData.updateCoupledEntityInfo(domainType, entityId);
fileMetaData.updateStatus(COUPLED);
});
Expand All @@ -60,31 +62,29 @@ public void updateStatusToCoupled(String id, DomainType domainType, Long entityI
return;
}
UUID fileMetaDataId = UUID.fromString(id);
FileMetaData fileMetaData = fileMetaDataRepository.findById(fileMetaDataId).orElse(null);
if (fileMetaData == null) {
throw new ResourceNotFound("해당 FileMetaData(id: " + fileMetaDataId + ")를 찾을 수 없습니다.");
}
FileMetaData fileMetaData = findById(fileMetaDataId);
fileMetaData.updateCoupledEntityInfo(domainType, entityId);
fileMetaData.updateStatus(COUPLED);
}

@Transactional
@Override
public void update(String id, DomainType domainType, Long entityId) {
updateStatusToDelete(domainType, entityId);
if (id == null) {
if (isCoupled(id)) {
return;
}
updateStatusToDelete(domainType, entityId);
updateStatusToCoupled(id, domainType, entityId);
}

@Transactional
@Override
public void update(List<String> ids, DomainType domainType, Long entityId) {
updateStatusToDelete(domainType, entityId);
if (ids == null || ids.isEmpty()) {
updateStatusToDelete(domainType, entityId);
return;
}
deleteExcludingIds(ids, domainType, entityId);
updateStatusToCoupled(ids, domainType, entityId);
}

Expand All @@ -94,9 +94,33 @@ public void updateStatusToDelete(DomainType domainType, Long entityId) {
List<FileMetaData> fileMetaDatas = getCoupledAllByDomainTypeAndEntityId(domainType, entityId);
fileMetaDatas.forEach(fileMetaData -> {
fileMetaData.updateStatus(DELETED);
entityManager.flush();
fileMetaDataRepository.delete(fileMetaData);
});
entityManager.flush();
fileMetaDataRepository.deleteAll(fileMetaDatas);
}

private boolean isCoupled(String id) {
if (id == null) {
return false;
}
FileMetaData fileMetaData = findById(UUID.fromString(id));
return fileMetaData.isCoupled();
}

private void deleteExcludingIds(List<String> ids, DomainType domainType, Long entityId) {
List<FileMetaData> fileMetaDatas = getCoupledAllByDomainTypeAndEntityId(domainType, entityId);
fileMetaDatas.stream()
.filter(fileMetaData -> !ids.contains(String.valueOf(fileMetaData.getId())))
.forEach(fileMetaData -> {
fileMetaData.updateStatus(DELETED);
});
entityManager.flush();
fileMetaDataRepository.deleteAll(fileMetaDatas);
}

private FileMetaData findById(UUID id) {
return fileMetaDataRepository.findById(id)
.orElseThrow(() -> new ResourceNotFound("해당 FileMetaData(id: " + id + ")를 찾을 수 없습니다."));
}

private List<UUID> toUUIDs(List<String> ids) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

@Transactional
@SpringBootTest
class FileMetaDataServiceImplTest extends TestContainerSupport {

Expand Down Expand Up @@ -54,14 +56,14 @@ void getCoupledAllByDomainTypeAndEntityId() {
DomainType domainType = DomainType.CLUB_PROFILE;
Long entityId = 1L;
fileMetaDataRepository.saveAll(fixture.giveMeBuilder(FileMetaData.class)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sampleList(3));
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sampleList(3));

//when
List<FileMetaData> result =
fileMetaDataService.getCoupledAllByDomainTypeAndEntityId(domainType, entityId);
fileMetaDataService.getCoupledAllByDomainTypeAndEntityId(domainType, entityId);

//then
assertThat(result).hasSize(3);
Expand All @@ -76,73 +78,106 @@ void updateAllToActivated() {
UUID id1 = UuidCreator.getTimeOrderedEpoch();
UUID id2 = UuidCreator.getTimeOrderedEpoch();
fileMetaDataRepository.saveAll(List.of(
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", null)
.set("entityId", null)
.set("fileStatus", FileStatus.PENDING)
.sample(),
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id2)
.set("domainType", null)
.set("entityId", null)
.set("fileStatus", FileStatus.PENDING)
.sample()
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", null)
.set("entityId", null)
.set("fileStatus", FileStatus.PENDING)
.sample(),
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id2)
.set("domainType", null)
.set("entityId", null)
.set("fileStatus", FileStatus.PENDING)
.sample()
));
em.flush();
em.clear();
em.flush();
em.clear();
//when
fileMetaDataService.updateStatusToCoupled(List.of(id1.toString(), id2.toString()), domainType, entityId);
em.flush();
em.clear();
//then
List<FileMetaData> result = fileMetaDataRepository.findAllByDomainTypeAndEntityIdWithFileStatus(
domainType, entityId, FileStatus.COUPLED);
domainType, entityId, FileStatus.COUPLED);
assertThat(result).hasSize(2)
.extracting("fileStatus")
.contains(FileStatus.COUPLED);
.extracting("fileStatus")
.contains(FileStatus.COUPLED);
}

@DisplayName("FileMetaData 수정 - COUPLED & DELETED")
@DisplayName("FileMetaData 수정 - COUPLED & DELETED id를 일부 수정할 경우")
@Test
void updateAllToActivatedAndAttached() {
//given
DomainType domainType = DomainType.CLUB_PROFILE;
Long entityId = 1L;
UUID id1 = UuidCreator.getTimeOrderedEpoch();
UUID id2 = UuidCreator.getTimeOrderedEpoch();
UUID id3 = UuidCreator.getTimeOrderedEpoch();
fileMetaDataRepository.saveAll(List.of(
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", null)
.set("entityId", null)
.set("fileStatus", FileStatus.PENDING)
.sample(),
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id2)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample()
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", null)
.set("entityId", null)
.set("fileStatus", FileStatus.PENDING)
.sample(),
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id2)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample()
));

FileMetaData fileMetaData = fixture.giveMeBuilder(FileMetaData.class)
.set("id", id3)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.PENDING)
.sample();
fileMetaDataRepository.save(fileMetaData);
//when
fileMetaDataService.update(List.of(id1.toString()), domainType, entityId);
fileMetaDataService.update(List.of(id1.toString(), fileMetaData.getId().toString()), domainType, entityId);

//then
List<FileMetaData> result = fileMetaDataRepository.findAllByDomainTypeAndEntityIdWithFileStatus(
domainType, entityId, FileStatus.COUPLED);
// FileMetaData attachedFileMetaData = (FileMetaData) em.createNativeQuery("select * from ddingdong.file_meta_data where id = :id",
// FileMetaData.class)
// .setParameter("id", id2)
// .getSingleResult();
domainType, entityId, FileStatus.COUPLED);

FileMetaData attachedFileMetaData = fileMetaDataRepository.findById(id2).orElse(null);
assertThat(result).hasSize(1)
.extracting("id", "fileStatus")
.contains(tuple(id1, FileStatus.COUPLED));
assertThat(result).hasSize(2)
.extracting("id", "fileStatus")
.contains(tuple(id1, FileStatus.COUPLED), tuple(id3, FileStatus.COUPLED));
assertThat(attachedFileMetaData).isEqualTo(null);
}

@DisplayName("FileMetaData 수정 - COUPLED & DELETED 기존 아이디를 그대로 입력할 경우")
@Test
void updateToActivatedAndAttached() {
//given
DomainType domainType = DomainType.CLUB_PROFILE;
Long entityId = 1L;
UUID id1 = UuidCreator.getTimeOrderedEpoch();
fileMetaDataRepository.save(
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample()
);

//when
fileMetaDataService.update(id1.toString(), domainType, entityId);

//then
List<FileMetaData> result = fileMetaDataRepository.findAllByDomainTypeAndEntityIdWithFileStatus(
domainType, entityId, FileStatus.COUPLED);

assertThat(result).hasSize(1)
.extracting("id", "fileStatus")
.contains(tuple(id1, FileStatus.COUPLED));
}


@DisplayName("FileMetaData 수정 - DELETED")
@Test
void updateAllToAttached() {
Expand All @@ -152,37 +187,25 @@ void updateAllToAttached() {
UUID id1 = UuidCreator.getTimeOrderedEpoch();
UUID id2 = UuidCreator.getTimeOrderedEpoch();
fileMetaDataRepository.saveAll(List.of(
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample(),
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id2)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample()
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id1)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample(),
fixture.giveMeBuilder(FileMetaData.class)
.set("id", id2)
.set("domainType", domainType)
.set("entityId", entityId)
.set("fileStatus", FileStatus.COUPLED)
.sample()
));

//when
fileMetaDataService.updateStatusToDelete(domainType, entityId);
em.flush();
//then
// List<FileMetaData> result = (List<FileMetaData>) em.createNativeQuery("select * from ddingdong.file_meta_data where id IN (:ids)",
// FileMetaData.class)
// .setParameter("ids", Arrays.asList(id1, id2))
// .getResultList();
List<FileMetaData> result = fileMetaDataRepository.findByIdIn(List.of(id1, id2));
assertThat(result).isEmpty();
// assertThat(result).hasSize(2)
// .allSatisfy(fileMetaData -> {
// assertThat(fileMetaData.getDomainType()).isEqualTo(domainType);
// assertThat(fileMetaData.getEntityId()).isEqualTo(entityId);
// assertThat(fileMetaData.getFileStatus()).isEqualTo(FileStatus.DELETED);
// });
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

@Transactional
@SpringBootTest
class FacadeCentralFixZoneServiceImplTest extends TestContainerSupport {

Expand Down

0 comments on commit 9de5f36

Please sign in to comment.