From 7c1ad8e6b2d2e16669332747c1639c1532ef7a27 Mon Sep 17 00:00:00 2001 From: Kim Kyeongho Date: Sat, 11 Oct 2025 19:29:05 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=82=AD=EC=A0=9C=20#31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/entity/CompanyChatMessage.java | 32 -------------- .../domain/chat/entity/CompanyChatRoom.java | 31 ------------- .../domain/chat/entity/RoomStatus.java | 5 --- .../domain/company/entity/Company.java | 29 ------------- .../entity/CompanyAnalysisRequest.java | 43 ------------------- .../entity/CompanyAnalysisSection.java | 33 -------------- .../domain/company/entity/RequestStatus.java | 5 --- 7 files changed, 178 deletions(-) delete mode 100644 src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatMessage.java delete mode 100644 src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatRoom.java delete mode 100644 src/main/java/com/project/InsightPrep/domain/chat/entity/RoomStatus.java delete mode 100644 src/main/java/com/project/InsightPrep/domain/company/entity/Company.java delete mode 100644 src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisRequest.java delete mode 100644 src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisSection.java delete mode 100644 src/main/java/com/project/InsightPrep/domain/company/entity/RequestStatus.java diff --git a/src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatMessage.java b/src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatMessage.java deleted file mode 100644 index dc37e92..0000000 --- a/src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatMessage.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.project.InsightPrep.domain.chat.entity; - -import com.project.InsightPrep.domain.member.entity.Member; -import com.project.InsightPrep.global.common.entity.BaseTimeEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "company_chat_message") -public class CompanyChatMessage extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "chat_room_id", nullable = false) - private CompanyChatRoom chatRoom; - - @ManyToOne - @JoinColumn(name = "sender_id", nullable = false) - private Member sender; - - @Column(nullable = false, length = 1000) - private String message; -} diff --git a/src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatRoom.java b/src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatRoom.java deleted file mode 100644 index fc794c2..0000000 --- a/src/main/java/com/project/InsightPrep/domain/chat/entity/CompanyChatRoom.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.project.InsightPrep.domain.chat.entity; - -import com.project.InsightPrep.domain.company.entity.Company; -import com.project.InsightPrep.global.common.entity.BaseTimeEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "company_chat_room") -public class CompanyChatRoom extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - @JoinColumn(name = "company_id", nullable = false) - private Company company; - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private RoomStatus roomStatus; -} diff --git a/src/main/java/com/project/InsightPrep/domain/chat/entity/RoomStatus.java b/src/main/java/com/project/InsightPrep/domain/chat/entity/RoomStatus.java deleted file mode 100644 index 96a52ef..0000000 --- a/src/main/java/com/project/InsightPrep/domain/chat/entity/RoomStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.project.InsightPrep.domain.chat.entity; - -public enum RoomStatus { - ACTIVE, CLOSED -} diff --git a/src/main/java/com/project/InsightPrep/domain/company/entity/Company.java b/src/main/java/com/project/InsightPrep/domain/company/entity/Company.java deleted file mode 100644 index 99fee4d..0000000 --- a/src/main/java/com/project/InsightPrep/domain/company/entity/Company.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.InsightPrep.domain.company.entity; - -import com.project.InsightPrep.global.common.entity.BaseTimeEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -@Entity -@Table(name = "company") -public class Company extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false, unique = true, length = 30) - private String name; - - @Column(length = 255) - private String recruitUrl; - - @Column(nullable = false) - private Boolean isHiring; - - // TODO: 업종 추가 예정 -} diff --git a/src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisRequest.java b/src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisRequest.java deleted file mode 100644 index 3300835..0000000 --- a/src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisRequest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.project.InsightPrep.domain.company.entity; - -import com.project.InsightPrep.domain.member.entity.Member; -import com.project.InsightPrep.global.common.entity.BaseTimeEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "company_analysis_request") -public class CompanyAnalysisRequest extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "company_id", nullable = false) - private Company company; // 요청 대상 기업 - - @ManyToOne - @JoinColumn(name = "requested_by", nullable = false) - private Member requestedBy; // 요청한 사용자 - - @ManyToOne - @JoinColumn(name = "reviewed_by") - private Member reviewedBy; // 관리자 - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private RequestStatus requestStatus; // PENDING, APPROVED, REJECTED - - @Column(length = 255) - private String reason; // 거절 사유 등 - -} diff --git a/src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisSection.java b/src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisSection.java deleted file mode 100644 index 5dca707..0000000 --- a/src/main/java/com/project/InsightPrep/domain/company/entity/CompanyAnalysisSection.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.project.InsightPrep.domain.company.entity; - -import com.project.InsightPrep.global.common.entity.BaseTimeEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "company_analysis_section") -public class CompanyAnalysisSection extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "company_id", nullable = false) - private Company company; - - @Column(nullable = false, length = 100) - private String sectionKey; // ex) summary_3lines - - @Column(nullable = false) - private String sectionTitle; // ex) 3줄 요약 - - @Column(columnDefinition = "TEXT", nullable = false) - private String content; // JSON 문자열 or 텍스트 -} diff --git a/src/main/java/com/project/InsightPrep/domain/company/entity/RequestStatus.java b/src/main/java/com/project/InsightPrep/domain/company/entity/RequestStatus.java deleted file mode 100644 index 293c105..0000000 --- a/src/main/java/com/project/InsightPrep/domain/company/entity/RequestStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.project.InsightPrep.domain.company.entity; - -public enum RequestStatus { - PENDING, APPROVED, REJECTED -} From b1fafba909001c141b9f08109dd02cca981aec34 Mon Sep 17 00:00:00 2001 From: Kim Kyeongho Date: Sun, 12 Oct 2025 00:51:43 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EC=BF=A0=ED=8F=B0=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?#31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/TestController.java | 61 +++++++++++++++++++ .../domain/coupon/entity/CouponEvent.java | 41 +++++++++++++ .../domain/coupon/entity/CouponIssue.java | 41 +++++++++++++ .../domain/member/entity/Member.java | 3 + .../member/entity/MemberDailyLimit.java | 35 +++++++++++ 5 files changed, 181 insertions(+) create mode 100644 src/main/java/com/project/InsightPrep/domain/auth/controller/TestController.java create mode 100644 src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponEvent.java create mode 100644 src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponIssue.java create mode 100644 src/main/java/com/project/InsightPrep/domain/member/entity/MemberDailyLimit.java diff --git a/src/main/java/com/project/InsightPrep/domain/auth/controller/TestController.java b/src/main/java/com/project/InsightPrep/domain/auth/controller/TestController.java new file mode 100644 index 0000000..acb6763 --- /dev/null +++ b/src/main/java/com/project/InsightPrep/domain/auth/controller/TestController.java @@ -0,0 +1,61 @@ +package com.project.InsightPrep.domain.auth.controller; + +import com.project.InsightPrep.global.auth.domain.CustomUserDetails; +import com.project.InsightPrep.domain.member.entity.Member; +import com.project.InsightPrep.global.auth.util.SecurityUtil; +import jakarta.servlet.http.HttpSession; +import java.util.HashMap; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +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; + +@RestController +@RequestMapping +@RequiredArgsConstructor +public class TestController { + + private final SecurityUtil securityUtil; + + /* + - 컨트롤러에서 사용자 ID 등을 사용할 경우, "@AuthenticationPrincipal CustomUserDetails userDetails" 추가. 단, Service 단의 코드의 매개변수로 넘겨야됨. + - Service에서 SecurityUtil 사용 (이거 적용) - Controller에 @AuthenticationPrincipal CustomUserDetails userDetails 없어도 됨. + */ + + @PreAuthorize("hasAnyRole('USER', 'ADMIN')") + @GetMapping("/debug/session") + public ResponseEntity debugSession(@AuthenticationPrincipal CustomUserDetails userDetails, HttpSession session) { // + String sessionId = session.getId(); + int sessionExpires = session.getMaxInactiveInterval(); + Long memberId = (userDetails != null) ? userDetails.getMember().getId() : null; + + Map debugInfo = new HashMap<>(); + debugInfo.put("sessionId", sessionId); + debugInfo.put("sessionExpires", sessionExpires); + debugInfo.put("loginMemberId", memberId); + + return ResponseEntity.ok(debugInfo); + } + + @PreAuthorize("hasRole('USER')") + @GetMapping("/test/secure") + public String testSecure(@AuthenticationPrincipal CustomUserDetails userDetails) { + return "로그인한 사용자 ID: " + userDetails.getMember().getId(); + } + + @PreAuthorize("hasRole('USER')") + @GetMapping("/test/me") + public ResponseEntity getMe() { + Member member = securityUtil.getAuthenticatedMember(); + Map info = new HashMap<>(); + info.put("id", member.getId()); + info.put("email", member.getEmail()); + info.put("nickname", member.getNickname()); + info.put("role", member.getRole()); + return ResponseEntity.ok(info); + } +} \ No newline at end of file diff --git a/src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponEvent.java b/src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponEvent.java new file mode 100644 index 0000000..9dea8d9 --- /dev/null +++ b/src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponEvent.java @@ -0,0 +1,41 @@ +package com.project.InsightPrep.domain.coupon.entity; + +import com.project.InsightPrep.global.common.entity.BaseTimeEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "coupon_event") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class CouponEvent extends BaseTimeEntity { + + // 쿠폰 정의 + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + private int totalCount; + private int issuedCount; + private LocalDateTime startTime; + private LocalDateTime endTime; + + @OneToMany(mappedBy = "couponEvent") + private List issues = new ArrayList<>(); +} diff --git a/src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponIssue.java b/src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponIssue.java new file mode 100644 index 0000000..d64c001 --- /dev/null +++ b/src/main/java/com/project/InsightPrep/domain/coupon/entity/CouponIssue.java @@ -0,0 +1,41 @@ +package com.project.InsightPrep.domain.coupon.entity; + +import com.project.InsightPrep.domain.member.entity.Member; +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 java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "coupon_issue") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class CouponIssue { + + // 발급 내역 + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "coupon_event_id") + private CouponEvent couponEvent; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + private LocalDateTime issuedAt; +} diff --git a/src/main/java/com/project/InsightPrep/domain/member/entity/Member.java b/src/main/java/com/project/InsightPrep/domain/member/entity/Member.java index 82ec9de..8879cea 100644 --- a/src/main/java/com/project/InsightPrep/domain/member/entity/Member.java +++ b/src/main/java/com/project/InsightPrep/domain/member/entity/Member.java @@ -40,4 +40,7 @@ public class Member extends BaseTimeEntity { @Column(nullable = false, length = 20) private Role role; // USER / ADMIN + @Column(nullable = false) + private int dailyLimit = 10; + } diff --git a/src/main/java/com/project/InsightPrep/domain/member/entity/MemberDailyLimit.java b/src/main/java/com/project/InsightPrep/domain/member/entity/MemberDailyLimit.java new file mode 100644 index 0000000..7e106cf --- /dev/null +++ b/src/main/java/com/project/InsightPrep/domain/member/entity/MemberDailyLimit.java @@ -0,0 +1,35 @@ +package com.project.InsightPrep.domain.member.entity; + +import com.project.InsightPrep.global.common.entity.BaseTimeEntity; +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.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "member_daily_limit") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class MemberDailyLimit extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + private int questionCount; +} From c690c1796367b866239f9161d75f61b7920c57f5 Mon Sep 17 00:00:00 2001 From: Kim Kyeongho Date: Sun, 12 Oct 2025 01:27:30 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20#31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auth/service/AuthServiceImplSignUpTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/project/InsightPrep/domain/auth/service/AuthServiceImplSignUpTest.java b/src/test/java/com/project/InsightPrep/domain/auth/service/AuthServiceImplSignUpTest.java index a5fadb6..a9a75d4 100644 --- a/src/test/java/com/project/InsightPrep/domain/auth/service/AuthServiceImplSignUpTest.java +++ b/src/test/java/com/project/InsightPrep/domain/auth/service/AuthServiceImplSignUpTest.java @@ -62,7 +62,7 @@ void setUp() { void login_success() { // given LoginDto dto = new LoginDto("test@example.com", "Password123!", false); - Member member = new Member(1L, "test@example.com", "Password123!","nickname", Role.USER); + Member member = new Member(1L, "test@example.com", "Password123!","nickname", Role.USER, 10); when(authMapper.findByEmail(dto.getEmail())).thenReturn(Optional.of(member)); when(passwordEncoder.matches(dto.getPassword(), member.getPassword())).thenReturn(true); @@ -92,7 +92,7 @@ void login_email_not_exist() { void login_password_mismatch() { // given LoginDto dto = new LoginDto("test@example.com", "Password123", false); - Member member = new Member(1L, "test@example.com", "Password123!","nickname", Role.USER); + Member member = new Member(1L, "test@example.com", "Password123!","nickname", Role.USER, 10); when(authMapper.findByEmail(dto.getEmail())).thenReturn(Optional.of(member)); when(passwordEncoder.matches(dto.getPassword(), member.getPassword())).thenReturn(false); @@ -106,7 +106,7 @@ void login_password_mismatch() { void login_auto() { // given LoginDto dto = new LoginDto("test@example.com", "Password123!", true); - Member member = new Member(1L, "test@example.com", "Password123!","nickname", Role.USER); + Member member = new Member(1L, "test@example.com", "Password123!","nickname", Role.USER, 10); when(authMapper.findByEmail(dto.getEmail())).thenReturn(Optional.of(member)); when(passwordEncoder.matches(dto.getPassword(), member.getPassword())).thenReturn(true);