Skip to content

Commit da9654b

Browse files
authored
Merge pull request #67 from dancier/search-implementation
Search implementation
2 parents db60762 + f02600a commit da9654b

File tree

14 files changed

+299
-70
lines changed

14 files changed

+299
-70
lines changed

api/swagger.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -652,13 +652,13 @@ components:
652652
gender:
653653
name: gender
654654
in: query
655-
description: preferred gender of the dancers
655+
description: required preferred gender of the dancers
656656
schema:
657657
type: string
658658
range:
659659
name: range
660660
in: query
661-
description: Range [km] in which the search for dancers should be done
661+
description: Range [km] in which the search for dancers should be done, defaults to 20 km
662662
schema:
663663
type: string
664664
schemas:

src/main/java/net/dancier/dancer/core/DancerRepository.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/main/java/net/dancier/dancer/core/DancerService.java

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/main/java/net/dancier/dancer/core/ProfileService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.dancier.dancer.core.model.DanceProfile;
1616
import net.dancier.dancer.core.model.Dancer;
1717
import net.dancier.dancer.core.util.ModelMapper;
18+
import net.dancier.dancer.dancers.DancerRepository;
1819
import net.dancier.dancer.location.ZipCode;
1920
import net.dancier.dancer.location.ZipCodeRepository;
2021
import org.slf4j.Logger;

src/main/java/net/dancier/dancer/chat/DancerController.java renamed to src/main/java/net/dancier/dancer/dancers/DancerController.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package net.dancier.dancer.chat;
1+
package net.dancier.dancer.dancers;
22

33
import lombok.RequiredArgsConstructor;
44
import net.dancier.dancer.chat.dto.DancerDto;
55
import net.dancier.dancer.chat.dto.DancerIdsDto;
6-
import net.dancier.dancer.core.DancerService;
6+
import net.dancier.dancer.core.dto.PublicProfileDto;
7+
import net.dancier.dancer.core.model.Gender;
78
import net.dancier.dancer.security.AuthenticatedUser;
89
import net.dancier.dancer.security.CurrentUser;
910
import org.slf4j.Logger;
@@ -12,8 +13,7 @@
1213
import org.springframework.security.access.annotation.Secured;
1314
import org.springframework.web.bind.annotation.*;
1415

15-
import java.util.HashMap;
16-
import java.util.UUID;
16+
import java.util.*;
1717

1818
import static net.dancier.dancer.authentication.Constants.ROLE_USER;
1919

@@ -25,6 +25,17 @@ public class DancerController {
2525

2626
private final DancerService dancerService;
2727

28+
@GetMapping("")
29+
@Secured(ROLE_USER)
30+
public ResponseEntity<List<PublicProfileDto>> get(
31+
@CurrentUser AuthenticatedUser authenticatedUser,
32+
@RequestParam Gender gender,
33+
@RequestParam(defaultValue = "20") int range
34+
) {
35+
log.info("Fetching list of dancers in {} km range with gender {} for user {}", range, gender, authenticatedUser.getUserId());
36+
return ResponseEntity.ok(dancerService.getDancerList(authenticatedUser, gender, range));
37+
}
38+
2839
@PostMapping("")
2940
@Secured(ROLE_USER)
3041
public ResponseEntity<HashMap<UUID, DancerDto>> post(
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.dancier.dancer.dancers;
2+
3+
import net.dancier.dancer.core.model.Dancer;
4+
import net.dancier.dancer.core.model.Gender;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
import java.util.List;
8+
import java.util.Optional;
9+
import java.util.UUID;
10+
11+
public interface DancerRepository extends JpaRepository<Dancer, UUID> {
12+
13+
Optional<Dancer> findByUserId(UUID userid);
14+
15+
Boolean existsByDancerName(String dancerName);
16+
17+
List<Dancer> findFirst500ByGenderAndLongitudeBetweenAndLatitudeBetween(
18+
Gender gender,
19+
double lowerLongitude,
20+
double upperLongitude,
21+
double lowerLatitude,
22+
double upperLatitude
23+
);
24+
25+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package net.dancier.dancer.dancers;
2+
3+
import net.dancier.dancer.chat.dto.DancerDto;
4+
import net.dancier.dancer.chat.dto.DancerIdsDto;
5+
import net.dancier.dancer.core.dto.PublicProfileDto;
6+
import net.dancier.dancer.core.exception.NotFoundException;
7+
import net.dancier.dancer.core.model.Dancer;
8+
import net.dancier.dancer.core.model.Gender;
9+
import net.dancier.dancer.security.AuthenticatedUser;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.stereotype.Service;
12+
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.UUID;
16+
17+
@Service
18+
public class DancerService {
19+
20+
@Autowired
21+
DancerRepository dancerRepository;
22+
23+
public Dancer loadByUserId(UUID userId) {
24+
return dancerRepository.findByUserId(userId).orElseThrow(() -> new NotFoundException("No Profile found for given user."));
25+
}
26+
27+
public List<Dancer> getAllDancer() {
28+
return dancerRepository.findAll();
29+
}
30+
31+
public HashMap<UUID, DancerDto> getDancerMap(DancerIdsDto dancerIdsDto) {
32+
33+
HashMap<UUID, DancerDto> dancers = new HashMap<>();
34+
35+
dancerRepository.findAllById(dancerIdsDto.getDancerIds())
36+
.stream()
37+
.map(DancerDto::fromDancer)
38+
.forEach(dancerDto -> dancers.put(dancerDto.getId(), dancerDto));
39+
40+
return dancers;
41+
}
42+
43+
public List<PublicProfileDto> getDancerList(AuthenticatedUser authenticatedUser, Gender gender, int range) {
44+
45+
Dancer dancer = loadByUserId(authenticatedUser.getUserId());
46+
47+
// 1° in longitude in Germany (latitude 47) are 75,78 km
48+
double longitudeRange = range/75.78;
49+
// 1° in longitude are 112,12 km
50+
double latitudeRange = range/112.12;
51+
52+
double upperLatitude = dancer.getLatitude() + latitudeRange;
53+
double lowerLatitude = dancer.getLatitude() - latitudeRange;
54+
double upperLongitude = dancer.getLongitude() + longitudeRange;
55+
double lowerLongitude = dancer.getLongitude() - longitudeRange;
56+
57+
List<Dancer> resultList = dancerRepository.findFirst500ByGenderAndLongitudeBetweenAndLatitudeBetween(
58+
gender, lowerLongitude, upperLongitude, lowerLatitude, upperLatitude);
59+
60+
return resultList.stream()
61+
.map(PublicProfileDto::of)
62+
.filter(d -> d.getId() != dancer.getId())
63+
.toList();
64+
}
65+
}

src/main/java/net/dancier/dancer/recommendation/RecommendationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package net.dancier.dancer.recommendation;
22

33
import lombok.RequiredArgsConstructor;
4-
import net.dancier.dancer.core.DancerRepository;
4+
import net.dancier.dancer.dancers.DancerRepository;
55
import net.dancier.dancer.core.model.Dancer;
66
import net.dancier.dancer.recommendation.model.BaseRecommendation;
77
import net.dancier.dancer.recommendation.model.RecommendationWrapper;

src/main/java/net/dancier/dancer/security/CustomUserDetailsServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import lombok.RequiredArgsConstructor;
55
import net.dancier.dancer.authentication.model.User;
66
import net.dancier.dancer.authentication.repository.UserRepository;
7-
import net.dancier.dancer.core.DancerRepository;
7+
import net.dancier.dancer.dancers.DancerRepository;
88
import net.dancier.dancer.core.model.Dancer;
99
import org.springframework.security.core.userdetails.UsernameNotFoundException;
1010
import org.springframework.stereotype.Service;

src/test/java/net/dancier/dancer/chat/ChatControllerTest.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,17 @@
44
import net.dancier.dancer.AbstractPostgreSQLEnabledTest;
55
import net.dancier.dancer.chat.client.ChatServiceClient;
66
import net.dancier.dancer.chat.dto.*;
7-
import net.dancier.dancer.core.DancerRepository;
7+
import net.dancier.dancer.dancers.DancerRepository;
88
import org.junit.jupiter.api.BeforeEach;
99
import org.junit.jupiter.api.DisplayName;
1010
import org.junit.jupiter.api.Nested;
1111
import org.junit.jupiter.api.Test;
1212
import org.springframework.beans.factory.annotation.Autowired;
1313
import org.springframework.boot.test.mock.mockito.MockBean;
14-
import org.springframework.http.HttpHeaders;
15-
import org.springframework.http.HttpStatus;
1614
import org.springframework.http.MediaType;
17-
import org.springframework.http.ResponseEntity;
1815
import org.springframework.security.test.context.support.WithUserDetails;
1916
import org.springframework.test.web.servlet.ResultActions;
2017

21-
import java.util.Arrays;
2218
import java.util.List;
2319
import java.util.Optional;
2420
import java.util.UUID;

0 commit comments

Comments
 (0)