Skip to content

Commit

Permalink
[fix] conflict 해결 - #102
Browse files Browse the repository at this point in the history
# Conflicts:
#	dateroad-api/src/main/java/org/dateroad/advertisement/api/AdvertisementController.java
#	dateroad-api/src/main/java/org/dateroad/advertisement/dto/response/AdvGetAllRes.java
#	dateroad-api/src/main/java/org/dateroad/advertisement/dto/response/AdvGetDetailRes.java
#	dateroad-api/src/main/java/org/dateroad/advertisement/service/AdvertisementService.java
#	dateroad-api/src/main/java/org/dateroad/auth/jwt/JwtValidator.java
#	dateroad-domain/src/main/java/org/dateroad/advertisement/repository/AdvertisementRepository.java
  • Loading branch information
sjk4618 committed Jul 15, 2024
2 parents 728cbfe + 1802435 commit b8e67e8
Show file tree
Hide file tree
Showing 63 changed files with 1,487 additions and 278 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;

@SpringBootApplication
public class DateroadApplication {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package org.dateroad.advertisement.api;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.dateroad.advertisement.dto.response.AdvGetAllRes;
import org.dateroad.advertisement.dto.response.AdvGetDetailRes;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;

@Tag(name = "광고 관련 API")
@SecurityRequirement(name = "Authorization")
public interface AdvertisementApi {
@Operation(
summary = "광고 전체 조회 API",
responses = {
@ApiResponse(
responseCode = "200",
content = @Content(
schema = @Schema(implementation = AdvGetAllRes.class),
examples = @ExampleObject(value = """
{
"advertismentDtoResList": [
{
"advertismentId": 1,
"thumbnail": "http://example.com/thumbnail1.jpg",
"title": "광고 제목 1",
},
{
"advertismentId": 2,
"thumbnail": "http://example.com/thumbnail2.jpg",
"title": "광고 제목 2",
},
{
"advertismentId": 3,
"thumbnail": "http://example.com/thumbnail2.jpg",
"title": "광고 제목 3",
},
{
"advertismentId": 4,
"thumbnail": "http://example.com/thumbnail2.jpg",
"title": "광고 제목 4",
}
]
}
""")
),
description = "요청이 성공했습니다."
),
@ApiResponse(
responseCode = "400",
description = "잘못된 요청입니다.",
content = @Content),
@ApiResponse(
responseCode = "401",
description = "액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.",
content = @Content),
@ApiResponse(
responseCode = "401",
description = "액세스 토큰의 값이 올바르지 않습니다.",
content = @Content),
@ApiResponse(
responseCode = "401",
description = "액세스 토큰이 만료되었습니다. 재발급 받아주세요.",
content = @Content),
@ApiResponse(
responseCode = "405",
description = "잘못된 HTTP method 요청입니다.",
content = @Content),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
ResponseEntity<AdvGetAllRes> getAllAdvertisements();

@Operation(
summary = "광고 상세 조회 API",
responses = {
@ApiResponse(
responseCode = "200",
content = @Content(
schema = @Schema(implementation = AdvGetDetailRes.class),
examples = @ExampleObject(value = """
{
"images": [
{
"imagesUrl": "http://example.com/image1.jpg",
"sequence": 1
},
{
"imagesUrl": "http://example.com/image2.jpg",
"sequence": 2
}
],
"title": "광고 제목",
"createAt": "2023.07.14",
"description": "광고 설명"
}
""")
),
description = "요청이 성공했습니다."
),
@ApiResponse(
responseCode = "400",
description = "잘못된 요청입니다.",
content = @Content),
@ApiResponse(
responseCode = "400",
description = "유효하지 않은 요청 파라미터 값입니다.",
content = @Content),
@ApiResponse(
responseCode = "401",
description = "액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.",
content = @Content),
@ApiResponse(
responseCode = "401",
description = "액세스 토큰의 값이 올바르지 않습니다.",
content = @Content),
@ApiResponse(
responseCode = "401",
description = "액세스 토큰이 만료되었습니다. 재발급 받아주세요.",
content = @Content),

@ApiResponse(
responseCode = "404",
description = "존재하지 않는 광고입니다.",
content = @Content),
@ApiResponse(
responseCode = "405",
description = "잘못된 HTTP method 요청입니다.",
content = @Content),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
ResponseEntity<AdvGetDetailRes> getAdvertisementsDetail(
@Parameter(required = true) final @PathVariable Long advId
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/advertisments")
@RequestMapping("/api/v1/advertisements")
public class AdvertisementController {
private final AdvertisementService advertisementService;

@GetMapping
public ResponseEntity<AdvGetAllRes> getAllAdvertisements(){
return ResponseEntity.ok(advertisementService.getAllAdvertisments());
return ResponseEntity.ok(advertisementService.getAllAdvertisements());
}

@GetMapping("{advId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,24 @@

@Builder(access = AccessLevel.PRIVATE)
public record AdvGetAllRes(
List<AdvertismentDtoRes> advertismentDtoResList
List<AdvertisementDtoRes> advertisementDtoResList
) {
public static AdvGetAllRes of(List<AdvertismentDtoRes> advertismentDtoResList) {
public static AdvGetAllRes of(List<AdvertisementDtoRes> advertisementDtoResList) {
return AdvGetAllRes.builder()
.advertismentDtoResList(advertismentDtoResList)
.advertisementDtoResList(advertisementDtoResList)
.build();
}

@Builder(access = AccessLevel.PRIVATE)
public record AdvertismentDtoRes(
Long advertismentId,
public record AdvertisementDtoRes(
Long advertisementId,
String thumbnail,
String title,
AdTagType tag
) {
public static AdvertismentDtoRes of(Advertisement advertisement) {
return AdvertismentDtoRes.builder()
.advertismentId(advertisement.getId())
public static AdvertisementDtoRes of(Advertisement advertisement) {
return AdvertisementDtoRes.builder()
.advertisementId(advertisement.getId())
.thumbnail(advertisement.getThumbnail())
.title(advertisement.getTitle())
.tag(advertisement.getTag())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package org.dateroad.advertisement.dto.response;

import org.dateroad.advertisement.domain.AdTagType;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import java.util.List;
Expand All @@ -12,14 +12,16 @@ public record AdvGetDetailRes(
String title,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul")
LocalDate createAt,
String description
String description,
AdTagType adTagType
) {
public static AdvGetDetailRes of(List<AdvImagesRes> images, String title, LocalDate createAt, String description) {
public static AdvGetDetailRes of(List<AdvImagesRes> images, String title, LocalDate createAt, String description, AdTagType type) {
return AdvGetDetailRes.builder()
.images(images)
.title(title)
.createAt(createAt)
.description(description)
.adTagType(type)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import org.dateroad.adImage.domain.AdImage;
import org.dateroad.adImage.repository.AdImageRepository;
import org.dateroad.advertisement.domain.Advertisement;
import org.dateroad.advertisement.repository.AdvertisementRepository;
import org.dateroad.advertisement.dto.response.AdvGetAllRes;
import org.dateroad.advertisement.dto.response.AdvGetAllRes.AdvertismentDtoRes;
import org.dateroad.advertisement.repository.AdvertisementRepository;
import org.dateroad.advertisement.dto.response.AdvGetAllRes.AdvertisementDtoRes;
import org.dateroad.advertisement.dto.response.AdvGetDetailRes;
import org.dateroad.advertisement.dto.response.AdvGetDetailRes.AdvImagesRes;
import org.dateroad.code.FailureCode;
Expand All @@ -25,26 +25,20 @@ public class AdvertisementService {
private final AdvertisementRepository advertisementRepository;
private final AdImageRepository adImageRepository;

private static List<AdvImagesRes> getImages(final List<AdImage> adImages) {
return adImages.stream().map(
adImage -> AdvImagesRes.of(adImage.getImageUrl(), adImage.getSequence())
).toList();
}

public AdvGetAllRes getAllAdvertisments() {
public AdvGetAllRes getAllAdvertisements() {
Pageable topFive = PageRequest.of(0, 5);
return AdvGetAllRes.of(advertisementRepository.findTop5ByOrderByCreatedDateDesc(topFive).
stream()
.map(AdvertismentDtoRes::of)
.collect(Collectors.toList()));
List<Advertisement> advertisements = advertisementRepository.findTop5ByOrderByCreatedDateDesc(topFive);
List<AdvertisementDtoRes> advertisementDtoResList = advertisements.stream()
.map(AdvertisementDtoRes::of).toList();
return AdvGetAllRes.of(advertisementDtoResList);
}

public AdvGetDetailRes getAdvertisementsDetail(final Long advId) {
Advertisement advertisement = getAdvertisement(advId);
List<AdImage> adImages = adImageRepository.findAllById(advId);
return AdvGetDetailRes.of(
getImages(adImages), advertisement.getTitle(), advertisement.getCreatedAt().toLocalDate(),
advertisement.getTitle()
advertisement.getTitle(), advertisement.getTag()
);
}

Expand All @@ -53,4 +47,10 @@ private Advertisement getAdvertisement(final Long advId) {
() -> new EntityNotFoundException(FailureCode.ADVERTISEMENT_NOT_FOUND)
);
}

private List<AdvImagesRes> getImages(final List<AdImage> adImages) {
return adImages.stream().map(
adImage -> AdvImagesRes.of(adImage.getImageUrl(), adImage.getSequence())
).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,9 @@
import org.dateroad.auth.jwt.refreshtoken.RefreshTokenGenerator;
import org.dateroad.code.FailureCode;
import org.dateroad.exception.UnauthorizedException;
import org.dateroad.refreshtoken.domain.RefreshToken;
import org.dateroad.refreshtoken.repository.RefreshTokenRepository;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Base64;

@RequiredArgsConstructor
@Component
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package org.dateroad.config;

import java.util.concurrent.Executor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
import io.lettuce.core.protocol.CommandKeyword;
import io.lettuce.core.protocol.CommandType;
import lombok.RequiredArgsConstructor;
import org.dateroad.date.repository.CourseRepository;
import org.dateroad.point.event.FreeEventListener;
import org.dateroad.point.event.pointEventListener;
import org.dateroad.point.event.PointEventListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -29,7 +28,7 @@
@Configuration
@RequiredArgsConstructor
public class RedisStreamConfig {
private final pointEventListener pointEventListener;
private final PointEventListener pointEventListener;
private final FreeEventListener freeEventListener;
@Value("${spring.data.redis.host}")
private String host;
Expand All @@ -51,9 +50,6 @@ public RedisConnectionFactory redisConnectionFactory() {
}

public void createStreamConsumerGroup(final String streamKey, final String consumerGroupName) {
// Stream이 존재 하지 않으면, MKSTREAM 옵션을 통해 만들고, ConsumerGroup또한 생성한다
System.out.println(streamKey + consumerGroupName);
// Stream이 존재하지 않으면, MKSTREAM 옵션을 통해 스트림과 소비자 그룹을 생성
if (Boolean.FALSE.equals(redisTemplate().hasKey(streamKey))) {
RedisAsyncCommands<String, String> commands = (RedisAsyncCommands<String, String>) Objects.requireNonNull(
redisTemplate()
Expand Down Expand Up @@ -94,7 +90,7 @@ public boolean isStreamConsumerGroupExist(final String streamKey, final String c
}

@Bean
public Subscription PointSubscription() {
public Subscription pointSubscription() {
createStreamConsumerGroup("coursePoint", "courseGroup");
StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, MapRecord<String, String, String>> containerOptions = StreamMessageListenerContainer.StreamMessageListenerContainerOptions
.builder().pollTimeout(Duration.ofMillis(100)).build();
Expand All @@ -110,7 +106,7 @@ public Subscription PointSubscription() {
}

@Bean
public Subscription FreeSubscription() {
public Subscription freeSubscription() {
createStreamConsumerGroup("courseFree", "courseGroup");
StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, MapRecord<String, String, String>> containerOptions = StreamMessageListenerContainer.StreamMessageListenerContainerOptions
.builder().pollTimeout(Duration.ofMillis(100)).build();
Expand Down
Loading

0 comments on commit b8e67e8

Please sign in to comment.