Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docker-els.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ services:
networks:
es-network:
driver: bridge
external: false
attachable: true

volumes:
esdata:
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/com/wayble/server/ServerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@SpringBootApplication(
exclude = ReactiveElasticsearchRepositoriesAutoConfiguration.class
)
@EnableJpaAuditing
@EnableElasticsearchRepositories(basePackages = "com.wayble.server.explore.repository")
public class ServerApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

@Configuration
@EnableElasticsearchRepositories
public class ElasticsearchConfig extends ElasticsearchConfiguration {

@Value("${spring.elasticsearch.uris}")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.config;
package com.wayble.server.common.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.wayble.server.explore.controller;

import com.wayble.server.common.response.CommonResponse;
import com.wayble.server.explore.dto.recommend.WaybleZoneRecommendResponseDto;
import com.wayble.server.explore.service.WaybleZoneRecommendService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@Validated
@RequestMapping("/api/v1/wayble-zones/recommend")
public class WaybleZoneRecommendController {

private final WaybleZoneRecommendService waybleZoneRecommendService;

@GetMapping("/{userId}")
public CommonResponse<WaybleZoneRecommendResponseDto> getWaybleZonePersonalRecommend(
@PathVariable("userId") Long userId) {
WaybleZoneRecommendResponseDto dto = waybleZoneRecommendService.getWaybleZonePersonalRecommend(userId);
return CommonResponse.success(dto);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.wayble.server.search.controller;
package com.wayble.server.explore.controller;

import com.wayble.server.common.response.CommonResponse;
import com.wayble.server.search.dto.SearchSliceDto;
import com.wayble.server.search.dto.WaybleZoneDocumentRegisterDto;
import com.wayble.server.search.dto.WaybleZoneSearchConditionDto;
import com.wayble.server.search.dto.WaybleZoneSearchResponseDto;
import com.wayble.server.search.entity.WaybleZoneDocument;
import com.wayble.server.search.service.SearchService;
import com.wayble.server.explore.dto.search.SearchSliceDto;
import com.wayble.server.explore.dto.search.WaybleZoneDocumentRegisterDto;
import com.wayble.server.explore.dto.search.WaybleZoneSearchConditionDto;
import com.wayble.server.explore.dto.search.WaybleZoneSearchResponseDto;
import com.wayble.server.explore.service.WaybleZoneSearchService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
Expand All @@ -17,10 +16,10 @@
@RestController
@RequiredArgsConstructor
@Validated
@RequestMapping("/search")
public class SearchController {
@RequestMapping("/api/v1/wayble-zones/search")
public class WaybleZoneSearchController {

private final SearchService searchService;
private final WaybleZoneSearchService waybleZoneSearchService;

@GetMapping("")
public CommonResponse<SearchSliceDto<WaybleZoneSearchResponseDto>> findByCondition(
Expand All @@ -29,7 +28,7 @@ public CommonResponse<SearchSliceDto<WaybleZoneSearchResponseDto>> findByConditi
@RequestParam(name = "size", defaultValue = "20") int size)
{
Slice<WaybleZoneSearchResponseDto> slice =
searchService.searchWaybleZonesByCondition(conditionDto, PageRequest.of(page, size));
waybleZoneSearchService.searchWaybleZonesByCondition(conditionDto, PageRequest.of(page, size));
return CommonResponse.success(new SearchSliceDto<>(
slice.getContent(),
slice.hasNext()
Expand All @@ -38,7 +37,7 @@ public CommonResponse<SearchSliceDto<WaybleZoneSearchResponseDto>> findByConditi

@PostMapping("")
public CommonResponse<String> registerDocumentFromDto(@RequestBody WaybleZoneDocumentRegisterDto registerDto) {
searchService.saveDocumentFromDto(registerDto);
waybleZoneSearchService.saveDocumentFromDto(registerDto);
return CommonResponse.success("Wayble Zone Document 등록 완료!");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.wayble.server.explore.dto.recommend;

public record WaybleZoneRecommendResponseDto(

String username

) {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.search.dto;
package com.wayble.server.explore.dto.search;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.search.dto;
package com.wayble.server.explore.dto.search;

import com.wayble.server.common.entity.Address;
import com.wayble.server.wayblezone.entity.WaybleZoneType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.search.dto;
package com.wayble.server.explore.dto.search;

import com.wayble.server.wayblezone.entity.WaybleZoneType;
import jakarta.validation.constraints.DecimalMax;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.wayble.server.search.dto;
package com.wayble.server.explore.dto.search;

import com.wayble.server.search.entity.WaybleZoneDocument;
import com.wayble.server.explore.entity.WaybleZoneDocument;
import com.wayble.server.wayblezone.entity.WaybleZoneType;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.ToString;

@Builder(access = AccessLevel.PRIVATE)
public record WaybleZoneSearchResponseDto(
Expand All @@ -29,7 +28,7 @@ public record WaybleZoneSearchResponseDto(
) {
public static WaybleZoneSearchResponseDto from(WaybleZoneDocument waybleZoneDocument, Double distance) {
return WaybleZoneSearchResponseDto.builder()
.zoneId(waybleZoneDocument.getId())
.zoneId(waybleZoneDocument.getZoneId())
.zoneName(waybleZoneDocument.getZoneName())
.zoneType(waybleZoneDocument.getZoneType())
.thumbnailImageUrl(waybleZoneDocument.getThumbnailImageUrl())
Expand Down
43 changes: 43 additions & 0 deletions src/main/java/com/wayble/server/explore/entity/AgeGroup.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.wayble.server.explore.entity;

import java.time.LocalDate;
import java.time.Period;

public enum AgeGroup {
TEENAGERS,
TWENTIES,
THIRTIES,
FORTIES,
FIFTIES,
SIXTIES,
SEVENTIES,
EIGHTIES,
OTHERS;

public static AgeGroup fromBirthDate(LocalDate birthDate) {
if (birthDate == null) {
return OTHERS;
}
int age = Period.between(birthDate, LocalDate.now()).getYears();

if (age >= 10 && age < 20) {
return TEENAGERS;
} else if (age < 30) {
return TWENTIES;
} else if (age < 40) {
return THIRTIES;
} else if (age < 50) {
return FORTIES;
} else if (age < 60) {
return FIFTIES;
} else if (age < 70) {
return SIXTIES;
} else if (age < 80) {
return SEVENTIES;
} else if (age < 90) {
return EIGHTIES;
} else {
return OTHERS;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.search.entity;
package com.wayble.server.explore.entity;

import com.wayble.server.common.entity.Address;
import lombok.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.wayble.server.search.entity;
package com.wayble.server.explore.entity;

import com.wayble.server.search.dto.WaybleZoneDocumentRegisterDto;
import com.wayble.server.explore.dto.search.WaybleZoneDocumentRegisterDto;
import com.wayble.server.wayblezone.entity.WaybleZone;
import com.wayble.server.wayblezone.entity.WaybleZoneType;
import jakarta.persistence.Id;
import org.springframework.data.annotation.Id;
import lombok.*;
import org.springframework.data.elasticsearch.annotations.*;

Expand All @@ -18,7 +18,8 @@
public class WaybleZoneDocument {

@Id
private Long id;
@Field(name = "id")
private Long zoneId;

@Field(type = FieldType.Text,
analyzer = "korean_edge_ngram_analyzer",
Expand All @@ -38,7 +39,7 @@ public class WaybleZoneDocument {

public static WaybleZoneDocument fromEntity(WaybleZone waybleZone) {
return WaybleZoneDocument.builder()
.id(waybleZone.getId())
.zoneId(waybleZone.getId())
.zoneName(waybleZone.getZoneName())
.zoneType(waybleZone.getZoneType())
.thumbnailImageUrl("thumbnail image url") // TODO: 이미지 경로 추가
Expand All @@ -50,7 +51,7 @@ public static WaybleZoneDocument fromEntity(WaybleZone waybleZone) {

public static WaybleZoneDocument fromDto(WaybleZoneDocumentRegisterDto dto) {
return WaybleZoneDocument.builder()
.id(dto.zoneId())
.zoneId(dto.zoneId())
.zoneName(dto.zoneName())
.zoneType(dto.waybleZoneType())
.thumbnailImageUrl(dto.thumbnailImageUrl())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.wayble.server.explore.entity;

import org.springframework.data.annotation.Id;
import com.wayble.server.user.entity.Gender;
import com.wayble.server.user.entity.User;
import lombok.*;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

import java.util.UUID;

@ToString
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "wayble_zone_visit_log")
public class WaybleZoneVisitLogDocument {

@Id
@Field(name = "id")
private Long logId;

private Long userId;

private Long zoneId;

private Gender gender;

private AgeGroup ageGroup;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

AgeGroup 임포트가 누락되었습니다.

AgeGroup 타입이 사용되고 있지만 임포트 문이 누락되었습니다.

다음 임포트를 추가하세요:

+import com.wayble.server.user.entity.AgeGroup;

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
src/main/java/com/wayble/server/explore/entity/WaybleZoneVisitLogDocument.java
at line 26, the AgeGroup type is used but its import statement is missing. Add
the appropriate import statement for AgeGroup at the top of the file to resolve
the missing import issue.


public static WaybleZoneVisitLogDocument fromEntity(User user, Long zoneId) {
return WaybleZoneVisitLogDocument.builder()
.logId(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE)
.userId(user.getId())
.zoneId(zoneId)
.gender(user.getGender())
.ageGroup(AgeGroup.fromBirthDate(user.getBirthDate()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.wayble.server.explore.exception;

import com.wayble.server.common.exception.ErrorCase;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum RecommendErrorCase implements ErrorCase {

INVALID_USER(400, 6001, "잘못된 유저 정보입니다.");

private final Integer httpStatusCode;
private final Integer errorCode;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.search.exception;
package com.wayble.server.explore.exception;

import com.wayble.server.common.exception.ErrorCase;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.wayble.server.explore.repository;

import com.wayble.server.explore.entity.WaybleZoneDocument;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;
import java.util.Optional;

public interface WaybleZoneDocumentRepository extends ElasticsearchRepository<WaybleZoneDocument, Long>{
Optional<WaybleZoneDocument> findById(Long waybleZoneId);
List<WaybleZoneDocument> findAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.wayble.server.explore.repository;

import com.wayble.server.explore.entity.WaybleZoneVisitLogDocument;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;


public interface WaybleZoneVisitLogDocumentRepository extends ElasticsearchRepository<WaybleZoneVisitLogDocument, Long>{
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.wayble.server.explore.repository.recommend;

import com.wayble.server.explore.dto.recommend.WaybleZoneRecommendResponseDto;
import com.wayble.server.user.entity.User;
import lombok.RequiredArgsConstructor;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class WaybleZoneQueryRecommendRepository {

private final ElasticsearchOperations operations;

public WaybleZoneRecommendResponseDto searchPersonalWaybleZone(User user) {
return null;
}
Comment on lines +13 to +17
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

미구현 메서드가 null을 반환하여 NPE 위험이 있습니다

searchPersonalWaybleZone가 항상 null을 반환하면 서비스·컨트롤러 계층에서 바로 NullPointerException이 발생합니다.
최소한 TODO 주석과 함께 UnsupportedOperationException을 던지거나, 빈 WaybleZoneRecommendResponseDto를 반환하도록 수정하세요.

-    public WaybleZoneRecommendResponseDto searchPersonalWaybleZone(User user) {
-        return null;
-    }
+    public WaybleZoneRecommendResponseDto searchPersonalWaybleZone(User user) {
+        // TODO: Elasticsearch 쿼리 구현
+        throw new UnsupportedOperationException("검색 로직이 아직 구현되지 않았습니다.");
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
private final ElasticsearchOperations operations;
public WaybleZoneRecommendResponseDto searchPersonalWaybleZone(User user) {
return null;
}
private final ElasticsearchOperations operations;
public WaybleZoneRecommendResponseDto searchPersonalWaybleZone(User user) {
// TODO: Elasticsearch 쿼리 구현
throw new UnsupportedOperationException("검색 로직이 아직 구현되지 않았습니다.");
}
🤖 Prompt for AI Agents
In
src/main/java/com/wayble/server/explore/repository/recommend/WaybleZoneQueryRecommendRepository.java
around lines 13 to 17, the method searchPersonalWaybleZone currently returns
null, which risks causing NullPointerExceptions in higher layers. To fix this,
either throw an UnsupportedOperationException with a TODO comment indicating the
method is not yet implemented, or return an empty instance of
WaybleZoneRecommendResponseDto to avoid null returns.

}
Loading