Skip to content

Feat/#186 calendar event#190

Merged
yeongsinkeem merged 20 commits intodev_tempfrom
feat/#186-calendar-event
Feb 11, 2026
Merged

Feat/#186 calendar event#190
yeongsinkeem merged 20 commits intodev_tempfrom
feat/#186-calendar-event

Conversation

@tishakong
Copy link
Collaborator

이슈 번호

#186

작업 내용

  • Event 관련 모델, Enum 생성 (Event, EventPartipicant, EventScope)
  • Event 작업 시 체크 필요한 권한 체크 메서드 생성
  • 일정 생성 API 구현
  • 일정 수정 API 구현
  • 일정 삭제 API 구현
  • 월별 일정 조회 API 구현
  • 다가오는 일정 조회 API 구현
  • 특정 일정 상세 조회 API 구현

yeongsinkeem and others added 20 commits January 13, 2026 22:54
refactor: 프론트 새 도메인 CORS 설정 추가
Refactor: 프론트 새 도메인 CORS 설정 추가
refactor: 프론트 새 도메인 CORS 설정 추가
refactor: 프론트 새 도메인 CORS 설정 추가
refactor: 프론트 새 도메인 CORS 설정 추가
refactor: 프론트 새 도메인 CORS 설정 추가
refactor: 프론트 새 CORS 설정 추가
[Release] main 서버 배포 (dev → main 병합)
- validateMembership, validateExecutive 메서드를 구현해 일정 관련 api 실행 시 권한 검증 로직을 모듈화 했습니다.
- addParticipants 메서드를 구현해 일정 참가자 추가 시 (일정 생성 및 수정) 활용할 수 있도록 했습니다.
- 경로 : POST /api/events
- 경로 : POST /api/events/{eventId}
- 경로 : GET /api/events/monthly?orgId=1&year=2026&&month=2
- 경로 : GET /api/events/upcoming?orgId=1
- 경로 : DELETE /api/events/{eventId}
- 경로 : GET /api/events/{eventId}
@tishakong tishakong self-assigned this Feb 10, 2026
@tishakong tishakong linked an issue Feb 10, 2026 that may be closed by this pull request
10 tasks
@gemini-code-assist
Copy link

Summary of Changes

Hello @tishakong, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the application's core architecture by introducing a robust multi-profile and organization management system. This foundational change allows users to operate within different organizational contexts, each with its own specific roles and data. Building upon this, a new calendar event feature has been integrated, enabling streamlined event planning and viewing for organization members. The changes required extensive refactoring across various modules, including board services, controllers, and authentication mechanisms, to ensure a cohesive and context-aware user experience.

Highlights

  • Multi-Profile and Organization Support: Introduced a comprehensive multi-profile system allowing users to manage distinct identities and roles across various organizations. This involved creating new entities like 'Organization', 'School', and 'MemberOrg', and refactoring existing board functionalities (Free, QnA, Tip, Notice posts and comments) to interact with these new organization-aware member profiles.
  • Calendar Event Feature: Implemented a new calendar event management system, providing APIs for creating, updating, deleting, and querying events. This feature supports monthly views, upcoming events, and detailed event information, utilizing new 'Event' and 'EventParticipant' entities with defined scopes.
  • Authentication and Authorization Enhancements: Updated the authentication flow to support organization-specific tokens, incorporating 'memberOrgId' into JWT claims. A new argument resolver ('@ActiveProfile') was added to seamlessly extract the active organization context from request headers, ensuring that all subsequent operations are performed within the correct organizational scope.
  • Status Enum Renaming: The 'Status' enum was renamed to 'AccountStatus' for improved clarity and consistency across the codebase, affecting numerous entities and repository methods related to account and content states.
Changelog
  • src/main/java/org/example/tackit/common/aop/logging/LoggingAspect.java
    • Updated import from UserLogRepository to MemberLogRepository.
    • Commented out the userLogRepository field and the logUserAction method.
  • src/main/java/org/example/tackit/common/dto/ActiveProfile.java
    • Added new annotation @ActiveProfile for method parameters.
  • src/main/java/org/example/tackit/common/dto/ProfileContext.java
    • Added new record ProfileContext to hold active profile ID.
  • src/main/java/org/example/tackit/common/homePopular/HomePopularPostController.java
    • Updated getPopularPosts method to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/common/homePopular/HomePopularPostService.java
    • Refactored getPopularPosts method to accept Long orgId and use new findTop3PopularByOrg method.
    • Commented out the old getPopularPosts implementation.
  • src/main/java/org/example/tackit/config/AdminDataInitializer.java
    • Renamed to CommonDataInitializer.java.
    • Updated admin member email and added default School entry.
  • src/main/java/org/example/tackit/config/FreeTagInitializer.java
  • src/main/java/org/example/tackit/config/QnATagInitializer.java
  • src/main/java/org/example/tackit/config/Resolver/ProfileContextResolver.java
    • Added new argument resolver for Active-Profile-Id header.
  • src/main/java/org/example/tackit/config/TipTagInitializer.java
  • src/main/java/org/example/tackit/config/WebConfig.java
    • Added new WebMvcConfigurer to register ProfileContextResolver.
  • src/main/java/org/example/tackit/config/jwt/TokenProvider.java
    • Updated Status import to AccountStatus.
    • Removed role from TokenDto creation.
    • Added generateTokenDtoWithProfile method to include orgId in JWT claims.
  • src/main/java/org/example/tackit/domain/Free_board/Free_comment/controller/FreeCommentController.java
    • Modified comment endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/Free_board/Free_comment/service/FreeCommentService.java
    • Replaced FreeMemberJPARepository with MemberOrgRepository.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/controller/FreePostController.java
    • Modified post endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/repository/FreeMemberJPARepository.java
    • Removed findByEmailAndOrganization method.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/repository/FreePostJPARepository.java
    • Updated Status to AccountStatus.
    • Replaced findByOrganizationAndStatus with findAllByOrganizationIdAndAccountStatus.
    • Added new @query method findTop3PopularByOrg.
    • Commented out old popular post methods.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/repository/FreePostReportRepository.java
    • Updated existsByMemberAndFreePost to use MemberOrg.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/repository/FreeScrapJPARepository.java
    • Updated findByMemberAndFreePost to use MemberOrg.
    • Commented out findByMemberAndType.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/service/FreePostService.java
    • Replaced FreeMemberJPARepository with MemberOrgRepository and MemberRepository.
    • Updated method signatures to use Long profileId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/Free_board/Free_post/service/FreePostTagService.java
    • Added a newline at the end of the file.
  • src/main/java/org/example/tackit/domain/Free_board/Free_tag/controller/FreeTagController.java
    • Modified getPostsByTag to use @ActiveProfile ProfileContext and commented out the entire method.
  • src/main/java/org/example/tackit/domain/Free_board/Free_tag/repository/FreeTagCustomRepository.java
    • Updated findPostsByTagId method signature to use String organization.
  • src/main/java/org/example/tackit/domain/Free_board/Free_tag/repository/FreeTagCustomRepositoryImpl.java
    • Updated Status to AccountStatus.
    • Commented out organization filter in findPostsByTagId.
  • src/main/java/org/example/tackit/domain/Free_board/Free_tag/service/FreeTagService.java
    • Commented out getFreePostsByTag method.
  • src/main/java/org/example/tackit/domain/Notice_board/Notice_comment/controller/NoticeCommentController.java
    • Modified comment endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/Notice_board/Notice_comment/service/NoticeCommentService.java
    • Replaced MemberRepository with MemberOrgRepository for member lookups.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/Notice_board/Notice_post/controller/NoticePostController.java
    • Modified post endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/Notice_board/Notice_post/repository/NoticePostRepository.java
    • Replaced findByOrganization with findByWriterId.
  • src/main/java/org/example/tackit/domain/Notice_board/Notice_post/service/NoticePostService.java
    • Replaced MemberRepository with MemberOrgRepository.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/Organization/controller/OrganizationController.java
    • Added new controller for managing organizations (create, join).
  • src/main/java/org/example/tackit/domain/Organization/dto/req/OrgCreateReqDto.java
    • Added new DTO for creating organizations.
  • src/main/java/org/example/tackit/domain/Organization/dto/req/OrgJoinReqDto.java
    • Added new DTO for joining organizations.
  • src/main/java/org/example/tackit/domain/Organization/dto/resp/OrgRespDto.java
    • Added empty DTO for organization responses.
  • src/main/java/org/example/tackit/domain/Organization/repository/OrganizationRepository.java
    • Added new repository for Organization entity.
  • src/main/java/org/example/tackit/domain/Organization/repository/SchoolRepository.java
    • Added new repository for School entity.
  • src/main/java/org/example/tackit/domain/Organization/service/OrganizationService.java
    • Added new service for managing organizations (create, join) with validation.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_comment/controller/QnACommentController.java
    • Modified comment endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_comment/repository/QnACommentRepository.java
    • Updated findByWriter to use MemberOrg.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_comment/service/QnACommentService.java
    • Replaced QnAMemberRepository with MemberOrgRepository.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/controller/QnAPostController.java
    • Modified post endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/controller/QnAPostScrapController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/repository/QnAMemberRepository.java
    • Removed findByEmailAndOrganization method.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/repository/QnAPostReportRepository.java
    • Added existsByMemberAndQnaPost method using MemberOrg.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/repository/QnAPostRepository.java
    • Updated Status to AccountStatus.
    • Replaced findAllByStatusAndWriter_Organization with findByWriterIdAndAccountStatus.
    • Added new @query method findTop3PopularByOrg.
    • Commented out old popular post methods.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/repository/QnAScrapRepository.java
    • Commented out findByMemberAndQnaPost and findByMemberAndQnaPost_Status methods.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/service/QnAPostService.java
    • Replaced QnAMemberRepository with MemberOrgRepository.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_post/service/QnAScrapService.java
    • Commented out toggleScrap and getMyQnAScraps methods.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_tag/controller/QnATagController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/QnA_board/QnA_tag/repository/QnATagCustomRepositoryImpl.java
    • Updated Status to AccountStatus.
    • Commented out organization filter in findPostsByTagId.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_comment/controller/TipCommentController.java
    • Modified comment endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_comment/dto/resp/TipCommentResponseDto.java
    • Changed id type from long to Long.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_comment/repository/TipCommentRepository.java
    • Updated findByWriter to use MemberOrg.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_comment/service/TipCommentService.java
    • Replaced TipMemberRepository with MemberOrgRepository.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_post/controller/TipController.java
    • Modified post endpoints to use @ActiveProfile ProfileContext for organization ID.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_post/repository/TipMemberRepository.java
    • Removed findByEmailAndOrganization method.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_post/repository/TipPostReportRepository.java
    • Updated existsByMemberAndTipPost to existsByReporterAndTipPost using MemberOrg.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_post/repository/TipPostRepository.java
    • Updated Status to AccountStatus.
    • Replaced findByOrganizationAndStatus with findByWriterId.
    • Added new query methods for popular posts and commented out old ones.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_post/repository/TipScrapRepository.java
    • Updated findByMemberAndTipPost to findByMemberOrgAndTipPost.
    • Updated existsByTipPostIdAndMemberId to existsByTipPostIdAndMemberOrg_Id.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_post/service/TipPostService.java
    • Replaced TipMemberRepository with MemberOrgRepository.
    • Updated method signatures to use Long orgId and adjusted logic for MemberOrg.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_tag/controller/TipTagController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_tag/repository/TipTagCustomRepository.java
    • Commented out findPostsByTagId method.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_tag/repository/TipTagCustomRepositoryImpl.java
    • Updated Status to AccountStatus.
    • Commented out organization filter in findPostsByTagId.
  • src/main/java/org/example/tackit/domain/Tip_board/Tip_tag/service/TipTagService.java
    • Commented out getPostsByTag method.
  • src/main/java/org/example/tackit/domain/admin/controller/AdminDashboardController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/admin/controller/AdminMemberController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/admin/dto/DeletedMemberDTO.java
    • Updated Status to AccountStatus.
    • Removed nickname field.
  • src/main/java/org/example/tackit/domain/admin/dto/MemberDTO.java
    • Updated Status to AccountStatus.
  • src/main/java/org/example/tackit/domain/admin/dto/ReportedPostDTO.java
    • Removed organization field.
    • Adjusted fromEntity to use MemberOrg for writer information.
  • src/main/java/org/example/tackit/domain/admin/model/ReportablePost.java
    • Updated getWriter to return MemberOrg.
    • Removed getOrganization method.
  • src/main/java/org/example/tackit/domain/admin/repository/AdminFreePostRepository.java
    • Updated Status to AccountStatus.
    • Updated findAllByStatusAndReportCountGreaterThanEqual to findAllByAccountStatusAndReportCountGreaterThanEqual.
  • src/main/java/org/example/tackit/domain/admin/repository/AdminMemberRepository.java
    • Updated Status to AccountStatus.
    • Commented out bulkUpdateType and existsByNickname methods.
  • src/main/java/org/example/tackit/domain/admin/repository/AdminQnAPostRepository.java
    • Updated Status to AccountStatus.
    • Updated findAllByStatusAndReportCountGreaterThanEqual to findAllByAccountStatusAndReportCountGreaterThanEqual.
  • src/main/java/org/example/tackit/domain/admin/repository/AdminTipPostRepository.java
    • Updated Status to AccountStatus.
    • Updated findAllByStatusAndReportCountGreaterThanEqual to findAllByAccountStatusAndReportCountGreaterThanEqual.
  • src/main/java/org/example/tackit/domain/admin/repository/UserLogRepository.java
    • Renamed to MemberLogRepository.java.
    • Commented out findDauByTimestampBetween and findMauByTimestampBetween methods.
  • src/main/java/org/example/tackit/domain/admin/service/AdminDashboardService.java
    • Updated UserLogRepository to MemberLogRepository.
    • Updated Status to AccountStatus.
    • Commented out the entire service.
  • src/main/java/org/example/tackit/domain/admin/service/AdminFreePostService.java
    • Updated Status to AccountStatus.
    • Updated findAllByStatusAndReportCountGreaterThanEqual to findAllByAccountStatusAndReportCountGreaterThanEqual.
  • src/main/java/org/example/tackit/domain/admin/service/AdminMemberService.java
    • Updated Status to AccountStatus.
    • Commented out getAllMembersOrderByStatus and getDeletedMembers methods.
  • src/main/java/org/example/tackit/domain/admin/service/AdminQnAPostService.java
    • Updated Status to AccountStatus.
    • Updated findAllByStatusAndReportCountGreaterThanEqual to findAllByAccountStatusAndReportCountGreaterThanEqual.
  • src/main/java/org/example/tackit/domain/admin/service/AdminTipPostService.java
    • Updated Status to AccountStatus.
    • Updated findAllByStatusAndReportCountGreaterThanEqual to findAllByAccountStatusAndReportCountGreaterThanEqual.
  • src/main/java/org/example/tackit/domain/auth/login/controller/AuthController.java
    • Modified signIn to return SignInResponse.
    • Commented out findEmail and findPassword methods.
  • src/main/java/org/example/tackit/domain/auth/login/controller/CheckController.java
    • Commented out checkNickname method.
  • src/main/java/org/example/tackit/domain/auth/login/dto/MultiProfileDto.java
    • Added new DTO for multi-profile information.
  • src/main/java/org/example/tackit/domain/auth/login/dto/SignInResponse.java
    • Added new DTO for sign-in responses with multi-profile list.
  • src/main/java/org/example/tackit/domain/auth/login/dto/SignUpDto.java
    • Removed organization-specific fields.
  • src/main/java/org/example/tackit/domain/auth/login/dto/TokenDto.java
    • Commented out role field.
  • src/main/java/org/example/tackit/domain/auth/login/repository/MemberOrgRepository.java
    • Added new repository for MemberOrg entity with various query methods.
  • src/main/java/org/example/tackit/domain/auth/login/repository/MemberRepository.java
    • Updated Status to AccountStatus.
    • Removed existsByNickname and organization-related find methods.
  • src/main/java/org/example/tackit/domain/auth/login/security/CustomUserDetails.java
    • Removed organization and memberType fields from constructor and class.
    • Simplified authorities to just ROLE_USER.
  • src/main/java/org/example/tackit/domain/auth/login/service/AuthService.java
    • Refactored signIn to return SignInResponse with multi-profile info.
    • Added selectProfile method for choosing an organization profile.
    • Commented out findEmailbyOrgAndNickname and findPwByIdentity.
  • src/main/java/org/example/tackit/domain/auth/login/service/CheckService.java
    • Commented out isNicknameDuplicated method.
  • src/main/java/org/example/tackit/domain/auth/login/service/CustomUserDetailsService.java
    • Updated Status to AccountStatus.
    • Simplified createUserDetails to assign only ROLE_USER.
  • src/main/java/org/example/tackit/domain/auth/login/service/RejoinCheckService.java
    • Updated Status to AccountStatus.
  • src/main/java/org/example/tackit/domain/auth/logout/repository/LogoutRepository.java
    • Removed Status import.
  • src/main/java/org/example/tackit/domain/auth/logout/service/WithdrawService.java
    • Removed Status import and related authentication details.
  • src/main/java/org/example/tackit/domain/entity/Event.java
    • Added new entity for calendar events.
  • src/main/java/org/example/tackit/domain/entity/EventParticipant.java
    • Added new entity for event participants.
  • src/main/java/org/example/tackit/domain/entity/EventScope.java
    • Added new enum for event scope.
  • src/main/java/org/example/tackit/domain/entity/FreeComment.java
    • Updated writer to be MemberOrg instead of Member.
  • src/main/java/org/example/tackit/domain/entity/FreePost.java
    • Updated writer to be MemberOrg.
    • Added organization as Organization entity.
    • Replaced status with accountStatus.
  • src/main/java/org/example/tackit/domain/entity/FreeReport.java
    • Updated member to be MemberOrg.
  • src/main/java/org/example/tackit/domain/entity/FreeScrap.java
    • Updated member to be MemberOrg.
  • src/main/java/org/example/tackit/domain/entity/Member.java
    • Simplified Member entity, removed organization-specific fields and roles.
    • Added accountStatus.
    • Commented out calculateYearsOfService, generateMypageResponse, and updateNickname.
  • src/main/java/org/example/tackit/domain/entity/MemberLog.java
    • Updated memberId, memberRole, memberType, organization fields to member, memberOrg, and orgName.
  • src/main/java/org/example/tackit/domain/entity/NoticeComment.java
    • Updated writer to be MemberOrg.
  • src/main/java/org/example/tackit/domain/entity/NoticePost.java
    • Updated writer to be MemberOrg.
    • Removed organization field.
  • src/main/java/org/example/tackit/domain/entity/Notification.java
    • Added memberOrgId and fromMemberOrgId fields.
  • src/main/java/org/example/tackit/domain/entity/Org/MemberOrg.java
    • Added new entity MemberOrg for member profiles within organizations.
  • src/main/java/org/example/tackit/domain/entity/Org/OrgStatus.java
    • Added new enum for organization membership status.
  • src/main/java/org/example/tackit/domain/entity/Org/OrgType.java
    • Added new enum for organization type.
  • src/main/java/org/example/tackit/domain/entity/Org/Organization.java
    • Added new entity Organization for clubs or communities.
  • src/main/java/org/example/tackit/domain/entity/Org/School.java
    • Added new entity School for schools.
  • src/main/java/org/example/tackit/domain/entity/Org/SchoolType.java
    • Added new enum for school type.
  • src/main/java/org/example/tackit/domain/entity/QnAComment.java
    • Updated writer to be MemberOrg.
    • Updated status to accountStatus.
  • src/main/java/org/example/tackit/domain/entity/QnAPost.java
    • Updated writer to be MemberOrg.
    • Updated status to accountStatus.
  • src/main/java/org/example/tackit/domain/entity/QnAReport.java
    • Updated member to be MemberOrg.
  • src/main/java/org/example/tackit/domain/entity/Report.java
    • Updated reporter to be MemberOrg.
  • src/main/java/org/example/tackit/domain/entity/Status.java
    • Renamed to AccountStatus.java.
  • src/main/java/org/example/tackit/domain/entity/TipComment.java
    • Updated writer to be MemberOrg.
    • Updated status to accountStatus.
  • src/main/java/org/example/tackit/domain/entity/TipPost.java
    • Updated writer to be MemberOrg.
    • Updated status to accountStatus.
  • src/main/java/org/example/tackit/domain/entity/TipReport.java
    • Updated member to reporter of type MemberOrg.
  • src/main/java/org/example/tackit/domain/entity/TipScrap.java
    • Updated member to memberOrg of type MemberOrg.
  • src/main/java/org/example/tackit/domain/event/controller/EventController.java
    • Added new controller for managing calendar events.
  • src/main/java/org/example/tackit/domain/event/dto/EventCreateReqDto.java
    • Added new DTO for creating events.
  • src/main/java/org/example/tackit/domain/event/dto/EventDetailResDto.java
    • Added new DTO for detailed event responses.
  • src/main/java/org/example/tackit/domain/event/dto/EventParticipantDto.java
    • Added new DTO for event participant information.
  • src/main/java/org/example/tackit/domain/event/dto/EventSimpleResDto.java
    • Added new DTO for simplified event responses.
  • src/main/java/org/example/tackit/domain/event/dto/EventUpdateReqDto.java
    • Added new DTO for updating events.
  • src/main/java/org/example/tackit/domain/event/repository/EventRepository.java
    • Added new repository for Event entity with query methods.
  • src/main/java/org/example/tackit/domain/event/service/EventService.java
    • Added new service for managing calendar events with business logic and validation.
  • src/main/java/org/example/tackit/domain/mypage/controller/MemberController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/mypage/controller/MypageFreeController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/mypage/controller/MypageQnAController.java
    • Modified getMyQnaPosts and getMyQnaComments to use @ActiveProfile ProfileContext.
  • src/main/java/org/example/tackit/domain/mypage/controller/MypageTipController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/mypage/dto/response/MemberMypageResponse.java
    • Commented out the entire DTO.
  • src/main/java/org/example/tackit/domain/mypage/dto/response/QnAMyCommentResponseDto.java
    • Added a newline at the end of the file.
  • src/main/java/org/example/tackit/domain/mypage/service/MemberScheduler.java
    • Commented out the entire scheduler.
  • src/main/java/org/example/tackit/domain/mypage/service/MemberService.java
    • Commented out the entire service.
  • src/main/java/org/example/tackit/domain/mypage/service/MyPageFreeService.java
    • Commented out the entire service.
  • src/main/java/org/example/tackit/domain/mypage/service/MyPageQnAService.java
    • Updated QnAMemberRepository to MemberOrgRepository.
    • Modified getMyPosts and getMyComments to accept Long orgId.
  • src/main/java/org/example/tackit/domain/mypage/service/MyPageTipService.java
    • Updated TipMemberRepository to MemberOrgRepository.
    • Modified getScrapListByMember, getMyPosts, and getMyComments to accept Long orgId.
  • src/main/java/org/example/tackit/domain/mypage/service/UpdateMemberService.java
    • Commented out the entire service.
  • src/main/java/org/example/tackit/domain/notification/controller/NotificationController.java
    • Modified getAllNotifications to use @ActiveProfile ProfileContext.
  • src/main/java/org/example/tackit/domain/notification/repository/NotificationRepository.java
    • Added findAllByMemberIdAndMemberOrgIdOrderByCreatedAtDesc method.
  • src/main/java/org/example/tackit/domain/notification/service/NotificationService.java
    • Added MemberOrgRepository.
    • Modified findAllNotifications to use ProfileContext and query by memberOrgId.
  • src/main/java/org/example/tackit/domain/report/controller/ReportController.java
    • Commented out the entire controller.
  • src/main/java/org/example/tackit/domain/report/dto/ReportContentDetailDto.java
    • Updated Status to AccountStatus.
  • src/main/java/org/example/tackit/domain/report/dto/ReportListDto.java
    • Updated Status to AccountStatus.
  • src/main/java/org/example/tackit/domain/report/service/ReportService.java
    • Commented out createReport method.
  • src/test/java/org/example/tackit/MemberSchedulerTest.java
    • Commented out the entire test class.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a multi-profile system, refactoring user and organization-related logic across the application. Key changes include replacing direct Member entity references with MemberOrg for actions tied to specific organizations, and updating many service and controller methods to accept a Long orgId or ProfileContext instead of a String organization.

New DTOs (ActiveProfile, ProfileContext, MultiProfileDto, SignInResponse) and a ProfileContextResolver with WebConfig are added to support the new multi-profile authentication flow, where users can select a specific organizational profile after login. The TokenProvider is updated to generate tokens with an orgId claim, and CustomUserDetails is simplified by removing organization-specific fields.

Several repositories (FreeMemberJPARepository, QnAMemberRepository, TipMemberRepository) have been simplified by removing findByEmailAndOrganization methods, as MemberOrgRepository now handles organization-specific member lookups. Entity fields like status are consistently renamed to accountStatus across various entities and services. Initializer classes for tags are commented out, and the CommonDataInitializer now sets up a default admin email and a school, removing previous member-specific initializations.

Review comments highlight issues with access control logic in FreePostService where organization ID comparisons were inverted or type-mismatched, and suggest refactoring repetitive userDetails == null checks in controllers using Spring Security annotations or filters for better code organization and maintainability. A potential NullPointerException in ProfileContextResolver when idStr is null is also noted.

Comment on lines 97 to 99
if (post.getOrganization().getId().equals(currProfile.getOrganization().getId()) ) {
throw new AccessDeniedCustomException(ErrorCode.ACCESS_DENIED_ORGANIZATION);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

조직 ID가 일치할 경우 접근을 거부하고 있어 로직이 반대로 구현된 것 같습니다. !를 추가하여 조직 ID가 일치하지 않을 때 예외를 던지도록 수정해야 합니다.

Suggested change
if (post.getOrganization().getId().equals(currProfile.getOrganization().getId()) ) {
throw new AccessDeniedCustomException(ErrorCode.ACCESS_DENIED_ORGANIZATION);
}
if (!post.getOrganization().getId().equals(currProfile.getOrganization().getId())) {
throw new AccessDeniedCustomException(ErrorCode.ACCESS_DENIED_ORGANIZATION);
}

Comment on lines 311 to 313
if (!post.getOrganization().equals(orgId)) {
throw new AccessDeniedCustomException(ErrorCode.ACCESS_DENIED_ORGANIZATION);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

post.getOrganization()Organization 객체를 반환하고, orgIdLong 타입의 프로필 ID이므로 타입이 맞지 않아 비교가 올바르게 동작하지 않습니다. 현재 프로필의 조직 ID와 게시글의 조직 ID를 비교해야 합니다.

Suggested change
if (!post.getOrganization().equals(orgId)) {
throw new AccessDeniedCustomException(ErrorCode.ACCESS_DENIED_ORGANIZATION);
}
if (!post.getOrganization().getId().equals(member.getOrganization().getId())) {
throw new AccessDeniedCustomException(ErrorCode.ACCESS_DENIED_ORGANIZATION);
}

Comment on lines 33 to 34
log.warn("멀티 프로필 헤더가 누락되었습니다. ID: {}", idStr);
throw new IllegalArgumentException("Required 'Active-Profile-Id' header is not present.");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

idStrnull일 때 log.warn 문에서 NullPointerException이 발생할 수 있습니다. idStrnull인 경우를 로깅 메시지에서 안전하게 처리해야 합니다.

Suggested change
log.warn("멀티 프로필 헤더가 누락되었습니다. ID: {}", idStr);
throw new IllegalArgumentException("Required 'Active-Profile-Id' header is not present.");
log.warn("멀티 프로필 헤더가 누락되었습니다.");
throw new IllegalArgumentException("Required 'Active-Profile-Id' header is not present.");

Comment on lines 76 to 78
if (!post.getWriter().getId().equals(orgId)) {
throw new AccessDeniedException("해당 조직의 게시글만 조회할 수 있습니다.");
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

현재 로직은 게시글 작성자의 프로필 ID(post.getWriter().getId())와 현재 사용자의 프로필 ID(orgId)를 비교하고 있습니다. "해당 조직의 게시글만 조회할 수 있습니다"라는 접근 제어 목적에 맞게, 현재 사용자의 조직과 게시글의 조직이 일치하는지 확인하는 로직으로 수정해야 합니다.

        MemberOrg currentProfile = memberOrgRepository.findById(orgId)
                .orElseThrow(() -> new IllegalArgumentException("유효하지 않은 프로필입니다."));
        if (!post.getOrganization().getId().equals(currentProfile.getOrganization().getId())) {
            throw new AccessDeniedException("해당 조직의 게시글만 조회할 수 있습니다.");
        }

Comment on lines +28 to +41
public ResponseEntity<?> createEvent(
@RequestBody EventCreateReqDto reqDto,
@AuthenticationPrincipal CustomUserDetails userDetails
) {
// TODO 인증 정보가 없습니다 코드 공통 로직 처리
if (userDetails == null) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("인증 정보가 없습니다.");
}

Long eventId = eventService.createEvent(reqDto, userDetails.getId());

// TODO ResponseEntity 커스텀 공통 양식 추가
return ResponseEntity.status(HttpStatus.CREATED).body(eventId);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

모든 컨트롤러 메소드에서 userDetails == null 체크가 반복되고 있습니다. Spring Security의 @PreAuthorize("isAuthenticated()") 어노테이션을 사용하거나, 인터셉터 또는 필터를 활용하여 인증 여부를 공통으로 처리하면 코드 중복을 줄이고 컨트롤러 로직을 더 깔끔하게 유지할 수 있습니다. 예를 들어, 클래스 레벨에 @PreAuthorize("isAuthenticated()")를 추가하고 SecurityConfig에서 활성화할 수 있습니다.

@yeongsinkeem
Copy link
Collaborator

캘린더 API 관련한 high priority 없는 거 확인했습니다 !
FreePostService 부분은 추후 리팩토링할 때 수정하면 좋을 것 같습니다

@yeongsinkeem yeongsinkeem changed the base branch from main to dev_temp February 11, 2026 07:09
@yeongsinkeem yeongsinkeem merged commit d08bfe4 into dev_temp Feb 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 캘린더 일정 생성

2 participants