Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions .env.prod

This file was deleted.

Empty file modified gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.cotato.itda.domain.chattopic.controller;

import com.cotato.itda.domain.chattopic.dto.res.ChatTopicResDTO;
import com.cotato.itda.domain.chattopic.service.query.ChatTopicQueryService;
import com.cotato.itda.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/chat-topics")
@Tag(name = "ChatTopic", description = "대화 주제")
public class ChatTopicController implements ChatTopicControllerDocs {

private final ChatTopicQueryService chatTopicQueryService;

@GetMapping
@Override
public ApiResponse<ChatTopicResDTO.ChatTopicListDTO> getChatTopics() {
return ApiResponse.success(chatTopicQueryService.getChatTopics());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.cotato.itda.domain.chattopic.controller;

import com.cotato.itda.domain.chattopic.dto.res.ChatTopicResDTO;
import com.cotato.itda.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import org.springframework.web.bind.annotation.GetMapping;

public interface ChatTopicControllerDocs {

@Operation(
summary = "대화 주제 조회 API By 정원",
description = "활성화된 대화 주제 목록만 조회합니다."
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공")
})
@GetMapping
ApiResponse<ChatTopicResDTO.ChatTopicListDTO> getChatTopics();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cotato.itda.domain.chattopic.converter;

import com.cotato.itda.domain.chattopic.dto.res.ChatTopicResDTO;
import com.cotato.itda.domain.chattopic.entity.ChatTopic;

import java.util.List;

public class ChatTopicConverter {

// Entity -> DTO
public static ChatTopicResDTO.ChatTopicDTO toChatTopicDTO(ChatTopic chatTopic) {
return ChatTopicResDTO.ChatTopicDTO.builder()
.name(chatTopic.getName())
.code(chatTopic.getCode())
.build();
}

public static ChatTopicResDTO.ChatTopicListDTO toChatTopicListDTO(List<ChatTopic> chatTopics) {
return ChatTopicResDTO.ChatTopicListDTO.builder()
.count(chatTopics.size())
.chatTopicList(chatTopics.stream()
.map(ChatTopicConverter::toChatTopicDTO)
.toList())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cotato.itda.domain.chattopic.dto.res;

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

import java.util.List;

public class ChatTopicResDTO {

@Builder
public record ChatTopicListDTO(
@Schema(description = "채팅 주제 개수", example = "10")
Integer count,
@Schema(description = "채팅 주제 목록")
List<ChatTopicDTO> chatTopicList
) {}

@Builder
public record ChatTopicDTO(
@Schema(description = "주제 이름", example = "일상")
String name,
@Schema(description = "주제 코드", example = "DAILY_LIFE")
String code
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cotato.itda.domain.chattopic.entity;

import com.cotato.itda.global.entity.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.*;

@Entity
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Table(name = "chat_topic")
public class ChatTopic extends BaseEntity {

@Column(name = "name", nullable = false)
private String name;

@Column(name = "code", nullable = false, unique = true)
private String code;

@Column(name = "is_active", nullable = false)
@Builder.Default
private Boolean isActive = true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.cotato.itda.domain.chattopic.exception;

import com.cotato.itda.domain.chattopic.exception.code.ChatTopicErrorCode;
import com.cotato.itda.global.error.exception.BusinessException;

import java.util.Map;

public class ChatTopicException extends BusinessException {
public ChatTopicException(ChatTopicErrorCode errorCode) {
super(errorCode);
}

public ChatTopicException(ChatTopicErrorCode errorCode, Map<String, Object> reasons) {
super(errorCode, reasons);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.cotato.itda.domain.chattopic.exception.code;

import com.cotato.itda.global.error.constant.ErrorCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum ChatTopicErrorCode implements ErrorCode {

NOT_FOUND(
HttpStatus.NOT_FOUND,
"CHAT_TOPIC_ERROR_404_NOT_FOUND",
"대화 주제를 찾을 수 없습니다."
),

BAD_REQUEST(
HttpStatus.BAD_REQUEST,
"CHAT_TOPIC_ERROR_400_BAD_REQUEST",
"유효하지 않은 요청입니다."
)
;

private final HttpStatus httpStatus;
private final String code;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.cotato.itda.domain.chattopic.repository;

import com.cotato.itda.domain.chattopic.entity.ChatTopic;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ChatTopicRepository extends JpaRepository<ChatTopic, Long> {
List<ChatTopic> findAllByCodeIn(List<String> codes);

List<ChatTopic> findAllByIsActiveTrue();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.cotato.itda.domain.chattopic.service.query;

import com.cotato.itda.domain.chattopic.dto.res.ChatTopicResDTO;

public interface ChatTopicQueryService {
ChatTopicResDTO.ChatTopicListDTO getChatTopics();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cotato.itda.domain.chattopic.service.query;

import com.cotato.itda.domain.chattopic.converter.ChatTopicConverter;
import com.cotato.itda.domain.chattopic.dto.res.ChatTopicResDTO;
import com.cotato.itda.domain.chattopic.entity.ChatTopic;
import com.cotato.itda.domain.chattopic.repository.ChatTopicRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ChatTopicQueryServiceImpl implements ChatTopicQueryService {

private final ChatTopicRepository chatTopicRepository;

@Override
public ChatTopicResDTO.ChatTopicListDTO getChatTopics() {
List<ChatTopic> chatTopics = chatTopicRepository.findAllByIsActiveTrue();

return ChatTopicConverter.toChatTopicListDTO(chatTopics);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.cotato.itda.domain.friendship.controller;

import com.cotato.itda.domain.friendship.dto.req.FriendshipReqDTO;
import com.cotato.itda.domain.friendship.dto.res.FriendshipResDTO;
import com.cotato.itda.domain.friendship.enums.FriendshipStatus;
import com.cotato.itda.domain.friendship.service.command.FriendshipCommandService;
import com.cotato.itda.domain.friendship.service.query.FriendshipQueryService;
import com.cotato.itda.global.common.response.ApiResponse;
import com.cotato.itda.global.security.jwt.principal.JwtPrincipal;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/friendships")
@Tag(name = "Friendship", description = "친구 관계 API")
public class FriendshipController implements FriendshipControllerDocs {

private final FriendshipCommandService friendshipCommandService;
private final FriendshipQueryService friendshipQueryService;

// TODO: JWT 사용 시 memberId 추출 로직으로 변경
@SecurityRequirement(name = "AccessToken")
@PostMapping("/{friendId}")
@Override
public ApiResponse<FriendshipResDTO.CreateDTO> createFriendship(
@AuthenticationPrincipal JwtPrincipal jwtPrincipal,
@PathVariable Long friendId
) {
Long memberId = jwtPrincipal.memberId();
return ApiResponse.success(friendshipCommandService.createFriendship(friendId, memberId));
}

// TODO: JWT 사용 시 memberId 추출 로직으로 변경
@SecurityRequirement(name = "AccessToken")
@PatchMapping("/{friendshipId}")
@Override
public ApiResponse<FriendshipResDTO.UpdateDTO> updateFriendship(
@PathVariable Long friendshipId,
@AuthenticationPrincipal JwtPrincipal jwtPrincipal,
@Valid @RequestBody FriendshipReqDTO.UpdateDTO dto
) {
Long memberId = jwtPrincipal.memberId();
return ApiResponse.success(friendshipCommandService.updateFriendship(dto, friendshipId, memberId));
}

// TODO: JWT 사용 시 memberId 추출 로직으로 변경
@SecurityRequirement(name = "AccessToken")
@GetMapping
@Override
public ApiResponse<FriendshipResDTO.FriendshipListDTO> getFriendshipList(
@AuthenticationPrincipal JwtPrincipal jwtPrincipal,
@RequestParam(required = false) List<FriendshipStatus> status,
@SortDefault(sort = "lastInteractedAt", direction = Sort.Direction.DESC) Sort sort
) {
Long memberId = jwtPrincipal.memberId();
return ApiResponse.success(friendshipQueryService.getFriendshipList(memberId, status, sort));
}

// TODO: JWT 사용 시 memberId 추출 로직으로 변경
@SecurityRequirement(name = "AccessToken")
@DeleteMapping("/{friendshipId}")
@Override
public ApiResponse<Void> deleteFriendship(
@PathVariable Long friendshipId,
@AuthenticationPrincipal JwtPrincipal jwtPrincipal
) {
Long memberId = jwtPrincipal.memberId();
friendshipCommandService.deleteFriendship(friendshipId, memberId);
return ApiResponse.success(null);
}

// TODO: JWT 사용 시 memberId 추출 로직으로 변경
@SecurityRequirement(name = "AccessToken")
@GetMapping("/settings/{friendshipId}")
@Override
public ApiResponse<FriendshipResDTO.FriendshipSettingsDTO> getFriendshipSettings(
@PathVariable Long friendshipId,
@AuthenticationPrincipal JwtPrincipal jwtPrincipal
) {
Long memberId = jwtPrincipal.memberId();
return ApiResponse.success(friendshipQueryService.getFriendshipSettings(friendshipId, memberId));
}
}
Loading