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
Expand Up @@ -71,6 +71,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers(HttpMethod.GET, "/study-schedules", "/studies/*/schedules").permitAll()
.requestMatchers(HttpMethod.GET, "/users/tokens").permitAll()
.requestMatchers(HttpMethod.GET, "/likes").permitAll()
.requestMatchers(HttpMethod.GET, "/tokens").permitAll()

.anyRequest().authenticated()
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.mos.backend.notifications.entity.exception.NotificationLogErrorCode;
import com.mos.backend.notifications.infrastructure.notificationlog.NotificationLogRepository;
import com.mos.backend.privatechatroommember.entity.PrivateChatRoomMember;
import com.mos.backend.privatechatroommember.entity.PrivateChatRoomMemberErrorCode;
import com.mos.backend.privatechatroommember.infrastructure.PrivateChatRoomMemberRepository;
import com.mos.backend.privatechatrooms.entity.PrivateChatRoom;
import com.mos.backend.privatechatrooms.entity.PrivateChatRoomErrorCode;
Expand Down Expand Up @@ -152,6 +153,7 @@ public UserStudySetting getUserStudySetting(Long userId, Long studyId) {
}

public PrivateChatRoomMember getPrivateChatRoomMember(Long userId, Long privateChatRoomId) {
return privateChatRoomMemberRepository.findByUserIdAndPrivateChatRoomId(userId, privateChatRoomId);
return privateChatRoomMemberRepository.findByUserIdAndPrivateChatRoomId(userId, privateChatRoomId)
.orElseThrow(() -> new MosException(PrivateChatRoomMemberErrorCode.NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,10 @@ private PrivateChatMessage savePrivateChatMessage(User user, PrivateChatRoom pri
@Transactional(readOnly = true)
public InfinityScrollRes<PrivateChatMessageRes> getPrivateChatMessages(Long userId, Long privateChatRoomId, Long lastPrivateChatMessageId, int size) {
PrivateChatRoom privateChatRoom = entityFacade.getPrivateChatRoom(privateChatRoomId);
PrivateChatRoomMember privateChatRoomMember = entityFacade.getPrivateChatRoomMember(userId, privateChatRoomId);

List<PrivateChatMessage> privateChatMessages = privateChatMessageRepository.findAllByChatRoomIdForInfiniteScroll(
privateChatRoom.getId(), lastPrivateChatMessageId, size
privateChatRoom.getId(), lastPrivateChatMessageId, size, privateChatRoomMember.getDeletedAt()
);

boolean hasNext = InfinityScrollUtil.hasNext(privateChatMessages, size);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.mos.backend.privatechatmessages.infrastructure;

import com.mos.backend.privatechatmessages.entity.PrivateChatMessage;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

import static com.mos.backend.privatechatmessages.entity.QPrivateChatMessage.privateChatMessage;

Expand All @@ -16,18 +17,26 @@
public class PrivateChatMessageQueryDslRepository {
private final JPAQueryFactory queryFactory;

public List<PrivateChatMessage> findByChatRoomIdForInfiniteScroll(Long privateChatRoomId, Long lastPrivateChatMessageId, int size) {
public List<PrivateChatMessage> findByChatRoomIdForInfiniteScroll(Long privateChatRoomId,
Long lastPrivateChatMessageId,
int size,
LocalDateTime deletedAt) {
return queryFactory
.selectFrom(privateChatMessage)
.where(
eqPrivateChatRoomId(privateChatRoomId),
ltPrivateChatMessageId(lastPrivateChatMessageId)
ltPrivateChatMessageId(lastPrivateChatMessageId),
gtPrivateChatMessageCreatedAt(deletedAt)
)
.orderBy(privateChatMessage.id.desc())
.limit(size + 1)
.fetch();
}

private static BooleanExpression gtPrivateChatMessageCreatedAt(LocalDateTime deletedAt) {
return Objects.isNull(deletedAt) ? null : privateChatMessage.createdAt.gt(deletedAt);
}

private static BooleanExpression eqPrivateChatRoomId(Long privateChatRoomId) {
return privateChatMessage.privateChatRoom.id.eq(privateChatRoomId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface PrivateChatMessageRepository {

Optional<PrivateChatMessage> findFirstByPrivateChatRoomOrderByCreatedAtDesc(PrivateChatRoom privateChatRoom);

List<PrivateChatMessage> findAllByChatRoomIdForInfiniteScroll(Long privateChatRoomId, Long lastPrivateChatMessageId, int size);
List<PrivateChatMessage> findAllByChatRoomIdForInfiniteScroll(Long privateChatRoomId, Long lastPrivateChatMessageId, int size, LocalDateTime deletedAt);

int countByPrivateChatRoomIdAndCreatedAtAfter(Long privateChatRoomId, LocalDateTime lastEntryAt);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ public Optional<PrivateChatMessage> findFirstByPrivateChatRoomOrderByCreatedAtDe
}

@Override
public List<PrivateChatMessage> findAllByChatRoomIdForInfiniteScroll(Long privateChatRoomId, Long lastPrivateChatMessageId, int size) {
return privateChatMessageQueryDslRepository.findByChatRoomIdForInfiniteScroll(privateChatRoomId, lastPrivateChatMessageId, size);
public List<PrivateChatMessage> findAllByChatRoomIdForInfiniteScroll(Long privateChatRoomId, Long lastPrivateChatMessageId, int size, LocalDateTime deletedAt) {
return privateChatMessageQueryDslRepository.findByChatRoomIdForInfiniteScroll(privateChatRoomId, lastPrivateChatMessageId, size, deletedAt);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,12 @@ public void updateLastEntryAt(Long userId, Long privateChatRoomId) {
public List<PrivateChatRoomMember> findByPrivateChatRoom(PrivateChatRoom privateChatRoom) {
return privateChatRoomMemberRepository.findByPrivateChatRoom(privateChatRoom);
}

@Transactional
public void leavePrivateChatRoom(Long userId, Long privateChatRoomId) {
PrivateChatRoomMember privateChatRoomMember = privateChatRoomMemberRepository.findByUserIdAndPrivateChatRoomId(userId, privateChatRoomId)
.orElseThrow(() -> new MosException(PrivateChatRoomMemberErrorCode.NOT_FOUND));

privateChatRoomMemberRepository.delete(privateChatRoomMember);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,27 @@
import com.mos.backend.common.entity.BaseAuditableEntity;
import com.mos.backend.privatechatrooms.entity.PrivateChatRoom;
import com.mos.backend.users.entity.User;
import jakarta.persistence.*;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.SQLDelete;

import java.time.LocalDateTime;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@SQLDelete(sql = "UPDATE private_chat_room_members SET deleted_at = NOW() WHERE private_chat_room_member_id = ?")
@Table(name = "private_chat_room_members")
public class PrivateChatRoomMember extends BaseAuditableEntity {

Expand All @@ -31,6 +42,9 @@ public class PrivateChatRoomMember extends BaseAuditableEntity {

private LocalDateTime lastEntryAt = LocalDateTime.now();

@ColumnDefault("NULL")
private LocalDateTime deletedAt;

public static PrivateChatRoomMember of(PrivateChatRoom privateChatRoom, User user) {
PrivateChatRoomMember privateChatRoomMember = new PrivateChatRoomMember();
privateChatRoomMember.privateChatRoom = privateChatRoom;
Expand All @@ -42,4 +56,4 @@ public static PrivateChatRoomMember of(PrivateChatRoom privateChatRoom, User use
public void updateLastEntryAt() {
this.lastEntryAt = LocalDateTime.now();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface PrivateChatRoomMemberJpaRepository extends JpaRepository<Privat

Optional<PrivateChatRoomMember> findByUserAndPrivateChatRoom(User user, PrivateChatRoom privateChatRoom);

PrivateChatRoomMember findByUserIdAndPrivateChatRoomId(Long userId, Long privateChatRoomId);
Optional<PrivateChatRoomMember> findByUserIdAndPrivateChatRoomId(Long userId, Long privateChatRoomId);

List<PrivateChatRoomMember> findByPrivateChatRoom(PrivateChatRoom privateChatRoom);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ public interface PrivateChatRoomMemberRepository {

Optional<PrivateChatRoomMember> findByUserAndPrivateChatRoom(User user, PrivateChatRoom privateChatRoom);

PrivateChatRoomMember findByUserIdAndPrivateChatRoomId(Long userId, Long privateChatRoomId);
Optional<PrivateChatRoomMember> findByUserIdAndPrivateChatRoomId(Long userId, Long privateChatRoomId);

List<PrivateChatRoomMember> findByPrivateChatRoom(PrivateChatRoom privateChatRoom);

void delete(PrivateChatRoomMember privateChatRoomMember);
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,17 @@ public Optional<PrivateChatRoomMember> findByUserAndPrivateChatRoom(User user, P
}

@Override
public PrivateChatRoomMember findByUserIdAndPrivateChatRoomId(Long userId, Long privateChatRoomId) {
public Optional<PrivateChatRoomMember> findByUserIdAndPrivateChatRoomId(Long userId, Long privateChatRoomId) {
return privateChatRoomMemberJpaRepository.findByUserIdAndPrivateChatRoomId(userId, privateChatRoomId);
}

@Override
public List<PrivateChatRoomMember> findByPrivateChatRoom(PrivateChatRoom privateChatRoom) {
return privateChatRoomMemberJpaRepository.findByPrivateChatRoom(privateChatRoom);
}

@Override
public void delete(PrivateChatRoomMember privateChatRoomMember) {
privateChatRoomMemberJpaRepository.delete(privateChatRoomMember);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.mos.backend.privatechatroommember.presentation;

import com.mos.backend.privatechatroommember.application.PrivateChatRoomMemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class PrivateChatRoomMemberController {
private final PrivateChatRoomMemberService privateChatRoomMemberService;

@DeleteMapping("/private-chat-rooms/{privateChatRoomId}/members")
public void leavePrivateChatRoom(@AuthenticationPrincipal Long userId, @PathVariable Long privateChatRoomId) {
privateChatRoomMemberService.leavePrivateChatRoom(userId, privateChatRoomId);
}
}