Skip to content

Commit

Permalink
Merge branch 'dev' into feat/#35
Browse files Browse the repository at this point in the history
  • Loading branch information
hhyuun authored Sep 27, 2024
2 parents d4e2ff2 + 436c8ce commit 000e656
Show file tree
Hide file tree
Showing 29 changed files with 948 additions and 35 deletions.
7 changes: 7 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ jobs:
- name: repository checkout
uses: actions/checkout@v3

- name: Docker 시스템 정리
run: |
docker container prune -f
docker image prune -a -f
docker volume prune -f
docker rmi $(docker images -f "dangling=true" -q) || true
- name: 배포
run: |
mkdir -p /home/ubuntu/logs
Expand Down
10 changes: 10 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ dependencies {
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6'

// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

// mysql
runtimeOnly 'com.mysql:mysql-connector-j'

Expand All @@ -70,3 +76,7 @@ dependencyManagement {
tasks.named('test') {
useJUnitPlatform()
}

clean {
delete file('src/main/generated')
}
20 changes: 20 additions & 0 deletions src/main/java/org/example/tokpik_be/config/QueryDslConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.example.tokpik_be.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class QueryDslConfig {

private final EntityManager entityManager;

@Bean
public JPAQueryFactory jpaQueryFactory() {

return new JPAQueryFactory(entityManager);
}
}
15 changes: 15 additions & 0 deletions src/main/java/org/example/tokpik_be/exception/ScrapException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.example.tokpik_be.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum ScrapException implements BaseException {

SCRAP_NOT_FOUND(HttpStatus.BAD_REQUEST, "존재하지 않는 스크랩");

private final HttpStatus status;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.example.tokpik_be.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum TalkTopicException implements BaseException {

TALK_TOPIC_NOT_FOUND(HttpStatus.BAD_REQUEST, "존재하지 않는 대화 주제");

private final HttpStatus status;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
package org.example.tokpik_be.scrap.controller;

import org.example.tokpik_be.scrap.dto.response.ScrapCountResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.example.tokpik_be.scrap.dto.request.ScrapCreateRequest;
import org.example.tokpik_be.scrap.dto.response.ScrapCreateResponse;
import org.example.tokpik_be.scrap.dto.response.ScrapListResponse;
import org.example.tokpik_be.scrap.service.ScrapService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

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;

@Tag(name = "Scrap API", description = "스크랩 관련 API")

@Tag(name = "스크랩 API", description = "스크랩 연관 API")
@RestController
@RequiredArgsConstructor
public class ScrapController {
Expand All @@ -29,6 +39,7 @@ public ResponseEntity<ScrapListResponse> getScrapList(
return ResponseEntity.ok(scrapListResponse);
}


@Operation(summary = "총 스크랩 수 조회", description = "총 스크랩 수 조회")
@ApiResponse(responseCode = "200", description = "스크랩 수 조회 성공")
@GetMapping("/users/scraps/count")
Expand All @@ -38,7 +49,6 @@ public ResponseEntity<ScrapCountResponse> getScrapCounts(
return ResponseEntity.ok(scrapCountResponse);
}


@Operation(summary = "총 스크랩 톡픽 수 조회", description = "사용자 총 스크랩 톡픽 수 조회")
@ApiResponse(responseCode = "200", description = "스크랩 톡픽 수 조회 성공")
@GetMapping("/users/scraps/topik/count")
Expand All @@ -47,4 +57,31 @@ public ResponseEntity<ScrapCountResponse> getTopicCounts(
ScrapCountResponse scrapCountResponse = scrapService.getUserTopicCounts(userId);
return ResponseEntity.ok(scrapCountResponse);
}

@Operation(summary = "스크랩 생성", description = "스크랩 생성")
@ApiResponse(responseCode = "200", description = "스크랩 생성 성공")
@PostMapping("/users/scraps")
public ResponseEntity<ScrapCreateResponse> createScrap(@RequestAttribute("userId") long userId,
@RequestBody @Valid ScrapCreateRequest scrapCreateRequest) {

ScrapCreateResponse response = scrapService.createScrap(userId, scrapCreateRequest);

return ResponseEntity.ok().body(response);
}

@Operation(summary = "대화 주제 스크랩", description = "대화 주제 스크랩")
@ApiResponse(responseCode = "200", description = "대화 주제 스크랩 성공")
@PostMapping("/users/scraps/{scrapId}/topics/{topicId}")
public ResponseEntity<Void> scrapTopic(
@Parameter(name = "scrapId", description = "스크랩 ID", example = "1", in = ParameterIn.PATH)
@PathVariable("scrapId") long scrapId,

@Parameter(name = "topicId", description = "스크랩할 대화 주제 ID", example = "1", in = ParameterIn.PATH)
@PathVariable("topicId") long topicId) {

scrapService.scrapTopic(scrapId, topicId);

return ResponseEntity.ok().build();

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.example.tokpik_be.scrap.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

public record ScrapCreateRequest(
@Schema(type = "string", description = "스크랩 이름(제목)", example = "여친과 하기 좋은 대화 주제")
@NotBlank(message = "스크랩 이름은 필수값")
String scrapName
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.example.tokpik_be.scrap.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

public record ScrapCreateResponse(
@Schema(type = "number", description = "생성된 스크랩 ID", example = "1")
long scrapId
) {

}
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package org.example.tokpik_be.scrap.service;

import java.util.List;

import lombok.RequiredArgsConstructor;
import org.example.tokpik_be.exception.GeneralException;
import org.example.tokpik_be.exception.ScrapException;
import org.example.tokpik_be.scrap.domain.Scrap;
import org.example.tokpik_be.scrap.domain.ScrapTopic;
import org.example.tokpik_be.scrap.dto.response.ScrapCountResponse;
import org.example.tokpik_be.scrap.dto.request.ScrapCreateRequest;
import org.example.tokpik_be.scrap.dto.response.ScrapCreateResponse;
import org.example.tokpik_be.scrap.dto.response.ScrapListResponse;
import org.example.tokpik_be.scrap.repository.ScrapRepository;
import org.example.tokpik_be.scrap.repository.ScrapTopicRepository;
import org.example.tokpik_be.talk_topic.domain.TalkTopic;
import org.example.tokpik_be.talk_topic.service.TalkTopicQueryService;
import org.example.tokpik_be.user.domain.User;
import org.example.tokpik_be.user.service.UserQueryService;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
Expand All @@ -22,6 +26,7 @@ public class ScrapService {
private final ScrapRepository scrapRepository;
private final ScrapTopicRepository scrapTopicRepository;
private final UserQueryService userQueryService;
private final TalkTopicQueryService talkTopicQueryService;

public ScrapListResponse getScrapList(long userId) {

Expand Down Expand Up @@ -75,4 +80,30 @@ public ScrapCountResponse getUserTopicCounts(long userId){

return new ScrapCountResponse(count);
}

@Transactional
public ScrapCreateResponse createScrap(long userId, ScrapCreateRequest request) {
User user = userQueryService.findById(userId);

Scrap scrap = new Scrap(request.scrapName(), user);
scrapRepository.save(scrap);

return new ScrapCreateResponse(scrap.getId());
}

@Transactional
public void scrapTopic(long scrapId, long topicId) {
Scrap scrap = findById(scrapId);
TalkTopic talkTopic = talkTopicQueryService.findById(topicId);

ScrapTopic scrapTopic = new ScrapTopic(scrap, talkTopic);
scrapTopicRepository.save(scrapTopic);
}

private Scrap findById(long scrapId) {

return scrapRepository.findById(scrapId)
.orElseThrow(() -> new GeneralException(ScrapException.SCRAP_NOT_FOUND));

}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package org.example.tokpik_be.tag.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.example.tokpik_be.tag.dto.request.UserPlaceTagsRequest;
import org.example.tokpik_be.tag.dto.response.PlaceTagTotalResponse;
import org.example.tokpik_be.tag.dto.response.UserPlaceTagResponse;
import org.example.tokpik_be.tag.service.PlaceTagService;
import org.springframework.http.ResponseEntity;
Expand All @@ -10,11 +15,6 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
public class PlaceTagController {
Expand Down Expand Up @@ -43,4 +43,14 @@ public ResponseEntity<UserPlaceTagResponse> updateUserPlaceTags(

return ResponseEntity.ok().body(response);
}

@Operation(summary = "전체 대화 장소 조회", description = "전체 대화 장소 조회")
@ApiResponse(responseCode = "200", description = "전체 대화 장소 조회 성공")
@GetMapping("/place-tags")
public ResponseEntity<PlaceTagTotalResponse> getAllPlaceTags() {

PlaceTagTotalResponse response = placeTagService.getAllPlaceTags();

return ResponseEntity.ok().body(response);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package org.example.tokpik_be.tag.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.example.tokpik_be.tag.dto.request.UserTopicTagsRequest;
import org.example.tokpik_be.tag.dto.response.TopicTagTotalResponse;
import org.example.tokpik_be.tag.dto.response.UserTopicTagResponse;
import org.example.tokpik_be.tag.service.TopicTagService;
import org.springframework.http.ResponseEntity;
Expand All @@ -10,11 +15,6 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
public class TopicTagController {
Expand Down Expand Up @@ -44,4 +44,13 @@ public ResponseEntity<UserTopicTagResponse> updateUserTopicTags(
return ResponseEntity.ok().body(response);
}

@Operation(summary = "전체 대화 종류 조회", description = "전체 대화 종류 조회")
@ApiResponse(responseCode = "200", description = "전체 대화 종류 조회 성공")
@GetMapping("/topic-tags")
public ResponseEntity<TopicTagTotalResponse> getAllTopicTags() {

TopicTagTotalResponse response = topicTagService.getAllTopicTags();

return ResponseEntity.ok().body(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.example.tokpik_be.tag.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import org.example.tokpik_be.tag.domain.PlaceTag;

public record PlaceTagTotalResponse(
@Schema(type = "array", description = "대화 장소들")
List<PlaceTagResponse> placeTags
) {

public record PlaceTagResponse(
@Schema(type = "number", description = "대화 장소 ID", example = "1")
long placeTagId,

@Schema(type = "string", description = "대화 장소 내용", example = "학교")
String content
) {

public static PlaceTagResponse from(PlaceTag placeTag) {

return new PlaceTagResponse(placeTag.getId(), placeTag.getContent());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.example.tokpik_be.tag.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import org.example.tokpik_be.tag.domain.TopicTag;

public record TopicTagTotalResponse(
@Schema(type = "array", description = "대화 종류들")
List<TopicTagResponse> topicTags
) {

public record TopicTagResponse(
@Schema(type = "number", description = "대화 종류 ID", example = "1")
long talkTypeId,

@Schema(type = "string", description = "대화 종류 내용", example = "비즈니스와 업무")
String content
) {

public static TopicTagResponse from(TopicTag topicTag) {

return new TopicTagResponse(topicTag.getId(), topicTag.getContent());
}
}
}
Loading

0 comments on commit 000e656

Please sign in to comment.