Skip to content

Commit

Permalink
Merge pull request #16 from dnd-side-project/feat/onboarding
Browse files Browse the repository at this point in the history
Feat/onboarding
  • Loading branch information
haeyonghahn committed Aug 23, 2023
2 parents 694b442 + 7b0a7b4 commit 3bc748e
Show file tree
Hide file tree
Showing 31 changed files with 649 additions and 6,115 deletions.
352 changes: 0 additions & 352 deletions log/2023-08/wrsungRestApi.2023-08-20.log

This file was deleted.

566 changes: 0 additions & 566 deletions log/2023-08/wrsungRestApi.2023-08-21.log

This file was deleted.

5,170 changes: 0 additions & 5,170 deletions log/wrsungRestApi.log

This file was deleted.

16 changes: 0 additions & 16 deletions src/main/java/com/dnd/gooding/domain/feed/FeedController.java

This file was deleted.

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));
}
}
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());
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/dnd/gooding/domain/feed/model/Feed.java
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;
}
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 {
}
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);
}
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 src/main/java/com/dnd/gooding/domain/feed/service/FeedService.java
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);
}
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());
}
}
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()));
}
}
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;
}
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();
}
}

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;
}
}
Loading

0 comments on commit 3bc748e

Please sign in to comment.