-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #16 from dnd-side-project/feat/onboarding
Feat/onboarding
- Loading branch information
Showing
31 changed files
with
649 additions
and
6,115 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
16 changes: 0 additions & 16 deletions
16
src/main/java/com/dnd/gooding/domain/feed/FeedController.java
This file was deleted.
Oops, something went wrong.
47 changes: 47 additions & 0 deletions
47
src/main/java/com/dnd/gooding/domain/feed/controller/FeedController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package com.dnd.gooding.domain.feed.controller; | ||
|
||
import io.swagger.v3.oas.annotations.Parameter; | ||
import io.swagger.v3.oas.annotations.Parameters; | ||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Pageable; | ||
import org.springframework.http.MediaType; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
import com.dnd.gooding.domain.feed.dto.response.FeedResponse; | ||
import com.dnd.gooding.domain.feed.service.FeedService; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
import java.util.List; | ||
|
||
@Tag(name = "Feed", description = "피드 API") | ||
@RestController | ||
@RequestMapping("/api/v1/feed") | ||
@RequiredArgsConstructor | ||
public class FeedController { | ||
|
||
private final FeedService feedService; | ||
|
||
@Operation(summary = "로그인한 사용자의 관심사로 피드를 조회한다.", | ||
responses = { | ||
@ApiResponse(responseCode = "200", description = "정상처리") | ||
}) | ||
@Parameters({ | ||
@Parameter(name = "userId", description = "로그인한 사용자 ID", required = true), | ||
@Parameter(name = "page", description = "페이지 번호"), | ||
@Parameter(name = "size", description = "페이지 크기") | ||
}) | ||
@GetMapping(value = "/{userId}", produces = MediaType.APPLICATION_JSON_VALUE) | ||
public ResponseEntity<Page<FeedResponse>> feed( | ||
@PathVariable Long userId, | ||
@RequestParam(name = "interests") List<String> interests, | ||
@Parameter(hidden = true) Pageable pageable) { | ||
return ResponseEntity | ||
.ok() | ||
.body(feedService.findByRecordIsNotUserId(userId, pageable)); | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
src/main/java/com/dnd/gooding/domain/feed/dto/response/FeedResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package com.dnd.gooding.domain.feed.dto.response; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
import com.dnd.gooding.domain.file.dto.response.RecordFileResponse; | ||
import com.dnd.gooding.domain.record.model.Record; | ||
import com.dnd.gooding.domain.user.dto.response.UserProfileResponse; | ||
|
||
import lombok.Getter; | ||
import lombok.Setter; | ||
|
||
@Getter | ||
@Setter | ||
public class FeedResponse { | ||
|
||
private Long recordId; | ||
private String title; | ||
private String description; | ||
private String placeTitle; | ||
private Double placeLatitude; | ||
private Double placeLongitude; | ||
private String interestType; | ||
private UserProfileResponse user; | ||
private List<RecordFileResponse> files; | ||
|
||
public FeedResponse(Record record) { | ||
this.recordId = record.getId(); | ||
this.title = record.getTitle(); | ||
this.description = record.getDescription(); | ||
this.placeTitle = record.getPlaceTitle(); | ||
this.placeLatitude = record.getPlaceLatitude(); | ||
this.placeLongitude = record.getPlaceLongitude(); | ||
this.interestType = record.getInterestType().getInterestName(); | ||
this.user = UserProfileResponse.from(record.getUser()); | ||
this.files = record.getFiles().stream() | ||
.map(file -> new RecordFileResponse(file)) | ||
.collect(Collectors.toList()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package com.dnd.gooding.domain.feed.model; | ||
|
||
import javax.persistence.Column; | ||
import javax.persistence.Entity; | ||
import javax.persistence.GeneratedValue; | ||
import javax.persistence.GenerationType; | ||
import javax.persistence.Id; | ||
import javax.persistence.JoinColumn; | ||
import javax.persistence.ManyToOne; | ||
import javax.persistence.Table; | ||
|
||
import com.dnd.gooding.domain.record.model.Record; | ||
import com.dnd.gooding.domain.user.model.User; | ||
|
||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Entity | ||
@Table(name = "feed") | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
@Getter | ||
public class Feed { | ||
|
||
@Id | ||
@Column(name = "feed_id") | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "user_id") | ||
private User user; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "record_id") | ||
private Record record; | ||
|
||
@Column(name = "feed_score") | ||
private Integer feedScore; | ||
|
||
@Column(name = "feed_save") | ||
private String feedSave; | ||
} |
8 changes: 8 additions & 0 deletions
8
src/main/java/com/dnd/gooding/domain/feed/repository/FeedRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package com.dnd.gooding.domain.feed.repository; | ||
|
||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
import com.dnd.gooding.domain.feed.model.Feed; | ||
|
||
public interface FeedRepository extends JpaRepository<Feed, Long>, FeedRepositoryCustom { | ||
} |
11 changes: 11 additions & 0 deletions
11
src/main/java/com/dnd/gooding/domain/feed/repository/FeedRepositoryCustom.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.dnd.gooding.domain.feed.repository; | ||
|
||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Pageable; | ||
|
||
import com.dnd.gooding.domain.record.model.Record; | ||
|
||
public interface FeedRepositoryCustom { | ||
|
||
Page<Record> findByRecordIsNotUserId(Long userId, Pageable pageable); | ||
} |
46 changes: 46 additions & 0 deletions
46
src/main/java/com/dnd/gooding/domain/feed/repository/FeedRepositoryImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
package com.dnd.gooding.domain.feed.repository; | ||
|
||
import static com.dnd.gooding.domain.file.model.QFile.*; | ||
import static com.dnd.gooding.domain.record.model.QRecord.*; | ||
import static com.dnd.gooding.domain.user.model.QUser.*; | ||
|
||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Pageable; | ||
|
||
import com.dnd.gooding.domain.feed.model.Feed; | ||
import com.dnd.gooding.domain.record.model.Record; | ||
import com.dnd.gooding.global.common.repository.Querydsl4RepositorySupport; | ||
import com.querydsl.core.types.dsl.BooleanExpression; | ||
|
||
public class FeedRepositoryImpl extends Querydsl4RepositorySupport implements FeedRepositoryCustom { | ||
|
||
public FeedRepositoryImpl() { | ||
super(Feed.class); | ||
} | ||
|
||
@Override | ||
public Page<Record> findByRecordIsNotUserId(Long userId, Pageable pageable) { | ||
return applyPagination(pageable, contentQuery -> contentQuery | ||
.select(record).distinct() | ||
.from(record) | ||
.join(record.user, user).fetchJoin() | ||
.join(record.files, file).fetchJoin() | ||
.where(userIdNotEquals(userId)) | ||
.orderBy( | ||
record.createdDate.desc() | ||
), countQuery -> countQuery | ||
.select(record).distinct() | ||
.from(record) | ||
.join(record.user, user).fetchJoin() | ||
.join(record.files, file).fetchJoin() | ||
.where(userIdNotEquals(userId)) | ||
.orderBy( | ||
record.createdDate.desc() | ||
) | ||
); | ||
} | ||
|
||
private BooleanExpression userIdNotEquals(Long userId) { | ||
return record.user.id.ne(userId); | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
src/main/java/com/dnd/gooding/domain/feed/service/FeedService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.dnd.gooding.domain.feed.service; | ||
|
||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Pageable; | ||
|
||
import com.dnd.gooding.domain.feed.dto.response.FeedResponse; | ||
|
||
public interface FeedService { | ||
|
||
Page<FeedResponse> findByRecordIsNotUserId(Long userId, Pageable pageable); | ||
} |
32 changes: 32 additions & 0 deletions
32
src/main/java/com/dnd/gooding/domain/feed/service/FeedServiceImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package com.dnd.gooding.domain.feed.service; | ||
|
||
import java.util.stream.Collectors; | ||
|
||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.PageImpl; | ||
import org.springframework.data.domain.Pageable; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import com.dnd.gooding.domain.feed.dto.response.FeedResponse; | ||
import com.dnd.gooding.domain.feed.repository.FeedRepository; | ||
import com.dnd.gooding.domain.record.model.Record; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Service | ||
@Transactional(readOnly = true) | ||
@RequiredArgsConstructor | ||
public class FeedServiceImpl implements FeedService { | ||
|
||
private final FeedRepository feedRepository; | ||
|
||
@Override | ||
public Page<FeedResponse> findByRecordIsNotUserId(Long userId, Pageable pageable) { | ||
Page<Record> records = feedRepository.findByRecordIsNotUserId(userId, pageable); | ||
return new PageImpl<FeedResponse>(records.stream() | ||
.map(FeedResponse::new) | ||
.collect(Collectors.toList()), | ||
pageable, records.getTotalElements()); | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/main/java/com/dnd/gooding/domain/onboarding/controller/OnboardingController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package com.dnd.gooding.domain.onboarding.controller; | ||
|
||
import com.dnd.gooding.domain.onboarding.dto.request.OnboardingRequest; | ||
import com.dnd.gooding.domain.onboarding.service.OnboardingService; | ||
import com.dnd.gooding.domain.user.dto.response.UserProfileResponse; | ||
import com.dnd.gooding.global.common.dto.ErrorResponse; | ||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.media.Content; | ||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.http.MediaType; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
@Tag(name = "Onboard", description = " 온보딩 API") | ||
@RestController | ||
@RequestMapping("/api/v1/onboard") | ||
@RequiredArgsConstructor | ||
public class OnboardingController { | ||
|
||
private final OnboardingService onboardingService; | ||
|
||
@Operation(summary = "온보딩 내용을 저장한다.", | ||
responses = { | ||
@ApiResponse(responseCode = "200", description = "정상처리"), | ||
@ApiResponse(responseCode = "404", description = "존재하지 않는 사용자입니다.", | ||
content = @Content(schema = @Schema(implementation = ErrorResponse.class))) | ||
}) | ||
@PostMapping(value = "/update/{userId}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, | ||
produces = MediaType.APPLICATION_JSON_VALUE) | ||
public ResponseEntity<UserProfileResponse> update( | ||
@PathVariable("userId") Long userId, | ||
OnboardingRequest onboardingRequest) { | ||
return ResponseEntity | ||
.ok() | ||
.body(onboardingService.findByUserIdAndUpdate(userId, | ||
onboardingRequest.getNickName(), onboardingRequest.getInterestCodes())); | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
src/main/java/com/dnd/gooding/domain/onboarding/dto/request/OnboardingRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.dnd.gooding.domain.onboarding.dto.request; | ||
|
||
import java.util.List; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Getter; | ||
import lombok.Setter; | ||
|
||
@Getter | ||
@Setter | ||
@AllArgsConstructor | ||
public class OnboardingRequest { | ||
private String nickName; | ||
private List<String> interestCodes; | ||
} |
32 changes: 32 additions & 0 deletions
32
src/main/java/com/dnd/gooding/domain/onboarding/dto/response/OnboardingResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package com.dnd.gooding.domain.onboarding.dto.response; | ||
|
||
import com.dnd.gooding.domain.onboarding.model.Onboarding; | ||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import lombok.*; | ||
|
||
@Builder | ||
@Getter | ||
@Setter | ||
@AllArgsConstructor | ||
@NoArgsConstructor | ||
@Schema(description = "관심사 정보") | ||
public class OnboardingResponse { | ||
private Long id; | ||
private String interestCode; | ||
private String interestName; | ||
|
||
public OnboardingResponse(Onboarding onboarding) { | ||
this.id = onboarding.getId(); | ||
this.interestCode = onboarding.getInterestType().getInterestCode(); | ||
this.interestName = onboarding.getInterestType().getInterestName(); | ||
} | ||
|
||
public static OnboardingResponse from(Onboarding onboarding) { | ||
return OnboardingResponse.builder() | ||
.id(onboarding.getId()) | ||
.interestCode(onboarding.getInterestType().getInterestCode()) | ||
.interestName(onboarding.getInterestType().getInterestName()) | ||
.build(); | ||
} | ||
} | ||
|
39 changes: 39 additions & 0 deletions
39
src/main/java/com/dnd/gooding/domain/onboarding/model/Onboarding.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package com.dnd.gooding.domain.onboarding.model; | ||
|
||
import com.dnd.gooding.domain.user.model.User; | ||
import com.dnd.gooding.global.common.converter.InterestConverter; | ||
import com.dnd.gooding.global.common.model.BaseEntity; | ||
import com.dnd.gooding.global.common.model.InterestType; | ||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
import javax.persistence.*; | ||
|
||
@Entity | ||
@Table(name = "onboarding") | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
@Getter | ||
public class Onboarding extends BaseEntity { | ||
|
||
@Id | ||
@Column(name = "onboarding_id") | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@Enumerated | ||
@Column(name = "interest_type") | ||
@Convert(converter = InterestConverter.class) | ||
private InterestType interestType; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY) | ||
@JoinColumn(name = "user_id") | ||
private User user; | ||
|
||
public static Onboarding from(User user, String interestCode) { | ||
Onboarding onboarding = new Onboarding(); | ||
onboarding.interestType = InterestType.ofInterestCode(interestCode); | ||
onboarding.user = user; | ||
return onboarding; | ||
} | ||
} |
Oops, something went wrong.