Skip to content

Commit 2a657ab

Browse files
committed
feat: #74 겹치는 트랙 있으면 위치 약간 조정해서 업로드
1 parent 81cbc08 commit 2a657ab

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/main/java/com/cabin/plat/domain/track/service/TrackServiceImpl.java

+47
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.ArrayList;
2222
import java.util.List;
2323
import java.util.Optional;
24+
import java.util.Random;
2425
import lombok.RequiredArgsConstructor;
2526
import org.springframework.data.domain.PageRequest;
2627
import org.springframework.data.domain.Pageable;
@@ -103,6 +104,20 @@ public TrackResponse.TrackId likeTrack(Member member, Long trackId, Boolean isLi
103104
public TrackResponse.TrackId addTrack(Member member, TrackRequest.TrackUpload trackUpload) {
104105
double latitude = trackUpload.getLatitude();
105106
double longitude = trackUpload.getLongitude();
107+
108+
List<Track> nearTracks = trackRepository.findAllTracksWithinBounds(
109+
latitude - 0.001,
110+
latitude + 0.001,
111+
longitude - 0.001,
112+
longitude + 0.001
113+
);
114+
115+
if (hasNearTrack(latitude, longitude, nearTracks)) {
116+
List<Double> editedPosition = editOverlapPosition(latitude, longitude, nearTracks);
117+
latitude = editedPosition.get(0);
118+
longitude = editedPosition.get(1);
119+
}
120+
106121
AddressInfo addressInfo = reverseGeoCoding.getAddressInfo(latitude, longitude);
107122

108123
Location location = locationRepository.save(trackMapper.toLocation(
@@ -117,6 +132,38 @@ public TrackResponse.TrackId addTrack(Member member, TrackRequest.TrackUpload tr
117132
return trackMapper.toTrackId(savedTrack.getId());
118133
}
119134

135+
private List<Double> editOverlapPosition(double latitude, double longitude, List<Track> nearTracks) {
136+
List<Double> editedPosition = new ArrayList<>();
137+
Random random = new Random();
138+
139+
int count = 0;
140+
while (hasNearTrack(latitude, longitude, nearTracks)) {
141+
if (count > 10) {
142+
return editedPosition;
143+
}
144+
count++;
145+
latitude += -0.0001 + (0.0002 * random.nextDouble());
146+
longitude += -0.0001 + (0.0002 * random.nextDouble());
147+
latitude = Math.round(latitude * 1_000_000) / 1_000_000.0;
148+
longitude = Math.round(longitude * 1_000_000) / 1_000_000.0;
149+
}
150+
151+
return List.of(latitude, longitude);
152+
}
153+
154+
private boolean hasNearTrack(double la1, double lo1, List<Track> overlayTracks) {
155+
for (Track track : overlayTracks) {
156+
double la2 = track.getLocation().getLatitude();
157+
double lo2 = track.getLocation().getLongitude();
158+
double distance = Math.sqrt(Math.pow(la1 - la2, 2) + Math.pow(lo1 - lo2, 2));
159+
160+
if (distance <= 0.0001) {
161+
return true;
162+
}
163+
}
164+
return false;
165+
}
166+
120167
@Override
121168
public TrackResponse.TrackDetailList getTrackFeeds(Member member, int page, int size) {
122169
List<Sort.Order> sorts = new ArrayList<>();

src/test/java/com/cabin/plat/domain/track/service/TrackServiceTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,39 @@ void addTrackTest() {
357357
assertThat(trackDetail.getMember().getMemberId()).isEqualTo(member.getId());
358358
}
359359

360+
@Test
361+
void 겹치는_트랙이_있으면_위치를_조정한다() {
362+
// given
363+
Member member = members.get(0);
364+
TrackRequest.TrackUpload trackUpload1 = TrackRequest.TrackUpload.builder()
365+
.isrc("isrc9")
366+
.imageUrl("https://testimage9.com")
367+
.content("테스트9")
368+
.latitude(36.014188)
369+
.longitude(129.325802)
370+
.build();
371+
372+
TrackRequest.TrackUpload trackUpload2 = TrackRequest.TrackUpload.builder()
373+
.isrc("test")
374+
.imageUrl("https://testtest.com")
375+
.content("테스트test")
376+
.latitude(36.014108)
377+
.longitude(129.325841)
378+
.build();
379+
380+
// when
381+
Long trackId1 = trackService.addTrack(member, trackUpload1).getTrackId();
382+
Long trackId2 = trackService.addTrack(member, trackUpload2).getTrackId();
383+
384+
// then
385+
TrackResponse.TrackDetail trackDetail1 = trackService.getTrackById(member, trackId1);
386+
assertThat(trackDetail1.getLatitude()).isEqualTo(36.014188);
387+
assertThat(trackDetail1.getLongitude()).isEqualTo(129.325802);
388+
TrackResponse.TrackDetail trackDetail2 = trackService.getTrackById(member, trackId2);
389+
assertThat(trackDetail2.getLatitude()).isNotEqualTo(36.014108);
390+
assertThat(trackDetail2.getLongitude()).isNotEqualTo(129.325841);
391+
}
392+
360393
@Test
361394
void getTrackFeedsTest_개수만() {
362395
// given

0 commit comments

Comments
 (0)