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 @@ -19,8 +19,8 @@
import lombok.RequiredArgsConstructor;
import project.flipnote.auth.controller.docs.AuthControllerDocs;
import project.flipnote.auth.model.ChangePasswordRequest;
import project.flipnote.auth.model.EmailVerifyRequest;
import project.flipnote.auth.model.EmailVerificationRequest;
import project.flipnote.auth.model.EmailVerifyRequest;
import project.flipnote.auth.model.PasswordResetCreateRequest;
import project.flipnote.auth.model.PasswordResetRequest;
import project.flipnote.auth.model.TokenPair;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import project.flipnote.auth.model.ChangePasswordRequest;
import project.flipnote.auth.model.EmailVerifyRequest;
import project.flipnote.auth.model.EmailVerificationRequest;
import project.flipnote.auth.model.EmailVerifyRequest;
import project.flipnote.auth.model.PasswordResetCreateRequest;
import project.flipnote.auth.model.PasswordResetRequest;
import project.flipnote.auth.model.UserLoginRequest;
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/project/flipnote/auth/service/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
import project.flipnote.auth.event.PasswordResetCreateEvent;
import project.flipnote.auth.exception.AuthErrorCode;
import project.flipnote.auth.model.ChangePasswordRequest;
import project.flipnote.auth.model.EmailVerifyRequest;
import project.flipnote.auth.model.EmailVerificationRequest;
import project.flipnote.auth.model.EmailVerifyRequest;
import project.flipnote.auth.model.PasswordResetCreateRequest;
import project.flipnote.auth.model.PasswordResetRequest;
import project.flipnote.auth.model.TokenPair;
Expand All @@ -34,9 +34,9 @@
import project.flipnote.auth.util.PasswordResetTokenGenerator;
import project.flipnote.auth.util.VerificationCodeGenerator;
import project.flipnote.common.config.ClientProperties;
import project.flipnote.common.model.request.UserCreateCommand;
import project.flipnote.common.model.event.UserRegisteredEvent;
import project.flipnote.common.exception.BizException;
import project.flipnote.common.model.event.UserRegisteredEvent;
import project.flipnote.common.model.request.UserCreateCommand;
import project.flipnote.common.security.dto.AuthPrinciple;
import project.flipnote.common.security.jwt.JwtComponent;
import project.flipnote.user.model.SocialLinksResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
public enum CommonErrorCode implements ErrorCode {
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(), "COMMON_001", "예기치 않은 오류가 발생했습니다."),
INVALID_INPUT_VALUE(HttpStatus.BAD_REQUEST.value(), "COMMON_002", "입력값이 올바르지 않습니다."),
SERVICE_TEMPORARILY_UNAVAILABLE(HttpStatus.TOO_MANY_REQUESTS.value(), "COMMON_003", "요청이 많아 처리되지 않았습니다. 잠시 후 다시 시도해주세요.");
SERVICE_TEMPORARILY_UNAVAILABLE(
HttpStatus.TOO_MANY_REQUESTS.value(), "COMMON_003", "요청이 많아 처리되지 않았습니다. 잠시 후 다시 시도해주세요."
);

private final int status;
private final String code;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package project.flipnote.common.model.event;

import java.util.List;

public record GroupJoinRequestedEvent(
Long groupId,
List<Long> receiverIds,
Long requesterId
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ public Long getCursorId() {
return null;
}

return Long.valueOf(normalized);
try {
return Long.valueOf(normalized);
} catch (NumberFormatException ex) {
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.authorizeHttpRequests(auth -> auth
.requestMatchers(
HttpMethod.POST,
"/*/users", "/*/auth/token/refresh", "/*/auth/password-resets", "/*/auth/register", "/*/images/upload"
"/*/users", "/*/auth/token/refresh", "/*/auth/password-resets", "/*/auth/register",
"/*/images/upload"
).permitAll()
.requestMatchers(HttpMethod.PATCH, "/*/auth/password-resets").permitAll()
.requestMatchers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@ Optional<GroupInvitation> findByIdAndGroup_IdAndInviteeUserIdAndStatus(
boolean existsByGroup_IdAndInviteeEmailAndStatus(Long groupId, String inviteeEmail, GroupInvitationStatus status);

@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query("UPDATE GroupInvitation gi " +
"SET gi.status = project.flipnote.group.entity.GroupInvitationStatus.EXPIRED " +
"WHERE gi.status = project.flipnote.group.entity.GroupInvitationStatus.PENDING " +
"AND gi.expiredAt < :now")
@Query("""
UPDATE GroupInvitation gi
SET gi.status = project.flipnote.group.entity.GroupInvitationStatus.EXPIRED
WHERE gi.status = project.flipnote.group.entity.GroupInvitationStatus.PENDING
AND gi.expiredAt < :now
""")
int bulkExpire(@Param("now") LocalDateTime now);
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
package project.flipnote.group.repository;

import java.util.List;
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import project.flipnote.group.entity.Group;

import org.springframework.stereotype.Repository;
import project.flipnote.group.entity.GroupMember;
import project.flipnote.group.entity.GroupMemberRole;
import project.flipnote.user.entity.UserProfile;

import java.util.Optional;

@Repository
public interface GroupMemberRepository extends JpaRepository<GroupMember, Long> {
Optional<GroupMember> findByGroupAndUser(Group group, UserProfile userProfile);
Optional<GroupMember> findByGroupAndUser(Group group, UserProfile userProfile);

long countByGroup_Id(Long groupId);

boolean existsByGroup_idAndUser_id(Long groupId, Long userId);

Optional<GroupMember> findByGroup_IdAndUser_Id(Long groupId, Long userId);

List<GroupMember> findByGroupAndRoleIn(Group group, List<GroupMemberRole> roles);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package project.flipnote.group.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import project.flipnote.group.entity.Group;
Expand All @@ -11,4 +13,6 @@
@Repository
public interface GroupRolePermissionRepository extends JpaRepository<GroupRolePermission, Long> {
boolean existsByGroupAndRoleAndGroupPermission(Group group, GroupMemberRole role, GroupPermission groupPermission);

List<GroupRolePermission> findByGroupAndGroupPermission(Group group, GroupPermission groupPermission);
}
45 changes: 22 additions & 23 deletions src/main/java/project/flipnote/group/service/GroupService.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,14 @@ public UserProfile validateUser(AuthPrinciple authPrinciple) {
() -> new BizException(UserErrorCode.USER_NOT_FOUND)
);
}

/*
그룹 내 유저 조회
*/
public boolean validateGroupInUser(UserProfile user, Long groupId) {
return groupMemberRepository.existsByGroup_idAndUser_id(groupId, user.getId());
}

/*
그룹 조회
*/
Expand All @@ -67,7 +67,6 @@ public Group validateGroup(Long groupId) {
);
}


/*
그룹 생성
*/
Expand Down Expand Up @@ -113,30 +112,30 @@ private void initializeGroupPermissions(Group group) {
List<GroupPermission> groupPermissions = groupPermissionRepository.findAll();

List<GroupRolePermission> groupRolePermissions = Arrays.stream(GroupMemberRole.values())
.flatMap(role -> groupPermissions.stream()
.map(permission -> GroupRolePermission.builder()
.group(group)
.groupPermission(permission)
.role(role)
.build()))
.toList();
.flatMap(role -> groupPermissions.stream()
.map(permission -> GroupRolePermission.builder()
.group(group)
.groupPermission(permission)
.role(role)
.build()))
.toList();

groupRolePermissionRepository.saveAll(groupRolePermissions);
}

/*
그룹 생성 메서드
*/
private Group createGroup(GroupCreateRequest req) {
private Group createGroup(GroupCreateRequest req) {
Group group = Group.builder()
.name(req.name())
.category(req.category())
.description(req.description())
.applicationRequired(req.applicationRequired())
.publicVisible(req.publicVisible())
.maxMember(req.maxMember())
.imageUrl(req.image())
.build();
.name(req.name())
.category(req.category())
.description(req.description())
.applicationRequired(req.applicationRequired())
.publicVisible(req.publicVisible())
.maxMember(req.maxMember())
.imageUrl(req.image())
.build();

Group saveGroup = groupRepository.save(group);

Expand All @@ -150,10 +149,10 @@ private Group createGroup(GroupCreateRequest req) {
*/
private void saveGroupOwner(Group group, UserProfile user) {
GroupMember groupMember = GroupMember.builder()
.group(group)
.user(user)
.role(GroupMemberRole.OWNER)
.build();
.group(group)
.user(user)
.role(GroupMemberRole.OWNER)
.build();

groupMemberRepository.save(groupMember);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package project.flipnote.groupjoin.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import project.flipnote.group.entity.Group;
import project.flipnote.groupjoin.entity.GroupJoin;
import project.flipnote.user.entity.UserProfile;

import java.util.List;

@Repository
public interface GroupJoinRepository extends JpaRepository<GroupJoin, Long> {
List<GroupJoin> findAllByGroup(Group group);
List<GroupJoin> findAllByGroup(Group group);

List<GroupJoin> findAllByUser(UserProfile userProfile);
List<GroupJoin> findAllByUser(UserProfile userProfile);

boolean existsByGroup_idAndUser_id(Long groupId, Long userId);
boolean existsByGroup_idAndUser_id(Long groupId, Long userId);
}
Loading
Loading