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,14 +1,13 @@
package com.jootalkpia.chat_server.controller;

import com.jootalkpia.chat_server.dto.messgaeDto.ChatMessageRequest;
import com.jootalkpia.chat_server.dto.ChatMessageToKafka;
import com.jootalkpia.chat_server.dto.messgaeDto.CommonResponse;
import com.jootalkpia.chat_server.service.ChatService;
import com.jootalkpia.chat_server.service.KafkaProducer;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
Expand All @@ -21,4 +20,9 @@ public class ChatController {
public void sendMessage(ChatMessageRequest request, @DestinationVariable Long channelId) {
chatService.processChatMessage(request, channelId);
}

@PostMapping("/chat/{channelId}")
public void sendMessageApi(@RequestBody ChatMessageRequest request, @PathVariable Long channelId) {
chatService.processChatMessage(request, channelId);
}
}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.jootalkpia.chat_server.service;

import com.jootalkpia.chat_server.domain.Files;
import com.jootalkpia.chat_server.domain.Thread;
import com.jootalkpia.chat_server.domain.User;
import com.jootalkpia.chat_server.dto.ChatMessageToKafka;
import com.jootalkpia.chat_server.dto.messgaeDto.ChatMessageRequest;
Expand All @@ -11,10 +10,13 @@
import com.jootalkpia.chat_server.dto.messgaeDto.TextResponse;
import com.jootalkpia.chat_server.dto.messgaeDto.VideoResponse;
import com.jootalkpia.chat_server.repository.jpa.FileRepository;
import com.jootalkpia.chat_server.repository.jpa.ThreadRepository;
import com.jootalkpia.chat_server.repository.jpa.UserRepository;
import com.jootalkpia.chat_server.util.DateTimeUtil;
import com.jootalkpia.chat_server.util.SnowflakeIdGenerator;
import jakarta.transaction.Transactional;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -28,7 +30,7 @@ public class ChatService {

private final UserRepository userRepository;
private final FileRepository fileRepository;
private final ThreadRepository threadRepository;
private final SnowflakeIdGenerator snowflakeIdGenerator;

@Transactional
public void processChatMessage(ChatMessageRequest request, Long channelId) {
Expand All @@ -41,13 +43,17 @@ public void processChatMessage(ChatMessageRequest request, Long channelId) {

private CommonResponse createCommonData(Long userId, Long channelId){
User user = userRepository.findByUserId(userId);
Thread thread = new Thread(); // todo:transaction처리 , 예외처리 필요
threadRepository.save(thread);

Long threadId = snowflakeIdGenerator.nextId();

LocalDateTime now = Instant.ofEpochMilli(System.currentTimeMillis())
.atZone(ZoneId.systemDefault())
.toLocalDateTime();

return CommonResponse.builder()
.channelId(channelId)
.threadId(thread.getThreadId())
.threadDateTime(DateTimeUtil.formatDateTime(thread.getCreatedAt()))
.threadId(threadId)
.threadDateTime(DateTimeUtil.formatDateTime(now))
.userId(user.getUserId())
.userNickname(user.getNickname())
.userProfileImage(user.getProfileImage())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.jootalkpia.chat_server.util;

import org.springframework.stereotype.Component;

import java.net.NetworkInterface;
import java.security.SecureRandom;
import java.util.Enumeration;

@Component
public class SnowflakeIdGenerator {
private static final long EPOCH = 1672531200000L; // 기준이 되는 Epoch 시간 (2023-01-01 00:00:00 기준)
private static final long WORKER_ID_BITS = 5L;
private static final long DATACENTER_ID_BITS = 5L;
private static final long SEQUENCE_BITS = 12L;

private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
private static final long MAX_DATACENTER_ID = ~(-1L << DATACENTER_ID_BITS);

private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
private static final long DATACENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATACENTER_ID_BITS;
private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);

private long workerId;
private long datacenterId;
private long sequence = 0L;
private long lastTimestamp = -1L;

public SnowflakeIdGenerator() {
this.workerId = getWorkerId();
this.datacenterId = getDataCenterId();
}

public synchronized long nextId() {
long timestamp = System.currentTimeMillis();

if (timestamp < lastTimestamp) {
throw new RuntimeException("generate snowflake id");
}

if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & SEQUENCE_MASK;
if (sequence == 0) {
timestamp = waitNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}

lastTimestamp = timestamp;

return ((timestamp - EPOCH) << TIMESTAMP_LEFT_SHIFT)
| (datacenterId << DATACENTER_ID_SHIFT)
| (workerId << WORKER_ID_SHIFT)
| sequence;
}

private long waitNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}

private long getWorkerId() {
try {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = e.nextElement();
byte[] mac = ni.getHardwareAddress();
if (mac != null) {
return ((mac[mac.length - 1] & 0xFF) % (MAX_WORKER_ID + 1));
}
}
} catch (Exception ex) {
return new SecureRandom().nextInt((int) MAX_WORKER_ID + 1);
}
return new SecureRandom().nextInt((int) MAX_WORKER_ID + 1);
}

private long getDataCenterId() {
return new SecureRandom().nextInt((int) MAX_DATACENTER_ID + 1);
}
}