Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…ang-log into fix/expenseShare
  • Loading branch information
Dahyeeee committed Sep 21, 2023
2 parents 6abd85d + ec9f769 commit 8ca1243
Show file tree
Hide file tree
Showing 87 changed files with 631 additions and 138 deletions.
26 changes: 25 additions & 1 deletion backend/src/docs/asciidoc/docs.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -296,13 +296,14 @@ include::{snippets}/shared-trip-controller-test/get-shared-trip/path-parameters.

==== 응답
include::{snippets}/shared-trip-controller-test/get-shared-trip/http-response.adoc[]
include::{snippets}/shared-trip-controller-test/get-shared-trip/path-parameters.adoc[]
include::{snippets}/shared-trip-controller-test/get-shared-trip/response-fields.adoc[]

=== 공유 상태 수정 (PATCH /trips/:tripId/share)

==== 요청
include::{snippets}/shared-trip-controller-test/update-shared-status/http-request.adoc[]
include::{snippets}/shared-trip-controller-test/update-shared-status/path-parameters.adoc[]
include::{snippets}/shared-trip-controller-test/update-shared-status/request-fields.adoc[]

==== 응답
include::{snippets}/shared-trip-controller-test/update-shared-status/http-response.adoc[]
Expand All @@ -317,3 +318,26 @@ include::{snippets}/shared-trip-controller-test/get-shared-expenses/path-paramet
==== 응답
include::{snippets}/shared-trip-controller-test/get-shared-expenses/http-response.adoc[]
include::{snippets}/shared-trip-controller-test/get-shared-expenses/response-fields.adoc[]

== 커뮤니티 API

=== 공개 여행 페이지 조회 (GET /community/trips)

==== 요청
include::{snippets}/community-controller-test/get-trips-by-page/http-request.adoc[]
include::{snippets}/community-controller-test/get-trips-by-page/path-parameters.adoc[]

==== 응답
include::{snippets}/community-controller-test/get-trips-by-page/http-response.adoc[]
include::{snippets}/community-controller-test/get-trips-by-page/path-parameters.adoc[]

== 커뮤니티 API

=== 공개 여행 페이지 조회 (GET /community/trips)

==== 요청
include::{snippets}/community-controller-test/get-trips-by-page/http-request.adoc[]

==== 응답
include::{snippets}/community-controller-test/get-trips-by-page/http-response.adoc[]
include::{snippets}/community-controller-test/get-trips-by-page/response-fields.adoc[]
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package hanglog.trip.domain;
package hanglog.community.domain;

import static jakarta.persistence.FetchType.LAZY;
import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

import hanglog.member.domain.Member;
import hanglog.trip.domain.Trip;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
Expand All @@ -18,7 +19,7 @@
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = PROTECTED)
public class Like {
public class Likes {

@Id
@GeneratedValue(strategy = IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package hanglog.trip.domain;
package hanglog.community.domain;

import static jakarta.persistence.FetchType.LAZY;
import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

import hanglog.global.BaseEntity;
import hanglog.trip.domain.Trip;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package hanglog.community.domain.repository;

import hanglog.community.domain.Likes;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LikesRepository extends JpaRepository<Likes, Long> {

boolean existsByMemberIdAndTripId(final Long memberId, final Long tripId);

Long countLikesByTripId(final Long tripId);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package hanglog.trip.domain.type;
package hanglog.community.domain.type;

public enum PublishedStatusType {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package hanglog.community.dto.response;

import java.util.List;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class CommunityTripListResponse {

final List<CommunityTripResponse> trips;
final Long lastPageIndex;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package hanglog.community.dto.response;

import static hanglog.image.util.ImageUrlConverter.convertNameToUrl;
import static lombok.AccessLevel.PRIVATE;

import hanglog.city.domain.City;
import hanglog.city.dto.response.CityResponse;
import hanglog.share.dto.response.WriterResponse;
import hanglog.trip.domain.Trip;
import java.time.LocalDate;
import java.util.List;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor(access = PRIVATE)
public class CommunityTripResponse {

private final Long id;
private final List<CityResponse> cities;
private final WriterResponse writer;
private final String title;
private final LocalDate startDate;
private final LocalDate endDate;
private final String description;
private final String imageUrl;
private final Boolean isLike;
private final String authorNickname;
private final Long likeCount;

public static CommunityTripResponse of(
final Trip trip,
final List<City> cities,
final boolean isLike,
final Long likeCount
) {
final List<CityResponse> cityResponses = cities.stream()
.map(CityResponse::of)
.toList();

return new CommunityTripResponse(
trip.getId(),
cityResponses,
WriterResponse.of(trip.getMember()),
trip.getTitle(),
trip.getStartDate(),
trip.getEndDate(),
trip.getDescription(),
convertNameToUrl(trip.getImageName()),
isLike,
trip.getMember().getNickname(),
likeCount
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package hanglog.community.presentation;

import static org.springframework.data.domain.Sort.Direction.DESC;

import hanglog.auth.Auth;
import hanglog.auth.domain.Accessor;
import hanglog.community.dto.response.CommunityTripListResponse;
import hanglog.community.service.CommunityService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/community")
public class CommunityController {

private final CommunityService communityService;

@GetMapping("/trips")
public ResponseEntity<CommunityTripListResponse> getTrips(
@Auth final Accessor accessor,
@PageableDefault(sort = "publishedTrip.id", direction = DESC) final Pageable pageable
) {
final CommunityTripListResponse communityTripListResponse = communityService.getTripsByPage(accessor, pageable);
return ResponseEntity.ok().body(communityTripListResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package hanglog.community.service;

import static hanglog.community.domain.type.PublishedStatusType.PUBLISHED;

import hanglog.auth.domain.Accessor;
import hanglog.city.domain.City;
import hanglog.community.domain.repository.LikesRepository;
import hanglog.community.dto.response.CommunityTripListResponse;
import hanglog.community.dto.response.CommunityTripResponse;
import hanglog.trip.domain.Trip;
import hanglog.trip.domain.TripCity;
import hanglog.trip.domain.repository.TripCityRepository;
import hanglog.trip.domain.repository.TripRepository;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
public class CommunityService {

private final LikesRepository likesRepository;
private final TripRepository tripRepository;
private final TripCityRepository tripCityRepository;

public CommunityTripListResponse getTripsByPage(final Accessor accessor, final Pageable pageable) {
final List<Trip> trips = tripRepository.findPublishedTripByPageable(pageable.previousOrFirst());
final List<CommunityTripResponse> communityTripResponse = trips.stream()
.map(trip -> getTripResponse(accessor, trip))
.toList();
final Long lastPageIndex =
tripRepository.countTripByPublishedStatus(PUBLISHED) / pageable.getPageSize() + 1;
return new CommunityTripListResponse(communityTripResponse, lastPageIndex);
}

private CommunityTripResponse getTripResponse(final Accessor accessor, final Trip trip) {
final List<City> cities = getCitiesByTripId(trip.getId());
final Long likeCount = likesRepository.countLikesByTripId(trip.getId());

if (accessor.isMember()) {
final boolean isLike = likesRepository.existsByMemberIdAndTripId(trip.getMember().getId(), trip.getId());
return CommunityTripResponse.of(trip, cities, isLike, likeCount);
}
return CommunityTripResponse.of(trip, cities, false, likeCount);
}

private List<City> getCitiesByTripId(final Long tripId) {
return tripCityRepository.findByTripId(tripId).stream()
.map(TripCity::getCity)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package hanglog.share.dto.response;

import static hanglog.image.util.ImageUrlConverter.convertNameToUrl;
import static lombok.AccessLevel.PRIVATE;

import hanglog.city.domain.City;
import hanglog.city.dto.response.CityWithPositionResponse;
import hanglog.trip.domain.Trip;
import hanglog.trip.dto.response.DayLogResponse;
import java.time.LocalDate;
import java.util.List;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor(access = PRIVATE)
public class SharedTripDetailResponse {

private final Long id;
private final List<CityWithPositionResponse> cities;
private final WriterResponse writer;
private final String title;
private final LocalDate startDate;
private final LocalDate endDate;
private final String description;
private final String imageUrl;
private final String sharedCode;
private final List<DayLogResponse> dayLogs;

public static SharedTripDetailResponse of(final Trip trip, final List<City> cities) {
final List<DayLogResponse> dayLogResponses = trip.getDayLogs().stream()
.map(DayLogResponse::of)
.toList();

final List<CityWithPositionResponse> cityWithPositionResponses = cities.stream()
.map(CityWithPositionResponse::of)
.toList();

final String sharedCode = trip.getSharedCode().orElse(null);

return new SharedTripDetailResponse(
trip.getId(),
cityWithPositionResponses,
WriterResponse.of(trip.getMember()),
trip.getTitle(),
trip.getStartDate(),
trip.getEndDate(),
trip.getDescription(),
convertNameToUrl(trip.getImageName()),
sharedCode,
dayLogResponses
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package hanglog.share.dto.response;

import static lombok.AccessLevel.PRIVATE;

import hanglog.member.domain.Member;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor(access = PRIVATE)
public class WriterResponse {

private final String nickname;
private final String imageUrl;

public static WriterResponse of(final Member member) {
return new WriterResponse(member.getNickname(), member.getImageUrl());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import hanglog.expense.service.ExpenseService;
import hanglog.share.dto.request.SharedTripStatusRequest;
import hanglog.share.dto.response.SharedTripCodeResponse;
import hanglog.share.dto.response.SharedTripDetailResponse;
import hanglog.share.service.SharedTripService;
import hanglog.trip.dto.response.TripDetailResponse;
import hanglog.trip.service.TripService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand All @@ -28,10 +28,10 @@ public class SharedTripController {
private final ExpenseService expenseService;

@GetMapping("/shared-trips/{sharedCode}")
public ResponseEntity<TripDetailResponse> getSharedTrip(@PathVariable final String sharedCode) {
public ResponseEntity<SharedTripDetailResponse> getSharedTrip(@PathVariable final String sharedCode) {
final Long tripId = sharedTripService.getTripId(sharedCode);
final TripDetailResponse tripDetailResponse = tripService.getTripDetail(tripId);
return ResponseEntity.ok().body(tripDetailResponse);
final SharedTripDetailResponse sharedTripDetailResponse = sharedTripService.getSharedTripDetail(tripId);
return ResponseEntity.ok().body(sharedTripDetailResponse);
}

@PatchMapping("/trips/{tripId}/share")
Expand Down
Loading

0 comments on commit 8ca1243

Please sign in to comment.