Skip to content
Merged
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ dependencies {
// Reactive μ›Ή ν”„λ ˆμž„μ›Œν¬ WebFlux
implementation 'org.springframework.boot:spring-boot-starter-webflux'

// Email
implementation 'org.springframework.boot:spring-boot-starter-mail'

// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.teamEWSN.gitdeun.codereference.entity;

import com.teamEWSN.gitdeun.mindmapnode.entity.MindmapNode;
import com.teamEWSN.gitdeun.mindmap.entity.Mindmap;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
Expand All @@ -17,8 +17,8 @@ public class CodeReference {
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "node_id", nullable = false)
private MindmapNode node;
@JoinColumn(name = "mindmap_id", nullable = false)
private Mindmap mindmap;

@Column(name = "file_path", columnDefinition = "TEXT", nullable = false)
private String filePath;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.teamEWSN.gitdeun.codereview.entity;

import com.teamEWSN.gitdeun.common.util.AuditedEntity;
import com.teamEWSN.gitdeun.mindmapnode.entity.MindmapNode;
import com.teamEWSN.gitdeun.mindmap.entity.Mindmap;
import com.teamEWSN.gitdeun.user.entity.User;
import jakarta.persistence.*;
import lombok.AccessLevel;
Expand All @@ -23,9 +23,9 @@ public class CodeReview extends AuditedEntity {
@JoinColumn(name = "author_id", nullable = false)
private User author;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "node_id", nullable = false)
private MindmapNode node;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mindmap_id", nullable = false)
private Mindmap mindmap;

@Column(name = "ref_id")
private Long refId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ public enum ErrorCode {
INVITATION_ALREADY_EXISTS(HttpStatus.CONFLICT, "INVITE-003", "이미 μ΄ˆλŒ€ λŒ€κΈ° 쀑인 μ‚¬μš©μžμž…λ‹ˆλ‹€."),
CANNOT_INVITE_SELF(HttpStatus.BAD_REQUEST, "INVITE-004", "자기 μžμ‹ μ„ μ΄ˆλŒ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€."),
INVITATION_REJECTED_USER(HttpStatus.FORBIDDEN, "INVITE-005", "μ΄ˆλŒ€λ₯Ό κ±°μ ˆν•œ μ‚¬μš©μžμ΄λ―€λ‘œ μ΄ˆλŒ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€."),


// μ•Œλ¦Ό κ΄€λ ¨
NOTIFICATION_NOT_FOUND(HttpStatus.NOT_FOUND, "NOTIFICATION-001", "μ•Œλ¦Όμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),
CANNOT_ACCESS_NOTIFICATION(HttpStatus.FORBIDDEN, "NOTIFICATION-002", "ν•΄λ‹Ή μ•Œλ¦Όμ— μ ‘κ·Όν•  κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€."),

// 방문기둝 κ΄€λ ¨
HISTORY_NOT_FOUND(HttpStatus.NOT_FOUND, "VISITHISTORY-001", "λ°©λ¬Έ 기둝을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
@Getter
public class AnalysisResultDto {
// FastAPIκ°€ λ°˜ν™˜ν•˜λŠ” Repo κ΄€λ ¨ 정보
private String language;
private String defaultBranch;
private String description;
private LocalDateTime githubLastUpdatedAt;

// FastAPIκ°€ λ°˜ν™˜ν•˜λŠ” Mindmap κ΄€λ ¨ 정보
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.teamEWSN.gitdeun.mindmapmember.entity.MindmapRole;
import com.teamEWSN.gitdeun.mindmapmember.repository.MindmapMemberRepository;
import com.teamEWSN.gitdeun.mindmapmember.service.MindmapAuthService;
import com.teamEWSN.gitdeun.notification.service.NotificationService;
import com.teamEWSN.gitdeun.user.entity.User;
import com.teamEWSN.gitdeun.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
Expand All @@ -36,7 +37,7 @@ public class InvitationService {
private final MindmapRepository mindmapRepository;
private final MindmapMemberRepository mindmapMemberRepository;
private final MindmapAuthService mindmapAuthService;
// private final NotificationService notificationService;
private final NotificationService notificationService;
private final InvitationMapper invitationMapper;

private static final String INVITATION_BASE_URL = "http://localhost:8080/invitations/";
Expand Down Expand Up @@ -90,7 +91,7 @@ public void inviteUserByEmail(Long mapId, InviteRequestDto requestDto, Long invi
invitationRepository.save(invitation);

// μ•Œλ¦Ό 전솑 + 이메일 전솑
// notificationService.sendInvitation(invitation);
notificationService.notifyInvitation(invitation);
}

// μ΄ˆλŒ€ν•œ λͺ©λ‘ 쑰회(member)
Expand Down Expand Up @@ -125,7 +126,7 @@ public void acceptInvitation(Long invitationId, Long userId) {
MindmapMember newMember = MindmapMember.of(newInvitation.getMindmap(), newInvitation.getInvitee(), newInvitation.getRole());
mindmapMemberRepository.save(newMember);

// notificationService.sendAcceptance(invitation);
notificationService.notifyAcceptance(invitation);
}

// μ΄ˆλŒ€ 거절
Expand All @@ -144,7 +145,6 @@ public void rejectInvitation(Long invitationId, Long userId) {
}

invitation.reject();
// notificationService.sendRejection(invitation);
}

// μ΄ˆλŒ€ 링크 생성(owner)
Expand Down Expand Up @@ -197,7 +197,7 @@ public void acceptInvitationByLink(String token, Long userId) {
.build();
invitationRepository.save(updatedInvitation);

// notificationService.sendLinkApprovalRequest(invitation);
notificationService.notifyLinkApprovalRequest(invitation);
}

// μ΄ˆλŒ€ 링크 수락(owner)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.teamEWSN.gitdeun.meeting.entity;

import com.teamEWSN.gitdeun.common.util.CreatedEntity;
import com.teamEWSN.gitdeun.mindmapnode.entity.MindmapNode;
import com.teamEWSN.gitdeun.mindmap.entity.Mindmap;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
Expand All @@ -21,8 +21,8 @@ public class Meeting extends CreatedEntity {
private Long id;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "node_id", nullable = false)
private MindmapNode node;
@JoinColumn(name = "mindmap_id", nullable = false)
private Mindmap mindmap;

@Column(name = "room_name", length = 255, nullable = false)
private String roomName;
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.teamEWSN.gitdeun.notification.controller;

import com.teamEWSN.gitdeun.common.jwt.CustomUserDetails;
import com.teamEWSN.gitdeun.notification.dto.NotificationResponseDto;
import com.teamEWSN.gitdeun.notification.dto.UnreadNotificationCountDto;
import com.teamEWSN.gitdeun.notification.service.NotificationService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/notifications")
@RequiredArgsConstructor
public class NotificationController {

private final NotificationService notificationService;

// ν˜„μž¬ μ‚¬μš©μžμ˜ λͺ¨λ“  μ•Œλ¦Ό 쑰회
@GetMapping
public ResponseEntity<Page<NotificationResponseDto>> getMyNotifications(
@AuthenticationPrincipal CustomUserDetails userDetails,
@PageableDefault(size = 10, sort = "createdAt,desc") Pageable pageable) {
Page<NotificationResponseDto> notifications = notificationService.getNotifications(userDetails.getId(), pageable);
return ResponseEntity.ok(notifications);
}

// 읽지 μ•Šμ€ μ•Œλ¦Ό 개수 쑰회
@GetMapping("/unread-count")
public ResponseEntity<UnreadNotificationCountDto> getUnreadNotificationCount(
@AuthenticationPrincipal CustomUserDetails userDetails) {
UnreadNotificationCountDto countDto = notificationService.getUnreadNotificationCount(userDetails.getId());
return ResponseEntity.ok(countDto);
}

// μ•Œλ¦Ό 읽음 처리
@PatchMapping("/{notificationId}/read")
public ResponseEntity<Void> markNotificationAsRead(
@PathVariable Long notificationId,
@AuthenticationPrincipal CustomUserDetails userDetails) {
notificationService.markAsRead(notificationId, userDetails.getId());
return ResponseEntity.noContent().build();
}

// μ•Œλ¦Ό μ‚­μ œ
@DeleteMapping("/{notificationId}")
public ResponseEntity<Void> deleteNotification(
@PathVariable Long notificationId,
@AuthenticationPrincipal CustomUserDetails userDetails) {
notificationService.deleteNotification(notificationId, userDetails.getId());
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.teamEWSN.gitdeun.notification.controller;

import com.teamEWSN.gitdeun.common.jwt.CustomUserDetails;
import com.teamEWSN.gitdeun.notification.service.NotificationSseService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

@RestController
@RequestMapping("/api/notifications")
@RequiredArgsConstructor
public class NotificationSseController {

private final NotificationSseService notificationSseService;

// ν΄λΌμ΄μ–ΈνŠΈμ˜ μ•Œλ¦Ό ꡬ독
@GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter subscribe(@AuthenticationPrincipal CustomUserDetails userDetails) {
return notificationSseService.subscribe(userDetails.getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.teamEWSN.gitdeun.notification.dto;

import com.teamEWSN.gitdeun.notification.entity.NotificationType;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@Builder
public class NotificationResponseDto {
private Long notificationId;
private String message;
private boolean read;
private NotificationType notificationType;
private LocalDateTime createdAt;
}
Loading