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
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.asyncgate.chat_server.config

import com.asyncgate.chat_server.filter.FilterChannelInterceptor
import com.asyncgate.chat_server.filter.JwtHandshakeInterceptor
import com.asyncgate.chat_server.filter.WebSocketHandshakeInterceptor
import org.springframework.context.annotation.Configuration
import org.springframework.messaging.simp.config.ChannelRegistration
import org.springframework.messaging.simp.config.MessageBrokerRegistry
Expand All @@ -13,13 +13,13 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo
@EnableWebSocketMessageBroker
class WebSocketConfig(
private val filterChannelInterceptor: FilterChannelInterceptor,
private val jwtHandshakeInterceptor: JwtHandshakeInterceptor,
private val webSocketHandshakeInterceptor: WebSocketHandshakeInterceptor,
) : WebSocketMessageBrokerConfigurer {

override fun registerStompEndpoints(registry: StompEndpointRegistry) {
registry.addEndpoint("/asyncgate-chat")
.setAllowedOriginPatterns("*")
.addInterceptors(jwtHandshakeInterceptor)
.addInterceptors(webSocketHandshakeInterceptor)
}

override fun configureMessageBroker(registry: MessageBrokerRegistry) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.asyncgate.chat_server.controller

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/health")
class HealthCheckController {

@GetMapping
fun healthCheck(): Map<String, String> {
return mapOf("status" to "UP")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.asyncgate.chat_server.exception

import com.asyncgate.chat_server.support.response.FailResponse
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.servlet.resource.NoResourceFoundException

@ControllerAdvice
class ChatServerErrorHandler {
private val log: Logger = LoggerFactory.getLogger(ChatServerErrorHandler::class.java)

@ExceptionHandler(ChatServerException::class)
fun handleApiException(e: ChatServerException): ResponseEntity<FailResponse> {
val errorType: FailType = e.failType
val response: FailResponse = FailResponse.of(
errorType.errorCode,
errorType.message,
errorType.status.value()
)
return ResponseEntity.status(errorType.status).body(response)
}

@ExceptionHandler(Exception::class)
fun handleException(exception: Exception) {
log.error("🚨 [Global Error] ${exception.message}", exception)
}

@ExceptionHandler(NoResourceFoundException::class)
fun handleResourceException(exception: NoResourceFoundException) {
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import org.springframework.web.socket.WebSocketHandler
import org.springframework.web.socket.server.HandshakeInterceptor

@Component
class JwtHandshakeInterceptor(
class WebSocketHandshakeInterceptor(
private val jwtTokenProvider: JwtTokenProvider,
) : HandshakeInterceptor {

companion object {
private val log: Logger = LoggerFactory.getLogger(JwtHandshakeInterceptor::class.java)
private val log: Logger = LoggerFactory.getLogger(WebSocketHandshakeInterceptor::class.java)
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.asyncgate.guild_server.client;

import com.asyncgate.guild_server.support.response.SuccessResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient(name = "user-server")
public interface UserClient {

@GetMapping("/users")
SuccessResponse<UserClientInfoResponses> getUsersInfo(@RequestParam(required = false) List<String> memberIds);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.asyncgate.guild_server.client;

import java.util.List;

public record UserClientInfoResponses(List<UserClientInfoResponse> responses) {
public record UserClientInfoResponse(String userId, String name, String nickname, String profileImageUrl) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableFeignClients
@EnableFeignClients(basePackages = "com.asyncgate.guild_server.client")
public class FeignClientConfig {

@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.asyncgate.guild_server.controller;

import com.asyncgate.guild_server.dto.request.DirectChannelCreateRequest;
import com.asyncgate.guild_server.dto.response.DirectResponse;
import com.asyncgate.guild_server.service.DirectService;
import com.asyncgate.guild_server.support.response.SuccessResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/direct")
public class DirectController {

private final DirectService directService;

@PostMapping
public SuccessResponse<DirectResponse> create(
final @AuthenticationPrincipal String currentUserId,
final @RequestBody DirectChannelCreateRequest request
) {
return SuccessResponse.created(
directService.create(currentUserId, request)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.asyncgate.guild_server.domain;

import lombok.Builder;
import lombok.Getter;

import java.util.List;
import java.util.UUID;

@Getter
public class Direct {

private final String id;

@Builder
private Direct(String id, String name) {
this.id = id;
}

public static Direct create() {
return Direct.builder()
.id(UUID.randomUUID().toString())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.asyncgate.guild_server.domain;

import lombok.Builder;
import lombok.Getter;

import java.util.UUID;

@Getter
public class DirectMember {
private final String id;
private final String directId;
private final String memberId;
private final String memberName;

@Builder
private DirectMember(String id, String directId, String memberId, String memberName) {
this.id = id;
this.directId = directId;
this.memberId = memberId;
this.memberName = memberName;
}

public static DirectMember create(final String directId, final String memberId, final String memberName) {
return new DirectMember(UUID.randomUUID().toString(), directId, memberId, memberName);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.asyncgate.guild_server.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor
public class DirectChannelCreateRequest {
private List<String> memberIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.asyncgate.guild_server.dto.response;

import com.asyncgate.guild_server.client.UserClientInfoResponses;

public record DirectResponse(String directId,UserClientInfoResponses members) {
public static DirectResponse of(final String directId, final UserClientInfoResponses members) {
return new DirectResponse(directId, members);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.asyncgate.guild_server.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "direct")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DirectEntity {

@Id
private String id;

@Builder
private DirectEntity(String id) {
this.id = id;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.asyncgate.guild_server.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "direct_member")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DirectMemberEntity {

@Id
private String id;
private String memberId;
private String memberName;

@Builder
private DirectMemberEntity(String id, String memberId, String memberName) {
this.id = id;
this.memberId = memberId;
this.memberName = memberName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncgate.guild_server.repository;

import com.asyncgate.guild_server.entity.DirectEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DirectJpaRepository extends JpaRepository<DirectEntity, String> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncgate.guild_server.repository;

import com.asyncgate.guild_server.entity.DirectMemberEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DirectMemberJpaRepository extends JpaRepository<DirectMemberEntity, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.asyncgate.guild_server.repository;

import com.asyncgate.guild_server.domain.DirectMember;

import java.util.List;

public interface DirectMemberRepository {
void saveAll(List<DirectMember> directMembers);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.asyncgate.guild_server.repository;

import com.asyncgate.guild_server.domain.DirectMember;
import com.asyncgate.guild_server.support.utility.DomainUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class DirectMemberRepositoryImpl implements DirectMemberRepository {

private final DirectMemberJpaRepository jpaRepository;

@Override
public void saveAll(List<DirectMember> directMembers) {
jpaRepository.saveAll(
directMembers.stream()
.map(DomainUtil.DirectMemberMapper::toEntity)
.toList()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.asyncgate.guild_server.repository;

import com.asyncgate.guild_server.domain.Direct;

public interface DirectRepository {
void save(Direct direct);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.asyncgate.guild_server.repository;

import com.asyncgate.guild_server.domain.Direct;
import com.asyncgate.guild_server.support.utility.DomainUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class DirectRepositoryImpl implements DirectRepository {
private final DirectJpaRepository jpaRepository;

@Override
public void save(Direct direct) {
jpaRepository.save(
DomainUtil.DirectMapper.toEntity(direct)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class SecurityConstants {
"/swagger-ui/index.css",
"/v3/api-docs/swagger-config",
"/error",
"/health"
"/health",
"/actuator/info"
};
}
Loading
Loading