diff --git a/build.gradle b/build.gradle index 1c4613a8..62a853fc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.2.4' - id 'io.spring.dependency-management' version '1.1.4' + id 'java' + id 'org.springframework.boot' version '3.2.4' + id 'io.spring.dependency-management' version '1.1.4' id 'org.asciidoctor.jvm.convert' version "3.3.2" id 'jacoco' } @@ -10,18 +10,18 @@ group = 'liaison' version = '0.0.1-SNAPSHOT' java { - sourceCompatibility = '17' + sourceCompatibility = '17' } configurations { asciidoctorExt - compileOnly { - extendsFrom annotationProcessor - } + compileOnly { + extendsFrom annotationProcessor + } } repositories { - mavenCentral() + mavenCentral() } dependencies { @@ -30,12 +30,14 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-batch' + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'com.amazonaws:aws-java-sdk-s3:1.12.715' implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.0.0' implementation 'javax.xml.bind:jaxb-api:2.3.0' + // p6spy 자리 implementation 'org.springframework.boot:spring-boot-starter-data-redis' @@ -74,7 +76,7 @@ dependencies { implementation 'org.flywaydb:flyway-core' implementation 'org.flywaydb:flyway-mysql' - implementation 'org.mindrot:jbcrypt:0.4' + implementation 'org.mindrot:jbcrypt:0.4' } test { @@ -116,7 +118,7 @@ tasks.withType(JavaCompile) { // java source set 에 querydsl QClass 위치 추가 sourceSets { - main.java.srcDirs += [ generated ] + main.java.srcDirs += [generated] } // gradle clean 시에 QClass 디렉토리 삭제 diff --git a/src/main/generated/liaison/linkit/admin/domain/QAdminMember.java b/src/main/generated/liaison/linkit/admin/domain/QAdminMember.java deleted file mode 100644 index 5772f19b..00000000 --- a/src/main/generated/liaison/linkit/admin/domain/QAdminMember.java +++ /dev/null @@ -1,51 +0,0 @@ -package liaison.linkit.admin.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QAdminMember is a Querydsl query type for AdminMember - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAdminMember extends EntityPathBase { - - private static final long serialVersionUID = -1364834362L; - - public static final QAdminMember adminMember = new QAdminMember("adminMember"); - - public final EnumPath adminType = createEnum("adminType", liaison.linkit.admin.domain.type.AdminType.class); - - public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); - - public final NumberPath id = createNumber("id", Long.class); - - public final DateTimePath lastLoginDate = createDateTime("lastLoginDate", java.time.LocalDateTime.class); - - public final DateTimePath modifiedAt = createDateTime("modifiedAt", java.time.LocalDateTime.class); - - public final StringPath password = createString("password"); - - public final EnumPath status = createEnum("status", liaison.linkit.member.domain.type.MemberState.class); - - public final StringPath username = createString("username"); - - public QAdminMember(String variable) { - super(AdminMember.class, forVariable(variable)); - } - - public QAdminMember(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QAdminMember(PathMetadata metadata) { - super(AdminMember.class, metadata); - } - -} - diff --git a/src/main/generated/liaison/linkit/common/domain/QBaseDateTimeEntity.java b/src/main/generated/liaison/linkit/common/domain/QBaseDateTimeEntity.java new file mode 100644 index 00000000..f2d0acce --- /dev/null +++ b/src/main/generated/liaison/linkit/common/domain/QBaseDateTimeEntity.java @@ -0,0 +1,39 @@ +package liaison.linkit.common.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseDateTimeEntity is a Querydsl query type for BaseDateTimeEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseDateTimeEntity extends EntityPathBase { + + private static final long serialVersionUID = -152371682L; + + public static final QBaseDateTimeEntity baseDateTimeEntity = new QBaseDateTimeEntity("baseDateTimeEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseDateTimeEntity(String variable) { + super(BaseDateTimeEntity.class, forVariable(variable)); + } + + public QBaseDateTimeEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseDateTimeEntity(PathMetadata metadata) { + super(BaseDateTimeEntity.class, metadata); + } + +} + diff --git a/src/main/generated/liaison/linkit/member/domain/QMember.java b/src/main/generated/liaison/linkit/member/domain/QMember.java index 815f9a83..a554ece6 100644 --- a/src/main/generated/liaison/linkit/member/domain/QMember.java +++ b/src/main/generated/liaison/linkit/member/domain/QMember.java @@ -22,7 +22,10 @@ public class QMember extends EntityPathBase { public static final QMember member = new QMember("member1"); - public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + public final liaison.linkit.common.domain.QBaseDateTimeEntity _super = new liaison.linkit.common.domain.QBaseDateTimeEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; public final StringPath email = createString("email"); @@ -34,22 +37,19 @@ public class QMember extends EntityPathBase { public final EnumPath memberState = createEnum("memberState", liaison.linkit.member.domain.type.MemberState.class); - public final DateTimePath modifiedAt = createDateTime("modifiedAt", java.time.LocalDateTime.class); - public final NumberPath privateWishCount = createNumber("privateWishCount", Integer.class); public final liaison.linkit.profile.domain.QProfile profile; - public final EnumPath profileType = createEnum("profileType", liaison.linkit.member.domain.type.ProfileType.class); - public final StringPath socialLoginId = createString("socialLoginId"); public final liaison.linkit.team.domain.QTeamProfile teamProfile; - public final EnumPath teamProfileType = createEnum("teamProfileType", liaison.linkit.member.domain.type.TeamProfileType.class); - public final NumberPath teamWishCount = createNumber("teamWishCount", Integer.class); + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + public QMember(String variable) { this(Member.class, forVariable(variable), INITS); } diff --git a/src/main/generated/liaison/linkit/profile/domain/attach/QAttachUrl.java b/src/main/generated/liaison/linkit/profile/domain/attach/QAttachUrl.java deleted file mode 100644 index d970edfc..00000000 --- a/src/main/generated/liaison/linkit/profile/domain/attach/QAttachUrl.java +++ /dev/null @@ -1,55 +0,0 @@ -package liaison.linkit.profile.domain.attach; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QAttachUrl is a Querydsl query type for AttachUrl - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAttachUrl extends EntityPathBase { - - private static final long serialVersionUID = 1845519294L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QAttachUrl attachUrl = new QAttachUrl("attachUrl"); - - public final StringPath attachUrlName = createString("attachUrlName"); - - public final StringPath attachUrlPath = createString("attachUrlPath"); - - public final NumberPath id = createNumber("id", Long.class); - - public final liaison.linkit.profile.domain.QProfile profile; - - public QAttachUrl(String variable) { - this(AttachUrl.class, forVariable(variable), INITS); - } - - public QAttachUrl(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QAttachUrl(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QAttachUrl(PathMetadata metadata, PathInits inits) { - this(AttachUrl.class, metadata, inits); - } - - public QAttachUrl(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.profile = inits.isInitialized("profile") ? new liaison.linkit.profile.domain.QProfile(forProperty("profile"), inits.get("profile")) : null; - } - -} - diff --git a/src/main/generated/liaison/linkit/team/domain/attach/QTeamAttachUrl.java b/src/main/generated/liaison/linkit/team/domain/attach/QTeamAttachUrl.java deleted file mode 100644 index fa5f8e11..00000000 --- a/src/main/generated/liaison/linkit/team/domain/attach/QTeamAttachUrl.java +++ /dev/null @@ -1,55 +0,0 @@ -package liaison.linkit.team.domain.attach; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QTeamAttachUrl is a Querydsl query type for TeamAttachUrl - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QTeamAttachUrl extends EntityPathBase { - - private static final long serialVersionUID = 925297701L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QTeamAttachUrl teamAttachUrl = new QTeamAttachUrl("teamAttachUrl"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath teamAttachUrlName = createString("teamAttachUrlName"); - - public final StringPath teamAttachUrlPath = createString("teamAttachUrlPath"); - - public final liaison.linkit.team.domain.QTeamProfile teamProfile; - - public QTeamAttachUrl(String variable) { - this(TeamAttachUrl.class, forVariable(variable), INITS); - } - - public QTeamAttachUrl(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QTeamAttachUrl(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QTeamAttachUrl(PathMetadata metadata, PathInits inits) { - this(TeamAttachUrl.class, metadata, inits); - } - - public QTeamAttachUrl(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.teamProfile = inits.isInitialized("teamProfile") ? new liaison.linkit.team.domain.QTeamProfile(forProperty("teamProfile"), inits.get("teamProfile")) : null; - } - -} - diff --git a/src/main/generated/liaison/linkit/team/domain/miniprofile/QTeamKeyword.java b/src/main/generated/liaison/linkit/team/domain/miniprofile/QTeamKeyword.java deleted file mode 100644 index 28e629c8..00000000 --- a/src/main/generated/liaison/linkit/team/domain/miniprofile/QTeamKeyword.java +++ /dev/null @@ -1,53 +0,0 @@ -package liaison.linkit.team.domain.miniprofile; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QTeamKeyword is a Querydsl query type for TeamKeyword - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QTeamKeyword extends EntityPathBase { - - private static final long serialVersionUID = -1972105873L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QTeamKeyword teamKeyword = new QTeamKeyword("teamKeyword"); - - public final NumberPath id = createNumber("id", Long.class); - - public final liaison.linkit.team.domain.QTeam team; - - public final StringPath teamKeywordNames = createString("teamKeywordNames"); - - public QTeamKeyword(String variable) { - this(TeamKeyword.class, forVariable(variable), INITS); - } - - public QTeamKeyword(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QTeamKeyword(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QTeamKeyword(PathMetadata metadata, PathInits inits) { - this(TeamKeyword.class, metadata, inits); - } - - public QTeamKeyword(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.team = inits.isInitialized("team") ? new liaison.linkit.team.domain.QTeam(forProperty("team"), inits.get("team")) : null; - } - -} - diff --git a/src/main/generated/liaison/linkit/wish/domain/QPrivateWish.java b/src/main/generated/liaison/linkit/wish/domain/QPrivateWish.java index 374ca61a..c90b61bf 100644 --- a/src/main/generated/liaison/linkit/wish/domain/QPrivateWish.java +++ b/src/main/generated/liaison/linkit/wish/domain/QPrivateWish.java @@ -39,8 +39,6 @@ public class QPrivateWish extends EntityPathBase { //inherited public final EnumPath status = _super.status; - public final EnumPath wishType = createEnum("wishType", liaison.linkit.wish.domain.type.WishType.class); - public QPrivateWish(String variable) { this(PrivateWish.class, forVariable(variable), INITS); } diff --git a/src/main/generated/liaison/linkit/wish/domain/QTeamWish.java b/src/main/generated/liaison/linkit/wish/domain/QTeamWish.java index a963108a..659ed83e 100644 --- a/src/main/generated/liaison/linkit/wish/domain/QTeamWish.java +++ b/src/main/generated/liaison/linkit/wish/domain/QTeamWish.java @@ -39,8 +39,6 @@ public class QTeamWish extends EntityPathBase { public final liaison.linkit.team.domain.announcement.QTeamMemberAnnouncement teamMemberAnnouncement; - public final EnumPath wishType = createEnum("wishType", liaison.linkit.wish.domain.type.WishType.class); - public QTeamWish(String variable) { this(TeamWish.class, forVariable(variable), INITS); } diff --git a/src/main/java/liaison/linkit/LinkitApplication.java b/src/main/java/liaison/linkit/LinkitApplication.java index 4b4da262..21f3cbcc 100644 --- a/src/main/java/liaison/linkit/LinkitApplication.java +++ b/src/main/java/liaison/linkit/LinkitApplication.java @@ -2,12 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication -@EnableJpaAuditing public class LinkitApplication { - public static void main(String[] args) { - SpringApplication.run(LinkitApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(LinkitApplication.class, args); + } } diff --git a/src/main/java/liaison/linkit/admin/AdminLoginArgumentResolver.java b/src/main/java/liaison/linkit/admin/AdminLoginArgumentResolver.java deleted file mode 100644 index b43cf4ab..00000000 --- a/src/main/java/liaison/linkit/admin/AdminLoginArgumentResolver.java +++ /dev/null @@ -1,96 +0,0 @@ -package liaison.linkit.admin; - -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; -import liaison.linkit.admin.domain.AdminMember; -import liaison.linkit.admin.domain.repository.AdminMemberRepository; -import liaison.linkit.auth.AdminAuth; -import liaison.linkit.auth.domain.Accessor; -import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.global.exception.RefreshTokenException; -import liaison.linkit.login.domain.MemberTokens; -import liaison.linkit.login.domain.repository.RefreshTokenRepository; -import liaison.linkit.login.infrastructure.BearerAuthorizationExtractor; -import liaison.linkit.login.infrastructure.JwtProvider; -import lombok.RequiredArgsConstructor; -import org.springframework.core.MethodParameter; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; - -import java.util.Arrays; - -import static liaison.linkit.admin.domain.type.AdminType.ADMIN; -import static liaison.linkit.admin.domain.type.AdminType.MASTER; -import static liaison.linkit.global.exception.ExceptionCode.*; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; - -@Component -@RequiredArgsConstructor -public class AdminLoginArgumentResolver implements HandlerMethodArgumentResolver { - - private static final String REFRESH_TOKEN = "refresh-token"; - - private final JwtProvider jwtProvider; - - private final BearerAuthorizationExtractor extractor; - - private final RefreshTokenRepository refreshTokenRepository; - - private final AdminMemberRepository adminMemberRepository; - - @Override - public boolean supportsParameter(final MethodParameter parameter) { - return parameter.withContainingClass(Long.class) - .hasParameterAnnotation(AdminAuth.class); - } - - @Override - public Accessor resolveArgument( - final MethodParameter parameter, - final ModelAndViewContainer mvcContainer, - final NativeWebRequest webRequest, - final WebDataBinderFactory binderFactory - ) { - final HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - if (request == null) { - throw new BadRequestException(INVALID_REQUEST); - } - - final String refreshToken = extractRefreshToken(request.getCookies()); - final String accessToken = extractor.extractAccessToken(webRequest.getHeader(AUTHORIZATION)); - jwtProvider.validateTokens(new MemberTokens(refreshToken, accessToken)); - - final Long memberId = Long.valueOf(jwtProvider.getSubject(accessToken)); - - final AdminMember adminMember = adminMemberRepository.findById(memberId) - .orElseThrow(() -> new RefreshTokenException(INVALID_ADMIN_AUTHORITY)); - - if (adminMember.getAdminType().equals(MASTER)) { - return Accessor.master(memberId); - } - if (adminMember.getAdminType().equals(ADMIN)) { - return Accessor.admin(memberId); - } - - throw new RefreshTokenException(INVALID_ADMIN_AUTHORITY); - } - - private String extractRefreshToken(final Cookie... cookies) { - if (cookies == null) { - throw new RefreshTokenException(NOT_FOUND_REFRESH_TOKEN); - } - return Arrays.stream(cookies) - .filter(this::isValidRefreshToken) - .findFirst() - .orElseThrow(() -> new RefreshTokenException(NOT_FOUND_REFRESH_TOKEN)) - .getValue(); - } - - private boolean isValidRefreshToken(final Cookie cookie) { - return REFRESH_TOKEN.equals(cookie.getName()) && - refreshTokenRepository.existsById(cookie.getValue()); - } -} diff --git a/src/main/java/liaison/linkit/admin/AdminLoginResolverConfig.java b/src/main/java/liaison/linkit/admin/AdminLoginResolverConfig.java deleted file mode 100644 index 05c0ac0b..00000000 --- a/src/main/java/liaison/linkit/admin/AdminLoginResolverConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package liaison.linkit.admin; - -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -@RequiredArgsConstructor -public class AdminLoginResolverConfig implements WebMvcConfigurer { - - private final AdminLoginArgumentResolver adminLoginArgumentResolver; - - -} diff --git a/src/main/java/liaison/linkit/admin/SecurityConfig.java b/src/main/java/liaison/linkit/admin/SecurityConfig.java deleted file mode 100644 index d77a4146..00000000 --- a/src/main/java/liaison/linkit/admin/SecurityConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package liaison.linkit.admin; - -import liaison.linkit.admin.infrastructure.BCryptPasswordEncoder; -import liaison.linkit.admin.infrastructure.PasswordEncoder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class SecurityConfig { - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } -} diff --git a/src/main/java/liaison/linkit/admin/domain/AdminMember.java b/src/main/java/liaison/linkit/admin/domain/AdminMember.java deleted file mode 100644 index 80df0441..00000000 --- a/src/main/java/liaison/linkit/admin/domain/AdminMember.java +++ /dev/null @@ -1,66 +0,0 @@ -package liaison.linkit.admin.domain; - -import jakarta.persistence.*; -import liaison.linkit.admin.domain.type.AdminType; -import liaison.linkit.member.domain.type.MemberState; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Where; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import java.time.LocalDateTime; - -import static jakarta.persistence.EnumType.STRING; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - -@Entity -@Getter -@NoArgsConstructor(access = PROTECTED) -@SQLDelete(sql = "UPDATE admin_member SET status = 'DELETED' WHERE id = ?") -@Where(clause = "status = 'ACTIVE'") -public class AdminMember { - @Id - @GeneratedValue(strategy = IDENTITY) - private Long id; - - @Column(nullable = false, unique = true, length = 20) - private String username; - - @Column(nullable = false, length = 64) - private String password; - - @Column(nullable = false) - private LocalDateTime lastLoginDate; - - @Column(nullable = false) - @Enumerated(value = STRING) - private AdminType adminType; - - @Enumerated(value = STRING) - private MemberState status; - - @CreatedDate - @Column(updatable = false) - private LocalDateTime createdAt; - - @LastModifiedDate - private LocalDateTime modifiedAt; - - public AdminMember(final Long id, final String username, final String password, final AdminType adminType) { - this.id = id; - this.username = username; - this.password = password; - this.lastLoginDate = LocalDateTime.now(); - this.adminType = adminType; - this.status = MemberState.ACTIVE; - this.createdAt = LocalDateTime.now(); - this.modifiedAt = LocalDateTime.now(); - } - - public AdminMember(final String username, final String password, final AdminType adminType) { - this(null, username, password, adminType); - } -} diff --git a/src/main/java/liaison/linkit/admin/domain/repository/AdminMemberRepository.java b/src/main/java/liaison/linkit/admin/domain/repository/AdminMemberRepository.java deleted file mode 100644 index 981b7b2f..00000000 --- a/src/main/java/liaison/linkit/admin/domain/repository/AdminMemberRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package liaison.linkit.admin.domain.repository; - -import liaison.linkit.admin.domain.AdminMember; -import liaison.linkit.admin.domain.type.AdminType; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.Optional; - -public interface AdminMemberRepository extends JpaRepository { - Optional findByUsername(String username); - - Boolean existsByIdAndAdminType(Long id, AdminType adminType); - - Boolean existsByUsername(String username); -} diff --git a/src/main/java/liaison/linkit/admin/domain/type/AdminType.java b/src/main/java/liaison/linkit/admin/domain/type/AdminType.java deleted file mode 100644 index a0e8db9b..00000000 --- a/src/main/java/liaison/linkit/admin/domain/type/AdminType.java +++ /dev/null @@ -1,19 +0,0 @@ -package liaison.linkit.admin.domain.type; - -import liaison.linkit.global.exception.AdminException; - -import java.util.Arrays; - -import static liaison.linkit.global.exception.ExceptionCode.NULL_ADMIN_AUTHORITY; - -public enum AdminType { - ADMIN, - MASTER; - - public static AdminType getMappedAdminType(final String adminType) { - return Arrays.stream(values()) - .filter(value -> value.name().toUpperCase().equals(adminType)) - .findAny() - .orElseThrow(() -> new AdminException(NULL_ADMIN_AUTHORITY)); - } -} diff --git a/src/main/java/liaison/linkit/admin/dto/request/AdminLoginRequest.java b/src/main/java/liaison/linkit/admin/dto/request/AdminLoginRequest.java deleted file mode 100644 index 46cda405..00000000 --- a/src/main/java/liaison/linkit/admin/dto/request/AdminLoginRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package liaison.linkit.admin.dto.request; - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class AdminLoginRequest { - - @NotNull(message = "사용자 이름을 입력해주세요.") - @Size(max = 20, message = "사용자 이름은 20자를 초과할 수 없습니다.") - private String username; - - @NotNull(message = "비밀번호를 입력해주세요.") - @Size(min = 4, max = 20, message = "비밀번호는 4자 이상, 20자 이하여야 합니다.") - private String password; - -} diff --git a/src/main/java/liaison/linkit/admin/dto/request/AdminMemberCreateRequest.java b/src/main/java/liaison/linkit/admin/dto/request/AdminMemberCreateRequest.java deleted file mode 100644 index cc79f951..00000000 --- a/src/main/java/liaison/linkit/admin/dto/request/AdminMemberCreateRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package liaison.linkit.admin.dto.request; - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class AdminMemberCreateRequest { - - @NotNull(message = "사용자 이름을 입력해주세요.") - @Size(max = 20, message = "사용자 이름은 20자를 초과할 수 없습니다.") - private String username; - - @NotNull(message = "비밀번호를 입력해주세요.") - @Size(min = 4, max = 20, message = "비밀번호는 4자 이상, 20자 이하여야 합니다.") - private String password; - - @NotNull(message = "관리자 권한을 선택해 주세요.") - private String adminType; -} diff --git a/src/main/java/liaison/linkit/admin/dto/request/PasswordUpdateRequest.java b/src/main/java/liaison/linkit/admin/dto/request/PasswordUpdateRequest.java deleted file mode 100644 index 8ad95c63..00000000 --- a/src/main/java/liaison/linkit/admin/dto/request/PasswordUpdateRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package liaison.linkit.admin.dto.request; - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class PasswordUpdateRequest { - - @NotNull(message = "기존 비밀번호를 입력해주세요.") - @Size(min = 4, max = 20, message = "비밀번호는 4자 이상, 20자 이하여야 합니다.") - private String currentPassword; - - @NotNull(message = "새로운 비밀번호를 입력해주세요.") - @Size(min = 4, max = 20, message = "비밀번호는 4자 이상, 20자 이하여야 합니다.") - private String newPassword; - -} diff --git a/src/main/java/liaison/linkit/admin/dto/response/AdminMemberResponse.java b/src/main/java/liaison/linkit/admin/dto/response/AdminMemberResponse.java deleted file mode 100644 index abb5e90c..00000000 --- a/src/main/java/liaison/linkit/admin/dto/response/AdminMemberResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package liaison.linkit.admin.dto.response; - -import liaison.linkit.admin.domain.AdminMember; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import static lombok.AccessLevel.PRIVATE; - -@Getter -@RequiredArgsConstructor(access = PRIVATE) -public class AdminMemberResponse { - private final Long id; - private final String username; - private final String adminType; - - public static AdminMemberResponse from(final AdminMember adminMember) { - return new AdminMemberResponse( - adminMember.getId(), - adminMember.getUsername(), - adminMember.getAdminType().name() - ); - } -} diff --git a/src/main/java/liaison/linkit/admin/infrastructure/BCryptPasswordEncoder.java b/src/main/java/liaison/linkit/admin/infrastructure/BCryptPasswordEncoder.java deleted file mode 100644 index 5956f42a..00000000 --- a/src/main/java/liaison/linkit/admin/infrastructure/BCryptPasswordEncoder.java +++ /dev/null @@ -1,15 +0,0 @@ -package liaison.linkit.admin.infrastructure; - -import org.mindrot.jbcrypt.BCrypt; - -public class BCryptPasswordEncoder implements PasswordEncoder{ - @Override - public String encode(final String password) { - return BCrypt.hashpw(password, BCrypt.gensalt()); - } - - @Override - public boolean matches(final String password, final String hashed) { - return BCrypt.checkpw(password, hashed); - } -} diff --git a/src/main/java/liaison/linkit/admin/infrastructure/PasswordEncoder.java b/src/main/java/liaison/linkit/admin/infrastructure/PasswordEncoder.java deleted file mode 100644 index 80559571..00000000 --- a/src/main/java/liaison/linkit/admin/infrastructure/PasswordEncoder.java +++ /dev/null @@ -1,7 +0,0 @@ -package liaison.linkit.admin.infrastructure; - -public interface PasswordEncoder { - String encode(String password); - - boolean matches(String password, String hashed); -} diff --git a/src/main/java/liaison/linkit/admin/presentation/AdminLoginController.java b/src/main/java/liaison/linkit/admin/presentation/AdminLoginController.java deleted file mode 100644 index 900f2fb7..00000000 --- a/src/main/java/liaison/linkit/admin/presentation/AdminLoginController.java +++ /dev/null @@ -1,62 +0,0 @@ -package liaison.linkit.admin.presentation; - -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import liaison.linkit.admin.dto.request.AdminLoginRequest; -import liaison.linkit.admin.service.AdminLoginService; -import liaison.linkit.auth.AdminAuth; -import liaison.linkit.auth.domain.Accessor; -import liaison.linkit.login.domain.MemberTokens; -import liaison.linkit.login.dto.AccessTokenResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseCookie; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import static org.springframework.http.HttpHeaders.SET_COOKIE; -import static org.springframework.http.HttpStatus.CREATED; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/admin") -public class AdminLoginController { - - private static final int COOKIE_AGE_SECONDS = 604800; // 1주일 - - private final AdminLoginService adminLoginService; - - @PostMapping("/login") - public ResponseEntity login( - @RequestBody @Valid final AdminLoginRequest adminLoginRequest, - final HttpServletResponse response - ) { - final MemberTokens memberTokens = adminLoginService.login(adminLoginRequest); - final ResponseCookie cookie = ResponseCookie.from("refresh-token", memberTokens.getRefreshToken()) - .maxAge(COOKIE_AGE_SECONDS) - .sameSite("None") - .secure(true) - .httpOnly(true) - .path("/") - .build(); - response.addHeader(SET_COOKIE, cookie.toString()); - return ResponseEntity.status(CREATED).body(new AccessTokenResponse(memberTokens.getAccessToken())); - } - - @PostMapping("/token") - public ResponseEntity extendLogin( - @CookieValue("refresh-token") final String refreshToken, - @RequestHeader("Authorization") final String authorizationHeader - ) { - final String renewalRefreshToken = adminLoginService.renewalAccessToken(refreshToken, authorizationHeader); - return ResponseEntity.status(CREATED).body(new AccessTokenResponse(renewalRefreshToken)); - } - - @DeleteMapping("/logout") - public ResponseEntity logout( - @AdminAuth final Accessor accessor, - @CookieValue("refresh-token") final String refreshToken - ) { - adminLoginService.removeRefreshToken(refreshToken); - return ResponseEntity.noContent().build(); - } -} diff --git a/src/main/java/liaison/linkit/admin/presentation/AdminMemberController.java b/src/main/java/liaison/linkit/admin/presentation/AdminMemberController.java deleted file mode 100644 index f33507c2..00000000 --- a/src/main/java/liaison/linkit/admin/presentation/AdminMemberController.java +++ /dev/null @@ -1,54 +0,0 @@ -package liaison.linkit.admin.presentation; - -import jakarta.validation.Valid; -import liaison.linkit.admin.dto.request.AdminMemberCreateRequest; -import liaison.linkit.admin.dto.request.PasswordUpdateRequest; -import liaison.linkit.admin.dto.response.AdminMemberResponse; -import liaison.linkit.admin.service.AdminMemberService; -import liaison.linkit.auth.AdminAuth; -import liaison.linkit.auth.MasterOnly; -import liaison.linkit.auth.domain.Accessor; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.net.URI; -import java.util.List; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/admin/members") -public class AdminMemberController { - - private final AdminMemberService adminMemberService; - - @GetMapping - @MasterOnly - public ResponseEntity> getAdminMembers( - @AdminAuth final Accessor accessor - ) { - final List adminMemberResponses = adminMemberService.getAdminMembers(); - return ResponseEntity.ok(adminMemberResponses); - } - - @PostMapping - @MasterOnly - public ResponseEntity createAdminMember( - @AdminAuth final Accessor accessor, - @RequestBody @Valid final AdminMemberCreateRequest adminMemberCreateRequest - ) { - final Long memberId = adminMemberService.createAdminMember(adminMemberCreateRequest); - return ResponseEntity.created(URI.create("/admin/members/" + memberId)).build(); - } - - @PatchMapping("/{memberId}/password") - @MasterOnly - public ResponseEntity updatePassword( - @AdminAuth final Accessor accessor, - @PathVariable final Long memberId, - @RequestBody @Valid final PasswordUpdateRequest passwordUpdateRequest - ) { - adminMemberService.updatePassword(memberId, passwordUpdateRequest); - return ResponseEntity.noContent().build(); - } -} diff --git a/src/main/java/liaison/linkit/admin/service/AdminLoginService.java b/src/main/java/liaison/linkit/admin/service/AdminLoginService.java deleted file mode 100644 index 334310c5..00000000 --- a/src/main/java/liaison/linkit/admin/service/AdminLoginService.java +++ /dev/null @@ -1,62 +0,0 @@ -package liaison.linkit.admin.service; - -import liaison.linkit.admin.domain.AdminMember; -import liaison.linkit.admin.domain.repository.AdminMemberRepository; -import liaison.linkit.admin.dto.request.AdminLoginRequest; -import liaison.linkit.admin.infrastructure.PasswordEncoder; -import liaison.linkit.global.exception.AdminException; -import liaison.linkit.global.exception.AuthException; -import liaison.linkit.login.domain.MemberTokens; -import liaison.linkit.login.domain.RefreshToken; -import liaison.linkit.login.domain.repository.RefreshTokenRepository; -import liaison.linkit.login.infrastructure.BearerAuthorizationExtractor; -import liaison.linkit.login.infrastructure.JwtProvider; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import static liaison.linkit.global.exception.ExceptionCode.*; - -@Service -@Transactional -@RequiredArgsConstructor -public class AdminLoginService { - private final AdminMemberRepository adminMemberRepository; - private final RefreshTokenRepository refreshTokenRepository; - private final JwtProvider jwtProvider; - private final BearerAuthorizationExtractor bearerAuthorizationExtractor; - private final PasswordEncoder passwordEncoder; - - public MemberTokens login(final AdminLoginRequest adminLoginRequest) { - final AdminMember adminMember = adminMemberRepository - .findByUsername(adminLoginRequest.getUsername()) - .orElseThrow(() -> new AdminException(INVALID_USER_NAME)); - - if (passwordEncoder.matches(adminLoginRequest.getPassword(), adminMember.getPassword())) { - final MemberTokens memberTokens = jwtProvider.generateLoginToken(adminMember.getId().toString()); - final RefreshToken savedRefreshToken = new RefreshToken(memberTokens.getRefreshToken(), - adminMember.getId()); - refreshTokenRepository.save(savedRefreshToken); - return memberTokens; - } - - throw new AdminException(INVALID_PASSWORD); - } - - public String renewalAccessToken(final String refreshTokenRequest, final String authorizationHeader) { - final String accessToken = bearerAuthorizationExtractor.extractAccessToken(authorizationHeader); - if (jwtProvider.isValidRefreshAndInvalidAccess(refreshTokenRequest, accessToken)) { - final RefreshToken refreshToken = refreshTokenRepository.findById(refreshTokenRequest) - .orElseThrow(() -> new AuthException(INVALID_REFRESH_TOKEN)); - return jwtProvider.regenerateAccessToken((refreshToken.getMemberId().toString())); - } - if (jwtProvider.isValidRefreshAndValidAccess(refreshTokenRequest, accessToken)) { - return accessToken; - } - throw new AuthException(FAIL_TO_VALIDATE_TOKEN); - } - - public void removeRefreshToken(final String refreshToken) { - refreshTokenRepository.deleteById(refreshToken); - } -} diff --git a/src/main/java/liaison/linkit/admin/service/AdminMemberService.java b/src/main/java/liaison/linkit/admin/service/AdminMemberService.java deleted file mode 100644 index 5c9a2062..00000000 --- a/src/main/java/liaison/linkit/admin/service/AdminMemberService.java +++ /dev/null @@ -1,63 +0,0 @@ -package liaison.linkit.admin.service; - -import liaison.linkit.admin.domain.AdminMember; -import liaison.linkit.admin.domain.repository.AdminMemberRepository; -import liaison.linkit.admin.domain.type.AdminType; -import liaison.linkit.admin.dto.request.AdminMemberCreateRequest; -import liaison.linkit.admin.dto.request.PasswordUpdateRequest; -import liaison.linkit.admin.dto.response.AdminMemberResponse; -import liaison.linkit.admin.infrastructure.PasswordEncoder; -import liaison.linkit.global.exception.AdminException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - -@Service -@Transactional -@RequiredArgsConstructor -public class AdminMemberService { - private final AdminMemberRepository adminMemberRepository; - private final PasswordEncoder passwordEncoder; - - public List getAdminMembers() { - final List adminMembers = adminMemberRepository.findAll(); - return adminMembers.stream() - .map(AdminMemberResponse::from) - .toList(); - } - - public Long createAdminMember(final AdminMemberCreateRequest request) { - if (adminMemberRepository.existsByUsername(request.getUsername())) { - throw new AdminException(DUPLICATED_ADMIN_USERNAME); - } - - return adminMemberRepository.save( - new AdminMember( - request.getUsername(), - passwordEncoder.encode(request.getPassword()), - AdminType.getMappedAdminType(request.getAdminType()) - ) - ).getId(); - } - - public void updatePassword(final Long adminMemberId, final PasswordUpdateRequest request) { - final AdminMember adminMember = adminMemberRepository.findById(adminMemberId) - .orElseThrow(() -> new AdminException(NOT_FOUND_ADMIN_ID)); - - if (!passwordEncoder.matches(request.getCurrentPassword(), adminMember.getPassword())) { - throw new AdminException(INVALID_CURRENT_PASSWORD); - } - - final AdminMember updatedAdminMember = new AdminMember( - adminMember.getId(), - adminMember.getUsername(), - passwordEncoder.encode(request.getNewPassword()), - adminMember.getAdminType() - ); - adminMemberRepository.save(updatedAdminMember); - } -} diff --git a/src/main/java/liaison/linkit/common/annotation/Adapter.java b/src/main/java/liaison/linkit/common/annotation/Adapter.java new file mode 100644 index 00000000..07ab5236 --- /dev/null +++ b/src/main/java/liaison/linkit/common/annotation/Adapter.java @@ -0,0 +1,19 @@ +package liaison.linkit.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Component; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component +public @interface Adapter { + // 스프링 빈의 이름을 지정 + @AliasFor(annotation = Component.class) + String value() default ""; +} diff --git a/src/main/java/liaison/linkit/common/annotation/ApiErrorCodeExample.java b/src/main/java/liaison/linkit/common/annotation/ApiErrorCodeExample.java new file mode 100644 index 00000000..2e974b90 --- /dev/null +++ b/src/main/java/liaison/linkit/common/annotation/ApiErrorCodeExample.java @@ -0,0 +1,13 @@ +package liaison.linkit.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import liaison.linkit.common.exception.BaseErrorCode; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiErrorCodeExample { + Class[] value(); // 배열로 변경 +} diff --git a/src/main/java/liaison/linkit/common/annotation/ExplainError.java b/src/main/java/liaison/linkit/common/annotation/ExplainError.java new file mode 100644 index 00000000..dd693240 --- /dev/null +++ b/src/main/java/liaison/linkit/common/annotation/ExplainError.java @@ -0,0 +1,16 @@ +package liaison.linkit.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.stereotype.Component; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component +public @interface ExplainError { + String value() default ""; +} diff --git a/src/main/java/liaison/linkit/common/annotation/Mapper.java b/src/main/java/liaison/linkit/common/annotation/Mapper.java new file mode 100644 index 00000000..a7c00dc7 --- /dev/null +++ b/src/main/java/liaison/linkit/common/annotation/Mapper.java @@ -0,0 +1,19 @@ +package liaison.linkit.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Component; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component +public @interface Mapper { + // 스프링 빈의 이름을 지정 + @AliasFor(annotation = Component.class) + String value() default ""; +} diff --git a/src/main/java/liaison/linkit/common/consts/LinkitStatic.java b/src/main/java/liaison/linkit/common/consts/LinkitStatic.java new file mode 100644 index 00000000..039f5395 --- /dev/null +++ b/src/main/java/liaison/linkit/common/consts/LinkitStatic.java @@ -0,0 +1,15 @@ +package liaison.linkit.common.consts; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LinkitStatic { + public static final int BAD_REQUEST = 400; + public static final int UNAUTHORIZED = 401; + public static final int FORBIDDEN = 403; + public static final int NOT_FOUND = 404; + public static final int DUPLICATE = 409; + public static final int TOO_MANY_REQUESTS = 429; + public static final int INTERNAL_SERVER = 500; +} diff --git a/src/main/java/liaison/linkit/common/domain/BaseDateTimeEntity.java b/src/main/java/liaison/linkit/common/domain/BaseDateTimeEntity.java new file mode 100644 index 00000000..600a94f5 --- /dev/null +++ b/src/main/java/liaison/linkit/common/domain/BaseDateTimeEntity.java @@ -0,0 +1,24 @@ +package liaison.linkit.common.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import java.time.LocalDateTime; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +// JPA - Auditing 기능을 활성화하여 저장, 업데이트될 때 특정 필드를 채움 +@EntityListeners(AuditingEntityListener.class) +// 이 클래스를 직접 테이블로 매핑하지 않고, 다른 엔티티 클래스들이 상속받아 사용할 수 있는 공통 매핑 정보로 제공 +@MappedSuperclass +@Getter +public abstract class BaseDateTimeEntity { + @Column(updatable = false) + @CreatedDate + private LocalDateTime createdAt; + + @LastModifiedDate + private LocalDateTime updatedAt; +} diff --git a/src/main/java/liaison/linkit/common/exception/AuthErrorCode.java b/src/main/java/liaison/linkit/common/exception/AuthErrorCode.java new file mode 100644 index 00000000..f5d3b412 --- /dev/null +++ b/src/main/java/liaison/linkit/common/exception/AuthErrorCode.java @@ -0,0 +1,36 @@ +package liaison.linkit.common.exception; + +import static liaison.linkit.common.consts.LinkitStatic.FORBIDDEN; +import static liaison.linkit.common.consts.LinkitStatic.UNAUTHORIZED; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum AuthErrorCode implements BaseErrorCode { + + TOKEN_EXPIRED(UNAUTHORIZED, "AUTH_401_1", "AccessToken 인증 시간이 만료되었습니다. 인증토큰을 재발급 해주세요"), + INVALID_TOKEN(UNAUTHORIZED, "AUTH_401_2", "유효하지 않은 AccessToken입니다. 재로그인 해주세요"), + REFRESH_TOKEN_EXPIRED(FORBIDDEN, "AUTH_403_1", "RefreshToken 인증 시간이 만료되었습니다. 재로그인 해주세요."), + ACCESS_TOKEN_NOT_EXIST(FORBIDDEN, "AUTH_403_2", "올바른 AccessToken을 넣어주세요."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/common/exception/BaseCodeException.java b/src/main/java/liaison/linkit/common/exception/BaseCodeException.java new file mode 100644 index 00000000..a8b63603 --- /dev/null +++ b/src/main/java/liaison/linkit/common/exception/BaseCodeException.java @@ -0,0 +1,15 @@ +package liaison.linkit.common.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class BaseCodeException extends RuntimeException { + + private final BaseErrorCode errorCode; + + public ErrorReason getErrorReason() { + return this.errorCode.getErrorReason(); + } +} diff --git a/src/main/java/liaison/linkit/common/exception/BaseErrorCode.java b/src/main/java/liaison/linkit/common/exception/BaseErrorCode.java new file mode 100644 index 00000000..de730a47 --- /dev/null +++ b/src/main/java/liaison/linkit/common/exception/BaseErrorCode.java @@ -0,0 +1,9 @@ +package liaison.linkit.common.exception; + +public interface BaseErrorCode { + + ErrorReason getErrorReason(); + + String getExplainError() throws NoSuchFieldException; + +} diff --git a/src/main/java/liaison/linkit/common/exception/ErrorReason.java b/src/main/java/liaison/linkit/common/exception/ErrorReason.java new file mode 100644 index 00000000..5c743871 --- /dev/null +++ b/src/main/java/liaison/linkit/common/exception/ErrorReason.java @@ -0,0 +1,12 @@ +package liaison.linkit.common.exception; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ErrorReason { + private final Integer status; + private final String code; + private final String reason; +} diff --git a/src/main/java/liaison/linkit/common/exception/GlobalErrorCode.java b/src/main/java/liaison/linkit/common/exception/GlobalErrorCode.java new file mode 100644 index 00000000..c74c4a16 --- /dev/null +++ b/src/main/java/liaison/linkit/common/exception/GlobalErrorCode.java @@ -0,0 +1,35 @@ +package liaison.linkit.common.exception; + +import static liaison.linkit.common.consts.LinkitStatic.BAD_REQUEST; +import static liaison.linkit.common.consts.LinkitStatic.INTERNAL_SERVER; +import static liaison.linkit.common.consts.LinkitStatic.TOO_MANY_REQUESTS; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum GlobalErrorCode implements BaseErrorCode { + ARGUMENT_NOT_VALID_ERROR(BAD_REQUEST, "GLOBAL_400_1", "잘못된 요청"), + INTERNAL_SERVER_ERROR(INTERNAL_SERVER, "GLOBAL_500_1", "서버 오류. 관리자에게 문의 부탁드립니다."), + TOO_MANY_REQUEST(TOO_MANY_REQUESTS, "GLOBAL_429_1", "과도한 요청을 보내셨습니다. 잠시 기다려 주세요."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/common/presentation/CommonResponse.java b/src/main/java/liaison/linkit/common/presentation/CommonResponse.java new file mode 100644 index 00000000..27ce461d --- /dev/null +++ b/src/main/java/liaison/linkit/common/presentation/CommonResponse.java @@ -0,0 +1,37 @@ +package liaison.linkit.common.presentation; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@JsonPropertyOrder({"isSuccess", "code", "message", "result"}) +public class CommonResponse { + + @JsonProperty("isSuccess") + private Boolean isSuccess; + + @JsonProperty("code") + private String code; + + @JsonProperty("message") + private String message; + + // 실제 응답 데이터 + // 제네릭 타입을 통해 다양한 유형의 응답 데이터를 담음 + @JsonProperty("result") + private T result; + + // 정적 팩토리 메서드 + public static CommonResponse onSuccess(T data) { + return new CommonResponse<>(true, "1000", "요청에 성공하였습니다.", data); + } + + public static CommonResponse onFailure(String code, String message, T data) { + return new CommonResponse<>(false, code, message, data); + } +} diff --git a/src/main/java/liaison/linkit/common/presentation/ErrorResponse.java b/src/main/java/liaison/linkit/common/presentation/ErrorResponse.java new file mode 100644 index 00000000..52e11d03 --- /dev/null +++ b/src/main/java/liaison/linkit/common/presentation/ErrorResponse.java @@ -0,0 +1,39 @@ +package liaison.linkit.common.presentation; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.time.LocalDateTime; +import liaison.linkit.common.exception.ErrorReason; +import lombok.Getter; + +@Getter +@JsonPropertyOrder({"isSuccess", "code", "message", "status", "timeStamp", "path"}) +public class ErrorResponse { + + @JsonProperty("isSuccess") + private final boolean success; + + private final int status; + private final String code; + private final String message; + private final LocalDateTime timeStamp; + private final String path; + + public ErrorResponse(ErrorReason errorReason, String path) { + this.success = false; + this.status = errorReason.getStatus(); + this.code = errorReason.getCode(); + this.message = errorReason.getReason(); + this.timeStamp = LocalDateTime.now(); + this.path = path; + } + + public ErrorResponse(int status, String code, String reason, String path) { + this.success = false; + this.status = status; + this.code = code; + this.message = reason; + this.timeStamp = LocalDateTime.now(); + this.path = path; + } +} diff --git a/src/main/java/liaison/linkit/global/config/CorsConfig.java b/src/main/java/liaison/linkit/global/config/CorsConfig.java index c23ef5d3..fc42c7fe 100644 --- a/src/main/java/liaison/linkit/global/config/CorsConfig.java +++ b/src/main/java/liaison/linkit/global/config/CorsConfig.java @@ -1,7 +1,6 @@ package liaison.linkit.global.config; import liaison.linkit.matching.MatchingAccessInterceptor; -import liaison.linkit.profile.browse.ProfileBrowseAccessInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; @@ -15,22 +14,24 @@ public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(final CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("http://localhost:3000", "https://www.linkit.im", "https://linkit.im", "https://dev-linkit.vercel.app", "https://liaison-dev.site", "https://www.liaison-dev.site") + .allowedOrigins( + "http://localhost:3000", + "https://www.linkit.im", + "https://linkit.im", + "https://dev-linkit.vercel.app", + "https://liaison-dev.site", + "https://www.liaison-dev.site") .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS") .allowCredentials(true) .exposedHeaders(HttpHeaders.LOCATION); WebMvcConfigurer.super.addCorsMappings(registry); } - @Autowired - private ProfileBrowseAccessInterceptor profileBrowseAccessInterceptor; - @Autowired private MatchingAccessInterceptor matchingAccessInterceptor; @Override public void addInterceptors(final InterceptorRegistry registry) { - registry.addInterceptor(profileBrowseAccessInterceptor).addPathPatterns("/browse/**"); registry.addInterceptor(matchingAccessInterceptor).addPathPatterns("/matching/**"); } } diff --git a/src/main/java/liaison/linkit/global/config/JpaAuditingConfig.java b/src/main/java/liaison/linkit/global/config/JpaAuditingConfig.java new file mode 100644 index 00000000..dbf6fa39 --- /dev/null +++ b/src/main/java/liaison/linkit/global/config/JpaAuditingConfig.java @@ -0,0 +1,9 @@ +package liaison.linkit.global.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaAuditingConfig { +} diff --git a/src/main/java/liaison/linkit/global/exception/ExceptionCode.java b/src/main/java/liaison/linkit/global/exception/ExceptionCode.java index d0a1dc48..2cd52c97 100644 --- a/src/main/java/liaison/linkit/global/exception/ExceptionCode.java +++ b/src/main/java/liaison/linkit/global/exception/ExceptionCode.java @@ -94,7 +94,7 @@ public enum ExceptionCode { // 1. antecedents 2. attach (URL/FILE) 3. awards INVALID_TEAM_MINI_PROFILE(6004, "해당 팀 미니 프로필이 정보가 존재하지 않습니다."), - NOT_FOUND_MEMBER_BY_MEMBER_ID(1004, "사용자의 ID에 해당하는 회원 정보가 존재하지 않습니다."), + NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID(1004, "사용자의 ID에 해당하는 회원 기본 정보가 존재하지 않습니다."), NOT_FOUND_PROFILE_BY_MEMBER_ID(1004, "사용자의 ID에 해당하는 내 이력서 정보가 존재하지 않습니다."), @@ -175,7 +175,11 @@ public enum ExceptionCode { NOT_FOUND_PRIVATE_MATCHING_BY_ID(9000, "내 이력서 대상 매칭 정보를 찾을 수 없습니다."), NOT_FOUND_TEAM_MATCHING_BY_ID(9001, "팀 소개서 대상 매칭 정보를 찾을 수 없습니다."), - NOT_FOUND_TEAM_WISH_BY_ID(5001, "팀 소개서 온보딩에서 팀 이름, 규모, 분야를 먼저 선택해주세요"); + NOT_FOUND_TEAM_WISH_BY_ID(5001, "팀 소개서 온보딩에서 팀 이름, 규모, 분야를 먼저 선택해주세요"), + + + // 링킷 1.0 버전 이후 기능 업데이트 에러 코드 업데이트 (9월 15일 이후 작성 부분) + NOT_FOUND_MEMBER_BY_MEMBER_ID(110, "사용자의 ID에 해당하는 회원 정보가 존재하지 않습니다."); private final int code; private final String message; } diff --git a/src/main/java/liaison/linkit/login/service/LoginService.java b/src/main/java/liaison/linkit/login/service/LoginService.java index 8259c294..fc1ed0f2 100644 --- a/src/main/java/liaison/linkit/login/service/LoginService.java +++ b/src/main/java/liaison/linkit/login/service/LoginService.java @@ -1,9 +1,22 @@ package liaison.linkit.login.service; +import static liaison.linkit.global.exception.ExceptionCode.DUPLICATED_EMAIL; +import static liaison.linkit.global.exception.ExceptionCode.FAIL_TO_GENERATE_MEMBER; +import static liaison.linkit.global.exception.ExceptionCode.FAIL_TO_VALIDATE_TOKEN; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_REFRESH_TOKEN; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + import jakarta.annotation.Nullable; +import java.util.List; +import java.util.Optional; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.login.domain.*; +import liaison.linkit.login.domain.MemberTokens; +import liaison.linkit.login.domain.OauthProvider; +import liaison.linkit.login.domain.OauthProviders; +import liaison.linkit.login.domain.OauthUserInfo; +import liaison.linkit.login.domain.RefreshToken; import liaison.linkit.login.domain.repository.RefreshTokenRepository; import liaison.linkit.login.dto.MemberTokensAndOnBoardingStepInform; import liaison.linkit.login.dto.RenewTokenResponse; @@ -13,13 +26,14 @@ import liaison.linkit.matching.domain.repository.teamMatching.TeamMatchingRepository; import liaison.linkit.member.domain.Member; import liaison.linkit.member.domain.repository.memberBasicInform.MemberBasicInformRepository; -import liaison.linkit.member.domain.repository.member.MemberRepository; +import liaison.linkit.member.implement.MemberCommandAdapter; +import liaison.linkit.member.implement.MemberQueryAdapter; import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncement; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementRepository; +import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; import lombok.RequiredArgsConstructor; @@ -27,10 +41,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @Transactional @RequiredArgsConstructor @@ -40,7 +50,10 @@ public class LoginService { private static final int MAX_TRY_COUNT = 5; private final RefreshTokenRepository refreshTokenRepository; - private final MemberRepository memberRepository; + + private final MemberQueryAdapter memberQueryAdapter; + private final MemberCommandAdapter memberCommandAdapter; + private final ProfileRepository profileRepository; private final TeamProfileRepository teamProfileRepository; private final OauthProviders oauthProviders; @@ -54,13 +67,6 @@ public class LoginService { private final TeamWishRepository teamWishRepository; private final TeamMemberAnnouncementRepository teamMemberAnnouncementRepository; - - // 회원 조회 - private Member getMember(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BY_MEMBER_ID)); - } - // 내 이력서 조회 private Profile getProfileByMember(final Long memberId) { return profileRepository.findByMemberId(memberId) @@ -96,7 +102,7 @@ public MemberTokensAndOnBoardingStepInform login(final String providerName, fina log.info("existDefaultPrivateProfile={}", existDefaultPrivateProfile); final boolean existDefaultTeamProfile = teamProfile.getExistDefaultTeamProfile(); - log.info("existDefaultTeamProfile={}",existDefaultTeamProfile); + log.info("existDefaultTeamProfile={}", existDefaultTeamProfile); final boolean existDefaultProfile = (existDefaultPrivateProfile || existDefaultTeamProfile); final MemberTokens memberTokens = jwtProvider.generateLoginToken(member.getId().toString()); @@ -115,8 +121,8 @@ public MemberTokensAndOnBoardingStepInform login(final String providerName, fina } private Member findOrCreateMember(final String socialLoginId, final String email) { - return memberRepository.findBySocialLoginId(socialLoginId) - .orElseGet(() -> createMember(socialLoginId, email)); + final Optional member = memberQueryAdapter.findBySocialLoginId(socialLoginId); + return member.orElseGet(() -> createMember(socialLoginId, email)); } @Transactional @@ -124,9 +130,9 @@ public Member createMember(final String socialLoginId, final String email) { log.info("createMember 정상 실행"); int tryCount = 0; while (tryCount < MAX_TRY_COUNT) { - if (!memberRepository.existsByEmail(email)) { + if (!memberQueryAdapter.existsByEmail(email)) { // 만약 이메일에 의해서 존재하지 않는 회원임이 판단된다면 - final Member member = memberRepository.save(new Member(socialLoginId, email, null)); + final Member member = memberCommandAdapter.create(new Member(socialLoginId, email, null)); log.info("memberId={}", member.getId()); // 내 이력서는 자동으로 생성된다. -> 미니 프로필도 함께 생성되어야 한다. @@ -137,7 +143,7 @@ public Member createMember(final String socialLoginId, final String email) { log.info("savedTeamProfile.ID={}", savedTeamProfile.getId()); return member; - } else if(memberRepository.existsByEmail(email)){ + } else if (memberQueryAdapter.existsByEmail(email)) { throw new AuthException(DUPLICATED_EMAIL); } tryCount += 1; @@ -170,8 +176,7 @@ private RenewTokenResponse getRenewTokenResponse(String refreshTokenRequest) { final RefreshToken refreshToken = refreshTokenRepository.findById(refreshTokenRequest) .orElseThrow(() -> new AuthException(INVALID_REFRESH_TOKEN)); - final Member member = getMember(refreshToken.getMemberId()); - + final Member member = memberQueryAdapter.findById(refreshToken.getMemberId()); final boolean existMemberBasicInform = member.isExistMemberBasicInform(); log.info("loginService login method memberId={}", member.getId()); @@ -182,7 +187,7 @@ private RenewTokenResponse getRenewTokenResponse(String refreshTokenRequest) { log.info("existDefaultPrivateProfile={}", existDefaultPrivateProfile); final boolean existDefaultTeamProfile = teamProfile.getExistDefaultTeamProfile(); - log.info("existDefaultTeamProfile={}",existDefaultTeamProfile); + log.info("existDefaultTeamProfile={}", existDefaultTeamProfile); final boolean existDefaultProfile = (existDefaultPrivateProfile || existDefaultTeamProfile); @@ -195,10 +200,14 @@ private RenewTokenResponse getRenewTokenResponse(String refreshTokenRequest) { // 내가 보내거나 받은 내 이력서 관련 매칭 요청에서 check -> false인 것이 존재하는지 // 내가 보내거나 받은 팀 소개서 관련 매칭 요청에서 check -> false인 것이 존재하는지 - final boolean existNonCheckNotification = ((privateMatchingRepository.existsNonCheckByMemberId(member.getId(), profile.getId())) || (teamMatchingRepository.existsNonCheckByMemberId(member.getId(), teamMemberAnnouncementIds))); + final boolean existNonCheckNotification = ( + (privateMatchingRepository.existsNonCheckByMemberId(member.getId(), profile.getId())) + || (teamMatchingRepository.existsNonCheckByMemberId(member.getId(), + teamMemberAnnouncementIds))); if (existMemberBasicInform && existDefaultProfile) { - return new RenewTokenResponse(jwtProvider.regenerateAccessToken(refreshToken.getMemberId().toString()), existMemberBasicInform, existDefaultProfile, existNonCheckNotification); + return new RenewTokenResponse(jwtProvider.regenerateAccessToken(refreshToken.getMemberId().toString()), + existMemberBasicInform, existDefaultProfile, existNonCheckNotification); } else { return new RenewTokenResponse(null, existMemberBasicInform, existDefaultProfile, existNonCheckNotification); } @@ -211,7 +220,7 @@ public void removeRefreshToken(final String refreshToken) { // 수정 필요 public void deleteAccount(final Long memberId) { - final Member member = getMember(memberId); + final Member member = memberQueryAdapter.findById(memberId); final Profile profile = getProfileByMember(memberId); final TeamProfile teamProfile = getTeamProfile(memberId); final List teamMemberAnnouncementList = getTeamMemberAnnouncementList(teamProfile); @@ -259,14 +268,14 @@ public void deleteAccount(final Long memberId) { privateWishRepository.deleteByProfileId(profile.getId()); } - if(memberBasicInformRepository.existsByMemberId(memberId)){ + if (memberBasicInformRepository.existsByMemberId(memberId)) { memberBasicInformRepository.deleteByMemberId(memberId); } // 회원가입하면 무조건 생기는 저장 데이터 teamProfileRepository.deleteByMemberId(memberId); profileRepository.deleteByMemberId(memberId); - memberRepository.deleteByMemberId(memberId); + memberCommandAdapter.deleteByMemberId(memberId); } private List getTeamMemberAnnouncementList(final TeamProfile teamProfile) { diff --git a/src/main/java/liaison/linkit/matching/MatchingAccessInterceptor.java b/src/main/java/liaison/linkit/matching/MatchingAccessInterceptor.java index 2a80b4c2..585c7ca4 100644 --- a/src/main/java/liaison/linkit/matching/MatchingAccessInterceptor.java +++ b/src/main/java/liaison/linkit/matching/MatchingAccessInterceptor.java @@ -2,21 +2,15 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.login.infrastructure.BearerAuthorizationExtractor; import liaison.linkit.login.infrastructure.JwtProvider; -import liaison.linkit.member.domain.Member; import liaison.linkit.member.domain.repository.member.MemberRepository; -import liaison.linkit.member.domain.type.ProfileType; -import liaison.linkit.member.domain.type.TeamProfileType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MEMBER_ID; - @RequiredArgsConstructor @Component @Slf4j @@ -26,12 +20,6 @@ public class MatchingAccessInterceptor implements HandlerInterceptor { private final BearerAuthorizationExtractor extractor; private final MemberRepository memberRepository; -// public MatchingAccessInterceptor() { -// this.jwtProvider = null; -// this.extractor = null; -// this.memberRepository = null; -// } - @Override public boolean preHandle( final HttpServletRequest request, @@ -48,77 +36,14 @@ public boolean preHandle( log.info("checkMatchingToPrivateProfileAccess={}", checkMatchingToPrivateProfileAccess); log.info("checkMatchingToTeamProfileAccess={}", checkMatchingToTeamProfileAccess); - - // 내 이력서에 매칭 요청이 발생한 경우 - if (checkMatchingToPrivateProfileAccess != null) { - final Long memberId = getMemberId(request); - log.info("memberId={}", memberId); - - final ProfileType profileType = getPrivateProfileType(memberId); - log.info("profileType={}",profileType); - - final TeamProfileType teamProfileType = getTeamProfileType(memberId); - log.info("teamProfileType={}",teamProfileType); - - if (!matchingAccessJudge(profileType, teamProfileType)) { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - return false; - } - } // 팀 소개서에 매칭 요청이 발생한 경우 - else if (checkMatchingToTeamProfileAccess != null) { - final Long memberId = getMemberId(request); - log.info("memberId={}", memberId); - - final ProfileType profileType = getPrivateProfileType(memberId); - log.info("profileType={}",profileType); - - final TeamProfileType teamProfileType = getTeamProfileType(memberId); - log.info("teamProfileType={}",teamProfileType); - - if (!matchingAccessJudge(profileType, teamProfileType)) { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - return false; - } - } } return true; } - // 매칭 권한 관리 - // 둘 다 ALLOW BROWSE 경우 -> false 반환된다 / 그게 아니라면 true 반환된다 -> 매칭 요청이 가능함. - private boolean matchingAccessJudge( - final ProfileType profileType, - final TeamProfileType teamProfileType - ) { - if (ProfileType.NO_PERMISSION.equals(profileType) && TeamProfileType.NO_PERMISSION.equals(teamProfileType)) { - return false; - } else if (ProfileType.NO_PERMISSION.equals(profileType) && TeamProfileType.ALLOW_BROWSE.equals(teamProfileType)) { - return false; - } else if (ProfileType.ALLOW_BROWSE.equals(profileType) && TeamProfileType.NO_PERMISSION.equals(teamProfileType)) { - return false; - } else return !ProfileType.ALLOW_BROWSE.equals(profileType) || !TeamProfileType.ALLOW_BROWSE.equals(teamProfileType); - } - - - // 회원 ID 조회 private Long getMemberId(HttpServletRequest request) { String accessToken = extractor.extractAccessToken(request.getHeader("Authorization")); return Long.valueOf(jwtProvider.getSubject(accessToken)); } - - // 내 이력서 타입 반환 - private ProfileType getPrivateProfileType(final Long memberId) { - final Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_ID)); - return member.getProfileType(); - } - - // 팀 소개서 타입 반환 - private TeamProfileType getTeamProfileType(final Long memberId) { - final Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_ID)); - return member.getTeamProfileType(); - } } diff --git a/src/main/java/liaison/linkit/member/business/MemberService.java b/src/main/java/liaison/linkit/member/business/MemberService.java new file mode 100644 index 00000000..b56c776a --- /dev/null +++ b/src/main/java/liaison/linkit/member/business/MemberService.java @@ -0,0 +1,82 @@ +package liaison.linkit.member.business; + +import liaison.linkit.member.domain.Member; +import liaison.linkit.member.domain.MemberBasicInform; +import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformCreateRequest; +import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformUpdateRequest; +import liaison.linkit.member.dto.response.MemberBasicInformResponse; +import liaison.linkit.member.implement.MemberBasicInformCommandAdapter; +import liaison.linkit.member.implement.MemberBasicInformQueryAdapter; +import liaison.linkit.member.implement.MemberQueryAdapter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; + +// 소셜로그인 이후 기본 정보 기입 플로우부터 +@Service +@RequiredArgsConstructor +@Transactional +@Slf4j +public class MemberService { + private final MemberQueryAdapter memberQueryAdapter; + private final MemberBasicInformQueryAdapter memberBasicInformQueryAdapter; + private final MemberBasicInformCommandAdapter memberBasicInformCommandAdapter; + + // 멤버 아이디로 회원 기본 정보의 유효성을 검증하는 로직 + public void validateMemberBasicInformByMember(final Long memberId) { + memberBasicInformQueryAdapter.existsByMemberId(memberId); + } + + // 회원 기본 정보 저장 메서드 + public void save( + final Long memberId, final MemberBasicInformCreateRequest memberBasicInformCreateRequest + ) throws ResponseStatusException { + + final Member member = memberQueryAdapter.findById(memberId); + + // dto -> 객체 + final MemberBasicInform newBasicMemberBasicInform = new MemberBasicInform( + memberBasicInformCreateRequest.getMemberName(), + memberBasicInformCreateRequest.getContact(), + memberBasicInformCreateRequest.isMarketingAgree(), + member + ); + + member.changeIsMemberBasicInform(true); + + // 기본 정보 입력 사용자로부터 재요청 + if (memberBasicInformQueryAdapter.existsByMemberId(memberId)) { + final MemberBasicInform savedMemberBasicInform = memberBasicInformQueryAdapter.findByMemberId(memberId); + savedMemberBasicInform.update(newBasicMemberBasicInform); + } else { + memberBasicInformCommandAdapter.save(newBasicMemberBasicInform); + } + } + + // (해당 회원의) 회원 기본 정보를 조회하는 메서드 + @Transactional(readOnly = true) + public MemberBasicInformResponse getPersonalMemberBasicInform(final Long memberId) { + final MemberBasicInform memberBasicInform = memberBasicInformQueryAdapter.findByMemberId(memberId); + return MemberBasicInformResponse.personalMemberBasicInform(memberBasicInform); + } + + public void update( + final Long memberId, + final MemberBasicInformUpdateRequest memberBasicInformUpdateRequest + ) { + final Member member = memberQueryAdapter.findById(memberId); + + final MemberBasicInform updateMemberBasicInform = new MemberBasicInform( + memberId, + memberBasicInformUpdateRequest.getMemberName(), + memberBasicInformUpdateRequest.getContact(), + memberBasicInformUpdateRequest.isMarketingAgree(), + member + ); + + memberBasicInformCommandAdapter.delete(member.getMemberBasicInform()); + memberBasicInformCommandAdapter.save(updateMemberBasicInform); + } +} diff --git a/src/main/java/liaison/linkit/member/domain/Member.java b/src/main/java/liaison/linkit/member/domain/Member.java index fefad0da..0a281948 100644 --- a/src/main/java/liaison/linkit/member/domain/Member.java +++ b/src/main/java/liaison/linkit/member/domain/Member.java @@ -1,33 +1,32 @@ package liaison.linkit.member.domain; -import jakarta.persistence.*; +import static jakarta.persistence.EnumType.STRING; +import static jakarta.persistence.FetchType.LAZY; +import static jakarta.persistence.GenerationType.IDENTITY; +import static liaison.linkit.member.domain.type.MemberState.ACTIVE; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import liaison.linkit.common.domain.BaseDateTimeEntity; import liaison.linkit.member.domain.type.MemberState; -import liaison.linkit.member.domain.type.ProfileType; -import liaison.linkit.member.domain.type.TeamProfileType; import liaison.linkit.profile.domain.Profile; import liaison.linkit.team.domain.TeamProfile; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLRestriction; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import java.time.LocalDateTime; - -import static jakarta.persistence.EnumType.STRING; -import static jakarta.persistence.FetchType.LAZY; -import static jakarta.persistence.GenerationType.IDENTITY; -import static liaison.linkit.member.domain.type.MemberState.ACTIVE; -import static lombok.AccessLevel.PROTECTED; @Entity @Getter @NoArgsConstructor(access = PROTECTED) @SQLRestriction("member_state = 'ACTIVE'") -public class Member { - - private static final String DEFAULT_MEMBER_IMAGE_NAME = "default-image.png"; - +public class Member extends BaseDateTimeEntity { + @Id @GeneratedValue(strategy = IDENTITY) private Long id; @@ -52,23 +51,6 @@ public class Member { @Enumerated(value = STRING) private MemberState memberState; - // 내 이력서 타입 (완성도 기반) - @Column(nullable = false) - @Enumerated(value = STRING) - private ProfileType profileType; - - // 팀 소개서 타입 (완성도 기반) - @Column(nullable = false) - @Enumerated(value = STRING) - private TeamProfileType teamProfileType; - - @CreatedDate - @Column(updatable = false) - private LocalDateTime createdAt; - - @LastModifiedDate - private LocalDateTime modifiedAt; - @Column(nullable = false) private boolean existMemberBasicInform; @@ -87,11 +69,7 @@ public Member( this.id = id; this.socialLoginId = socialLoginId; this.email = email; - this.profileType = ProfileType.NO_PERMISSION; - this.teamProfileType = TeamProfileType.NO_PERMISSION; this.memberState = ACTIVE; - this.createdAt = LocalDateTime.now(); - this.modifiedAt = LocalDateTime.now(); this.memberBasicInform = memberBasicInform; this.existMemberBasicInform = false; this.privateWishCount = 0; @@ -110,14 +88,6 @@ public void changeIsMemberBasicInform(final Boolean existMemberBasicInform) { this.existMemberBasicInform = existMemberBasicInform; } - public void setProfileType(final ProfileType profileType) { - this.profileType = profileType; - } - - public void setTeamProfileType(final TeamProfileType teamProfileType) { - this.teamProfileType = teamProfileType; - } - public void addPrivateWishCount() { this.privateWishCount += 1; } diff --git a/src/main/java/liaison/linkit/member/domain/MemberBasicInform.java b/src/main/java/liaison/linkit/member/domain/MemberBasicInform.java index 849ed9a4..c3928ba8 100644 --- a/src/main/java/liaison/linkit/member/domain/MemberBasicInform.java +++ b/src/main/java/liaison/linkit/member/domain/MemberBasicInform.java @@ -1,13 +1,18 @@ package liaison.linkit.member.domain; -import jakarta.persistence.*; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; import liaison.linkit.global.BaseEntity; import lombok.Getter; import lombok.NoArgsConstructor; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - // 이름 및 사용자 정보 기입 플로우 추가 구현 필요 @Entity @Getter @@ -31,16 +36,19 @@ public class MemberBasicInform extends BaseEntity { @Column(nullable = false, length = 30) private String contact; + // 서비스 이용약관 동의 @Column(nullable = false) private boolean serviceUseAgree; + // 개인정보 수집 및 이용 동의 @Column(nullable = false) private boolean privateInformAgree; + // 만 14세 이상 @Column(nullable = false) private boolean ageCheck; - // 뉴스레터 및 마케팅 정보 수신동의 + // 광고성 정보 수신 동의 @Column(nullable = false) private boolean marketingAgree; diff --git a/src/main/java/liaison/linkit/member/domain/repository/member/MemberRepositoryCustom.java b/src/main/java/liaison/linkit/member/domain/repository/member/MemberRepositoryCustom.java index e978156b..ccbacee0 100644 --- a/src/main/java/liaison/linkit/member/domain/repository/member/MemberRepositoryCustom.java +++ b/src/main/java/liaison/linkit/member/domain/repository/member/MemberRepositoryCustom.java @@ -6,8 +6,6 @@ public interface MemberRepositoryCustom { Optional findBySocialLoginId(final String socialLoginId); - boolean existsByEmail(final String email); - void deleteByMemberId(final Long memberId); } diff --git a/src/main/java/liaison/linkit/member/domain/type/MemberType.java b/src/main/java/liaison/linkit/member/domain/type/MemberType.java deleted file mode 100644 index 95122742..00000000 --- a/src/main/java/liaison/linkit/member/domain/type/MemberType.java +++ /dev/null @@ -1,26 +0,0 @@ -package liaison.linkit.member.domain.type; - -// 회원의 내 이력서 및 팀 소개서 작성 여부에 따른 타입 설정 -public enum MemberType { - - // 내 이력서 및 팀 소개서 모두 작성하지 않은 상태 -> 처음에 회원가입 진행했을 때 상태 - // 모두 작성하지 않은 경우 Error Code -> 사용자가 내 이력서 또는 팀 소개서를 등록하세요 알림을 띄워준다. - EMPTY_PROFILE, - - // 내 이력서 작성 O / 팀 소개서 작성 X - // 내 이력서에 있는 Completion 컬럼에 따른 Profile 테이블의 권한 조회 - MY_PROFILE_WRITER, - - // 내 이력서 작성 X / 팀 소개서 작성 O - // 팀 소개서에 있는 Completion 컬럼에 따른 Team Profile 테이블의 권한 조회 - TEAM_PROFILE_WRITER, - - // 내 이력서 작성 O / 팀 소개서 작성 O - // 내 이력서 권한을 우선 조회 -> 매칭 요청 권한이 허용된 경우에 -> 내 이력서 및 팀 소개서 모두 요청을 보낼 수 있다. - // 내 이력서 권한이 허용되지 않았지만 팀 소개서 매칭 요청 %는 상위한 경우 -> 내 이력서에 대한 매칭 요청만 가능하도록 (팀 영입 매칭 요청) - BOTH_PROFILE_WRITER; - - // 4가지 타입 관리를 통해 매칭 요청 권한 전처리를 거친다. - - -} diff --git a/src/main/java/liaison/linkit/member/domain/type/ProfileType.java b/src/main/java/liaison/linkit/member/domain/type/ProfileType.java deleted file mode 100644 index 902effc9..00000000 --- a/src/main/java/liaison/linkit/member/domain/type/ProfileType.java +++ /dev/null @@ -1,13 +0,0 @@ -package liaison.linkit.member.domain.type; - -public enum ProfileType { - // 허용하지 않음 - NO_PERMISSION, - - // 열람 가능 - ALLOW_BROWSE, - - // 매칭 요청 가능 - ALLOW_MATCHING - -} diff --git a/src/main/java/liaison/linkit/member/domain/type/TeamProfileType.java b/src/main/java/liaison/linkit/member/domain/type/TeamProfileType.java deleted file mode 100644 index 5833e299..00000000 --- a/src/main/java/liaison/linkit/member/domain/type/TeamProfileType.java +++ /dev/null @@ -1,12 +0,0 @@ -package liaison.linkit.member.domain.type; - -public enum TeamProfileType { - // 허용하지 않음 - NO_PERMISSION, - - // 열람 가능 - ALLOW_BROWSE, - - // 매칭 요청 가능 - ALLOW_MATCHING -} diff --git a/src/main/java/liaison/linkit/member/exception/member/MemberErrorCode.java b/src/main/java/liaison/linkit/member/exception/member/MemberErrorCode.java new file mode 100644 index 00000000..d3f6b8d7 --- /dev/null +++ b/src/main/java/liaison/linkit/member/exception/member/MemberErrorCode.java @@ -0,0 +1,33 @@ +package liaison.linkit.member.exception.member; + +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MemberErrorCode implements BaseErrorCode { + MEMBER_NOT_FOUND(NOT_FOUND, "MEMBER_404_1", "회원을 찾을 수 없습니다."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/member/exception/member/MemberNotFoundException.java b/src/main/java/liaison/linkit/member/exception/member/MemberNotFoundException.java new file mode 100644 index 00000000..d987d1fd --- /dev/null +++ b/src/main/java/liaison/linkit/member/exception/member/MemberNotFoundException.java @@ -0,0 +1,12 @@ +package liaison.linkit.member.exception.member; + +import liaison.linkit.common.exception.BaseCodeException; + +public class MemberNotFoundException extends BaseCodeException { + + public static BaseCodeException EXCEPTION = new MemberNotFoundException(); + + private MemberNotFoundException() { + super(MemberErrorCode.MEMBER_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/member/exception/memberBasicInform/MemberBasicInformErrorCode.java b/src/main/java/liaison/linkit/member/exception/memberBasicInform/MemberBasicInformErrorCode.java new file mode 100644 index 00000000..fe522f10 --- /dev/null +++ b/src/main/java/liaison/linkit/member/exception/memberBasicInform/MemberBasicInformErrorCode.java @@ -0,0 +1,33 @@ +package liaison.linkit.member.exception.memberBasicInform; + +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MemberBasicInformErrorCode implements BaseErrorCode { + MEMBER_BASIC_INFORM_NOT_FOUND(NOT_FOUND, "MEMBER_BASIC_INFORM_404_1", "회원 기본 정보를 찾을 수 없습니다."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/member/exception/memberBasicInform/MemberBasicInformNotFoundException.java b/src/main/java/liaison/linkit/member/exception/memberBasicInform/MemberBasicInformNotFoundException.java new file mode 100644 index 00000000..1aa20254 --- /dev/null +++ b/src/main/java/liaison/linkit/member/exception/memberBasicInform/MemberBasicInformNotFoundException.java @@ -0,0 +1,12 @@ +package liaison.linkit.member.exception.memberBasicInform; + +import liaison.linkit.common.exception.BaseCodeException; + +public class MemberBasicInformNotFoundException extends BaseCodeException { + + public static BaseCodeException NOT_FOUND_EXCEPTION = new MemberBasicInformNotFoundException(); + + private MemberBasicInformNotFoundException() { + super(MemberBasicInformErrorCode.MEMBER_BASIC_INFORM_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/member/implement/MemberBasicInformCommandAdapter.java b/src/main/java/liaison/linkit/member/implement/MemberBasicInformCommandAdapter.java new file mode 100644 index 00000000..e1815a82 --- /dev/null +++ b/src/main/java/liaison/linkit/member/implement/MemberBasicInformCommandAdapter.java @@ -0,0 +1,24 @@ +package liaison.linkit.member.implement; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.member.domain.MemberBasicInform; +import liaison.linkit.member.domain.repository.memberBasicInform.MemberBasicInformRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class MemberBasicInformCommandAdapter { + private final MemberBasicInformRepository memberBasicInformRepository; + + public MemberBasicInform save(final MemberBasicInform memberBasicInform) { + return memberBasicInformRepository.save(memberBasicInform); + } + + public void delete(final MemberBasicInform memberBasicInform) { + memberBasicInformRepository.delete(memberBasicInform); + } + + public void deleteByMemberId(final Long memberId) { + memberBasicInformRepository.deleteByMemberId(memberId); + } +} diff --git a/src/main/java/liaison/linkit/member/implement/MemberBasicInformQueryAdapter.java b/src/main/java/liaison/linkit/member/implement/MemberBasicInformQueryAdapter.java new file mode 100644 index 00000000..0496e33c --- /dev/null +++ b/src/main/java/liaison/linkit/member/implement/MemberBasicInformQueryAdapter.java @@ -0,0 +1,30 @@ +package liaison.linkit.member.implement; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.member.domain.MemberBasicInform; +import liaison.linkit.member.domain.repository.memberBasicInform.MemberBasicInformRepository; +import liaison.linkit.member.exception.memberBasicInform.MemberBasicInformNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class MemberBasicInformQueryAdapter { + private final MemberBasicInformRepository memberBasicInformRepository; + + public MemberBasicInform findById(final Long memberBasicInformId) { + return memberBasicInformRepository + .findById(memberBasicInformId) + .orElseThrow(() -> MemberBasicInformNotFoundException.NOT_FOUND_EXCEPTION); + } + + public boolean existsByMemberId(final Long memberId) { + return memberBasicInformRepository.existsByMemberId(memberId); + } + + public MemberBasicInform findByMemberId(final Long memberId) { + return memberBasicInformRepository.findByMemberId(memberId) + .orElseThrow(() -> MemberBasicInformNotFoundException.NOT_FOUND_EXCEPTION); + } + + +} diff --git a/src/main/java/liaison/linkit/member/implement/MemberCommandAdapter.java b/src/main/java/liaison/linkit/member/implement/MemberCommandAdapter.java new file mode 100644 index 00000000..c0658681 --- /dev/null +++ b/src/main/java/liaison/linkit/member/implement/MemberCommandAdapter.java @@ -0,0 +1,20 @@ +package liaison.linkit.member.implement; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.member.domain.Member; +import liaison.linkit.member.domain.repository.member.MemberRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class MemberCommandAdapter { + private final MemberRepository memberRepository; + + public Member create(final Member member) { + return memberRepository.save(member); + } + + public void deleteByMemberId(final Long memberId) { + memberRepository.deleteByMemberId(memberId); + } +} diff --git a/src/main/java/liaison/linkit/member/implement/MemberQueryAdapter.java b/src/main/java/liaison/linkit/member/implement/MemberQueryAdapter.java new file mode 100644 index 00000000..f29dcb00 --- /dev/null +++ b/src/main/java/liaison/linkit/member/implement/MemberQueryAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.member.implement; + +import java.util.Optional; +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.member.domain.Member; +import liaison.linkit.member.domain.repository.member.MemberRepository; +import liaison.linkit.member.exception.member.MemberNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class MemberQueryAdapter { + // 데이터를 조회하는 기능을 담당 + private final MemberRepository memberRepository; + + public Member findById(final Long memberId) { + return memberRepository + .findById(memberId) + .orElseThrow(() -> MemberNotFoundException.EXCEPTION); + } + + public Optional findBySocialLoginId(final String socialLoginId) { + return memberRepository.findBySocialLoginId(socialLoginId); + } + + public boolean existsByEmail(final String email) { + return memberRepository.existsByEmail(email); + } +} diff --git a/src/main/java/liaison/linkit/member/presentation/MemberController.java b/src/main/java/liaison/linkit/member/presentation/MemberController.java index 515d962e..6067ea60 100644 --- a/src/main/java/liaison/linkit/member/presentation/MemberController.java +++ b/src/main/java/liaison/linkit/member/presentation/MemberController.java @@ -3,10 +3,14 @@ import liaison.linkit.auth.Auth; import liaison.linkit.auth.MemberOnly; import liaison.linkit.auth.domain.Accessor; +import liaison.linkit.common.annotation.ApiErrorCodeExample; +import liaison.linkit.common.exception.AuthErrorCode; +import liaison.linkit.common.exception.GlobalErrorCode; import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformCreateRequest; import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformUpdateRequest; import liaison.linkit.member.dto.response.MemberBasicInformResponse; -import liaison.linkit.member.service.MemberService; +import liaison.linkit.member.exception.member.MemberErrorCode; +import liaison.linkit.member.business.MemberService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -32,14 +36,17 @@ public ResponseEntity createMemberBasicInform( return ResponseEntity.status(HttpStatus.CREATED).build(); } - // 조회 화면 필요 + @ApiErrorCodeExample( + value = {MemberErrorCode.class, AuthErrorCode.class, GlobalErrorCode.class} + ) @GetMapping("/basic-inform") @MemberOnly public ResponseEntity getMemberBasicInform( @Auth final Accessor accessor ) { memberService.validateMemberBasicInformByMember(accessor.getMemberId()); - final MemberBasicInformResponse memberBasicInformResponse = memberService.getPersonalMemberBasicInform(accessor.getMemberId()); + final MemberBasicInformResponse memberBasicInformResponse + = memberService.getPersonalMemberBasicInform(accessor.getMemberId()); return ResponseEntity.ok().body(memberBasicInformResponse); } diff --git a/src/main/java/liaison/linkit/member/service/MemberService.java b/src/main/java/liaison/linkit/member/service/MemberService.java deleted file mode 100644 index 86be3eaa..00000000 --- a/src/main/java/liaison/linkit/member/service/MemberService.java +++ /dev/null @@ -1,119 +0,0 @@ -package liaison.linkit.member.service; - -import liaison.linkit.global.exception.AuthException; -import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.member.domain.Member; -import liaison.linkit.member.domain.MemberBasicInform; -import liaison.linkit.member.domain.repository.memberBasicInform.MemberBasicInformRepository; -import liaison.linkit.member.domain.repository.member.MemberRepository; -import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformCreateRequest; -import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformUpdateRequest; -import liaison.linkit.member.dto.response.MemberBasicInformResponse; -import liaison.linkit.member.dto.response.MemberResponse; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.server.ResponseStatusException; - -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MEMBER_BY_MEMBER_ID; - -// 소셜로그인 이후 기본 정보 기입 플로우부터 -@Service -@RequiredArgsConstructor -@Transactional -@Slf4j -public class MemberService { - - // 회원 기본 정보를 다룸 - - private final MemberRepository memberRepository; - private final MemberBasicInformRepository memberBasicInformRepository; - private final ProfileRepository profileRepository; - - // 회원 정보를 가져오는 메서드 - private Member getMember(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BY_MEMBER_ID)); - } - - // 회원 기본 정보를 가져오는 메서드 - private MemberBasicInform getMemberBasicInform(final Long memberId) { - return memberBasicInformRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID)); - } - - // 멤버 아이디로 회원 기본 정보의 유효성을 검증하는 로직 - public void validateMemberBasicInformByMember(final Long memberId) { - if (!memberBasicInformRepository.existsByMemberId(memberId)) { - throw new AuthException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID); - } - } - - // 회원 기본 정보 저장 메서드 - public void save( - final Long memberId, final MemberBasicInformCreateRequest memberBasicInformCreateRequest - ) throws ResponseStatusException { - - final Member member = getMember(memberId); - - // dto -> 객체 - final MemberBasicInform newBasicMemberBasicInform = new MemberBasicInform( - memberBasicInformCreateRequest.getMemberName(), - memberBasicInformCreateRequest.getContact(), - memberBasicInformCreateRequest.isMarketingAgree(), - member - ); - - member.changeIsMemberBasicInform(true); - - // 기본 정보 입력 사용자로부터 재요청 - if (memberBasicInformRepository.existsByMemberId(memberId)) { - final MemberBasicInform savedMemberBasicInform = memberBasicInformRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID)); - - // 객체 update - savedMemberBasicInform.update(newBasicMemberBasicInform); - } else { - memberBasicInformRepository.save(newBasicMemberBasicInform); - } - } - - // (해당 회원의) 회원 기본 정보를 조회하는 메서드 - @Transactional(readOnly = true) - public MemberBasicInformResponse getPersonalMemberBasicInform(final Long memberId) { - final MemberBasicInform memberBasicInform = getMemberBasicInform(memberId); - return MemberBasicInformResponse.personalMemberBasicInform(memberBasicInform); - } - - // (해당 회원의) 회원 기본 정보 중 이메일을 조회하는 메서드 - @Transactional(readOnly = true) - public MemberResponse getMemberEmail(final Long memberId) { - final Member member = getMember(memberId); - return MemberResponse.getEmail(member); - } - - public void update( - final Long memberId, - final MemberBasicInformUpdateRequest memberBasicInformUpdateRequest - ) { - final Member member = getMember(memberId); - final MemberBasicInform updateMemberBasicInform = new MemberBasicInform( - memberId, - memberBasicInformUpdateRequest.getMemberName(), - memberBasicInformUpdateRequest.getContact(), - memberBasicInformUpdateRequest.isMarketingAgree(), - member - ); - - // 저장되어 있던 회원 기본 정보 삭제 - memberBasicInformRepository.delete(member.getMemberBasicInform()); - - // 새롭게 전달 받은 회원 기본 정보 저장 - memberBasicInformRepository.save(updateMemberBasicInform); - } - - -} diff --git a/src/main/java/liaison/linkit/profile/browse/CheckBrowseToPrivateProfileAccess.java b/src/main/java/liaison/linkit/profile/browse/CheckBrowseToPrivateProfileAccess.java deleted file mode 100644 index 190a2436..00000000 --- a/src/main/java/liaison/linkit/profile/browse/CheckBrowseToPrivateProfileAccess.java +++ /dev/null @@ -1,14 +0,0 @@ -package liaison.linkit.profile.browse; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -// 내 이력서 열람 요청 -@Target(METHOD) -@Retention(RUNTIME) -public @interface CheckBrowseToPrivateProfileAccess { - boolean checkPrivateBrowseAccess() default false; -} diff --git a/src/main/java/liaison/linkit/profile/browse/CheckBrowseToTeamProfileAccess.java b/src/main/java/liaison/linkit/profile/browse/CheckBrowseToTeamProfileAccess.java deleted file mode 100644 index 35a9289c..00000000 --- a/src/main/java/liaison/linkit/profile/browse/CheckBrowseToTeamProfileAccess.java +++ /dev/null @@ -1,13 +0,0 @@ -package liaison.linkit.profile.browse; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Target(METHOD) -@Retention(RUNTIME) -public @interface CheckBrowseToTeamProfileAccess { - boolean checkTeamBrowseAccess() default false; -} diff --git a/src/main/java/liaison/linkit/profile/browse/ProfileBrowseAccessInterceptor.java b/src/main/java/liaison/linkit/profile/browse/ProfileBrowseAccessInterceptor.java deleted file mode 100644 index 05e4ddc7..00000000 --- a/src/main/java/liaison/linkit/profile/browse/ProfileBrowseAccessInterceptor.java +++ /dev/null @@ -1,128 +0,0 @@ -package liaison.linkit.profile.browse; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.login.infrastructure.BearerAuthorizationExtractor; -import liaison.linkit.login.infrastructure.JwtProvider; -import liaison.linkit.member.domain.type.ProfileType; -import liaison.linkit.member.domain.type.TeamProfileType; -import liaison.linkit.profile.domain.Profile; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; -import liaison.linkit.team.domain.TeamProfile; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; - - -@Component -@RequiredArgsConstructor -@Slf4j -public class ProfileBrowseAccessInterceptor implements HandlerInterceptor { - - private final JwtProvider jwtProvider; - private final BearerAuthorizationExtractor extractor; - private final ProfileRepository profileRepository; - private final TeamProfileRepository teamProfileRepository; - -// public ProfileBrowseAccessInterceptor() { -// this.jwtProvider = null; -// this.extractor = null; -// this.memberRepository = null; -// } - - @Override - public boolean preHandle( - final HttpServletRequest request, - final HttpServletResponse response, - final Object handler - ) throws Exception { - if (handler instanceof HandlerMethod handlerMethod) { - - // to_private 열람 요청 - final CheckBrowseToPrivateProfileAccess checkBrowseToPrivateProfileAccess = - handlerMethod.getMethodAnnotation(CheckBrowseToPrivateProfileAccess.class); - - // to_team 열람 요청 - final CheckBrowseToTeamProfileAccess checkBrowseToTeamProfileAccess = - handlerMethod.getMethodAnnotation(CheckBrowseToTeamProfileAccess.class); - - log.info("checkBrowseToPrivateProfileAccess={}", checkBrowseToPrivateProfileAccess); - log.info("checkBrowseToTeamProfileAccess={}", checkBrowseToTeamProfileAccess); - - // 내 이력서 또는 팀 소개서에 열람 요청이 발생한 경우 - if (checkBrowseToPrivateProfileAccess != null || checkBrowseToTeamProfileAccess != null) { - final Long memberId = getMemberId(request); - log.info("memberId={}", memberId); - - final ProfileType profileType = getPrivateProfileType(memberId); - log.info("profileType={}",profileType); - - final TeamProfileType teamProfileType = getTeamProfileType(memberId); - log.info("teamProfileType={}",teamProfileType); - - // 접근 권한 판단 실행 여부 - if (!isAccessJudge(profileType, teamProfileType)) { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - return false; - } - } - } - return true; - } - - // 열람 권한 판단 - public boolean isAccessJudge( - final ProfileType profileType, - final TeamProfileType teamProfileType - ) { - // 열람 권한 판단 - if (ProfileType.NO_PERMISSION.equals(profileType) && TeamProfileType.NO_PERMISSION.equals(teamProfileType)) { - log.info("내 이력서에 대한 열람 권한이 거부됩니다."); - return false; - } else return true; - } - - // 회원 ID 조회 - private Long getMemberId(HttpServletRequest request) { - String accessToken = extractor.extractAccessToken(request.getHeader("Authorization")); - return Long.valueOf(jwtProvider.getSubject(accessToken)); - } - - // 내 이력서 타입 반환 - private ProfileType getPrivateProfileType(final Long memberId) { -// final Member member = memberRepository.findById(memberId) -// .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_ID)); - - final Profile profile = profileRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_MEMBER_ID)); - - if (profile.getCompletion() < 50) { - return ProfileType.NO_PERMISSION; - } else if (profile.getCompletion() >= 80) { - return ProfileType.ALLOW_MATCHING; - } else { - return ProfileType.ALLOW_BROWSE; - } - } - - // 팀 소개서 타입 반환 - private TeamProfileType getTeamProfileType(final Long memberId) { - final TeamProfile teamProfile = teamProfileRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID)); - - if (teamProfile.getTeamProfileCompletion() < 50) { - return TeamProfileType.NO_PERMISSION; - } else if (teamProfile.getTeamProfileCompletion() >= 80) { - return TeamProfileType.ALLOW_MATCHING; - } else { - return TeamProfileType.ALLOW_BROWSE; - } - } -} diff --git a/src/main/java/liaison/linkit/profile/business/ProfileMapper.java b/src/main/java/liaison/linkit/profile/business/ProfileMapper.java new file mode 100644 index 00000000..c178411f --- /dev/null +++ b/src/main/java/liaison/linkit/profile/business/ProfileMapper.java @@ -0,0 +1,4 @@ +package liaison.linkit.profile.business; + +public class ProfileMapper { +} diff --git a/src/main/java/liaison/linkit/profile/domain/Profile.java b/src/main/java/liaison/linkit/profile/domain/Profile.java index b40858f0..bf1098b4 100644 --- a/src/main/java/liaison/linkit/profile/domain/Profile.java +++ b/src/main/java/liaison/linkit/profile/domain/Profile.java @@ -1,9 +1,22 @@ package liaison.linkit.profile.domain; -import jakarta.persistence.*; +import static jakarta.persistence.CascadeType.ALL; +import static jakarta.persistence.CascadeType.REMOVE; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import liaison.linkit.global.BaseEntity; import liaison.linkit.member.domain.Member; -import liaison.linkit.member.domain.type.ProfileType; import liaison.linkit.profile.domain.awards.Awards; import liaison.linkit.profile.domain.miniProfile.MiniProfile; import liaison.linkit.profile.domain.role.ProfileJobRole; @@ -13,15 +26,6 @@ import lombok.extern.slf4j.Slf4j; import org.hibernate.annotations.SQLRestriction; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import static jakarta.persistence.CascadeType.ALL; -import static jakarta.persistence.CascadeType.REMOVE; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - @Entity @Getter @AllArgsConstructor @@ -94,17 +98,10 @@ public class Profile extends BaseEntity { @Column(nullable = false) private boolean isAwards; -// // 3.11. 첨부 기입 여부 -// @Column(nullable = false) -// private boolean isAttach; - // 3.11. 첨부 링크(URL) 기입 여부 @Column(nullable = false) private boolean isAttachUrl; -// // 3.11. 첨부 파일(File) 기입 여부 -// @Column(nullable = false) -// private boolean isAttachFile; // 3.1. 미니 프로필 기입 여부 @Column(nullable = false) @@ -147,16 +144,31 @@ public Profile( // 첨부 10% // 디폴트 항목 관리 메서드 - public void addPerfectionDefault() {this.completion += 10.0;} - public void cancelPerfectionDefault() {this.completion -= 10.0;} + public void addPerfectionDefault() { + this.completion += 10.0; + } + + public void cancelPerfectionDefault() { + this.completion -= 10.0; + } // 수상 및 첨부 관리 메서드 - public void addPerfectionTen() {this.completion += 10.0;} - public void cancelPerfectionTen() {this.completion -= 10.0;} + public void addPerfectionTen() { + this.completion += 10.0; + } + + public void cancelPerfectionTen() { + this.completion -= 10.0; + } // 자기소개 관리 메서드 - public void addPerfectionThirty() { this.completion += 30.0; } - public void cancelPerfectionThirty() {this.completion -= 30.0;} + public void addPerfectionThirty() { + this.completion += 30.0; + } + + public void cancelPerfectionThirty() { + this.completion -= 30.0; + } // 3.1. 미니 프로필 업데이트 public void updateIsMiniProfile(final Boolean isMiniProfile) { @@ -173,13 +185,11 @@ public void updateIntroduction(final String introduction) { this.introduction = introduction; updateIsIntroduction(true); addPerfectionThirty(); - updateMemberProfileTypeByCompletion(); } } else { // 삭제 요청인 경우 deleteIntroduction(); updateIsIntroduction(false); cancelPerfectionThirty(); - updateMemberProfileTypeByCompletion(); } } @@ -203,7 +213,7 @@ public void updateIsProfileSkill(final boolean isProfileSkill) { // 모두 true인 경우 if (this.isJobAndSkill != (this.isProfileJobRole && isProfileSkill)) { this.isJobAndSkill = !this.isJobAndSkill; - if(this.isJobAndSkill){ + if (this.isJobAndSkill) { addPerfectionDefault(); } else { cancelPerfectionDefault(); @@ -267,19 +277,6 @@ public void updateIsAwards(final boolean isAwards) { } } - // 3.11. 첨부 업데이트 -// private void updateIsAttach(final boolean isAttachUrl, final boolean isAttachFile) { -// // attachUrl, attachFile 2개 중에 하나라도 참이면 isAttach는 참이다. -// if (this.isAttach != (isAttachUrl || isAttachFile)) { -// this.isAttach = !this.isAttach; -// if (this.isAttach) { -// addPerfectionTen(); -// } else { -// cancelPerfectionTen(); -// } -// } -// } - // 3.11.1 첨부 링크 업데이트 public void updateIsAttachUrl(final boolean isAttachUrl) { this.isAttachUrl = isAttachUrl; @@ -289,48 +286,16 @@ public void updateIsAttachUrl(final boolean isAttachUrl) { cancelPerfectionTen(); } } - // 3.11.2 첨부 파일 업데이트 -// public void updateIsAttachFile(final boolean isAttachFile) { -// this.isAttachFile = isAttachFile; -// updateIsAttach(this.isAttachUrl, isAttachFile); -// } - - - - - // 내 이력서의 완성도 % 기반으로 접근 권한 관리 메서드 - public void updateMemberProfileTypeByCompletion() { - final double presentCompletion = this.getCompletion(); - final ProfileType profileType = this.getMember().getProfileType(); - - if (presentCompletion >= 0 && presentCompletion < 50) { - if (ProfileType.NO_PERMISSION.equals(profileType)) { - return; - } else { - // 해당 상태를 변경해줘야함. - this.getMember().setProfileType(ProfileType.NO_PERMISSION); - } - } else if (presentCompletion >= 50 && presentCompletion < 80) { - if (ProfileType.ALLOW_BROWSE.equals(profileType)) { - return; - } else { - this.getMember().setProfileType(ProfileType.ALLOW_BROWSE); - } - } else { - if (ProfileType.ALLOW_MATCHING.equals(profileType)) { - return; - } else { - this.getMember().setProfileType(ProfileType.ALLOW_MATCHING); - } - } + // 내 이력서의 각 항목들 기입 여부 조회 개별 메서드 + public boolean getIsMiniProfile() { + return isMiniProfile; } - // 내 이력서의 각 항목들 기입 여부 조회 개별 메서드 - public boolean getIsMiniProfile() { return isMiniProfile; } public boolean getIsIntroduction() { return isIntroduction; } + public boolean getIsProfileSkill() { return isProfileSkill; } @@ -338,32 +303,42 @@ public boolean getIsProfileSkill() { public boolean getIsJobAndSkill() { return isJobAndSkill; } + public boolean getIsProfileTeamBuildingField() { return isProfileTeamBuildingField; } + public boolean getIsProfileRegion() { return isProfileRegion; } - public boolean getIsAntecedents() {return isAntecedents;} + + public boolean getIsAntecedents() { + return isAntecedents; + } + public boolean getIsEducation() { return isEducation; } + public boolean getIsAwards() { return isAwards; } + public boolean getIsAttachUrl() { return isAttachUrl; } // 3.4. 자기소개 초기화 및 삭제 메서드 - public void deleteIntroduction() {this.introduction = null;} + public void deleteIntroduction() { + this.introduction = null; + } public boolean getExistDefaultPrivateProfile() { if (this.isProfileTeamBuildingField && this.isProfileRegion && this.isMiniProfile) { return true; - } else return false; + } else { + return false; + } } - - } diff --git a/src/main/java/liaison/linkit/profile/domain/attach/AttachFile.java b/src/main/java/liaison/linkit/profile/domain/attach/AttachFile.java deleted file mode 100644 index 13bf6863..00000000 --- a/src/main/java/liaison/linkit/profile/domain/attach/AttachFile.java +++ /dev/null @@ -1,52 +0,0 @@ -//package liaison.linkit.profile.domain.attach; -// -//import jakarta.persistence.*; -//import liaison.linkit.profile.domain.Profile; -//import liaison.linkit.profile.dto.request.attach.AttachFileUpdateRequest; -//import lombok.AccessLevel; -//import lombok.AllArgsConstructor; -//import lombok.Getter; -//import lombok.NoArgsConstructor; -// -//import static jakarta.persistence.CascadeType.ALL; -//import static jakarta.persistence.FetchType.LAZY; -// -//@Entity -//@Getter -//@AllArgsConstructor -//@NoArgsConstructor(access = AccessLevel.PROTECTED) -//@Table(name = "attach_file") -//public class AttachFile { -// -// @Id -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// @Column(name = "attach_file_id") -// private Long id; -// -// @ManyToOne(fetch = LAZY, cascade = ALL) -// @JoinColumn(name = "profile_id") -// private Profile profile; -// -// @Column(nullable = false) -// private String attachFileName; -// -// @Column(nullable = false) -// private String attachFilePath; -// -// public static AttachFile of( -// final Profile profile, -// final String attachFileName, -// final String attachFilePath -// ) { -// return new AttachFile( -// null, -// profile, -// attachFileName, -// attachFilePath -// ); -// } -// -// public void update(final AttachFileUpdateRequest updateRequest) { -// this.attachFilePath = updateRequest.getAttachFilePath(); -// } -//} diff --git a/src/main/java/liaison/linkit/profile/domain/attach/AttachUrl.java b/src/main/java/liaison/linkit/profile/domain/attach/AttachUrl.java deleted file mode 100644 index 8b70aa68..00000000 --- a/src/main/java/liaison/linkit/profile/domain/attach/AttachUrl.java +++ /dev/null @@ -1,54 +0,0 @@ -package liaison.linkit.profile.domain.attach; - -import jakarta.persistence.*; -import liaison.linkit.profile.domain.Profile; -import liaison.linkit.profile.dto.request.attach.AttachUrlUpdateRequest; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import static jakarta.persistence.FetchType.LAZY; -import static jakarta.persistence.GenerationType.IDENTITY; - -@Entity -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "attach_url") -public class AttachUrl { - - @Id - @GeneratedValue(strategy = IDENTITY) - @Column(name = "attach_url_id") - private Long id; - - @ManyToOne(fetch = LAZY) - @JoinColumn(name = "profile_id") - private Profile profile; - - // 웹 링크 이름 - @Column(nullable = false) - private String attachUrlName; - - @Column(nullable = false) - private String attachUrlPath; - - public static AttachUrl of( - final Profile profile, - final String attachUrlName, - final String attachUrlPath - ) { - return new AttachUrl( - null, - profile, - attachUrlName, - attachUrlPath - ); - } - - public void update(final AttachUrlUpdateRequest updateRequest) { - this.attachUrlName = updateRequest.getAttachUrlName(); - this.attachUrlPath = updateRequest.getAttachUrlPath(); - } -} diff --git a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachFileRepository.java b/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachFileRepository.java deleted file mode 100644 index 4e8ef601..00000000 --- a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachFileRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -//package liaison.linkit.profile.domain.repository.attach; -// -//import liaison.linkit.profile.domain.attach.AttachFile; -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.data.jpa.repository.Query; -//import org.springframework.data.repository.query.Param; -// -//import java.util.List; -// -//public interface AttachFileRepository extends JpaRepository { -// boolean existsByProfileId(final Long profileId); -// -// AttachFile findByProfileId(@Param("profileId") final Long profileId); -// -// @Query("SELECT attachFile FROM AttachFile attachFile WHERE attachFile.profile.id = :profileId") -// List findAllByProfileId(@Param("profileId") Long profileId); -//} diff --git a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepository.java b/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepository.java deleted file mode 100644 index b689a9cb..00000000 --- a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package liaison.linkit.profile.domain.repository.attach; - -import liaison.linkit.profile.domain.attach.AttachUrl; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AttachUrlRepository extends JpaRepository, AttachUrlRepositoryCustom{ - -} diff --git a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepositoryCustom.java b/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepositoryCustom.java deleted file mode 100644 index f2e9cc4c..00000000 --- a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepositoryCustom.java +++ /dev/null @@ -1,13 +0,0 @@ -package liaison.linkit.profile.domain.repository.attach; - -import liaison.linkit.profile.domain.attach.AttachUrl; - -import java.util.List; -import java.util.Optional; - -public interface AttachUrlRepositoryCustom { - Optional findByProfileId(final Long profileId); - boolean existsByProfileId(final Long profileId); - List findAllByProfileId(final Long profileId); - void deleteAllByProfileId(final Long profileId); -} diff --git a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepositoryCustomImpl.java b/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepositoryCustomImpl.java deleted file mode 100644 index c09d5775..00000000 --- a/src/main/java/liaison/linkit/profile/domain/repository/attach/AttachUrlRepositoryCustomImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package liaison.linkit.profile.domain.repository.attach; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import liaison.linkit.profile.domain.attach.AttachUrl; -import liaison.linkit.profile.domain.attach.QAttachUrl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; - -@RequiredArgsConstructor -@Slf4j -public class AttachUrlRepositoryCustomImpl implements AttachUrlRepositoryCustom { - - private final JPAQueryFactory jpaQueryFactory; - - @Override - public Optional findByProfileId(Long profileId) { - QAttachUrl attachUrl = QAttachUrl.attachUrl; - - AttachUrl result = jpaQueryFactory - .selectFrom(attachUrl) - .where(attachUrl.profile.id.eq(profileId)) - .fetchOne(); - - return Optional.ofNullable(result); - } - - @Override - public boolean existsByProfileId(final Long profileId) { - QAttachUrl attachUrl = QAttachUrl.attachUrl; - - long count = jpaQueryFactory - .selectFrom(attachUrl) - .where(attachUrl.profile.id.eq(profileId)) - .fetchCount(); // 레코드의 수를 반환 - - return count > 0; // 0보다 크면 true, 그렇지 않으면 false - } - - @Override - public List findAllByProfileId(final Long profileId){ - QAttachUrl attachUrl = QAttachUrl.attachUrl; - return jpaQueryFactory.selectFrom(attachUrl) - .where(attachUrl.profile.id.eq(profileId)) - .fetch(); - } - - - @Override - @Transactional - public void deleteAllByProfileId(final Long profileId){ - log.info("Deleting all AttachUrls for profileId: {}", profileId); - QAttachUrl attachUrl = QAttachUrl.attachUrl; - jpaQueryFactory.delete(attachUrl) - .where(attachUrl.profile.id.eq(profileId)) - .execute(); - } -} diff --git a/src/main/java/liaison/linkit/profile/dto/response/ProfileResponse.java b/src/main/java/liaison/linkit/profile/dto/response/ProfileResponse.java index b603c415..bae55747 100644 --- a/src/main/java/liaison/linkit/profile/dto/response/ProfileResponse.java +++ b/src/main/java/liaison/linkit/profile/dto/response/ProfileResponse.java @@ -1,19 +1,17 @@ package liaison.linkit.profile.dto.response; +import java.util.List; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; import liaison.linkit.profile.dto.response.education.EducationResponse; import liaison.linkit.profile.dto.response.miniProfile.MiniProfileResponse; import liaison.linkit.profile.dto.response.onBoarding.JobAndSkillResponse; -import liaison.linkit.profile.dto.response.teamBuilding.ProfileTeamBuildingFieldResponse; import liaison.linkit.profile.dto.response.profileRegion.ProfileRegionResponse; +import liaison.linkit.profile.dto.response.teamBuilding.ProfileTeamBuildingFieldResponse; import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.List; - @Getter @RequiredArgsConstructor public class ProfileResponse { @@ -29,7 +27,6 @@ public class ProfileResponse { private final List antecedentsResponse; private final List educationResponse; private final List awardsResponse; - private final AttachResponse attachResponse; public ProfileResponse() { this.isPrivateProfileEssential = false; @@ -42,7 +39,6 @@ public ProfileResponse() { this.antecedentsResponse = null; this.educationResponse = null; this.awardsResponse = null; - this.attachResponse = null; } public static ProfileResponse profileItems( @@ -55,8 +51,7 @@ public static ProfileResponse profileItems( final ProfileRegionResponse profileRegionResponse, final List antecedentsResponses, final List educationResponses, - final List awardsResponses, - final AttachResponse attachResponse + final List awardsResponses ) { return new ProfileResponse( @@ -69,8 +64,7 @@ public static ProfileResponse profileItems( profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses ); } } diff --git a/src/main/java/liaison/linkit/profile/dto/response/attach/AttachFileResponse.java b/src/main/java/liaison/linkit/profile/dto/response/attach/AttachFileResponse.java deleted file mode 100644 index 6cc9d0b1..00000000 --- a/src/main/java/liaison/linkit/profile/dto/response/attach/AttachFileResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -//package liaison.linkit.profile.dto.response.attach; -// -//import liaison.linkit.profile.domain.attach.AttachFile; -//import lombok.AllArgsConstructor; -//import lombok.Getter; -// -//@Getter -//@AllArgsConstructor -//public class AttachFileResponse { -// private Long id; -// private String attachFileName; -// private String attachFilePath; -// -// public static AttachFileResponse personalAttachFile( -// final AttachFile attachFile -// ) { -// return new AttachFileResponse( -// attachFile.getId(), -// attachFile.getAttachFileName(), -// attachFile.getAttachFilePath() -// ); -// } -//} diff --git a/src/main/java/liaison/linkit/profile/dto/response/attach/AttachResponse.java b/src/main/java/liaison/linkit/profile/dto/response/attach/AttachResponse.java deleted file mode 100644 index 4e01c126..00000000 --- a/src/main/java/liaison/linkit/profile/dto/response/attach/AttachResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package liaison.linkit.profile.dto.response.attach; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@Getter -@AllArgsConstructor -public class AttachResponse { - - private List attachUrlResponseList; -// private List attachFileResponseList; - - public AttachResponse() { - this.attachUrlResponseList = null; -// this.attachFileResponseList = null; - } - - public static AttachResponse getAttachResponse( - final List attachUrlResponses) -// final List attachFileResponses) - { - return new AttachResponse( - attachUrlResponses -// attachFileResponses - ); - } -} diff --git a/src/main/java/liaison/linkit/profile/dto/response/attach/AttachUrlResponse.java b/src/main/java/liaison/linkit/profile/dto/response/attach/AttachUrlResponse.java deleted file mode 100644 index 0ef60bdb..00000000 --- a/src/main/java/liaison/linkit/profile/dto/response/attach/AttachUrlResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package liaison.linkit.profile.dto.response.attach; - -import liaison.linkit.profile.domain.attach.AttachUrl; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class AttachUrlResponse { - private final Long id; - private final String attachUrlName; - private final String attachUrlPath; - - public static AttachUrlResponse personalAttachUrl(final AttachUrl attachUrl) { - return new AttachUrlResponse( - attachUrl.getId(), - attachUrl.getAttachUrlName(), - attachUrl.getAttachUrlPath() - ); - } -} diff --git a/src/main/java/liaison/linkit/profile/dto/response/browse/BrowsePrivateProfileResponse.java b/src/main/java/liaison/linkit/profile/dto/response/browse/BrowsePrivateProfileResponse.java index 6d082287..1fee0455 100644 --- a/src/main/java/liaison/linkit/profile/dto/response/browse/BrowsePrivateProfileResponse.java +++ b/src/main/java/liaison/linkit/profile/dto/response/browse/BrowsePrivateProfileResponse.java @@ -1,8 +1,8 @@ package liaison.linkit.profile.dto.response.browse; +import java.util.List; import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; import liaison.linkit.profile.dto.response.education.EducationResponse; @@ -13,8 +13,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.List; - @Getter @RequiredArgsConstructor public class BrowsePrivateProfileResponse { @@ -29,7 +27,6 @@ public class BrowsePrivateProfileResponse { private final List antecedentsResponse; private final List educationResponse; private final List awardsResponse; - private final AttachResponse attachResponse; public static BrowsePrivateProfileResponse privateProfile( final Long profileId, @@ -41,8 +38,7 @@ public static BrowsePrivateProfileResponse privateProfile( final ProfileRegionResponse profileRegionResponse, final List antecedentsResponses, final List educationResponses, - final List awardsResponses, - final AttachResponse attachResponse + final List awardsResponses ) { return new BrowsePrivateProfileResponse( profileId, @@ -54,8 +50,7 @@ public static BrowsePrivateProfileResponse privateProfile( profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses ); } } diff --git a/src/main/java/liaison/linkit/profile/exception/ProfileErrorCode.java b/src/main/java/liaison/linkit/profile/exception/ProfileErrorCode.java new file mode 100644 index 00000000..69aeca83 --- /dev/null +++ b/src/main/java/liaison/linkit/profile/exception/ProfileErrorCode.java @@ -0,0 +1,33 @@ +package liaison.linkit.profile.exception; + +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ProfileErrorCode implements BaseErrorCode { + PROFILE_NOT_FOUND(NOT_FOUND, "PROFILE_404_1", "프로필을 찾을 수 없습니다."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/profile/exception/ProfileNotFoundException.java b/src/main/java/liaison/linkit/profile/exception/ProfileNotFoundException.java new file mode 100644 index 00000000..e56bc18d --- /dev/null +++ b/src/main/java/liaison/linkit/profile/exception/ProfileNotFoundException.java @@ -0,0 +1,11 @@ +package liaison.linkit.profile.exception; + +import liaison.linkit.common.exception.BaseCodeException; + +public class ProfileNotFoundException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new ProfileNotFoundException(); + + private ProfileNotFoundException() { + super(ProfileErrorCode.PROFILE_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/profile/implement/ProfileCommandAdapter.java b/src/main/java/liaison/linkit/profile/implement/ProfileCommandAdapter.java new file mode 100644 index 00000000..37dfce86 --- /dev/null +++ b/src/main/java/liaison/linkit/profile/implement/ProfileCommandAdapter.java @@ -0,0 +1,4 @@ +package liaison.linkit.profile.implement; + +public class ProfileCommandAdapter { +} diff --git a/src/main/java/liaison/linkit/profile/implement/ProfileQueryAdapter.java b/src/main/java/liaison/linkit/profile/implement/ProfileQueryAdapter.java new file mode 100644 index 00000000..25747ae9 --- /dev/null +++ b/src/main/java/liaison/linkit/profile/implement/ProfileQueryAdapter.java @@ -0,0 +1,23 @@ +package liaison.linkit.profile.implement; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.profile.domain.Profile; +import liaison.linkit.profile.domain.repository.profile.ProfileRepository; +import liaison.linkit.profile.exception.ProfileNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class ProfileQueryAdapter { + private final ProfileRepository profileRepository; + + public Profile findById(final Long profileId) { + return profileRepository.findById(profileId) + .orElseThrow(() -> ProfileNotFoundException.EXCEPTION); + } + + public Profile findByMemberId(final Long memberId) { + return profileRepository.findByMemberId(memberId) + .orElseThrow(() -> ProfileNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/liaison/linkit/profile/presentation/AttachController.java b/src/main/java/liaison/linkit/profile/presentation/AttachController.java deleted file mode 100644 index 408ece22..00000000 --- a/src/main/java/liaison/linkit/profile/presentation/AttachController.java +++ /dev/null @@ -1,63 +0,0 @@ -package liaison.linkit.profile.presentation; - -import jakarta.validation.Valid; -import liaison.linkit.auth.Auth; -import liaison.linkit.auth.MemberOnly; -import liaison.linkit.auth.domain.Accessor; -import liaison.linkit.profile.dto.request.attach.AttachUrlCreateRequest; -import liaison.linkit.profile.dto.response.attach.AttachResponse; -import liaison.linkit.profile.service.AttachService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequiredArgsConstructor -@RequestMapping -@Slf4j -public class AttachController { - - private final AttachService attachService; - - // 외부 링크 1개 생성 요청 - @PostMapping("/private/attach/url") - @MemberOnly - public ResponseEntity createAttachUrl( - @Auth final Accessor accessor, - @RequestBody @Valid List attachUrlCreateRequests - ) { - if (attachUrlCreateRequests.isEmpty()) { - log.info("attachUrlCreateRequests 비어있습니다."); - attachService.deleteAllUrl(accessor.getMemberId()); - } else { - attachService.saveUrl(accessor.getMemberId(), attachUrlCreateRequests); - } - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - - // 외부 링크 1개 삭제 요청 - @DeleteMapping("/private/attach/url/{attachUrlId}") - @MemberOnly - public ResponseEntity deleteAttachUrl( - @Auth final Accessor accessor, - @PathVariable final Long attachUrlId - ) { - attachService.validateAttachUrlByMember(accessor.getMemberId()); - attachService.deleteUrl(accessor.getMemberId(), attachUrlId); - return ResponseEntity.noContent().build(); - } - - @GetMapping("/private/attach/url/list") - @MemberOnly - public ResponseEntity getAttachList( - @Auth final Accessor accessor - ) { - - final AttachResponse attachResponse = attachService.getAttachList(accessor.getMemberId()); - return ResponseEntity.ok().body(attachResponse); - } -} diff --git a/src/main/java/liaison/linkit/profile/presentation/BrowsePrivateProfileController.java b/src/main/java/liaison/linkit/profile/presentation/BrowsePrivateProfileController.java index 3ba811a7..44ef7ac3 100644 --- a/src/main/java/liaison/linkit/profile/presentation/BrowsePrivateProfileController.java +++ b/src/main/java/liaison/linkit/profile/presentation/BrowsePrivateProfileController.java @@ -7,7 +7,6 @@ import liaison.linkit.global.exception.ExceptionCode; import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.browse.BrowsePrivateProfileResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; @@ -44,7 +43,6 @@ public class BrowsePrivateProfileController { public final AntecedentsService antecedentsService; public final EducationService educationService; public final AwardsService awardsService; - public final AttachService attachService; public final ProfileRegionService profileRegionService; public final BrowsePrivateProfileService browsePrivateProfileService; @@ -67,43 +65,50 @@ public ResponseEntity getBrowsePrivateProfile( browsePrivateProfileService.validatePrivateProfileByMiniProfile(miniProfileId); // 2. 열람하고자 하는 회원의 ID를 가져온다. - final Long browseTargetPrivateProfileId = browsePrivateProfileService.getTargetPrivateProfileIdByMiniProfileId(miniProfileId); + final Long browseTargetPrivateProfileId = browsePrivateProfileService.getTargetPrivateProfileIdByMiniProfileId( + miniProfileId); log.info("browseTargetPrivateProfileId={}", browseTargetPrivateProfileId); // 열람할 타깃 profile id 제공 - final ProfileIsValueResponse profileIsValueResponse = browsePrivateProfileService.getProfileIsValue(browseTargetPrivateProfileId); + final ProfileIsValueResponse profileIsValueResponse = browsePrivateProfileService.getProfileIsValue( + browseTargetPrivateProfileId); log.info("profileIsValueResponse={}", profileIsValueResponse); - final MiniProfileResponse miniProfileResponse = getBrowseMiniProfileResponse(accessor.getMemberId(), browseTargetPrivateProfileId, profileIsValueResponse.isMiniProfile()); + final MiniProfileResponse miniProfileResponse = getBrowseMiniProfileResponse(accessor.getMemberId(), + browseTargetPrivateProfileId, profileIsValueResponse.isMiniProfile()); log.info("miniProfileResponse={}", miniProfileResponse); final CompletionResponse completionResponse = getCompletionResponse(browseTargetPrivateProfileId); log.info("completionResponse={}", completionResponse); - final ProfileIntroductionResponse profileIntroductionResponse = getProfileIntroduction(browseTargetPrivateProfileId, profileIsValueResponse.isIntroduction()); + final ProfileIntroductionResponse profileIntroductionResponse = getProfileIntroduction( + browseTargetPrivateProfileId, profileIsValueResponse.isIntroduction()); log.info("profileIntroductionResponse={}", profileIntroductionResponse); - final JobAndSkillResponse jobAndSkillResponse = getJobAndSkillResponse(browseTargetPrivateProfileId, profileIsValueResponse.isJobAndSkill()); + final JobAndSkillResponse jobAndSkillResponse = getJobAndSkillResponse(browseTargetPrivateProfileId, + profileIsValueResponse.isJobAndSkill()); log.info("jobAndSkillResponse={}", jobAndSkillResponse); - final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = getProfileTeamBuildingResponse(browseTargetPrivateProfileId, profileIsValueResponse.isProfileTeamBuildingField()); + final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = getProfileTeamBuildingResponse( + browseTargetPrivateProfileId, profileIsValueResponse.isProfileTeamBuildingField()); log.info("profileTeamBuildingFieldResponse={}", profileTeamBuildingFieldResponse); - final ProfileRegionResponse profileRegionResponse = getProfileRegionResponse(browseTargetPrivateProfileId, profileIsValueResponse.isProfileRegion()); + final ProfileRegionResponse profileRegionResponse = getProfileRegionResponse(browseTargetPrivateProfileId, + profileIsValueResponse.isProfileRegion()); log.info("profileRegionResponse={}", profileRegionResponse); - final List antecedentsResponses = getAntecedentsResponses(browseTargetPrivateProfileId, profileIsValueResponse.isAntecedents()); + final List antecedentsResponses = getAntecedentsResponses(browseTargetPrivateProfileId, + profileIsValueResponse.isAntecedents()); log.info("antecedentsResponses={}", antecedentsResponses); - final List educationResponses = getEducationResponses(browseTargetPrivateProfileId, profileIsValueResponse.isEducation()); + final List educationResponses = getEducationResponses(browseTargetPrivateProfileId, + profileIsValueResponse.isEducation()); log.info("educationResponses={}", educationResponses); - final List awardsResponses = getAwardsResponses(browseTargetPrivateProfileId, profileIsValueResponse.isAwards()); + final List awardsResponses = getAwardsResponses(browseTargetPrivateProfileId, + profileIsValueResponse.isAwards()); log.info("awardsResponses={}", awardsResponses); - final AttachResponse attachResponse = getAttachResponses(browseTargetPrivateProfileId, profileIsValueResponse.isAttachUrl()); - log.info("attachResponse={}", attachResponse); - final BrowsePrivateProfileResponse browsePrivateProfileResponse = browsePrivateProfileService.getProfileResponse( browseTargetPrivateProfileId, miniProfileResponse, @@ -114,8 +119,7 @@ public ResponseEntity getBrowsePrivateProfile( profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses ); return ResponseEntity.ok().body(browsePrivateProfileResponse); @@ -124,18 +128,6 @@ public ResponseEntity getBrowsePrivateProfile( } } - private AttachResponse getAttachResponses( - final Long browseTargetPrivateProfileId, - final boolean isAttachUrl - ) { - if (isAttachUrl) { - attachService.validateAttachUrlByProfile(browseTargetPrivateProfileId); - return attachService.getBrowseAttachList(browseTargetPrivateProfileId); - } else { - return new AttachResponse(); - } - } - private List getAwardsResponses( final Long browseTargetPrivateProfileId, final boolean isAwards @@ -236,7 +228,8 @@ private MiniProfileResponse getBrowseMiniProfileResponse( // 미니 프로필이 존재하는 경우 if (isMiniProfile) { miniProfileService.validateMiniProfileByTargetProfileId(browseTargetPrivateProfileId); - log.info("targetPrivateProfileId={}가 유효합니다. in browsePrivateProfileController", browseTargetPrivateProfileId); + log.info("targetPrivateProfileId={}가 유효합니다. in browsePrivateProfileController", + browseTargetPrivateProfileId); return miniProfileService.getBrowsePersonalMiniProfile(memberId, browseTargetPrivateProfileId); } else { final String memberName = miniProfileService.getMemberName(browseTargetPrivateProfileId); diff --git a/src/main/java/liaison/linkit/profile/presentation/ProfileController.java b/src/main/java/liaison/linkit/profile/presentation/ProfileController.java index a4c41c02..81fcd1ca 100644 --- a/src/main/java/liaison/linkit/profile/presentation/ProfileController.java +++ b/src/main/java/liaison/linkit/profile/presentation/ProfileController.java @@ -1,15 +1,17 @@ package liaison.linkit.profile.presentation; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + import jakarta.validation.Valid; +import java.util.List; import liaison.linkit.auth.Auth; import liaison.linkit.auth.MemberOnly; import liaison.linkit.auth.domain.Accessor; -import liaison.linkit.member.service.MemberService; +import liaison.linkit.member.business.MemberService; import liaison.linkit.profile.dto.request.IntroductionRequest; import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.ProfileResponse; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; import liaison.linkit.profile.dto.response.education.EducationResponse; @@ -18,15 +20,24 @@ import liaison.linkit.profile.dto.response.onBoarding.JobAndSkillResponse; import liaison.linkit.profile.dto.response.profileRegion.ProfileRegionResponse; import liaison.linkit.profile.dto.response.teamBuilding.ProfileTeamBuildingFieldResponse; -import liaison.linkit.profile.service.*; +import liaison.linkit.profile.service.AntecedentsService; +import liaison.linkit.profile.service.AwardsService; +import liaison.linkit.profile.service.CompletionService; +import liaison.linkit.profile.service.EducationService; +import liaison.linkit.profile.service.MiniProfileService; +import liaison.linkit.profile.service.ProfileOnBoardingService; +import liaison.linkit.profile.service.ProfileRegionService; +import liaison.linkit.profile.service.ProfileService; +import liaison.linkit.profile.service.ProfileSkillService; +import liaison.linkit.profile.service.TeamBuildingFieldService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @@ -44,7 +55,6 @@ public class ProfileController { public final AntecedentsService antecedentsService; public final EducationService educationService; public final AwardsService awardsService; - public final AttachService attachService; public final ProfileRegionService profileRegionService; // 자기소개 생성/수정 메서드 @@ -68,10 +78,13 @@ public ResponseEntity getMyProfile(@Auth final Accessor accessor) { try { profileService.validateProfileByMember(accessor.getMemberId()); - final ProfileIsValueResponse profileIsValueResponse = profileService.getProfileIsValue(accessor.getMemberId()); + final ProfileIsValueResponse profileIsValueResponse = profileService.getProfileIsValue( + accessor.getMemberId()); log.info("profileIsValueResponse={}", profileIsValueResponse); - final boolean isPrivateProfileEssential = (profileIsValueResponse.isProfileTeamBuildingField() && profileIsValueResponse.isProfileRegion() && profileIsValueResponse.isMiniProfile() && profileIsValueResponse.isJobAndSkill()); + final boolean isPrivateProfileEssential = (profileIsValueResponse.isProfileTeamBuildingField() + && profileIsValueResponse.isProfileRegion() && profileIsValueResponse.isMiniProfile() + && profileIsValueResponse.isJobAndSkill()); log.info("isPrivateProfileEssential={}", isPrivateProfileEssential); if (!isPrivateProfileEssential) { @@ -79,18 +92,25 @@ public ResponseEntity getMyProfile(@Auth final Accessor accessor) { return ResponseEntity.ok().body(new ProfileResponse()); } - final MiniProfileResponse miniProfileResponse = getMiniProfileResponse(accessor.getMemberId(), profileIsValueResponse.isMiniProfile()); + final MiniProfileResponse miniProfileResponse = getMiniProfileResponse(accessor.getMemberId(), + profileIsValueResponse.isMiniProfile()); log.info("miniProfileResponse={}", miniProfileResponse); final CompletionResponse completionResponse = getCompletionResponse(accessor.getMemberId()); - final ProfileIntroductionResponse profileIntroductionResponse = getProfileIntroduction(accessor.getMemberId(), profileIsValueResponse.isIntroduction()); - final JobAndSkillResponse jobAndSkillResponse = getJobAndSkillResponse(accessor.getMemberId(), profileIsValueResponse.isJobAndSkill()); - final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = getProfileTeamBuildingResponse(accessor.getMemberId(), profileIsValueResponse.isProfileTeamBuildingField()); - final ProfileRegionResponse profileRegionResponse = getProfileRegionResponse(accessor.getMemberId(), profileIsValueResponse.isProfileRegion()); - final List antecedentsResponses = getAntecedentsResponses(accessor.getMemberId(), profileIsValueResponse.isAntecedents()); - final List educationResponses = getEducationResponses(accessor.getMemberId(), profileIsValueResponse.isEducation()); - final List awardsResponses = getAwardsResponses(accessor.getMemberId(), profileIsValueResponse.isAwards()); - final AttachResponse attachResponse = getAttachResponses(accessor.getMemberId(), profileIsValueResponse.isAttachUrl()); + final ProfileIntroductionResponse profileIntroductionResponse = getProfileIntroduction( + accessor.getMemberId(), profileIsValueResponse.isIntroduction()); + final JobAndSkillResponse jobAndSkillResponse = getJobAndSkillResponse(accessor.getMemberId(), + profileIsValueResponse.isJobAndSkill()); + final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = getProfileTeamBuildingResponse( + accessor.getMemberId(), profileIsValueResponse.isProfileTeamBuildingField()); + final ProfileRegionResponse profileRegionResponse = getProfileRegionResponse(accessor.getMemberId(), + profileIsValueResponse.isProfileRegion()); + final List antecedentsResponses = getAntecedentsResponses(accessor.getMemberId(), + profileIsValueResponse.isAntecedents()); + final List educationResponses = getEducationResponses(accessor.getMemberId(), + profileIsValueResponse.isEducation()); + final List awardsResponses = getAwardsResponses(accessor.getMemberId(), + profileIsValueResponse.isAwards()); final ProfileResponse profileResponse = profileService.getProfileResponse( isPrivateProfileEssential, @@ -102,8 +122,7 @@ public ResponseEntity getMyProfile(@Auth final Accessor accessor) { profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses ); return ResponseEntity.ok().body(profileResponse); @@ -217,15 +236,4 @@ private List getAntecedentsResponses( return null; } } - - private AttachResponse getAttachResponses( - final Long memberId, - final boolean isAttachUrl - ) { - if (isAttachUrl) { - return attachService.getAttachList(memberId); - } else { - return new AttachResponse(); - } - } } diff --git a/src/main/java/liaison/linkit/profile/presentation/ProfileOnBoardingController.java b/src/main/java/liaison/linkit/profile/presentation/ProfileOnBoardingController.java index af46b606..c8ce4e47 100644 --- a/src/main/java/liaison/linkit/profile/presentation/ProfileOnBoardingController.java +++ b/src/main/java/liaison/linkit/profile/presentation/ProfileOnBoardingController.java @@ -5,7 +5,7 @@ import liaison.linkit.auth.MemberOnly; import liaison.linkit.auth.domain.Accessor; import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.member.service.MemberService; +import liaison.linkit.member.business.MemberService; import liaison.linkit.profile.dto.request.onBoarding.OnBoardingPersonalJobAndSkillCreateRequest; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; import liaison.linkit.profile.dto.response.education.EducationResponse; @@ -71,13 +71,20 @@ public ResponseEntity getOnBoardingProfile(@Auth final Accessor accessor) { try { profileOnBoardingService.validateProfileByMember(accessor.getMemberId()); - final ProfileOnBoardingIsValueResponse profileOnBoardingIsValueResponse = profileOnBoardingService.getProfileOnBoardingIsValue(accessor.getMemberId()); - final MiniProfileResponse miniProfileResponse = getMiniProfileResponse(accessor.getMemberId(), profileOnBoardingIsValueResponse.isMiniProfile()); - final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = getProfileTeamBuildingResponse(accessor.getMemberId(), profileOnBoardingIsValueResponse.isProfileTeamBuildingField()); - final ProfileRegionResponse profileRegionResponse = getProfileRegionResponse(accessor.getMemberId(), profileOnBoardingIsValueResponse.isProfileRegion()); - final JobAndSkillResponse jobAndSkillResponse = getJobAndSkillResponse(accessor.getMemberId(), profileOnBoardingIsValueResponse.isJobAndSkill()); - final List educationResponses = getEducationResponses(accessor.getMemberId(), profileOnBoardingIsValueResponse.isEducation()); - final List antecedentsResponses = getAntecedentsResponses(accessor.getMemberId(), profileOnBoardingIsValueResponse.isAntecedents()); + final ProfileOnBoardingIsValueResponse profileOnBoardingIsValueResponse = profileOnBoardingService.getProfileOnBoardingIsValue( + accessor.getMemberId()); + final MiniProfileResponse miniProfileResponse = getMiniProfileResponse(accessor.getMemberId(), + profileOnBoardingIsValueResponse.isMiniProfile()); + final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = getProfileTeamBuildingResponse( + accessor.getMemberId(), profileOnBoardingIsValueResponse.isProfileTeamBuildingField()); + final ProfileRegionResponse profileRegionResponse = getProfileRegionResponse(accessor.getMemberId(), + profileOnBoardingIsValueResponse.isProfileRegion()); + final JobAndSkillResponse jobAndSkillResponse = getJobAndSkillResponse(accessor.getMemberId(), + profileOnBoardingIsValueResponse.isJobAndSkill()); + final List educationResponses = getEducationResponses(accessor.getMemberId(), + profileOnBoardingIsValueResponse.isEducation()); + final List antecedentsResponses = getAntecedentsResponses(accessor.getMemberId(), + profileOnBoardingIsValueResponse.isAntecedents()); final OnBoardingProfileResponse onBoardingProfileResponse = profileOnBoardingService.getOnBoardingProfile( profileTeamBuildingFieldResponse, diff --git a/src/main/java/liaison/linkit/profile/service/AntecedentsService.java b/src/main/java/liaison/linkit/profile/service/AntecedentsService.java index cfbd940e..0fddfb7c 100644 --- a/src/main/java/liaison/linkit/profile/service/AntecedentsService.java +++ b/src/main/java/liaison/linkit/profile/service/AntecedentsService.java @@ -1,5 +1,12 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_ANTECEDENTS_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_ANTECEDENTS_BY_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_ANTECEDENTS_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.profile.domain.Profile; @@ -13,10 +20,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -60,7 +63,6 @@ public void validateAntecedentsByProfile(final Long profileId) { } } - // validate 및 실제 비즈니스 로직 구분 라인 ------------------------------------------------------------- @Transactional @@ -76,7 +78,6 @@ public void saveAll( if (antecedentsRepository.existsByProfileId(profile.getId())) { antecedentsRepository.deleteAllByProfileId(profile.getId()); profile.updateIsAntecedents(false); - profile.updateMemberProfileTypeByCompletion(); } // 저장 로직을 반복 실행하여 모든 경력 데이터 저장 @@ -87,7 +88,6 @@ public void saveAll( // 프로필 업데이트 profile.updateIsAntecedents(true); - profile.updateMemberProfileTypeByCompletion(); } // DB 저장 로직 @@ -159,7 +159,6 @@ public void delete(final Long memberId, final Long antecedentsId) { log.info("더 이상 경력이 존재하지 않습니다."); // 더 이상 경력이 존재하지 않다면 profile.updateIsAntecedents(false); - profile.updateMemberProfileTypeByCompletion(); } log.info("profile.getId={}의 경력이 아직 존재합니다.", profile.getId()); } @@ -176,7 +175,6 @@ public Long save( } else { // 경력을 보유하고 있지 않았던 경우 profile.updateIsAntecedents(true); - profile.updateMemberProfileTypeByCompletion(); return saveAntecedent(profile, antecedentsCreateRequest); } } diff --git a/src/main/java/liaison/linkit/profile/service/AttachService.java b/src/main/java/liaison/linkit/profile/service/AttachService.java deleted file mode 100644 index c4965e64..00000000 --- a/src/main/java/liaison/linkit/profile/service/AttachService.java +++ /dev/null @@ -1,289 +0,0 @@ -package liaison.linkit.profile.service; - -import liaison.linkit.global.exception.AuthException; -import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.global.exception.FileException; -import liaison.linkit.image.infrastructure.S3Uploader; -import liaison.linkit.profile.domain.Profile; -import liaison.linkit.profile.domain.attach.AttachUrl; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; -import liaison.linkit.profile.domain.repository.attach.AttachUrlRepository; -import liaison.linkit.profile.dto.request.attach.AttachUrlCreateRequest; -import liaison.linkit.profile.dto.request.attach.AttachUrlUpdateRequest; -import liaison.linkit.profile.dto.response.attach.AttachResponse; -import liaison.linkit.profile.dto.response.attach.AttachUrlResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - -@Service -@RequiredArgsConstructor -@Transactional -@Slf4j -public class AttachService { - private final ProfileRepository profileRepository; - private final AttachUrlRepository attachUrlRepository; -// private final AttachFileRepository attachFileRepository; - private final S3Uploader s3Uploader; - private final ApplicationEventPublisher publisher; - - // 모든 "내 이력서" 서비스 계층에 필요한 profile 조회 메서드 - private Profile getProfile(final Long memberId) { - return profileRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_MEMBER_ID)); - } - - // 단일 첨부 URL 조회 - private AttachUrl getAttachUrl(final Long attachUrlId) { - return attachUrlRepository.findById(attachUrlId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_ATTACH_URL_BY_ID)); - } - - // 전체 첨부 URL 조회 - private List getAttachUrls(final Long profileId) { - try { - return attachUrlRepository.findAllByProfileId(profileId); - } catch (Exception e) { - throw new BadRequestException(NOT_FOUND_ATTACH_URLS_BY_PROFILE_ID); - } - } - - // 해당 회원이 1개라도 Attach URL 보유하고 있는지 - public void validateAttachUrlByMember(final Long memberId) { - if (!attachUrlRepository.existsByProfileId(getProfile(memberId).getId())) { - throw new AuthException(INVALID_ATTACH_URL_WITH_PROFILE); - } - } - - public void validateAttachUrlByProfile(final Long profileId) { - if (!attachUrlRepository.existsByProfileId(profileId)) { - throw new AuthException(INVALID_ATTACH_URL_WITH_PROFILE); - } - } - - // 단일 첨부 File 조회 -// private AttachFile getAttachFile(final Long attachFileId) { -// return attachFileRepository.findById(attachFileId) -// .orElseThrow(() -> new BadRequestException(NOT_FOUND_ATTACH_FILE_BY_ID)); -// } -// - // 전체 첨부 File 조회 -// private List getAttachFiles(final Long profileId) { -// try { -// return attachFileRepository.findAllByProfileId(profileId); -// } catch (Exception e) { -// throw new BadRequestException(NOT_FOUND_ATTACH_URLS_BY_PROFILE_ID); -// } -// } - - // 해당 회원이 1개라도 Attach File 보유하고 있는지 -// public void validateAttachFileByMember(final Long memberId) { -// if (!attachFileRepository.existsByProfileId(getProfile(memberId).getId())) { -// throw new AuthException(INVALID_ATTACH_FILE_WITH_PROFILE); -// } -// } - - // validate 및 실제 비즈니스 로직 구분 라인 ------------------------------------------------------------- - - public void saveUrl( - final Long memberId, - final List attachUrlCreateRequests - ) { - final Profile profile = getProfile(memberId); - - // 기존에 존재 이력이 있다면 - if (attachUrlRepository.existsByProfileId(profile.getId())) { - attachUrlRepository.deleteAllByProfileId(profile.getId()); - profile.updateIsAttachUrl(false); - profile.updateMemberProfileTypeByCompletion(); - } - - attachUrlCreateRequests.forEach(request -> { - saveAttachUrl(profile, request); - }); - - profile.updateIsAttachUrl(true); - profile.updateMemberProfileTypeByCompletion(); - } - - private void saveAttachUrl(final Profile profile, final AttachUrlCreateRequest attachUrlCreateRequest) { - final AttachUrl newAttachUrl = AttachUrl.of( - profile, - attachUrlCreateRequest.getAttachUrlName(), - attachUrlCreateRequest.getAttachUrlPath() - ); - attachUrlRepository.save(newAttachUrl); - } - - public AttachUrlResponse getAttachUrlDetail(final Long attachUrlId) { - final AttachUrl attachUrl = attachUrlRepository.findById(attachUrlId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_ATTACH_URL_ID)); - return getAttachUrlResponse(attachUrl); - } - - private AttachUrlResponse getAttachUrlResponse(final AttachUrl attachUrl) { - return AttachUrlResponse.personalAttachUrl(attachUrl); - } - - // 수정 메서드 - // 특정 URL 수정 - public void updateUrl(final Long attachUrlId, final AttachUrlUpdateRequest updateRequest) { - final AttachUrl attachUrl = getAttachUrl(attachUrlId); - attachUrl.update(updateRequest); - } - - public void deleteAllUrl(final Long memberId) { - final Profile profile = getProfile(memberId); - if (attachUrlRepository.existsByProfileId(profile.getId())) { - attachUrlRepository.deleteAllByProfileId(profile.getId()); - profile.updateIsAttachUrl(false); - profile.updateMemberProfileTypeByCompletion(); - } - } - - // 삭제 메서드 - public void deleteUrl(final Long memberId, final Long attachUrlId) { - final Profile profile = getProfile(memberId); - final AttachUrl attachUrl = getAttachUrl(attachUrlId); - - attachUrlRepository.deleteById(attachUrl.getId()); - - if (!attachUrlRepository.existsByProfileId(profile.getId())) { - profile.cancelPerfectionTen(); - profile.updateMemberProfileTypeByCompletion(); - } - } - -// public void saveFile( -// final Long memberId, -// final MultipartFile attachFile -// ) { -// final Profile profile = getProfile(memberId); -// final String attachFileUrl = saveFileS3(attachFile); -// final AttachFile newAttachFile = AttachFile.of( -// profile, -// attachFile.getOriginalFilename(), -// attachFileUrl -// ); -// -// attachFileRepository.save(newAttachFile); -// profile.updateIsAttachFile(true); -// // 프로필 상태 관리 첨부용으로 추가 필요 -// } -// -// private String saveFileS3(final MultipartFile attachFile) { -// validateSizeofFile(attachFile); -// final PortfolioFile portfolioFile = new PortfolioFile(attachFile); -// return uploadPortfolioFile(portfolioFile); -// } - -// private String uploadPortfolioFile(final PortfolioFile portfolioFile) { -// try { -// return s3Uploader.uploadPortfolioFile(portfolioFile); -// } catch (final Exception e) { -// publisher.publishEvent(new S3PortfolioEvent(portfolioFile.getHashedName())); -// throw e; -// } -// } - - private void validateSizeofFile(final MultipartFile attachFile) { - if (attachFile == null || attachFile.isEmpty()) { - throw new FileException(EMPTY_ATTACH_FILE); - } - } - - // 조회 메서드 -// public AttachFileResponse getAttachFileDetail(final Long attachFileId) { -// final AttachFile attachFile = attachFileRepository.findById(attachFileId) -// .orElseThrow(() -> new BadRequestException(NOT_FOUND_ATTACH_FILE_ID)); -// return getAttachFileResponse(attachFile); -// } - -// private AttachFileResponse getAttachFileResponse(final AttachFile attachFile) { -// return AttachFileResponse.personalAttachFile(attachFile); -// } - -// // 수정 메서드 -// public void updateFile(final Long memberId, final AttachFileUpdateRequest updateRequest) { -// final Profile profile = getProfile(memberId); -// final Long attachFileId = validateAttachFileByMember(memberId); -// -// final AttachFile attachFile = attachFileRepository.findById(attachFileId) -// .orElseThrow(() -> new BadRequestException(NOT_FOUND_ATTACH_FILE_ID)); -// -// attachFile.update(updateRequest); -// attachFileRepository.save(attachFile); -// } -// -// public void deleteFile(final Long memberId) { -// final Profile profile = profileRepository.findByMemberId(memberId); -// final Long attachFileId = validateAttachFileByMember(memberId); -// -// if (!attachFileRepository.existsByProfileId(attachFileId)) { -// throw new BadRequestException(NOT_FOUND_ATTACH_FILE_ID); -// } -// -// attachFileRepository.deleteById(attachFileId); -// -// // 프로그레스바 상태 관련 함수 추가 필요 -// } - - public AttachResponse getAttachList(final Long memberId) { - final Profile profile = getProfile(memberId); - - final List attachUrls = attachUrlRepository.findAllByProfileId(profile.getId()); - log.info("attachUrls={}", attachUrls); - -// final List attachFiles = attachFileRepository.findAllByProfileId(profile.getId()); -// log.info("attachFiles={}", attachFiles); - - final List attachUrlResponses = attachUrls.stream().map(this::getAttachUrlResponse).toList(); - log.info("attachUrlResponses={}", attachUrlResponses); - -// final List attachFileResponses = attachFiles.stream().map(this::getAttachFileResponse).toList(); -// log.info("attachFileResponses={}", attachFileResponses); - - return AttachResponse.getAttachResponse(attachUrlResponses); - } - @Transactional(readOnly = true) - public AttachResponse getBrowseAttachList(final Long profileId) { - final Profile profile = profileRepository.findById(profileId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); - - final List attachUrls = attachUrlRepository.findAllByProfileId(profile.getId()); - log.info("attachUrls={}", attachUrls); - -// final List attachFiles = attachFileRepository.findAllByProfileId(profile.getId()); -// log.info("attachFiles={}", attachFiles); - - final List attachUrlResponses = attachUrls.stream().map(this::getAttachUrlResponse).toList(); - log.info("attachUrlResponses={}", attachUrlResponses); - -// final List attachFileResponses = attachFiles.stream().map(this::getAttachFileResponse).toList(); -// log.info("attachFileResponses={}", attachFileResponses); - - return AttachResponse.getAttachResponse(attachUrlResponses); - } - - - - -// public void deleteFile( -// final Long memberId, -// final Long attachFileUrlId -// ) { -// final Profile profile = getProfile(memberId); -// attachFileRepository.deleteById(attachFileUrlId); -// if (!attachFileRepository.existsByProfileId(profile.getId()) && !attachUrlRepository.existsByProfileId(profile.getId())) { -// profile.cancelPerfectionTen(); -// profile.updateMemberProfileTypeByCompletion(); -// } -// } -} diff --git a/src/main/java/liaison/linkit/profile/service/AwardsService.java b/src/main/java/liaison/linkit/profile/service/AwardsService.java index 5ade5103..c76d791a 100644 --- a/src/main/java/liaison/linkit/profile/service/AwardsService.java +++ b/src/main/java/liaison/linkit/profile/service/AwardsService.java @@ -1,9 +1,16 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_AWARDS_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_AWARDS_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_AWARDS_LIST_BY_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.profile.domain.awards.Awards; import liaison.linkit.profile.domain.Profile; +import liaison.linkit.profile.domain.awards.Awards; import liaison.linkit.profile.domain.repository.awards.AwardsRepository; import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.dto.request.awards.AwardsCreateRequest; @@ -12,10 +19,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -36,15 +39,6 @@ private Awards getAwards(final Long awardsId) { .orElseThrow(() -> new BadRequestException(NOT_FOUND_AWARDS_BY_ID)); } - // 해당 내 이력서로부터 모든 보유 기술들을 조회하려고 할 때 - private List getAwardsList(final Long profileId) { - try { - return awardsRepository.findAllByProfileId(profileId); - } catch (Exception e) { - throw new BadRequestException(NOT_FOUND_AWARDS_LIST_BY_PROFILE_ID); - } - } - // 멤버로부터 프로필 아이디를 조회해서 존재성을 판단 public void validateAwardsByMember(final Long memberId) { if (!awardsRepository.existsByProfileId(getProfile(memberId).getId())) { @@ -59,8 +53,6 @@ public void validateAwardsByProfile(final Long profileId) { } } - // validate 및 실제 비즈니스 로직 구분 라인 ------------------------------------------------------------- - public Long save( final Long memberId, final AwardsCreateRequest awardsCreateRequest @@ -70,9 +62,8 @@ public Long save( if (profile.getIsAwards()) { return saveAwards(profile, awardsCreateRequest); - } else{ + } else { profile.updateIsAwards(true); - profile.updateMemberProfileTypeByCompletion(); return saveAwards(profile, awardsCreateRequest); } } @@ -94,7 +85,6 @@ public void saveAll(final Long memberId, final List awardsC if (awardsRepository.existsByProfileId(profile.getId())) { awardsRepository.deleteAllByProfileId(profile.getId()); profile.updateIsAwards(false); - profile.updateMemberProfileTypeByCompletion(); } awardsCreateRequests.forEach(request -> { @@ -102,7 +92,6 @@ public void saveAll(final Long memberId, final List awardsC }); profile.updateIsAwards(true); - profile.updateMemberProfileTypeByCompletion(); } private Long saveAwards(final Profile profile, final AwardsCreateRequest awardsCreateRequest) { @@ -134,7 +123,6 @@ public List getAllBrowseAwards(final Long profileId) { final Profile profile = profileRepository.findById(profileId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); - final List awards = awardsRepository.findAllByProfileId(profile.getId()); return awards.stream() .map(this::getAwardsResponse) @@ -148,7 +136,7 @@ private AwardsResponse getAwardsResponse(final Awards awards) { // 수상 항목 1개 조회 (비공개 처리 로직 추가 필요) @Transactional(readOnly = true) - public AwardsResponse getAwardsDetail(final Long awardsId){ + public AwardsResponse getAwardsDetail(final Long awardsId) { final Awards awards = awardsRepository.findById(awardsId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_AWARDS_ID)); return AwardsResponse.personalAwards(awards); @@ -164,10 +152,8 @@ public void deleteAwards(final Long memberId, final Long awardsId) { if (!awardsRepository.existsByProfileId(profile.getId())) { // 존재하지 않는 경우 profile.updateIsAwards(false); - profile.updateMemberProfileTypeByCompletion(); } } - } diff --git a/src/main/java/liaison/linkit/profile/service/BrowsePrivateProfileService.java b/src/main/java/liaison/linkit/profile/service/BrowsePrivateProfileService.java index 09f2cb2a..dc312eca 100644 --- a/src/main/java/liaison/linkit/profile/service/BrowsePrivateProfileService.java +++ b/src/main/java/liaison/linkit/profile/service/BrowsePrivateProfileService.java @@ -1,5 +1,12 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_MINI_PROFILE_WITH_MEMBER; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MEMBER_BY_MEMBER_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MINI_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.member.domain.Member; @@ -7,18 +14,16 @@ import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.miniProfile.MiniProfile; import liaison.linkit.profile.domain.repository.antecedents.AntecedentsRepository; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; -import liaison.linkit.profile.domain.repository.skill.ProfileSkillRepository; -import liaison.linkit.profile.domain.repository.skill.SkillRepository; -import liaison.linkit.profile.domain.repository.attach.AttachUrlRepository; import liaison.linkit.profile.domain.repository.education.DegreeRepository; import liaison.linkit.profile.domain.repository.education.EducationRepository; import liaison.linkit.profile.domain.repository.miniProfile.MiniProfileRepository; +import liaison.linkit.profile.domain.repository.profile.ProfileRepository; +import liaison.linkit.profile.domain.repository.skill.ProfileSkillRepository; +import liaison.linkit.profile.domain.repository.skill.SkillRepository; import liaison.linkit.profile.domain.repository.teambuilding.ProfileTeamBuildingFieldRepository; import liaison.linkit.profile.domain.repository.teambuilding.TeamBuildingFieldRepository; import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.browse.BrowsePrivateProfileResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; @@ -35,10 +40,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -56,7 +57,6 @@ public class BrowsePrivateProfileService { private final AntecedentsRepository antecedentsRepository; private final EducationRepository educationRepository; private final DegreeRepository degreeRepository; - private final AttachUrlRepository attachUrlRepository; // 회원 조회 private Member getMember(final Long memberId) { @@ -111,8 +111,7 @@ public BrowsePrivateProfileResponse getProfileResponse( final ProfileRegionResponse profileRegionResponse, final List antecedentsResponses, final List educationResponses, - final List awardsResponses, - final AttachResponse attachResponse + final List awardsResponses ) { return BrowsePrivateProfileResponse.privateProfile( profileId, @@ -124,13 +123,13 @@ public BrowsePrivateProfileResponse getProfileResponse( profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses ); } public boolean checkBrowseAuthority(final Long memberId) { - final Profile profile = profileRepository.findByMemberId(memberId).orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); + final Profile profile = profileRepository.findByMemberId(memberId) + .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); final TeamProfile teamProfile = teamProfileRepository.findByMemberId(memberId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_PROFILE_BY_ID)); diff --git a/src/main/java/liaison/linkit/profile/service/EducationService.java b/src/main/java/liaison/linkit/profile/service/EducationService.java index f76a6d67..365fcbb7 100644 --- a/src/main/java/liaison/linkit/profile/service/EducationService.java +++ b/src/main/java/liaison/linkit/profile/service/EducationService.java @@ -1,13 +1,21 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_DEGREE_NAME; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_EDUCATIONS_BY_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_EDUCATION_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; + +import java.util.ArrayList; +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.education.Degree; import liaison.linkit.profile.domain.education.Education; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.domain.repository.education.DegreeRepository; import liaison.linkit.profile.domain.repository.education.EducationRepository; +import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.dto.request.education.EducationCreateRequest; import liaison.linkit.profile.dto.response.education.EducationResponse; import lombok.RequiredArgsConstructor; @@ -15,11 +23,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -65,7 +68,6 @@ public void saveAll( if (educationRepository.existsByProfileId(profile.getId())) { educationRepository.deleteAllByProfileId(profile.getId()); profile.updateIsEducation(false); - profile.updateMemberProfileTypeByCompletion(); } List responses = new ArrayList<>(); @@ -90,7 +92,6 @@ public void saveAll( // 반복문 종료 후에 프로필의 상태를 업데이트한다. profile.updateIsEducation(true); - profile.updateMemberProfileTypeByCompletion(); } @Transactional(readOnly = true) @@ -128,7 +129,6 @@ public void delete(final Long memberId, final Long educationId) { log.info("삭제 완료"); if (!educationRepository.existsByProfileId(profile.getId())) { profile.updateIsEducation(false); - profile.updateMemberProfileTypeByCompletion(); } } @@ -145,7 +145,6 @@ public Long save( } else { // 기존에 존재하지 않았던 경우 profile.updateIsEducation(true); - profile.updateMemberProfileTypeByCompletion(); return makeNewEducation(educationCreateRequest, profile); } } @@ -159,7 +158,8 @@ public Long update( final Degree degree = degreeRepository.findByDegreeName(educationCreateRequest.getDegreeName()) .orElseThrow(() -> new BadRequestException(NOT_FOUND_DEGREE_NAME)); - education.update(educationCreateRequest, educationCreateRequest.getUniversityName(), educationCreateRequest.getMajorName(), degree); + education.update(educationCreateRequest, educationCreateRequest.getUniversityName(), + educationCreateRequest.getMajorName(), degree); return education.getId(); } diff --git a/src/main/java/liaison/linkit/profile/service/MiniProfileService.java b/src/main/java/liaison/linkit/profile/service/MiniProfileService.java index 332b233c..06f55ef9 100644 --- a/src/main/java/liaison/linkit/profile/service/MiniProfileService.java +++ b/src/main/java/liaison/linkit/profile/service/MiniProfileService.java @@ -192,7 +192,8 @@ public MiniProfileResponse getPersonalMiniProfile(final Long memberId) { final List jobRoleNames = getJobRoleNames(memberId); log.info("대상 객체의 희망 직무 및 역할을 조회하였습니다."); - return MiniProfileResponse.personalMiniProfile(miniProfile, miniProfileKeywordList, memberBasicInform.getMemberName(), jobRoleNames); + return MiniProfileResponse.personalMiniProfile(miniProfile, miniProfileKeywordList, + memberBasicInform.getMemberName(), jobRoleNames); } @Transactional(readOnly = true) @@ -213,9 +214,11 @@ public MiniProfileResponse getBrowsePersonalMiniProfile(final Long memberId, fin final List jobRoleNames = getJobRoleNames(profile.getMember().getId()); log.info("대상 객체의 희망 직무 및 역할을 조회하였습니다."); - final boolean isPrivateSaved = privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + final boolean isPrivateSaved = privateWishRepository.existsByMemberIdAndProfileId(memberId, + miniProfile.getProfile().getId()); - return MiniProfileResponse.personalBrowseMiniProfile(miniProfile, miniProfileKeywordList, memberBasicInform.getMemberName(), jobRoleNames, isPrivateSaved); + return MiniProfileResponse.personalBrowseMiniProfile(miniProfile, miniProfileKeywordList, + memberBasicInform.getMemberName(), jobRoleNames, isPrivateSaved); } private List getProfileJobRoleList(final Long profileId) { @@ -228,12 +231,12 @@ private List getMiniProfileKeywords(final Long miniProfileId private boolean getSavedImageUrl(final Profile profile) { - final MiniProfile miniProfile = getMiniProfile(profile.getId()); - if (miniProfile.getMiniProfileImg() != null) { - return true; - } else { - return false; - } + final MiniProfile miniProfile = getMiniProfile(profile.getId()); + if (miniProfile.getMiniProfileImg() != null) { + return true; + } else { + return false; + } } // 나중에 리팩토링 필요한 부분 @@ -282,7 +285,7 @@ public List getJobRoleNames(final Long memberId) { public boolean getIsPrivateSaved(final Long memberId, final Long profileId) { final MiniProfile miniProfile = getMiniProfile(profileId); - return privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + return privateWishRepository.existsByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); } // 미니 프로필의 유효성 검증이 끝난 후 수정한다. diff --git a/src/main/java/liaison/linkit/profile/service/ProfileOnBoardingService.java b/src/main/java/liaison/linkit/profile/service/ProfileOnBoardingService.java index cfa507d6..9eb10275 100644 --- a/src/main/java/liaison/linkit/profile/service/ProfileOnBoardingService.java +++ b/src/main/java/liaison/linkit/profile/service/ProfileOnBoardingService.java @@ -1,14 +1,20 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_ID; + +import java.util.List; +import java.util.Optional; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.global.exception.ExceptionCode; import liaison.linkit.profile.domain.Profile; +import liaison.linkit.profile.domain.repository.jobRole.JobRoleRepository; +import liaison.linkit.profile.domain.repository.jobRole.ProfileJobRoleRepository; import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.domain.repository.skill.ProfileSkillRepository; import liaison.linkit.profile.domain.repository.skill.SkillRepository; -import liaison.linkit.profile.domain.repository.jobRole.JobRoleRepository; -import liaison.linkit.profile.domain.repository.jobRole.ProfileJobRoleRepository; import liaison.linkit.profile.domain.role.JobRole; import liaison.linkit.profile.domain.role.ProfileJobRole; import liaison.linkit.profile.domain.skill.ProfileSkill; @@ -19,18 +25,13 @@ import liaison.linkit.profile.dto.response.miniProfile.MiniProfileResponse; import liaison.linkit.profile.dto.response.onBoarding.JobAndSkillResponse; import liaison.linkit.profile.dto.response.onBoarding.OnBoardingProfileResponse; -import liaison.linkit.profile.dto.response.teamBuilding.ProfileTeamBuildingFieldResponse; import liaison.linkit.profile.dto.response.profileRegion.ProfileRegionResponse; +import liaison.linkit.profile.dto.response.teamBuilding.ProfileTeamBuildingFieldResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Optional; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -198,7 +199,6 @@ public void updateMemberProfileType( final Long memberId ) { final Profile profile = getProfileByMember(memberId); - profile.updateMemberProfileTypeByCompletion(); } diff --git a/src/main/java/liaison/linkit/profile/service/ProfileRegionService.java b/src/main/java/liaison/linkit/profile/service/ProfileRegionService.java index f67c78c3..7a75cb6e 100644 --- a/src/main/java/liaison/linkit/profile/service/ProfileRegionService.java +++ b/src/main/java/liaison/linkit/profile/service/ProfileRegionService.java @@ -1,21 +1,25 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.HAVE_TO_INPUT_REGION; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_REGION_BY_MEMBER_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_REGION_BY_PROFILE_ID; + import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.region.ProfileRegion; -import liaison.linkit.profile.domain.repository.region.ProfileRegionRepository; +import liaison.linkit.profile.domain.region.Region; import liaison.linkit.profile.domain.repository.profile.ProfileRepository; +import liaison.linkit.profile.domain.repository.region.ProfileRegionRepository; import liaison.linkit.profile.dto.request.profileRegion.ProfileRegionCreateRequest; import liaison.linkit.profile.dto.response.profileRegion.ProfileRegionResponse; -import liaison.linkit.profile.domain.region.Region; import liaison.linkit.team.domain.repository.activity.region.RegionRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -58,23 +62,21 @@ public void save(final Long memberId, final ProfileRegionCreateRequest profileRe if (profileRegionRepository.existsByProfileId(profile.getId())) { profileRegionRepository.deleteByProfileId(profile.getId()); profile.updateIsProfileRegion(false); - profile.updateMemberProfileTypeByCompletion(); } final Region region = regionRepository - .findRegionByCityNameAndDivisionName(profileRegionCreateRequest.getCityName(), profileRegionCreateRequest.getDivisionName() - ); + .findRegionByCityNameAndDivisionName(profileRegionCreateRequest.getCityName(), + profileRegionCreateRequest.getDivisionName() + ); if (region == null) { throw new BadRequestException(HAVE_TO_INPUT_REGION); } ProfileRegion newProfileRegion = new ProfileRegion(null, profile, region); - profileRegionRepository.save(newProfileRegion); profile.updateIsProfileRegion(true); - profile.updateMemberProfileTypeByCompletion(); } catch (IllegalArgumentException e) { throw e; // or return a custom response or error code } catch (Exception e) { @@ -88,7 +90,8 @@ public void save(final Long memberId, final ProfileRegionCreateRequest profileRe public ProfileRegionResponse getPersonalProfileRegion(final Long memberId) { final Profile profile = getProfile(memberId); ProfileRegion profileRegion = getProfileRegion(profile.getId()); - return new ProfileRegionResponse(profileRegion.getRegion().getCityName(), profileRegion.getRegion().getDivisionName()); + return new ProfileRegionResponse(profileRegion.getRegion().getCityName(), + profileRegion.getRegion().getDivisionName()); } // 내 이력서에 매핑되어 있는 활동 지역 및 위치 조회 @@ -98,7 +101,8 @@ public ProfileRegionResponse getPersonalBrowseProfileRegion(final Long profileId .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); ProfileRegion profileRegion = getProfileRegion(profile.getId()); - return new ProfileRegionResponse(profileRegion.getRegion().getCityName(), profileRegion.getRegion().getDivisionName()); + return new ProfileRegionResponse(profileRegion.getRegion().getCityName(), + profileRegion.getRegion().getDivisionName()); } } diff --git a/src/main/java/liaison/linkit/profile/service/ProfileService.java b/src/main/java/liaison/linkit/profile/service/ProfileService.java index 463afbad..9ddb77b4 100644 --- a/src/main/java/liaison/linkit/profile/service/ProfileService.java +++ b/src/main/java/liaison/linkit/profile/service/ProfileService.java @@ -9,7 +9,6 @@ import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.domain.repository.skill.ProfileSkillRepository; import liaison.linkit.profile.domain.repository.skill.SkillRepository; -import liaison.linkit.profile.domain.repository.attach.AttachUrlRepository; import liaison.linkit.profile.domain.repository.education.DegreeRepository; import liaison.linkit.profile.domain.repository.education.EducationRepository; import liaison.linkit.profile.domain.repository.miniProfile.MiniProfileRepository; @@ -19,7 +18,6 @@ import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.ProfileResponse; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; import liaison.linkit.profile.dto.response.education.EducationResponse; @@ -58,12 +56,6 @@ public class ProfileService { private final EducationRepository educationRepository; private final DegreeRepository degreeRepository; - // 첨부 링크 정보 담당 - private final AttachUrlRepository attachUrlRepository; - - // 첨부 이미지(파일 경로) 정보 담당 -// private final AttachFileRepository attachFileRepository; - // 프로필 (내 이력서) 1개 조회 private Profile getProfileByMember(final Long memberId) { return profileRepository.findByMemberId(memberId) @@ -83,7 +75,6 @@ public void validateProfileByMember(final Long memberId) { } - // 생성/수정/삭제 포함 public void saveIntroduction( final Long memberId, @@ -122,8 +113,7 @@ public ProfileResponse getProfileResponse( final ProfileRegionResponse profileRegionResponse, final List antecedentsResponses, final List educationResponses, - final List awardsResponses, - final AttachResponse attachResponse + final List awardsResponses ) { return ProfileResponse.profileItems( isPrivateProfileEssential, @@ -135,14 +125,11 @@ public ProfileResponse getProfileResponse( profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses ); } - - private Profile getProfileByMiniProfile(final Long miniProfileId) { final MiniProfile miniProfile = miniProfileRepository.findById(miniProfileId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_MINI_PROFILE_BY_ID)); diff --git a/src/main/java/liaison/linkit/profile/service/TeamBuildingFieldService.java b/src/main/java/liaison/linkit/profile/service/TeamBuildingFieldService.java index 40f642c8..f6e93077 100644 --- a/src/main/java/liaison/linkit/profile/service/TeamBuildingFieldService.java +++ b/src/main/java/liaison/linkit/profile/service/TeamBuildingFieldService.java @@ -1,5 +1,11 @@ package liaison.linkit.profile.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_TEAM_BUILDING_FIELD_BY_PROFILE_ID; + +import java.util.List; +import java.util.Optional; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.profile.domain.Profile; @@ -15,11 +21,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Optional; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -49,7 +50,6 @@ public void validateBrowseProfileTeamBuildingFieldByProfile(final Long profileId } } - // validate 및 실제 비즈니스 로직 구분 라인 ------------------------------------------------------------- // 희망 팀빌딩 분야 저장 비즈니스 로직 @@ -64,7 +64,6 @@ public void save(final Long memberId, final ProfileTeamBuildingCreateRequest cre profileTeamBuildingFieldRepository.deleteAllByProfileId(profile.getId()); // 삭제 이후 false 변경과 11.8 빼기 진행해줘야 함 profile.updateIsProfileTeamBuildingField(false); - profile.updateMemberProfileTypeByCompletion(); } // 무조건 입력 값이 들어온다 @@ -81,7 +80,6 @@ public void save(final Long memberId, final ProfileTeamBuildingCreateRequest cre // 프로그레스바 처리 비즈니스 로직 profile.updateIsProfileTeamBuildingField(true); - profile.updateMemberProfileTypeByCompletion(); } // 내 이력서에 선택한 희망 팀빌딩 분야 전체 조회 @@ -90,10 +88,12 @@ public ProfileTeamBuildingFieldResponse getAllProfileTeamBuildingFields(final Lo try { final Profile profile = getProfile(memberId); - List profileTeamBuildingFields = profileTeamBuildingFieldRepository.findAllByProfileId(profile.getId()); + List profileTeamBuildingFields = profileTeamBuildingFieldRepository.findAllByProfileId( + profile.getId()); List teamBuildingFieldNames = profileTeamBuildingFields.stream() - .map(profileTeamBuildingField -> teamBuildingFieldRepository.findById(profileTeamBuildingField.getTeamBuildingField().getId())) + .map(profileTeamBuildingField -> teamBuildingFieldRepository.findById( + profileTeamBuildingField.getTeamBuildingField().getId())) .filter(Optional::isPresent) .map(Optional::get) .map(TeamBuildingField::getTeamBuildingFieldName) @@ -111,10 +111,12 @@ public ProfileTeamBuildingFieldResponse getAllBrowseProfileTeamBuildingFields(fi final Profile profile = profileRepository.findById(profileId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); - List profileTeamBuildingFields = profileTeamBuildingFieldRepository.findAllByProfileId(profile.getId()); + List profileTeamBuildingFields = profileTeamBuildingFieldRepository.findAllByProfileId( + profile.getId()); List teamBuildingFieldNames = profileTeamBuildingFields.stream() - .map(profileTeamBuildingField -> teamBuildingFieldRepository.findById(profileTeamBuildingField.getTeamBuildingField().getId())) + .map(profileTeamBuildingField -> teamBuildingFieldRepository.findById( + profileTeamBuildingField.getTeamBuildingField().getId())) .filter(Optional::isPresent) .map(Optional::get) .map(TeamBuildingField::getTeamBuildingFieldName) diff --git a/src/main/java/liaison/linkit/search/service/SearchService.java b/src/main/java/liaison/linkit/search/service/SearchService.java index 509861be..0a08f245 100644 --- a/src/main/java/liaison/linkit/search/service/SearchService.java +++ b/src/main/java/liaison/linkit/search/service/SearchService.java @@ -89,7 +89,8 @@ public Page findPrivateMiniProfile( log.info("cityName={}", cityName); log.info("divisionName={}", divisionName); - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; @@ -121,7 +122,8 @@ public Page findPrivateMiniProfileLogin( String divisionName ) { - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; @@ -162,12 +164,12 @@ public Page findTeamMemberAnnouncementsWithTeamMiniPr // 해당 팀원 공고들을 찾는다. // 해당 팀원 공고와 연결된 팀 미니 프로필을 같이 반환한다. - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; final Long activityTagCount = (activityTagName != null) ? (long) activityTagName.size() : null; - // 해당되는 모든 팀원 공고를 조회한다. Page teamMemberAnnouncements = teamMemberAnnouncementRepository.findAllByOrderByCreatedDateDesc( teamBuildingFieldName, @@ -198,7 +200,8 @@ public Page findTeamMemberAnnouncementsWithTeam String divisionName, final List activityTagName ) { - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; final Long activityTagCount = (activityTagName != null) ? (long) activityTagName.size() : null; @@ -217,40 +220,54 @@ public Page findTeamMemberAnnouncementsWithTeam activityTagCount, pageable ); - return teamMemberAnnouncements.map(teamMemberAnnouncement -> convertToSearchTeamProfileResponseAfterLogin(teamMemberAnnouncement, memberId)); + return teamMemberAnnouncements.map( + teamMemberAnnouncement -> convertToSearchTeamProfileResponseAfterLogin(teamMemberAnnouncement, + memberId)); } - private SearchTeamProfileResponse convertToSearchTeamProfileResponse(final TeamMemberAnnouncement teamMemberAnnouncement) { + private SearchTeamProfileResponse convertToSearchTeamProfileResponse( + final TeamMemberAnnouncement teamMemberAnnouncement) { // 각각의 개별 팀원 공고를 찾아냈다. - final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId(teamMemberAnnouncement.getTeamProfile().getId()); - final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()); - - final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole(teamMemberAnnouncement.getId()); - final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills(teamMemberAnnouncement.getId()); + final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId( + teamMemberAnnouncement.getTeamProfile().getId()); + final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()); + + final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole( + teamMemberAnnouncement.getId()); + final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills( + teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); - return new SearchTeamProfileResponse( TeamMiniProfileResponse.personalTeamMiniProfile(teamMiniProfile, teamMiniProfileKeyword), TeamMemberAnnouncementResponse.of( - teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList) + teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, + teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList) ); } - private SearchBrowseTeamProfileResponse convertToSearchTeamProfileResponseAfterLogin(final TeamMemberAnnouncement teamMemberAnnouncement, final Long memberId) { - final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId(teamMemberAnnouncement.getTeamProfile().getId()); - final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()); - - final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole(teamMemberAnnouncement.getId()); - final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills(teamMemberAnnouncement.getId()); + private SearchBrowseTeamProfileResponse convertToSearchTeamProfileResponseAfterLogin( + final TeamMemberAnnouncement teamMemberAnnouncement, final Long memberId) { + final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId( + teamMemberAnnouncement.getTeamProfile().getId()); + final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()); + + final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole( + teamMemberAnnouncement.getId()); + final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills( + teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); - final boolean isTeamSaved = teamWishRepository.findByTeamMemberAnnouncementIdAndMemberId(teamMemberAnnouncement.getId(), memberId); + final boolean isTeamSaved = teamWishRepository.existsByTeamMemberAnnouncementIdAndMemberId( + teamMemberAnnouncement.getId(), memberId); log.info("isTeamSaved={}", isTeamSaved); return new SearchBrowseTeamProfileResponse( TeamMiniProfileResponse.personalTeamMiniProfile(teamMiniProfile, teamMiniProfileKeyword), - TeamMemberAnnouncementResponse.afterLogin(teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList, isTeamSaved) + TeamMemberAnnouncementResponse.afterLogin(teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, + teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList, isTeamSaved) ); } @@ -282,7 +299,8 @@ public Page findTeamMiniProfile( } private TeamMiniProfileResponse convertToTeamMiniProfileResponse(final TeamMiniProfile teamMiniProfile) { - List teamKeywordNames = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()).stream() + List teamKeywordNames = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()).stream() .map(TeamMiniProfileKeyword::getTeamKeywordNames) .toList(); @@ -327,7 +345,8 @@ private MiniProfileResponse convertToMiniProfileResponse(final MiniProfile miniP ); } - private BrowseMiniProfileResponse convertToBrowseMiniProfileResponse(final MiniProfile miniProfile, final Long memberId) { + private BrowseMiniProfileResponse convertToBrowseMiniProfileResponse(final MiniProfile miniProfile, + final Long memberId) { final String memberName = getMemberNameByMiniProfile(miniProfile.getId()); List myKeywordNames = miniProfileKeywordRepository.findAllByMiniProfileId(miniProfile.getId()).stream() .map(MiniProfileKeyword::getMyKeywordNames) @@ -343,7 +362,8 @@ private BrowseMiniProfileResponse convertToBrowseMiniProfileResponse(final MiniP .toList(); // privateWish -> 찾아야함 (내가 이 해당 미니 프로필을 찜해뒀는지?) - final boolean isPrivateWish = privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + final boolean isPrivateWish = privateWishRepository.existsByMemberIdAndProfileId(memberId, + miniProfile.getProfile().getId()); return new BrowseMiniProfileResponse( miniProfile.getId(), @@ -381,7 +401,6 @@ private Profile getProfileIdByMiniProfile(final Long miniProfileId) { // 회원 기본 정보를 가져오는 메서드 private MemberBasicInform getMemberBasicInform(final Long memberId) { - return memberBasicInformRepository.findByMemberId(memberId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID)); } diff --git a/src/main/java/liaison/linkit/team/domain/TeamProfile.java b/src/main/java/liaison/linkit/team/domain/TeamProfile.java index e8d814dd..4e28f6e2 100644 --- a/src/main/java/liaison/linkit/team/domain/TeamProfile.java +++ b/src/main/java/liaison/linkit/team/domain/TeamProfile.java @@ -1,9 +1,16 @@ package liaison.linkit.team.domain; -import jakarta.persistence.*; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; import liaison.linkit.global.BaseEntity; import liaison.linkit.member.domain.Member; -import liaison.linkit.member.domain.type.TeamProfileType; import liaison.linkit.team.domain.miniprofile.TeamMiniProfile; import lombok.AllArgsConstructor; import lombok.Getter; @@ -11,10 +18,6 @@ import lombok.extern.slf4j.Slf4j; import org.hibernate.annotations.SQLRestriction; -import static jakarta.persistence.GenerationType.IDENTITY; -import static liaison.linkit.member.domain.type.TeamProfileType.ALLOW_MATCHING; -import static lombok.AccessLevel.PROTECTED; - @Entity @Getter @AllArgsConstructor @@ -121,22 +124,30 @@ public TeamProfile( this(null, member, teamProfileCompletion); } - // 기본 입력 항목 (희망 팀빌딩 분야 / 활동 방식 + 활동 지역 및 위치) - // 팀원 공고 15.0% - // 팀 소개 15.0% - // 팀원 소개 15.0% - // 연혁 2.5% - // 첨부 2.5% - // 디폴트 항목 관리 메서드 - public void addTeamPerfectionDefault25() {this.teamProfileCompletion += 25.0;} - public void cancelTeamPerfectionDefault25() {this.teamProfileCompletion -= 25.0;} + public void addTeamPerfectionDefault25() { + this.teamProfileCompletion += 25.0; + } + + public void cancelTeamPerfectionDefault25() { + this.teamProfileCompletion -= 25.0; + } + + public void addTeamPerfectionFifteen() { + this.teamProfileCompletion += 15.0; + } + + public void cancelTeamPerfectionFifteen() { + this.teamProfileCompletion -= 15.0; + } - public void addTeamPerfectionFifteen() {this.teamProfileCompletion += 15.0;} - public void cancelTeamPerfectionFifteen() {this.teamProfileCompletion -= 15.0;} + public void addTeamPerfectionTwoPointFive() { + this.teamProfileCompletion += 2.5; + } - public void addTeamPerfectionTwoPointFive() {this.teamProfileCompletion += 2.5;} - public void cancelTeamPerfectionTwoPointFive() {this.teamProfileCompletion -= 2.5;} + public void cancelTeamPerfectionTwoPointFive() { + this.teamProfileCompletion -= 2.5; + } // 4.1. 미니 프로필 업데이트 public void updateIsTeamMiniProfile(final boolean isTeamMiniProfile) { @@ -188,7 +199,7 @@ public void updateIsTeamIntroduction(final boolean isTeamIntroduction) { this.isTeamIntroduction = isTeamIntroduction; if (this.isTeamIntroduction) { addTeamPerfectionFifteen(); - } else{ + } else { cancelTeamPerfectionFifteen(); } } @@ -244,30 +255,46 @@ public void updateIsTeamAttachFile(final boolean isTeamAttachFile) { public boolean getIsTeamProfileTeamBuildingField() { return isTeamProfileTeamBuildingField; } + public boolean getIsTeamMemberAnnouncement() { return isTeamMemberAnnouncement; } + public boolean getIsActivity() { return isActivity; } + public boolean getIsActivityMethod() { return isActivityMethod; } + public boolean getIsActivityRegion() { return isActivityRegion; } + public boolean getIsTeamIntroduction() { return isTeamIntroduction; } + public boolean getIsTeamMemberIntroduction() { return isTeamMemberIntroduction; } + public boolean getIsHistory() { return isHistory; } - public boolean getIsTeamAttach() {return isTeamAttach;} - public boolean getIsTeamAttachUrl() { return isTeamAttachUrl; } - public boolean getIsTeamMiniProfile() {return isTeamMiniProfile;} + + public boolean getIsTeamAttach() { + return isTeamAttach; + } + + public boolean getIsTeamAttachUrl() { + return isTeamAttachUrl; + } + + public boolean getIsTeamMiniProfile() { + return isTeamMiniProfile; + } // 4.7. 팀 소개 텍스트 내용 업데이트 @@ -279,7 +306,6 @@ public void updateTeamIntroduction(final String teamIntroduction) { log.info("기존에 팀 소개가 저장되어 있지 않았습니다."); this.teamIntroduction = teamIntroduction; updateIsTeamIntroduction(true); - updateMemberTeamProfileTypeByCompletion(); } else { // 기존에 저장되었던 경우 (수정으로 간주) log.info("기존에 팀 소개가 저장되어 있었습니다."); @@ -292,33 +318,6 @@ public void updateTeamIntroduction(final String teamIntroduction) { // 기존에 저장되어 있었던 경우 this.teamIntroduction = null; updateIsTeamIntroduction(false); - updateMemberTeamProfileTypeByCompletion(); - } - } - } - - // 프로필 권한 관리 메서드 - public void updateMemberTeamProfileTypeByCompletion() { - final double presentTeamProfileCompletion = this.getTeamProfileCompletion(); - final TeamProfileType teamProfileType = this.getMember().getTeamProfileType(); - - if (presentTeamProfileCompletion >= 0 && presentTeamProfileCompletion < 50) { - if (TeamProfileType.NO_PERMISSION.equals(teamProfileType)) { - return; - } else { - this.getMember().setTeamProfileType(TeamProfileType.NO_PERMISSION); - } - } else if (presentTeamProfileCompletion >= 50 && presentTeamProfileCompletion < 80) { - if (TeamProfileType.ALLOW_BROWSE.equals(teamProfileType)) { - return; - } else { - this.getMember().setTeamProfileType(TeamProfileType.ALLOW_BROWSE); - } - } else { - if (ALLOW_MATCHING.equals(teamProfileType)) { - return; - } else { - this.getMember().setTeamProfileType(ALLOW_MATCHING); } } } @@ -327,6 +326,8 @@ public void updateMemberTeamProfileTypeByCompletion() { public boolean getExistDefaultTeamProfile() { if (this.isTeamProfileTeamBuildingField && this.isActivity && this.isTeamMiniProfile) { return true; - } else return false; + } else { + return false; + } } } diff --git a/src/main/java/liaison/linkit/team/domain/attach/TeamAttachFile.java b/src/main/java/liaison/linkit/team/domain/attach/TeamAttachFile.java deleted file mode 100644 index 0facfb3b..00000000 --- a/src/main/java/liaison/linkit/team/domain/attach/TeamAttachFile.java +++ /dev/null @@ -1,47 +0,0 @@ -//package liaison.linkit.team.domain.attach; -// -//import jakarta.persistence.*; -//import liaison.linkit.team.domain.TeamProfile; -//import lombok.AccessLevel; -//import lombok.AllArgsConstructor; -//import lombok.Getter; -//import lombok.NoArgsConstructor; -// -//import static jakarta.persistence.CascadeType.ALL; -//import static jakarta.persistence.FetchType.LAZY; -//import static jakarta.persistence.GenerationType.IDENTITY; -// -//@Entity -//@Getter -//@AllArgsConstructor -//@NoArgsConstructor(access = AccessLevel.PROTECTED) -//@Table(name = "team_attach_file") -//public class TeamAttachFile { -// @Id -// @GeneratedValue(strategy = IDENTITY) -// @Column(name = "team_attach_file_id") -// private Long id; -// -// @ManyToOne(fetch = LAZY, cascade = ALL) -// @JoinColumn(name = "team_profile_id") -// private TeamProfile teamProfile; -// -// @Column(nullable = false) -// private String teamAttachFileName; -// -// @Column(nullable = false) -// private String teamAttachFilePath; -// -// public static TeamAttachFile of( -// final TeamProfile teamProfile, -// final String teamAttachFileName, -// final String teamAttachFilePath -// ) { -// return new TeamAttachFile( -// null, -// teamProfile, -// teamAttachFileName, -// teamAttachFilePath -// ); -// } -//} diff --git a/src/main/java/liaison/linkit/team/domain/attach/TeamAttachUrl.java b/src/main/java/liaison/linkit/team/domain/attach/TeamAttachUrl.java deleted file mode 100644 index 41725c57..00000000 --- a/src/main/java/liaison/linkit/team/domain/attach/TeamAttachUrl.java +++ /dev/null @@ -1,49 +0,0 @@ -package liaison.linkit.team.domain.attach; - -import jakarta.persistence.*; -import liaison.linkit.team.domain.TeamProfile; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import static jakarta.persistence.FetchType.LAZY; -import static jakarta.persistence.GenerationType.IDENTITY; - -@Entity -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "team_attach_url") -public class TeamAttachUrl { - - @Id - @GeneratedValue(strategy = IDENTITY) - @Column(name = "team_attach_url_id") - private Long id; - - @ManyToOne(fetch = LAZY) - @JoinColumn(name = "team_profile_id") - private TeamProfile teamProfile; - - @Column(nullable = false) - private String teamAttachUrlName; - - @Column(nullable = false) - private String teamAttachUrlPath; - - public static TeamAttachUrl of( - final TeamProfile teamProfile, - final String teamAttachUrlName, - final String teamAttachUrlPath - ) { - return new TeamAttachUrl( - null, - teamProfile, - teamAttachUrlName, - teamAttachUrlPath - ); - } - - -} diff --git a/src/main/java/liaison/linkit/team/domain/repository/attach/TeamAttachFileRepository.java b/src/main/java/liaison/linkit/team/domain/repository/attach/TeamAttachFileRepository.java deleted file mode 100644 index 6799f193..00000000 --- a/src/main/java/liaison/linkit/team/domain/repository/attach/TeamAttachFileRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -//package liaison.linkit.team.domain.repository.attach; -// -//import liaison.linkit.team.domain.attach.TeamAttachFile; -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.data.jpa.repository.Query; -//import org.springframework.data.repository.query.Param; -// -//import java.util.List; -// -//public interface TeamAttachFileRepository extends JpaRepository { -// boolean existsByTeamProfileId(final Long teamProfileId); -// -// @Query("SELECT teamAttachFile FROM TeamAttachFile teamAttachFile WHERE teamAttachFile.teamProfile.id = :teamProfileId") -// List findAllByTeamProfileId(@Param("teamProfileId") final Long teamProfileId); -// -//} diff --git a/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepository.java b/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepository.java deleted file mode 100644 index 78c8c4cd..00000000 --- a/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package liaison.linkit.team.domain.repository.attach.teamAttachUrl; - -import liaison.linkit.team.domain.attach.TeamAttachUrl; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TeamAttachUrlRepository extends JpaRepository, TeamAttachUrlRepositoryCustom { - -} diff --git a/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepositoryCustom.java b/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepositoryCustom.java deleted file mode 100644 index 7678fb49..00000000 --- a/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepositoryCustom.java +++ /dev/null @@ -1,11 +0,0 @@ -package liaison.linkit.team.domain.repository.attach.teamAttachUrl; - -import liaison.linkit.team.domain.attach.TeamAttachUrl; - -import java.util.List; - -public interface TeamAttachUrlRepositoryCustom { - boolean existsByTeamProfileId(final Long teamProfileId); - void deleteAllByTeamProfileId(final Long teamProfileId); - List findAllByTeamProfileId(final Long teamProfileId); -} diff --git a/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepositoryCustomImpl.java b/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepositoryCustomImpl.java deleted file mode 100644 index 9b8ce79a..00000000 --- a/src/main/java/liaison/linkit/team/domain/repository/attach/teamAttachUrl/TeamAttachUrlRepositoryCustomImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package liaison.linkit.team.domain.repository.attach.teamAttachUrl; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import liaison.linkit.team.domain.attach.QTeamAttachUrl; -import liaison.linkit.team.domain.attach.TeamAttachUrl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@RequiredArgsConstructor -@Slf4j -public class TeamAttachUrlRepositoryCustomImpl implements TeamAttachUrlRepositoryCustom{ - - private final JPAQueryFactory jpaQueryFactory; - - @Override - public boolean existsByTeamProfileId(Long teamProfileId) { - QTeamAttachUrl teamAttachUrl = QTeamAttachUrl.teamAttachUrl; - - Integer count = jpaQueryFactory - .selectOne() - .from(teamAttachUrl) - .where(teamAttachUrl.teamProfile.id.eq(teamProfileId)) - .fetchFirst(); - - return count != null; - } - - @Override - public List findAllByTeamProfileId(Long teamProfileId) { - QTeamAttachUrl teamAttachUrl = QTeamAttachUrl.teamAttachUrl; - - return jpaQueryFactory - .selectFrom(teamAttachUrl) - .where(teamAttachUrl.teamProfile.id.eq(teamProfileId)) - .fetch(); - } - - @Override - @Transactional - public void deleteAllByTeamProfileId(Long teamProfileId) { - QTeamAttachUrl teamAttachUrl = QTeamAttachUrl.teamAttachUrl; - - jpaQueryFactory - .delete(teamAttachUrl) - .where(teamAttachUrl.teamProfile.id.eq(teamProfileId)) - .execute(); - } -} diff --git a/src/main/java/liaison/linkit/team/dto/response/TeamProfileResponse.java b/src/main/java/liaison/linkit/team/dto/response/TeamProfileResponse.java index cd6c3507..c56ee7d1 100644 --- a/src/main/java/liaison/linkit/team/dto/response/TeamProfileResponse.java +++ b/src/main/java/liaison/linkit/team/dto/response/TeamProfileResponse.java @@ -1,16 +1,14 @@ package liaison.linkit.team.dto.response; +import java.util.List; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.List; - @Getter @RequiredArgsConstructor public class TeamProfileResponse { @@ -42,9 +40,6 @@ public class TeamProfileResponse { // 4.9. 연혁 private final List historyResponses; - // 4.10. 첨부 - private final TeamAttachResponse teamAttachResponse; - public TeamProfileResponse() { this.isTeamProfileEssential = false; this.teamMiniProfileResponse = null; @@ -55,15 +50,8 @@ public TeamProfileResponse() { this.teamProfileIntroductionResponse = null; this.teamMemberIntroductionResponses = null; this.historyResponses = null; - this.teamAttachResponse = null; } -// public TeamProfileResponse() { -// this.isTeamProfileEssential = false; -// this.teamMiniProfileResponse = null; -// -// } - public static TeamProfileResponse teamProfileItems( final boolean isTeamProfileEssential, final TeamMiniProfileResponse teamMiniProfileResponse, @@ -73,8 +61,7 @@ public static TeamProfileResponse teamProfileItems( final ActivityResponse activityResponse, final TeamProfileIntroductionResponse teamProfileIntroductionResponse, final List teamMemberIntroductionResponse, - final List historyResponse, - final TeamAttachResponse teamAttachResponse + final List historyResponse ) { return new TeamProfileResponse( isTeamProfileEssential, @@ -85,8 +72,7 @@ public static TeamProfileResponse teamProfileItems( activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponse, - historyResponse, - teamAttachResponse + historyResponse ); } } diff --git a/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachFileResponse.java b/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachFileResponse.java deleted file mode 100644 index 5dbb8b47..00000000 --- a/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachFileResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -//package liaison.linkit.team.dto.response.attach; -// -//import liaison.linkit.team.domain.attach.TeamAttachFile; -//import lombok.AllArgsConstructor; -//import lombok.Getter; -// -//@Getter -//@AllArgsConstructor -//public class TeamAttachFileResponse { -// private Long id; -// private String teamAttachFileName; -// private String teamAttachFilePath; -// -// public static TeamAttachFileResponse getTeamAttachFile( -// final TeamAttachFile teamAttachFile -// ) { -// return new TeamAttachFileResponse( -// teamAttachFile.getId(), -// teamAttachFile.getTeamAttachFileName(), -// teamAttachFile.getTeamAttachFilePath() -// ); -// } -// -//} diff --git a/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachResponse.java b/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachResponse.java deleted file mode 100644 index 40c8cbbf..00000000 --- a/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package liaison.linkit.team.dto.response.attach; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@Getter -@AllArgsConstructor -public class TeamAttachResponse { - private List teamAttachUrlResponseList; -// private List teamAttachFileResponseList; - - public TeamAttachResponse() { - this.teamAttachUrlResponseList = null; -// this.teamAttachFileResponseList = null; - } - - public static TeamAttachResponse getTeamAttachResponse( - final List teamAttachUrlResponses -// final List teamAttachFileResponses - ) { - return new TeamAttachResponse( - teamAttachUrlResponses -// teamAttachFileResponses - ); - } -} diff --git a/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachUrlResponse.java b/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachUrlResponse.java deleted file mode 100644 index d0fdf5be..00000000 --- a/src/main/java/liaison/linkit/team/dto/response/attach/TeamAttachUrlResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package liaison.linkit.team.dto.response.attach; - -import liaison.linkit.team.domain.attach.TeamAttachUrl; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class TeamAttachUrlResponse { - private final Long id; - private final String teamAttachUrlName; - private final String teamAttachUrlPath; - - public static TeamAttachUrlResponse getTeamAttachUrl( - final TeamAttachUrl teamAttachUrl - ) { - return new TeamAttachUrlResponse( - teamAttachUrl.getId(), - teamAttachUrl.getTeamAttachUrlName(), - teamAttachUrl.getTeamAttachUrlPath() - ); - } - -} diff --git a/src/main/java/liaison/linkit/team/dto/response/browse/BrowseTeamProfileResponse.java b/src/main/java/liaison/linkit/team/dto/response/browse/BrowseTeamProfileResponse.java index fe4af00f..9a05446d 100644 --- a/src/main/java/liaison/linkit/team/dto/response/browse/BrowseTeamProfileResponse.java +++ b/src/main/java/liaison/linkit/team/dto/response/browse/BrowseTeamProfileResponse.java @@ -1,19 +1,17 @@ package liaison.linkit.team.dto.response.browse; +import java.util.List; import liaison.linkit.team.dto.response.TeamMemberIntroductionResponse; import liaison.linkit.team.dto.response.TeamProfileIntroductionResponse; import liaison.linkit.team.dto.response.TeamProfileTeamBuildingFieldResponse; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.List; - @Getter @RequiredArgsConstructor public class BrowseTeamProfileResponse { @@ -27,7 +25,6 @@ public class BrowseTeamProfileResponse { private final TeamProfileIntroductionResponse teamProfileIntroductionResponse; private final List teamMemberIntroductionResponses; private final List historyResponses; - private final TeamAttachResponse teamAttachResponse; public static BrowseTeamProfileResponse teamProfile( final Long teamProfileId, @@ -38,8 +35,7 @@ public static BrowseTeamProfileResponse teamProfile( final ActivityResponse activityResponse, final TeamProfileIntroductionResponse teamProfileIntroductionResponse, final List teamMemberIntroductionResponses, - final List historyResponses, - final TeamAttachResponse teamAttachResponse + final List historyResponses ) { return new BrowseTeamProfileResponse( teamProfileId, @@ -50,8 +46,7 @@ public static BrowseTeamProfileResponse teamProfile( activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponses, - historyResponses, - teamAttachResponse + historyResponses ); } } diff --git a/src/main/java/liaison/linkit/team/exception/TeamErrorCode.java b/src/main/java/liaison/linkit/team/exception/TeamErrorCode.java new file mode 100644 index 00000000..097ae212 --- /dev/null +++ b/src/main/java/liaison/linkit/team/exception/TeamErrorCode.java @@ -0,0 +1,34 @@ +package liaison.linkit.team.exception; + +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum TeamErrorCode implements BaseErrorCode { + + TEAM_NOT_FOUND(NOT_FOUND, "TEAM_404_1", "해당하는 팀을 찾을 수 없습니다."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/team/exception/TeamNotFoundException.java b/src/main/java/liaison/linkit/team/exception/TeamNotFoundException.java new file mode 100644 index 00000000..f47efb3b --- /dev/null +++ b/src/main/java/liaison/linkit/team/exception/TeamNotFoundException.java @@ -0,0 +1,11 @@ +package liaison.linkit.team.exception; + +import liaison.linkit.common.exception.BaseCodeException; + +public class TeamNotFoundException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new TeamNotFoundException(); + + private TeamNotFoundException() { + super(TeamErrorCode.TEAM_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/team/implement/TeamQueryAdapter.java b/src/main/java/liaison/linkit/team/implement/TeamQueryAdapter.java new file mode 100644 index 00000000..7e4cd54d --- /dev/null +++ b/src/main/java/liaison/linkit/team/implement/TeamQueryAdapter.java @@ -0,0 +1,18 @@ +package liaison.linkit.team.implement; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.team.domain.Team; +import liaison.linkit.team.domain.repository.team.TeamRepository; +import liaison.linkit.team.exception.TeamNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class TeamQueryAdapter { + + private final TeamRepository teamRepository; + + public Team findById(final Long teamId) { + return teamRepository.findById(teamId).orElseThrow(() -> TeamNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/liaison/linkit/team/presentation/BrowseTeamProfileController.java b/src/main/java/liaison/linkit/team/presentation/BrowseTeamProfileController.java index 895095dd..2ae97f86 100644 --- a/src/main/java/liaison/linkit/team/presentation/BrowseTeamProfileController.java +++ b/src/main/java/liaison/linkit/team/presentation/BrowseTeamProfileController.java @@ -11,7 +11,6 @@ import liaison.linkit.team.dto.response.TeamProfileTeamBuildingFieldResponse; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; import liaison.linkit.team.dto.response.browse.BrowseTeamProfileResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; @@ -52,8 +51,6 @@ public class BrowseTeamProfileController { public final TeamMemberIntroductionService teamMemberIntroductionService; // 4.9. public final HistoryService historyService; - // 4.10. - public final TeamAttachService teamAttachService; @GetMapping("/browse/team/profile/{teamMiniProfileId}") @MemberOnly @@ -71,14 +68,17 @@ public ResponseEntity getBrowseTeamProfile( browseTeamProfileService.validateTeamProfileByTeamMiniProfile(teamMiniProfileId); // 2. 열람하고자 하는 회원의 ID를 가져온다. - final Long browseTargetTeamProfileId = browseTeamProfileService.getTargetTeamProfileByTeamMiniProfileId(teamMiniProfileId); + final Long browseTargetTeamProfileId = browseTeamProfileService.getTargetTeamProfileByTeamMiniProfileId( + teamMiniProfileId); log.info("browseTargetTeamProfileId={}", browseTargetTeamProfileId); // 팀 소개서에 있는 항목들의 존재 여부 파악 - final TeamProfileIsValueResponse teamProfileIsValueResponse = browseTeamProfileService.getTeamProfileIsValue(browseTargetTeamProfileId); + final TeamProfileIsValueResponse teamProfileIsValueResponse = browseTeamProfileService.getTeamProfileIsValue( + browseTargetTeamProfileId); // 4.1. 팀 미니 프로필 - final TeamMiniProfileResponse teamMiniProfileResponse = getTeamMiniProfileResponse(browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamMiniProfile()); + final TeamMiniProfileResponse teamMiniProfileResponse = getTeamMiniProfileResponse( + browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamMiniProfile()); log.info("teamMiniProfileResponse={}", teamMiniProfileResponse); // 4.3. 프로필 완성도 @@ -86,33 +86,35 @@ public ResponseEntity getBrowseTeamProfile( log.info("teamCompletionResponse={}", teamCompletionResponse); // 4.4. 희망 팀빌딩 분야 - final TeamProfileTeamBuildingFieldResponse teamProfileTeamBuildingFieldResponse = getTeamProfileTeamBuildingFieldResponse(browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); + final TeamProfileTeamBuildingFieldResponse teamProfileTeamBuildingFieldResponse = getTeamProfileTeamBuildingFieldResponse( + browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); log.info("teamProfileTeamBuildingFieldResponse={}", teamProfileTeamBuildingFieldResponse); // 4.5. 팀원 공고 - final List teamMemberAnnouncementResponse = getTeamMemberAnnouncement(browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamMemberAnnouncement()); + final List teamMemberAnnouncementResponse = getTeamMemberAnnouncement( + browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamMemberAnnouncement()); log.info("teamMemberAnnouncementResponse={}", teamMemberAnnouncementResponse); // 4.6. 활동 방식 + 활동 지역/위치 - final ActivityResponse activityResponse = getActivityResponse(browseTargetTeamProfileId, teamProfileIsValueResponse.isActivity()); + final ActivityResponse activityResponse = getActivityResponse(browseTargetTeamProfileId, + teamProfileIsValueResponse.isActivity()); log.info("activityResponse={}", activityResponse); // 4.7. 팀 소개 - final TeamProfileIntroductionResponse teamProfileIntroductionResponse = getTeamProfileIntroduction(browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamIntroduction()); + final TeamProfileIntroductionResponse teamProfileIntroductionResponse = getTeamProfileIntroduction( + browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamIntroduction()); log.info("teamProfileIntroductionResponse={}", teamProfileIntroductionResponse); // 4.8. 팀원 소개 - final List teamMemberIntroductionResponse = getTeamMemberIntroduction(browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamMemberIntroduction()); + final List teamMemberIntroductionResponse = getTeamMemberIntroduction( + browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamMemberIntroduction()); log.info("teamMemberIntroductionResponse={}", teamMemberIntroductionResponse); // 4.9. 연혁 - final List historyResponse = getHistory(browseTargetTeamProfileId, teamProfileIsValueResponse.isHistory()); + final List historyResponse = getHistory(browseTargetTeamProfileId, + teamProfileIsValueResponse.isHistory()); log.info("historyResponse={}", historyResponse); - // 4.10. 첨부 - final TeamAttachResponse teamAttachResponse = getTeamAttach(browseTargetTeamProfileId, teamProfileIsValueResponse.isTeamAttachUrl()); - log.info("teamAttachResponse={}", teamAttachResponse); - final BrowseTeamProfileResponse browseTeamProfileResponse = browseTeamProfileService.getBrowseTeamProfileResponse( browseTargetTeamProfileId, teamMiniProfileResponse, @@ -122,8 +124,7 @@ public ResponseEntity getBrowseTeamProfile( activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponse, - historyResponse, - teamAttachResponse + historyResponse ); return ResponseEntity.ok().body(browseTeamProfileResponse); @@ -165,6 +166,7 @@ private List getTeamMemberAnnouncement( return null; } } + // 4.6. 활동 방식 + 활동 지역 및 위치 private ActivityResponse getActivityResponse( final Long memberId, @@ -214,18 +216,6 @@ private List getHistory( } } - // 4.10 첨부 - private TeamAttachResponse getTeamAttach( - final Long memberId, - final boolean isTeamAttach - ) { - if (isTeamAttach) { - return teamAttachService.getTeamAttachList(memberId); - } else { - return new TeamAttachResponse(); - } - } - private TeamMiniProfileResponse getTeamMiniProfileResponse( final Long memberId, final boolean isTeamMiniProfile diff --git a/src/main/java/liaison/linkit/team/presentation/TeamAttachController.java b/src/main/java/liaison/linkit/team/presentation/TeamAttachController.java deleted file mode 100644 index 09e60f5f..00000000 --- a/src/main/java/liaison/linkit/team/presentation/TeamAttachController.java +++ /dev/null @@ -1,62 +0,0 @@ -package liaison.linkit.team.presentation; - -import jakarta.validation.Valid; -import liaison.linkit.auth.Auth; -import liaison.linkit.auth.MemberOnly; -import liaison.linkit.auth.domain.Accessor; -import liaison.linkit.team.dto.request.attach.TeamAttachUrlCreateRequest; -import liaison.linkit.team.service.TeamAttachService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequiredArgsConstructor -@RequestMapping -@Slf4j -public class TeamAttachController { - - private final TeamAttachService teamAttachService; - - // 외부 링크 리스트 생성 요청 - @PostMapping("/team/attach/url") - @MemberOnly - public ResponseEntity createTeamAttachUrl( - @Auth final Accessor accessor, - @RequestBody @Valid List teamAttachUrlCreateRequests - ) { - if (teamAttachUrlCreateRequests.isEmpty()) { - log.info("teamAttachUrlCreateRequest가 비어있습니다."); - teamAttachService.deleteAllTeamAttachUrl(accessor.getMemberId()); - } else{ - teamAttachService.saveUrl(accessor.getMemberId(), teamAttachUrlCreateRequests); - } - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - - @DeleteMapping("/team/attach/url/{teamAttachUrlId}") - @MemberOnly - public ResponseEntity deleteTeamAttachUrl( - @Auth final Accessor accessor, - @PathVariable final Long teamAttachUrlId - ) { - teamAttachService.validateTeamAttachUrlByMember(accessor.getMemberId()); - teamAttachService.deleteTeamAttachUrl(accessor.getMemberId(), teamAttachUrlId); - return ResponseEntity.noContent().build(); - } - - // 외부 링크 파일 1개(단일) 생성 요청 -// @PostMapping("/file") -// @MemberOnly -// public ResponseEntity createTeamAttachFile( -// @Auth final Accessor accessor, -// @RequestPart MultipartFile teamAttachFile -// ) { -// teamAttachService.saveFile(accessor.getMemberId(), teamAttachFile); -// return ResponseEntity.status(HttpStatus.CREATED).build(); -// } -} diff --git a/src/main/java/liaison/linkit/team/presentation/TeamController.java b/src/main/java/liaison/linkit/team/presentation/TeamController.java new file mode 100644 index 00000000..d935333c --- /dev/null +++ b/src/main/java/liaison/linkit/team/presentation/TeamController.java @@ -0,0 +1,26 @@ +package liaison.linkit.team.presentation; + +import liaison.linkit.team.service.TeamService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping +@Slf4j +public class TeamController { + + private final TeamService teamService; + + // [3.0.0] 회원이 팀을 생성한다. + // @PostMapping("/team") + // @MemberOnly + // public ResponseEntity createNewTeam( + // @Auth final Accessor accessor + // ) { + // teamService.createNewTeam(accessor); + // return ResponseEntity.status(CREATED).build(); + // } +} diff --git a/src/main/java/liaison/linkit/team/presentation/TeamProfileController.java b/src/main/java/liaison/linkit/team/presentation/TeamProfileController.java index a20eaafc..c9d11683 100644 --- a/src/main/java/liaison/linkit/team/presentation/TeamProfileController.java +++ b/src/main/java/liaison/linkit/team/presentation/TeamProfileController.java @@ -8,7 +8,6 @@ import liaison.linkit.team.dto.response.*; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; @@ -43,8 +42,6 @@ public class TeamProfileController { final TeamMemberIntroductionService teamMemberIntroductionService; // 4.9. final HistoryService historyService; - // 4.10. - final TeamAttachService teamAttachService; // 팀 소개서 전체 조회 @GetMapping("/team/profile") @@ -56,10 +53,13 @@ public ResponseEntity getTeamProfile(@Auth final Accessor accessor) { log.info("--- 팀 이력서가 유효합니다. ---"); // 팀 소개서에 있는 항목들의 존재 여부 파악 - final TeamProfileIsValueResponse teamProfileIsValueResponse = teamProfileService.getTeamProfileIsValue(accessor.getMemberId()); + final TeamProfileIsValueResponse teamProfileIsValueResponse = teamProfileService.getTeamProfileIsValue( + accessor.getMemberId()); log.info("teamProfileIsValueResponse={}", teamProfileIsValueResponse); - final boolean isTeamProfileEssential = (teamProfileIsValueResponse.isTeamMiniProfile() && teamProfileIsValueResponse.isActivity() && teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); + final boolean isTeamProfileEssential = (teamProfileIsValueResponse.isTeamMiniProfile() + && teamProfileIsValueResponse.isActivity() + && teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); log.info("isTeamProfileEssential={}", isTeamProfileEssential); @@ -70,7 +70,8 @@ public ResponseEntity getTeamProfile(@Auth final Accessor accessor) { } // 4.1. 팀 미니 프로필 - final TeamMiniProfileResponse teamMiniProfileResponse = getTeamMiniProfileResponse(accessor.getMemberId(), teamProfileIsValueResponse.isTeamMiniProfile()); + final TeamMiniProfileResponse teamMiniProfileResponse = getTeamMiniProfileResponse(accessor.getMemberId(), + teamProfileIsValueResponse.isTeamMiniProfile()); log.info("teamMiniProfileResponse={}", teamMiniProfileResponse); // 4.3. 프로필 완성도 @@ -78,33 +79,35 @@ public ResponseEntity getTeamProfile(@Auth final Accessor accessor) { log.info("teamCompletionResponse={}", teamCompletionResponse); // 4.4. 희망 팀빌딩 분야 - final TeamProfileTeamBuildingFieldResponse teamProfileTeamBuildingFieldResponse = getTeamProfileTeamBuildingFieldResponse(accessor.getMemberId(), teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); + final TeamProfileTeamBuildingFieldResponse teamProfileTeamBuildingFieldResponse = getTeamProfileTeamBuildingFieldResponse( + accessor.getMemberId(), teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); log.info("teamProfileTeamBuildingFieldResponse={}", teamProfileTeamBuildingFieldResponse); // 4.5. 팀원 공고 - final List teamMemberAnnouncementResponse = getTeamMemberAnnouncement(accessor.getMemberId(), teamProfileIsValueResponse.isTeamMemberAnnouncement()); + final List teamMemberAnnouncementResponse = getTeamMemberAnnouncement( + accessor.getMemberId(), teamProfileIsValueResponse.isTeamMemberAnnouncement()); log.info("teamMemberAnnouncementResponse={}", teamMemberAnnouncementResponse); // 4.6. 활동 방식 + 활동 지역/위치 - final ActivityResponse activityResponse = getActivityResponse(accessor.getMemberId(), teamProfileIsValueResponse.isActivity()); + final ActivityResponse activityResponse = getActivityResponse(accessor.getMemberId(), + teamProfileIsValueResponse.isActivity()); log.info("activityResponse={}", activityResponse); // 4.7. 팀 소개 - final TeamProfileIntroductionResponse teamProfileIntroductionResponse = getTeamProfileIntroduction(accessor.getMemberId(), teamProfileIsValueResponse.isTeamIntroduction()); + final TeamProfileIntroductionResponse teamProfileIntroductionResponse = getTeamProfileIntroduction( + accessor.getMemberId(), teamProfileIsValueResponse.isTeamIntroduction()); log.info("teamProfileIntroductionResponse={}", teamProfileIntroductionResponse); // 4.8. 팀원 소개 - final List teamMemberIntroductionResponse = getTeamMemberIntroduction(accessor.getMemberId(), teamProfileIsValueResponse.isTeamMemberIntroduction()); + final List teamMemberIntroductionResponse = getTeamMemberIntroduction( + accessor.getMemberId(), teamProfileIsValueResponse.isTeamMemberIntroduction()); log.info("teamMemberIntroductionResponse={}", teamMemberIntroductionResponse); // 4.9. 연혁 - final List historyResponse = getHistory(accessor.getMemberId(), teamProfileIsValueResponse.isHistory()); + final List historyResponse = getHistory(accessor.getMemberId(), + teamProfileIsValueResponse.isHistory()); log.info("historyResponse={}", historyResponse); - // 4.10. 첨부 - final TeamAttachResponse teamAttachResponse = getTeamAttach(accessor.getMemberId(), teamProfileIsValueResponse.isTeamAttachUrl()); - log.info("teamAttachResponse={}", teamAttachResponse); - final TeamProfileResponse teamProfileResponse = teamProfileService.getTeamProfileResponse( isTeamProfileEssential, teamMiniProfileResponse, @@ -114,8 +117,7 @@ public ResponseEntity getTeamProfile(@Auth final Accessor accessor) { activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponse, - historyResponse, - teamAttachResponse + historyResponse ); return ResponseEntity.ok().body(teamProfileResponse); @@ -168,6 +170,7 @@ private List getTeamMemberAnnouncement( return null; } } + // 4.6. 활동 방식 + 활동 지역 및 위치 private ActivityResponse getActivityResponse( final Long memberId, @@ -219,18 +222,6 @@ private List getHistory( } } - // 4.10 첨부 - private TeamAttachResponse getTeamAttach( - final Long memberId, - final boolean isTeamAttach - ) { - if (isTeamAttach) { - return teamAttachService.getTeamAttachList(memberId); - } else { - return new TeamAttachResponse(); - } - } - private TeamMiniProfileResponse getTeamMiniProfileResponse( final Long memberId, final boolean isTeamMiniProfile diff --git a/src/main/java/liaison/linkit/team/service/ActivityService.java b/src/main/java/liaison/linkit/team/service/ActivityService.java index a7d63431..ac788c2a 100644 --- a/src/main/java/liaison/linkit/team/service/ActivityService.java +++ b/src/main/java/liaison/linkit/team/service/ActivityService.java @@ -1,17 +1,23 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_ACTIVITY_METHOD_BY_TEAM_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_ACTIVITY_REGION_BY_TEAM_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + +import java.util.List; +import java.util.Optional; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.team.domain.activity.ActivityRegion; import liaison.linkit.profile.domain.region.Region; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.activity.ActivityMethod; import liaison.linkit.team.domain.activity.ActivityMethodTag; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; +import liaison.linkit.team.domain.activity.ActivityRegion; import liaison.linkit.team.domain.repository.activity.method.ActivityMethodRepository; import liaison.linkit.team.domain.repository.activity.method.ActivityMethodTagRepository; import liaison.linkit.team.domain.repository.activity.region.ActivityRegionRepository; import liaison.linkit.team.domain.repository.activity.region.RegionRepository; +import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.dto.request.activity.ActivityCreateRequest; import liaison.linkit.team.dto.response.activity.ActivityMethodResponse; import liaison.linkit.team.dto.response.activity.ActivityRegionResponse; @@ -21,11 +27,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Optional; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -104,7 +105,8 @@ public void saveActivityRegion( } // 지역 정보 구현 로직 - final Region region = regionRepository.findRegionByCityNameAndDivisionName(activityCreateRequest.getCityName(), activityCreateRequest.getDivisionName()); + final Region region = regionRepository.findRegionByCityNameAndDivisionName(activityCreateRequest.getCityName(), + activityCreateRequest.getDivisionName()); ActivityRegion activityRegion = new ActivityRegion(null, teamProfile, region); @@ -113,7 +115,6 @@ public void saveActivityRegion( teamProfile.updateIsActivityRegion(true); // isActivity -> true였다면 그대로 / false였다면 더하기 teamProfile.updateIsActivity(); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } // 활동 방식 전체 조회 @@ -130,7 +131,8 @@ public ActivityMethodResponse getAllActivityMethods( log.info("오류 찾기 part 1"); List activityTagNames = activityMethods.stream() - .map(activityMethod -> activityMethodTagRepository.findById(activityMethod.getActivityMethodTag().getId())) + .map(activityMethod -> activityMethodTagRepository.findById( + activityMethod.getActivityMethodTag().getId())) .filter(Optional::isPresent) .map(Optional::get) .map(ActivityMethodTag::getActivityTagName) @@ -146,9 +148,10 @@ public ActivityRegionResponse getActivityRegion(final Long memberId) { final TeamProfile teamProfile = getTeamProfile(memberId); ActivityRegion activityRegion = activityRegionRepository.findByTeamProfileId(teamProfile.getId()) - .orElseThrow(()-> new BadRequestException(NOT_FOUND_ACTIVITY_REGION_BY_TEAM_PROFILE_ID)); + .orElseThrow(() -> new BadRequestException(NOT_FOUND_ACTIVITY_REGION_BY_TEAM_PROFILE_ID)); - return new ActivityRegionResponse(activityRegion.getRegion().getCityName(), activityRegion.getRegion().getDivisionName()); + return new ActivityRegionResponse(activityRegion.getRegion().getCityName(), + activityRegion.getRegion().getDivisionName()); } public ActivityResponse getActivity(final Long memberId) { diff --git a/src/main/java/liaison/linkit/team/service/BrowseTeamProfileService.java b/src/main/java/liaison/linkit/team/service/BrowseTeamProfileService.java index 6676670d..a0aa4f0a 100644 --- a/src/main/java/liaison/linkit/team/service/BrowseTeamProfileService.java +++ b/src/main/java/liaison/linkit/team/service/BrowseTeamProfileService.java @@ -1,17 +1,25 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_TEAM_MINI_PROFILE; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MINI_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.miniprofile.TeamMiniProfile; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.domain.repository.miniprofile.TeamMiniProfileRepository; -import liaison.linkit.team.dto.response.*; +import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; +import liaison.linkit.team.dto.response.TeamMemberIntroductionResponse; +import liaison.linkit.team.dto.response.TeamProfileIntroductionResponse; +import liaison.linkit.team.dto.response.TeamProfileIsValueResponse; +import liaison.linkit.team.dto.response.TeamProfileTeamBuildingFieldResponse; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; import liaison.linkit.team.dto.response.browse.BrowseTeamProfileResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; @@ -20,10 +28,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -71,8 +75,7 @@ public BrowseTeamProfileResponse getBrowseTeamProfileResponse( final ActivityResponse activityResponse, final TeamProfileIntroductionResponse teamProfileIntroductionResponse, final List teamMemberIntroductionResponse, - final List historyResponse, - final TeamAttachResponse teamAttachResponse + final List historyResponse ) { return BrowseTeamProfileResponse.teamProfile( profileId, @@ -83,13 +86,13 @@ public BrowseTeamProfileResponse getBrowseTeamProfileResponse( activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponse, - historyResponse, - teamAttachResponse + historyResponse ); } public boolean checkBrowseAuthority(final Long memberId) { - final Profile profile = profileRepository.findByMemberId(memberId).orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); + final Profile profile = profileRepository.findByMemberId(memberId) + .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); final TeamProfile teamProfile = teamProfileRepository.findByMemberId(memberId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_PROFILE_BY_ID)); diff --git a/src/main/java/liaison/linkit/team/service/HistoryService.java b/src/main/java/liaison/linkit/team/service/HistoryService.java index 5b4ecf7b..387b6b62 100644 --- a/src/main/java/liaison/linkit/team/service/HistoryService.java +++ b/src/main/java/liaison/linkit/team/service/HistoryService.java @@ -1,5 +1,11 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.HAVE_TO_INPUT_HISTORY; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_HISTORY_WITH_TEAM_PROFILE; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_HISTORY_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.team.domain.TeamProfile; @@ -13,10 +19,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -72,7 +74,6 @@ public Long saveHistory( return saveHistoryMethod(teamProfile, historyCreateRequest); } else { teamProfile.updateIsHistory(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); return saveHistoryMethod(teamProfile, historyCreateRequest); } } @@ -86,7 +87,6 @@ public void saveHistories( if (historyRepository.existsByTeamProfileId(teamProfile.getId())) { historyRepository.deleteAllByTeamProfileId(teamProfile.getId()); teamProfile.updateIsHistory(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } historyCreateRequests.forEach(request -> { @@ -94,7 +94,6 @@ public void saveHistories( }); teamProfile.updateIsHistory(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } private Long saveHistoryMethod( @@ -123,7 +122,6 @@ public void deleteHistory(final Long memberId, final Long historyId) { log.info("History 삭제 완료"); if (!historyRepository.existsByTeamProfileId(teamProfile.getId())) { teamProfile.cancelTeamPerfectionTwoPointFive(); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } } @@ -132,19 +130,6 @@ public Long updateHistory(Long historyId, HistoryCreateRequest historyCreateRequ history.update(historyCreateRequest); return history.getId(); } - - -// public void update(final Long memberId, final HistoryUpdateRequest historyUpdateRequest) { -// final TeamProfile teamProfile = teamProfileRepository.findByMemberId(memberId); -// final Long historyId = validateHistoryByMember(memberId); -// -// final History history = historyRepository.findById(historyId) -// .orElseThrow(() -> new BadRequestException(NOT_FOUND_HISTORY_ID)); -// -// history.update(historyUpdateRequest); -// historyRepository.save(history); -// } - } diff --git a/src/main/java/liaison/linkit/team/service/TeamAttachService.java b/src/main/java/liaison/linkit/team/service/TeamAttachService.java deleted file mode 100644 index 2d276c4f..00000000 --- a/src/main/java/liaison/linkit/team/service/TeamAttachService.java +++ /dev/null @@ -1,189 +0,0 @@ -package liaison.linkit.team.service; - -import liaison.linkit.global.exception.AuthException; -import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.global.exception.FileException; -import liaison.linkit.image.infrastructure.S3Uploader; -import liaison.linkit.team.domain.TeamProfile; -import liaison.linkit.team.domain.attach.TeamAttachUrl; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; -import liaison.linkit.team.domain.repository.attach.teamAttachUrl.TeamAttachUrlRepository; -import liaison.linkit.team.dto.request.attach.TeamAttachUrlCreateRequest; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachUrlResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - -@Service -@RequiredArgsConstructor -@Transactional -@Slf4j -public class TeamAttachService { - private final TeamProfileRepository teamProfileRepository; - private final TeamAttachUrlRepository teamAttachUrlRepository; -// private final TeamAttachFileRepository teamAttachFileRepository; - private final S3Uploader s3Uploader; - private final ApplicationEventPublisher publisher; - - // 모든 "팀 소개서" 서비스 계층에 필요한 TeamProfile 조회 메서드 - private TeamProfile getTeamProfile(final Long memberId) { - return teamProfileRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID)); - } - -// public void validateTeamAttachFileByMember(final Long memberId) { -// if (!teamAttachFileRepository.existsByTeamProfileId(getTeamProfile(memberId).getId())) { -// throw new AuthException(INVALID_TEAM_ATTACH_URL_WITH_PROFILE); -// } -// } - - public void validateTeamAttachUrlByMember(final Long memberId) { - if (!teamAttachUrlRepository.existsByTeamProfileId(getTeamProfile(memberId).getId())) { - throw new AuthException(INVALID_TEAM_ATTACH_URL_WITH_PROFILE); - } - } - - private TeamAttachUrl getTeamAttachUrl(final Long teamAttachUrlId) { - return teamAttachUrlRepository.findById(teamAttachUrlId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_ATTACH_URL_ID)); - } - - // 팀 첨부 URL 저장 - public void saveUrl( - final Long memberId, - final List teamAttachUrlCreateRequests - ) { - final TeamProfile teamProfile = getTeamProfile(memberId); - // 존재 이력이 있으면 전체 삭제 먼저 - if (teamAttachUrlRepository.existsByTeamProfileId(teamProfile.getId())) { - teamAttachUrlRepository.deleteAllByTeamProfileId(teamProfile.getId()); - teamProfile.updateIsTeamAttachUrl(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); - } - - teamAttachUrlCreateRequests.forEach(request ->{ - saveTeamAttachUrl(teamProfile, request); - }); - - teamProfile.updateIsTeamAttachUrl(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); - } - - private void saveTeamAttachUrl(final TeamProfile teamProfile, final TeamAttachUrlCreateRequest teamAttachUrlCreateRequest) { - final TeamAttachUrl newTeamAttachUrl = TeamAttachUrl.of( - teamProfile, - teamAttachUrlCreateRequest.getTeamAttachUrlName(), - teamAttachUrlCreateRequest.getTeamAttachUrlPath() - ); - teamAttachUrlRepository.save(newTeamAttachUrl); - } - - // 파일 저장 메서드 실행부 -// public void saveFile( -// final Long memberId, -// final MultipartFile teamAttachFile -// ) { -// final TeamProfile teamProfile = getTeamProfile(memberId); -// final String teamAttachFileUrl = saveFileS3(teamAttachFile); -// -// final TeamAttachFile newAttachFile = TeamAttachFile.of( -// teamProfile, -// teamAttachFile.getOriginalFilename(), -// teamAttachFileUrl -// ); -// -// teamAttachFileRepository.save(newAttachFile); -// teamProfile.updateIsTeamAttachFile(true); -// teamProfile.updateMemberTeamProfileTypeByCompletion(); -// } - - // S3에 파일 저장 -// private String saveFileS3(final MultipartFile teamAttachFile) { -// validateSizeofFile(teamAttachFile); -// final PortfolioFile portfolioFile = new PortfolioFile(teamAttachFile); -// return uploadPortfolioFile(portfolioFile); -// } - - // 포트폴리오 파일 업로드 -// private String uploadPortfolioFile(final PortfolioFile portfolioFile) { -// try { -// return s3Uploader.uploadPortfolioFile(portfolioFile); -// } catch (final Exception e) { -// publisher.publishEvent(new S3PortfolioEvent(portfolioFile.getHashedName())); -// throw e; -// } -// } - - // 파일 유효성 판단 - private void validateSizeofFile(final MultipartFile teamAttachFile) { - if (teamAttachFile == null || teamAttachFile.isEmpty()) { - throw new FileException(EMPTY_TEAM_ATTACH_FILE); - } - } - - public TeamAttachResponse getTeamAttachList(final Long memberId) { - final TeamProfile teamProfile = getTeamProfile(memberId); - - final List teamAttachUrls = teamAttachUrlRepository.findAllByTeamProfileId(teamProfile.getId()); - log.info("teamAttachUrls={}", teamAttachUrls); - -// final List teamAttachFiles = teamAttachFileRepository.findAllByTeamProfileId(teamProfile.getId()); -// log.info("teamAttachFiles={}", teamAttachFiles); - - final List teamAttachUrlResponses = teamAttachUrls.stream().map(this::getTeamAttachUrlResponse).toList(); -// final List teamAttachFileResponses = teamAttachFiles.stream().map(this::getTeamAttachFileResponse).toList(); - - return TeamAttachResponse.getTeamAttachResponse(teamAttachUrlResponses); - } - -// private TeamAttachFileResponse getTeamAttachFileResponse( -// final TeamAttachFile teamAttachFile -// ) { -// return TeamAttachFileResponse.getTeamAttachFile(teamAttachFile); -// } - - private TeamAttachUrlResponse getTeamAttachUrlResponse( - final TeamAttachUrl teamAttachUrl - ) { - return TeamAttachUrlResponse.getTeamAttachUrl(teamAttachUrl); - } - - // 특정 팀 첨부 URL 삭제 By teamAttachUrlId - public void deleteTeamAttachUrl(Long memberId, Long teamAttachUrlId) { - final TeamProfile teamProfile = getTeamProfile(memberId); - final TeamAttachUrl teamAttachUrl = getTeamAttachUrl(teamAttachUrlId); - - // 해당 팀 첨부 URL 단일 삭제 - teamAttachUrlRepository.deleteById(teamAttachUrl.getId()); - - // 해당 팀 첨부가 존재하지 않는다면 - if (!teamAttachUrlRepository.existsByTeamProfileId(teamProfile.getId())) { - teamProfile.updateIsTeamAttachUrl(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); - } - } - - public void deleteAllTeamAttachUrl(final Long memberId) { - final TeamProfile teamProfile = getTeamProfile(memberId); - - // 빈 값 들어왔다고 무조건 제외하면 안되고, 상황 판단 이후에 제거해야 한다. - // 기존에 존재했던 이력이 있으먄 - if (teamAttachUrlRepository.existsByTeamProfileId(teamProfile.getId())) { - // 모든 팀 첨부 항목 삭제 - teamAttachUrlRepository.deleteAllByTeamProfileId(teamProfile.getId()); - teamProfile.updateIsTeamAttachUrl(false); - log.info("teamProfile -> false로 변경"); - teamProfile.updateMemberTeamProfileTypeByCompletion(); - // 삭제한다. - } - - } -} diff --git a/src/main/java/liaison/linkit/team/service/TeamMemberAnnouncementService.java b/src/main/java/liaison/linkit/team/service/TeamMemberAnnouncementService.java index 785a150b..427da173 100644 --- a/src/main/java/liaison/linkit/team/service/TeamMemberAnnouncementService.java +++ b/src/main/java/liaison/linkit/team/service/TeamMemberAnnouncementService.java @@ -1,19 +1,29 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.HAVE_TO_INPUT_APPLICATION_PROCESS; +import static liaison.linkit.global.exception.ExceptionCode.HAVE_TO_INPUT_JOB_ROLE_NAME; +import static liaison.linkit.global.exception.ExceptionCode.HAVE_TO_INPUT_MAIN_BUSINESS; +import static liaison.linkit.global.exception.ExceptionCode.HAVE_TO_INPUT_SKILL_NAMES; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_TEAM_MEMBER_ANNOUNCEMENT_WITH_PROFILE; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_JOB_ROLE; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; -import liaison.linkit.profile.domain.repository.skill.SkillRepository; import liaison.linkit.profile.domain.repository.jobRole.JobRoleRepository; +import liaison.linkit.profile.domain.repository.skill.SkillRepository; import liaison.linkit.profile.domain.role.JobRole; import liaison.linkit.profile.domain.skill.Skill; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncement; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncementJobRole; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncementSkill; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementJobRoleRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementSkillRepository; +import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.dto.request.announcement.TeamMemberAnnouncementRequest; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; @@ -22,10 +32,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -64,7 +70,8 @@ public void validateTeamMemberAnnouncement(final Long memberId) { @Transactional(readOnly = true) public List getTeamMemberAnnouncements(final Long memberId) { final TeamProfile teamProfile = getTeamProfile(memberId); - final List teamMemberAnnouncements = teamMemberAnnouncementRepository.findAllByTeamProfileId(teamProfile.getId()); + final List teamMemberAnnouncements = teamMemberAnnouncementRepository.findAllByTeamProfileId( + teamProfile.getId()); return teamMemberAnnouncements.stream() .map(this::getTeamMemberAnnouncementResponse) @@ -74,8 +81,10 @@ public List getTeamMemberAnnouncements(final Lon private TeamMemberAnnouncementResponse getTeamMemberAnnouncementResponse( final TeamMemberAnnouncement teamMemberAnnouncement ) { - final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole(teamMemberAnnouncement.getId()); - final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills(teamMemberAnnouncement.getId()); + final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole( + teamMemberAnnouncement.getId()); + final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills( + teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); return TeamMemberAnnouncementResponse.of( @@ -92,19 +101,23 @@ public Long saveAnnouncement( final Long memberId, final TeamMemberAnnouncementRequest teamMemberAnnouncementRequest ) { - if (teamMemberAnnouncementRequest.getJobRoleName() == null || teamMemberAnnouncementRequest.getJobRoleName().isEmpty()) { + if (teamMemberAnnouncementRequest.getJobRoleName() == null || teamMemberAnnouncementRequest.getJobRoleName() + .isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_JOB_ROLE_NAME); } - if (teamMemberAnnouncementRequest.getMainBusiness() == null || teamMemberAnnouncementRequest.getMainBusiness().isEmpty()) { + if (teamMemberAnnouncementRequest.getMainBusiness() == null || teamMemberAnnouncementRequest.getMainBusiness() + .isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_MAIN_BUSINESS); } - if (teamMemberAnnouncementRequest.getSkillNames() == null || teamMemberAnnouncementRequest.getSkillNames().isEmpty()) { + if (teamMemberAnnouncementRequest.getSkillNames() == null || teamMemberAnnouncementRequest.getSkillNames() + .isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_SKILL_NAMES); } - if (teamMemberAnnouncementRequest.getApplicationProcess() == null || teamMemberAnnouncementRequest.getApplicationProcess().isEmpty()) { + if (teamMemberAnnouncementRequest.getApplicationProcess() == null + || teamMemberAnnouncementRequest.getApplicationProcess().isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_APPLICATION_PROCESS); } @@ -112,7 +125,8 @@ public Long saveAnnouncement( if (teamProfile.getIsTeamMemberAnnouncement()) { // 메인 객체 우선 저장 - final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, teamMemberAnnouncementRequest); + final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, + teamMemberAnnouncementRequest); // 직무/역할 저장 saveTeamMemberAnnouncementJobRole(savedTeamMemberAnnouncement, teamMemberAnnouncementRequest); // 요구 기술 저장 @@ -120,13 +134,13 @@ public Long saveAnnouncement( return savedTeamMemberAnnouncement.getId(); } else { // 메인 객체 우선 저장 - final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, teamMemberAnnouncementRequest); + final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, + teamMemberAnnouncementRequest); // 직무/역할 저장 saveTeamMemberAnnouncementJobRole(savedTeamMemberAnnouncement, teamMemberAnnouncementRequest); // 요구 기술 저장 saveTeamMemberAnnouncementSkill(savedTeamMemberAnnouncement, teamMemberAnnouncementRequest); teamProfile.updateIsTeamMemberAnnouncement(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); return savedTeamMemberAnnouncement.getId(); } } @@ -148,7 +162,8 @@ public void saveAnnouncements( // 순차적으로 1개씩 저장 teamMemberAnnouncementRequestList.forEach(request -> { - final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, request); + final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, + request); saveTeamMemberAnnouncementJobRole(savedTeamMemberAnnouncement, request); saveTeamMemberAnnouncementSkill(savedTeamMemberAnnouncement, request); }); @@ -157,7 +172,8 @@ public void saveAnnouncements( // 팀원 공고가 존재하지 않는다 -> 새로운 생성 필요 else { teamMemberAnnouncementRequestList.forEach(request -> { - final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, request); + final TeamMemberAnnouncement savedTeamMemberAnnouncement = saveTeamMemberAnnouncement(teamProfile, + request); saveTeamMemberAnnouncementJobRole(savedTeamMemberAnnouncement, request); saveTeamMemberAnnouncementSkill(savedTeamMemberAnnouncement, request); }); @@ -237,7 +253,6 @@ public void deleteTeamMemberAnnouncement( if (!teamMemberAnnouncementRepository.existsByTeamProfileId(teamProfile.getId())) { teamProfile.updateIsTeamMemberAnnouncement(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } } @@ -246,19 +261,23 @@ public Long updateTeamMemberAnnouncement( final Long teamMemberAnnouncementId, final TeamMemberAnnouncementRequest teamMemberAnnouncementRequest ) { - if (teamMemberAnnouncementRequest.getJobRoleName() == null || teamMemberAnnouncementRequest.getJobRoleName().isEmpty()) { + if (teamMemberAnnouncementRequest.getJobRoleName() == null || teamMemberAnnouncementRequest.getJobRoleName() + .isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_JOB_ROLE_NAME); } - if (teamMemberAnnouncementRequest.getMainBusiness() == null || teamMemberAnnouncementRequest.getMainBusiness().isEmpty()) { + if (teamMemberAnnouncementRequest.getMainBusiness() == null || teamMemberAnnouncementRequest.getMainBusiness() + .isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_MAIN_BUSINESS); } - if (teamMemberAnnouncementRequest.getSkillNames() == null || teamMemberAnnouncementRequest.getSkillNames().isEmpty()) { + if (teamMemberAnnouncementRequest.getSkillNames() == null || teamMemberAnnouncementRequest.getSkillNames() + .isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_SKILL_NAMES); } - if (teamMemberAnnouncementRequest.getApplicationProcess() == null || teamMemberAnnouncementRequest.getApplicationProcess().isEmpty()) { + if (teamMemberAnnouncementRequest.getApplicationProcess() == null + || teamMemberAnnouncementRequest.getApplicationProcess().isEmpty()) { throw new BadRequestException(HAVE_TO_INPUT_APPLICATION_PROCESS); } diff --git a/src/main/java/liaison/linkit/team/service/TeamMemberIntroductionService.java b/src/main/java/liaison/linkit/team/service/TeamMemberIntroductionService.java index 63e76f1a..73d0dbab 100644 --- a/src/main/java/liaison/linkit/team/service/TeamMemberIntroductionService.java +++ b/src/main/java/liaison/linkit/team/service/TeamMemberIntroductionService.java @@ -1,11 +1,16 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_TEAM_INTRODUCTION_WITH_TEAM_PROFILE; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_INTRODUCTION_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.memberIntroduction.TeamMemberIntroduction; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.domain.repository.memberIntroduction.TeamMemberIntroductionRepository; +import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.dto.request.memberIntroduction.TeamMemberIntroductionCreateRequest; import liaison.linkit.team.dto.response.TeamMemberIntroductionResponse; import lombok.RequiredArgsConstructor; @@ -13,10 +18,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @@ -54,7 +55,6 @@ public Long saveTeamMemberIntroduction( return saveTeamMemberIntroductionMethod(teamProfile, teamMemberIntroductionCreateRequest); } else { teamProfile.updateIsTeamMemberIntroduction(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); return saveTeamMemberIntroductionMethod(teamProfile, teamMemberIntroductionCreateRequest); } } @@ -69,7 +69,6 @@ public void saveTeamMemberIntroductions( if (teamMemberIntroductionRepository.existsByTeamProfileId(teamProfile.getId())) { teamMemberIntroductionRepository.deleteAllByTeamProfileId(teamProfile.getId()); teamProfile.updateIsTeamMemberIntroduction(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } teamMemberIntroductionCreateRequests.forEach(request -> { @@ -77,7 +76,6 @@ public void saveTeamMemberIntroductions( }); teamProfile.updateIsTeamMemberIntroduction(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } // 팀원 소개 저장 메서드 @@ -101,13 +99,15 @@ public List getAllTeamMemberIntroduction( final Long memberId ) { final TeamProfile teamProfile = getTeamProfile(memberId); - final List teamMemberIntroductions = teamMemberIntroductionRepository.findAllByTeamProfileId(teamProfile.getId()); + final List teamMemberIntroductions = teamMemberIntroductionRepository.findAllByTeamProfileId( + teamProfile.getId()); return teamMemberIntroductions.stream() .map(this::getTeamMemberIntroductionResponse) .toList(); } - private TeamMemberIntroductionResponse getTeamMemberIntroductionResponse(final TeamMemberIntroduction teamMemberIntroduction) { + private TeamMemberIntroductionResponse getTeamMemberIntroductionResponse( + final TeamMemberIntroduction teamMemberIntroduction) { return TeamMemberIntroductionResponse.of(teamMemberIntroduction); } @@ -125,7 +125,6 @@ public void deleteTeamMemberIntroduction( // 존재하지 않는다면 if (!teamMemberIntroductionRepository.existsByTeamProfileId(teamProfile.getId())) { teamProfile.updateIsTeamIntroduction(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } } diff --git a/src/main/java/liaison/linkit/team/service/TeamProfileService.java b/src/main/java/liaison/linkit/team/service/TeamProfileService.java index 4f342f39..77cade8a 100644 --- a/src/main/java/liaison/linkit/team/service/TeamProfileService.java +++ b/src/main/java/liaison/linkit/team/service/TeamProfileService.java @@ -1,14 +1,22 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + +import java.util.List; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.dto.request.TeamIntroductionCreateRequest; -import liaison.linkit.team.dto.response.*; +import liaison.linkit.team.dto.response.OnBoardingTeamProfileResponse; +import liaison.linkit.team.dto.response.TeamMemberIntroductionResponse; +import liaison.linkit.team.dto.response.TeamProfileIntroductionResponse; +import liaison.linkit.team.dto.response.TeamProfileIsValueResponse; +import liaison.linkit.team.dto.response.TeamProfileOnBoardingIsValueResponse; +import liaison.linkit.team.dto.response.TeamProfileResponse; +import liaison.linkit.team.dto.response.TeamProfileTeamBuildingFieldResponse; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; @@ -17,10 +25,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; - @Service @RequiredArgsConstructor @Transactional @@ -89,8 +93,7 @@ public TeamProfileResponse getTeamProfileResponse( final ActivityResponse activityResponse, final TeamProfileIntroductionResponse teamProfileIntroductionResponse, final List teamMemberIntroductionResponse, - final List historyResponse, - final TeamAttachResponse teamAttachResponse + final List historyResponse ) { return TeamProfileResponse.teamProfileItems( isTeamProfileEssential, @@ -101,8 +104,7 @@ public TeamProfileResponse getTeamProfileResponse( activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponse, - historyResponse, - teamAttachResponse + historyResponse ); } } diff --git a/src/main/java/liaison/linkit/team/service/TeamProfileTeamBuildingFieldService.java b/src/main/java/liaison/linkit/team/service/TeamProfileTeamBuildingFieldService.java index e49e00cc..f9a97155 100644 --- a/src/main/java/liaison/linkit/team/service/TeamProfileTeamBuildingFieldService.java +++ b/src/main/java/liaison/linkit/team/service/TeamProfileTeamBuildingFieldService.java @@ -1,5 +1,10 @@ package liaison.linkit.team.service; +import static liaison.linkit.global.exception.ExceptionCode.INVALID_TEAM_PROFILE_TEAM_BUILDING_WITH_MEMBER; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; + +import java.util.List; +import java.util.Optional; import liaison.linkit.global.exception.AuthException; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.profile.domain.repository.teambuilding.TeamBuildingFieldRepository; @@ -14,12 +19,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Optional; - -import static liaison.linkit.global.exception.ExceptionCode.INVALID_TEAM_PROFILE_TEAM_BUILDING_WITH_MEMBER; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_BY_MEMBER_ID; - @Service @RequiredArgsConstructor @Transactional @@ -55,7 +54,6 @@ public void saveTeamBuildingField( teamProfileTeamBuildingFieldRepository.deleteAllByTeamProfileId(teamProfile.getId()); // 완성도 빼기 로직 teamProfile.updateIsTeamProfileTeamBuildingField(false); - teamProfile.updateMemberTeamProfileTypeByCompletion(); } log.info("팀 소개서 희망 팀빌딩 분야 실행 part2 (삭제 완료)"); @@ -72,7 +70,6 @@ public void saveTeamBuildingField( // 프로그레스바 처리 비즈니스 로직 teamProfile.updateIsTeamProfileTeamBuildingField(true); - teamProfile.updateMemberTeamProfileTypeByCompletion(); log.info("팀 소개서 희망 팀빌딩 분야 실행 part3 (저장 완료)"); } @@ -80,10 +77,12 @@ public void saveTeamBuildingField( public TeamProfileTeamBuildingFieldResponse getAllTeamProfileTeamBuildingFields(final Long memberId) { final TeamProfile teamProfile = getTeamProfile(memberId); - final List teamProfileTeamBuildingFields = teamProfileTeamBuildingFieldRepository.findAllByTeamProfileId(teamProfile.getId()); + final List teamProfileTeamBuildingFields = teamProfileTeamBuildingFieldRepository.findAllByTeamProfileId( + teamProfile.getId()); List teamBuildingFieldNames = teamProfileTeamBuildingFields.stream() - .map(teamProfileTeamBuildingField -> teamBuildingFieldRepository.findById(teamProfileTeamBuildingField.getTeamBuildingField().getId())) + .map(teamProfileTeamBuildingField -> teamBuildingFieldRepository.findById( + teamProfileTeamBuildingField.getTeamBuildingField().getId())) .filter(Optional::isPresent) .map(Optional::get) .map(TeamBuildingField::getTeamBuildingFieldName) diff --git a/src/main/java/liaison/linkit/team/service/TeamService.java b/src/main/java/liaison/linkit/team/service/TeamService.java new file mode 100644 index 00000000..8d096633 --- /dev/null +++ b/src/main/java/liaison/linkit/team/service/TeamService.java @@ -0,0 +1,17 @@ +package liaison.linkit.team.service; + +import liaison.linkit.member.domain.repository.member.MemberRepository; +import liaison.linkit.team.domain.repository.team.TeamRepository; +import liaison.linkit.team.domain.repository.teamMember.TeamMemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class TeamService { + private final MemberRepository memberRepository; + private final TeamRepository teamRepository; + private final TeamMemberRepository teamMemberRepository; +} diff --git a/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java b/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java new file mode 100644 index 00000000..7930d106 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java @@ -0,0 +1,22 @@ +package liaison.linkit.wish.business; + +import liaison.linkit.common.annotation.Mapper; +import liaison.linkit.member.domain.Member; +import liaison.linkit.profile.domain.Profile; +import liaison.linkit.wish.domain.PrivateWish; +import liaison.linkit.wish.presentation.dto.privateWish.PrivateWishResponseDTO; + +@Mapper +public class PrivateWishMapper { + public PrivateWish toPrivate(final Profile profile, final Member member) { + return PrivateWish.builder().profile(profile).member(member).build(); + } + + public PrivateWishResponseDTO.AddPrivateWish toAddPrivateWish() { + return PrivateWishResponseDTO.AddPrivateWish.builder().build(); + } + + public PrivateWishResponseDTO.RemovePrivateWish toRemovePrivateWish() { + return PrivateWishResponseDTO.RemovePrivateWish.builder().build(); + } +} diff --git a/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java b/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java new file mode 100644 index 00000000..2883baca --- /dev/null +++ b/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java @@ -0,0 +1,23 @@ +package liaison.linkit.wish.business; + +import liaison.linkit.common.annotation.Mapper; +import liaison.linkit.member.domain.Member; +import liaison.linkit.team.domain.announcement.TeamMemberAnnouncement; +import liaison.linkit.wish.domain.TeamWish; +import liaison.linkit.wish.presentation.dto.teamWish.TeamWishResponseDTO; + +@Mapper +public class TeamWishMapper { + public TeamWish toTeam(final TeamMemberAnnouncement teamMemberAnnouncement, final Member member) { + return TeamWish.builder().teamMemberAnnouncement(teamMemberAnnouncement).member(member).build(); + } + + public TeamWishResponseDTO.AddTeamWish toAddTeamWish() { + return TeamWishResponseDTO.AddTeamWish.builder().build(); + } + + public TeamWishResponseDTO.RemoveTeamWish toRemoveTeamWish() { + return TeamWishResponseDTO.RemoveTeamWish.builder() + .build(); + } +} diff --git a/src/main/java/liaison/linkit/wish/service/WishService.java b/src/main/java/liaison/linkit/wish/business/WishService.java similarity index 60% rename from src/main/java/liaison/linkit/wish/service/WishService.java rename to src/main/java/liaison/linkit/wish/business/WishService.java index 43c06411..97e05efa 100644 --- a/src/main/java/liaison/linkit/wish/service/WishService.java +++ b/src/main/java/liaison/linkit/wish/business/WishService.java @@ -1,19 +1,25 @@ -package liaison.linkit.wish.service; +package liaison.linkit.wish.business; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_JOB_ROLE; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MINI_PROFILE_BY_TEAM_PROFILE_ID; +import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_ID; + +import java.util.List; +import java.util.Objects; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.member.domain.Member; import liaison.linkit.member.domain.MemberBasicInform; -import liaison.linkit.member.domain.repository.memberBasicInform.MemberBasicInformRepository; -import liaison.linkit.member.domain.repository.member.MemberRepository; +import liaison.linkit.member.implement.MemberBasicInformQueryAdapter; +import liaison.linkit.member.implement.MemberQueryAdapter; import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.miniProfile.MiniProfile; import liaison.linkit.profile.domain.miniProfile.MiniProfileKeyword; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.domain.repository.jobRole.ProfileJobRoleRepository; import liaison.linkit.profile.domain.repository.miniProfile.MiniProfileKeywordRepository; -import liaison.linkit.profile.domain.repository.miniProfile.MiniProfileRepository; import liaison.linkit.profile.domain.role.JobRole; import liaison.linkit.profile.domain.role.ProfileJobRole; +import liaison.linkit.profile.implement.ProfileQueryAdapter; import liaison.linkit.search.dto.response.browseAfterLogin.BrowseMiniProfileResponse; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncement; @@ -21,43 +27,57 @@ import liaison.linkit.team.domain.announcement.TeamMemberAnnouncementSkill; import liaison.linkit.team.domain.miniprofile.TeamMiniProfile; import liaison.linkit.team.domain.miniprofile.TeamMiniProfileKeyword; -import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementJobRoleRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementRepository; import liaison.linkit.team.domain.repository.announcement.TeamMemberAnnouncementSkillRepository; -import liaison.linkit.team.domain.repository.miniprofile.teamMiniProfileKeyword.TeamMiniProfileKeywordRepository; import liaison.linkit.team.domain.repository.miniprofile.TeamMiniProfileRepository; +import liaison.linkit.team.domain.repository.miniprofile.teamMiniProfileKeyword.TeamMiniProfileKeywordRepository; +import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; import liaison.linkit.wish.domain.PrivateWish; import liaison.linkit.wish.domain.TeamWish; import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; -import liaison.linkit.wish.domain.type.WishType; -import liaison.linkit.wish.dto.response.WishTeamProfileResponse; +import liaison.linkit.wish.exception.privateWish.ForbiddenPrivateWishException; +import liaison.linkit.wish.exception.privateWish.PrivateWishManyRequestException; +import liaison.linkit.wish.exception.teamWish.ForbiddenTeamWishException; +import liaison.linkit.wish.exception.teamWish.TeamWishManyRequestException; +import liaison.linkit.wish.implement.privateWish.PrivateWishCommandAdapter; +import liaison.linkit.wish.implement.privateWish.PrivateWishQueryAdapter; +import liaison.linkit.wish.implement.teamWish.TeamWishCommandAdapter; +import liaison.linkit.wish.implement.teamWish.TeamWishQueryAdapter; +import liaison.linkit.wish.presentation.dto.privateWish.PrivateWishResponseDTO; +import liaison.linkit.wish.presentation.dto.response.WishTeamProfileResponse; +import liaison.linkit.wish.presentation.dto.teamWish.TeamWishResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Objects; - -import static liaison.linkit.global.exception.ExceptionCode.*; - @Service @RequiredArgsConstructor @Transactional @Slf4j public class WishService { - private final MemberRepository memberRepository; - private final ProfileRepository profileRepository; - private final MiniProfileRepository miniProfileRepository; + private final MemberQueryAdapter memberQueryAdapter; + + private final MemberBasicInformQueryAdapter memberBasicInformQueryAdapter; + + private final PrivateWishMapper privateWishMapper; + private final PrivateWishQueryAdapter privateWishQueryAdapter; + private final PrivateWishCommandAdapter privateWishCommandAdapter; + + private final TeamWishMapper teamWishMapper; + private final TeamWishQueryAdapter teamWishQueryAdapter; + private final TeamWishCommandAdapter teamWishCommandAdapter; + + private final ProfileQueryAdapter profileQueryAdapter; + private final TeamMiniProfileRepository teamMiniProfileRepository; private final PrivateWishRepository privateWishRepository; private final TeamWishRepository teamWishRepository; - private final MemberBasicInformRepository memberBasicInformRepository; private final ProfileJobRoleRepository profileJobRoleRepository; private final MiniProfileKeywordRepository miniProfileKeywordRepository; private final TeamMiniProfileKeywordRepository teamMiniProfileKeywordRepository; @@ -67,150 +87,70 @@ public class WishService { private final TeamMemberAnnouncementJobRoleRepository teamMemberAnnouncementJobRoleRepository; private final TeamMemberAnnouncementSkillRepository teamMemberAnnouncementSkillRepository; - // 내 이력서 찜하기 최대 개수 판단 메서드 - public void validateMemberMaxPrivateWish(final Long memberId) { - final Member member = getMember(memberId); - final int memberPrivateWishCount = member.getPrivateWishCount(); - if (memberPrivateWishCount >= 8) { - throw new BadRequestException(CANNOT_CREATE_PRIVATE_WISH_BECAUSE_OF_MAX_COUNT); - } - } - - // 팀 소개서 찜하기 최대 개수 판단 메서드 - public void validateMemberMaxTeamWish(final Long memberId) { - final Member member = getMember(memberId); - final int memberTeamWishCount = member.getTeamWishCount(); - if (memberTeamWishCount >= 8) { - throw new BadRequestException(CANNOT_CREATE_TEAM_WISH_BECAUSE_OF_MAX_COUNT); - } - } - - // 회원 정보를 가져오는 메서드 - private Member getMember(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BY_MEMBER_ID)); - } - - // 모든 "내 이력서" 서비스 계층에 필요한 profile 조회 메서드 - private Profile getProfile(final Long memberId) { - return profileRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_MEMBER_ID)); - } - private TeamProfile getTeamProfile(final Long memberId) { return teamProfileRepository.findByMemberId(memberId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_PROFILE_ID)); } - private Profile getProfileByMiniProfileId( - final Long miniProfileId - ) { - final MiniProfile miniProfile = miniProfileRepository.findById(miniProfileId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MINI_PROFILE_BY_ID)); - - return miniProfile.getProfile(); - } - - public void createWishToPrivateProfile( - final Long memberId, - final Long miniProfileId - ) { - // 내가 - final Member member = getMember(memberId); - // 상대방의 내 이력서를 - final Profile profile = getProfileByMiniProfileId(miniProfileId); - - if (Objects.equals(getProfile(memberId).getId(), profile.getId())) { - throw new BadRequestException(NOT_ALLOW_P2P_WISH); + @Transactional + public PrivateWishResponseDTO.AddPrivateWish createWishToPrivateProfile(final Long memberId, final Long profileId) { + final Member member = memberQueryAdapter.findById(memberId); + final Profile profile = profileQueryAdapter.findById(profileId); + if (Objects.equals(profileQueryAdapter.findByMemberId(memberId).getId(), profile.getId())) { + throw ForbiddenPrivateWishException.EXCEPTION; } - - // 찜한다 - final PrivateWish privateWish = new PrivateWish( - null, - member, - profile, - WishType.PROFILE - ); - - privateWishRepository.save(privateWish); - // 내 이력서 찜하기 카운트 + 1 + privateWishCommandAdapter.create(new PrivateWish(null, member, profile)); member.addPrivateWishCount(); + return privateWishMapper.toAddPrivateWish(); } - // 찜하기 취소 메서드 - public void cancelWishToPrivateProfile( - final Long memberId, - final Long miniProfileId - ) { - final Member member = getMember(memberId); - final Profile profile = getProfileByMiniProfileId(miniProfileId); - // 내 이력서 찜하기 객체 삭제 - privateWishRepository.deleteByMemberIdAndProfileId(memberId, profile.getId()); - member.subPrivateWishCount(); - } - - // 팀 소개서 찜하기 메서드 - public void createWishToTeamProfile( - final Long memberId, - final Long teamMemberAnnouncementId - ) { - final Member member = getMember(memberId); - final TeamMemberAnnouncement teamMemberAnnouncement = teamMemberAnnouncementRepository.findById(teamMemberAnnouncementId) + // 팀원 공고 찜하기 메서드 + public TeamWishResponseDTO.AddTeamWish createWishToTeamProfile(final Long memberId, final Long teamMemberAnnouncementId) { + final Member member = memberQueryAdapter.findById(memberId); + final TeamMemberAnnouncement teamMemberAnnouncement = teamMemberAnnouncementRepository.findById( + teamMemberAnnouncementId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_ID)); // 나의 팀 프로필의 ID -> 내가 찜한 팀원 공고의 팀 프로필과 같은지 if (Objects.equals(getTeamProfile(memberId).getId(), teamMemberAnnouncement.getTeamProfile().getId())) { - throw new BadRequestException(NOT_ALLOW_P2T_WISH); + throw ForbiddenTeamWishException.EXCEPTION; } - - final TeamWish teamWish = new TeamWish( - null, - member, - teamMemberAnnouncement, - WishType.TEAM_PROFILE - ); - - // DB에 저장 - teamWishRepository.save(teamWish); - - // 팀 소개서 찜하기 카운트 + 1 + teamWishCommandAdapter.create(new TeamWish(null, member, teamMemberAnnouncement)); member.addTeamWishCount(); + return teamWishMapper.toAddTeamWish(); } - public void cancelWishToTeamProfile( - final Long memberId, - final Long teamMemberAnnouncementId - ) { - final Member member = getMember(memberId); - - // 삭제하고자 하는 팀 찜하기 객체 조회 - final TeamWish teamWish = teamWishRepository.findByMemberIdAndTeamMemberAnnouncementId(teamMemberAnnouncementId, memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_WISH_BY_TEAM_MEMBER_ANNOUNCEMENT_ID)); - - // 바로 삭제 - teamWishRepository.delete(teamWish); + // 찜하기 취소 메서드 + public PrivateWishResponseDTO.RemovePrivateWish cancelWishToPrivateProfile(final Long memberId, final Long profileId) { + privateWishCommandAdapter.deleteByMemberIdAndProfileId(memberId, profileId); + final Member member = memberQueryAdapter.findById(memberId); + member.subPrivateWishCount(); + return privateWishMapper.toRemovePrivateWish(); + } - // 삭제 이후 -1 + // 팀원 공고 찜하기 취소 메서드 + public TeamWishResponseDTO.RemoveTeamWish cancelWishToTeamProfile(final Long memberId, final Long teamMemberAnnouncementId) { + teamWishCommandAdapter.deleteByMemberIdAndTeamMemberAnnouncementId(memberId, teamMemberAnnouncementId); + final Member member = memberQueryAdapter.findById(memberId); member.subTeamWishCount(); + return teamWishMapper.toRemoveTeamWish(); } public List getPrivateProfileWishList(final Long memberId) { - // 주체 객체 조회 - final Member member = getMember(memberId); - - final List privateWishList = privateWishRepository.findAllByMemberId(member.getId()); + final List privateWishList = privateWishQueryAdapter.findAllPrivateWish(memberId); return privateWishList.stream() .map(privateWish -> { // 상대의 미니 프로필 객체를 가져온다. final MiniProfile miniProfile = privateWish.getProfile().getMiniProfile(); final List miniProfileKeywords = getMiniProfileKeywords(miniProfile.getId()); // 상대 회원의 기본 정보를 가져와야 한다. - final MemberBasicInform memberBasicInform = getMemberBasicInform(miniProfile.getProfile().getMember().getId()); + final MemberBasicInform memberBasicInform = memberBasicInformQueryAdapter.findByMemberId(memberId); final List jobRoleNames = getJobRoleNames(miniProfile.getProfile().getMember().getId()); // privateWish -> 찾아야함 (내가 이 해당 미니 프로필을 찜해뒀는지?) - final boolean isPrivateWish = privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + final boolean isPrivateWish = privateWishRepository.existsByMemberIdAndProfileId(memberId, + miniProfile.getProfile().getId()); return BrowseMiniProfileResponse.personalBrowseMiniProfile( miniProfile, @@ -226,13 +166,12 @@ public List getPrivateProfileWishList(final Long memb // 찜한 상대 팀 (팀원 공고)를 찾아야 한다. public List getTeamProfileWishList(final Long memberId) { - // 찜한 주체 객체 조회 - final Member member = getMember(memberId); - // 팀 찜 목록 객체 조회 + final Member member = memberQueryAdapter.findById(memberId); final List teamWishList = teamWishRepository.findAllByMemberId(member.getId()); log.info("teamWishList={}", teamWishList); - return teamWishList.stream().map(teamWish -> convertToWishTeamProfileResponse(teamWish, member.getId())).toList(); + return teamWishList.stream().map(teamWish -> convertToWishTeamProfileResponse(teamWish, member.getId())) + .toList(); } // 팀 소개서 응답 변환 @@ -241,31 +180,29 @@ private WishTeamProfileResponse convertToWishTeamProfileResponse(final TeamWish // 팀원 공고를 조회한다. final TeamMemberAnnouncement teamMemberAnnouncement = teamWish.getTeamMemberAnnouncement(); - final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId(teamMemberAnnouncement.getTeamProfile().getId()); - final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()); + final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId( + teamMemberAnnouncement.getTeamProfile().getId()); + final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()); - final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole(teamMemberAnnouncement.getId()); - final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills(teamMemberAnnouncement.getId()); + final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole( + teamMemberAnnouncement.getId()); + final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills( + teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); - final boolean isTeamSaved = teamWishRepository.findByTeamMemberAnnouncementIdAndMemberId(teamMemberAnnouncement.getId(), memberId); + final boolean isTeamSaved = teamWishRepository.existsByTeamMemberAnnouncementIdAndMemberId( + teamMemberAnnouncement.getId(), memberId); return new WishTeamProfileResponse( TeamMiniProfileResponse.personalTeamMiniProfile(teamMiniProfile, teamMiniProfileKeyword), - TeamMemberAnnouncementResponse.afterLogin(teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList, isTeamSaved) + TeamMemberAnnouncementResponse.afterLogin(teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, + teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList, isTeamSaved) ); } - - - // 회원 기본 정보를 가져오는 메서드 - private MemberBasicInform getMemberBasicInform(final Long memberId) { - return memberBasicInformRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID)); - } - public List getJobRoleNames(final Long memberId) { - final Profile profile = getProfile(memberId); + final Profile profile = profileQueryAdapter.findByMemberId(memberId); final List profileJobRoleList = getProfileJobRoleList(profile.getId()); List jobRoleList = profileJobRoleList.stream() @@ -298,4 +235,23 @@ private TeamMiniProfile getTeamMiniProfileByTeamProfileId(final Long teamProfile private List getMiniProfileKeywords(final Long miniProfileId) { return miniProfileKeywordRepository.findAllByMiniProfileId(miniProfileId); } + + + // 내 이력서 찜하기 최대 개수 판단 메서드 + public void validateMemberMaxPrivateWish(final Long memberId) { + final Member member = memberQueryAdapter.findById(memberId); + final int memberPrivateWishCount = member.getPrivateWishCount(); + if (memberPrivateWishCount >= 8) { + throw PrivateWishManyRequestException.EXCEPTION; + } + } + + // 팀 소개서 찜하기 최대 개수 판단 메서드 + public void validateMemberMaxTeamWish(final Long memberId) { + final Member member = memberQueryAdapter.findById(memberId); + final int memberTeamWishCount = member.getTeamWishCount(); + if (memberTeamWishCount >= 8) { + throw TeamWishManyRequestException.EXCEPTION; + } + } } diff --git a/src/main/java/liaison/linkit/wish/domain/PrivateWish.java b/src/main/java/liaison/linkit/wish/domain/PrivateWish.java index 7cfbac1d..5b208d7b 100644 --- a/src/main/java/liaison/linkit/wish/domain/PrivateWish.java +++ b/src/main/java/liaison/linkit/wish/domain/PrivateWish.java @@ -1,22 +1,27 @@ package liaison.linkit.wish.domain; -import jakarta.persistence.*; +import static jakarta.persistence.FetchType.LAZY; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import liaison.linkit.global.BaseEntity; import liaison.linkit.member.domain.Member; import liaison.linkit.profile.domain.Profile; -import liaison.linkit.wish.domain.type.WishType; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLRestriction; -import static jakarta.persistence.EnumType.STRING; -import static jakarta.persistence.FetchType.LAZY; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - @Entity @Getter +@Builder @NoArgsConstructor(access = PROTECTED) @AllArgsConstructor @SQLRestriction("status = 'USABLE'") @@ -36,8 +41,4 @@ public class PrivateWish extends BaseEntity { @ManyToOne(fetch = LAZY) @JoinColumn(name = "profile_id") private Profile profile; - - @Column(name = "wish_type") - @Enumerated(value = STRING) - private WishType wishType; } diff --git a/src/main/java/liaison/linkit/wish/domain/TeamWish.java b/src/main/java/liaison/linkit/wish/domain/TeamWish.java index 381d21f8..edf33b96 100644 --- a/src/main/java/liaison/linkit/wish/domain/TeamWish.java +++ b/src/main/java/liaison/linkit/wish/domain/TeamWish.java @@ -1,22 +1,27 @@ package liaison.linkit.wish.domain; -import jakarta.persistence.*; +import static jakarta.persistence.FetchType.LAZY; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import liaison.linkit.global.BaseEntity; import liaison.linkit.member.domain.Member; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncement; -import liaison.linkit.wish.domain.type.WishType; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLRestriction; -import static jakarta.persistence.EnumType.STRING; -import static jakarta.persistence.FetchType.LAZY; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - @Entity @Getter +@Builder @NoArgsConstructor(access = PROTECTED) @AllArgsConstructor @SQLRestriction("status = 'USABLE'") @@ -36,9 +41,4 @@ public class TeamWish extends BaseEntity { @ManyToOne(fetch = LAZY) @JoinColumn(name = "team_member_announcement_id") private TeamMemberAnnouncement teamMemberAnnouncement; - - @Column(name = "wish_type") - @Enumerated(value = STRING) - private WishType wishType; - } diff --git a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java index 0fe5a22c..ed784388 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java @@ -6,11 +6,17 @@ public interface PrivateWishRepositoryCustom { List findAllByMemberId(final Long memberId); + void deleteByMemberId(final Long memberId); + void deleteByProfileId(final Long profileId); + void deleteByMemberIdAndProfileId(final Long memberId, final Long profileId); + boolean existsByMemberId(final Long memberId); + boolean existsByProfileId(final Long profileId); - boolean findByMemberIdAndProfileId(final Long memberId, final Long profileId); + + boolean existsByMemberIdAndProfileId(final Long memberId, final Long profileId); } diff --git a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java index 09cd87d0..b1d76a56 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java @@ -12,7 +12,7 @@ @RequiredArgsConstructor @Slf4j -public class PrivateWishRepositoryCustomImpl implements PrivateWishRepositoryCustom{ +public class PrivateWishRepositoryCustomImpl implements PrivateWishRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; @@ -89,7 +89,7 @@ public boolean existsByProfileId(final Long profileId) { } @Override - public boolean findByMemberIdAndProfileId(final Long memberId, final Long profileId) { + public boolean existsByMemberIdAndProfileId(final Long memberId, final Long profileId) { QPrivateWish privateWish = QPrivateWish.privateWish; Integer count = jpaQueryFactory diff --git a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java index 24588bfe..13de293c 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java @@ -8,16 +8,27 @@ public interface TeamWishRepositoryCustom { List findAllByMemberId(final Long memberId); + Optional findByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId); - Optional findByMemberIdAndTeamMemberAnnouncementId(final Long teamMemberAnnouncementId, final Long memberId); - boolean findByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, final Long memberId); + + Optional findByMemberIdAndTeamMemberAnnouncementId( + final Long memberId, + final Long teamMemberAnnouncementId + ); + + boolean existsByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, final Long memberId); boolean existsByMemberId(final Long memberId); + boolean existsByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId); + boolean existsByTeamMemberAnnouncementIds(final List teamMemberAnnouncementIds); void deleteByMemberId(final Long memberId); + void deleteByMemberIdAndTeamMemberAnnouncementId(final Long memberId, final Long teamMemberAnnouncementId); + void deleteByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId); + void deleteByTeamMemberAnnouncementIds(final List teamMemberAnnouncementIds); } diff --git a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java index ff5376a7..2b0d95c6 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java @@ -13,7 +13,7 @@ @RequiredArgsConstructor @Slf4j -public class TeamWishRepositoryCustomImpl implements TeamWishRepositoryCustom{ +public class TeamWishRepositoryCustomImpl implements TeamWishRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; @@ -37,7 +37,7 @@ public Optional findByTeamMemberAnnouncementId(Long teamMemberAnnounce } @Override - public Optional findByMemberIdAndTeamMemberAnnouncementId(Long teamMemberAnnouncementId, Long memberId) { + public Optional findByMemberIdAndTeamMemberAnnouncementId(Long memberId, Long teamMemberAnnouncementId) { QTeamWish teamWish = QTeamWish.teamWish; TeamWish result = jpaQueryFactory .selectFrom(teamWish) @@ -48,7 +48,8 @@ public Optional findByMemberIdAndTeamMemberAnnouncementId(Long teamMem } @Override - public boolean findByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, final Long memberId) { + public boolean existsByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, + final Long memberId) { QTeamWish teamWish = QTeamWish.teamWish; Integer count = jpaQueryFactory .selectOne() diff --git a/src/main/java/liaison/linkit/wish/domain/type/WishType.java b/src/main/java/liaison/linkit/wish/domain/type/WishType.java deleted file mode 100644 index 98155f4c..00000000 --- a/src/main/java/liaison/linkit/wish/domain/type/WishType.java +++ /dev/null @@ -1,8 +0,0 @@ -package liaison.linkit.wish.domain.type; - -public enum WishType { - // 내 이력서에 매칭 요청 보낸 경우 - PROFILE, - // 팀 소개서에 매칭 요청 보낸 경우 - TEAM_PROFILE -} diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/DuplicatePrivateWishException.java b/src/main/java/liaison/linkit/wish/exception/privateWish/DuplicatePrivateWishException.java new file mode 100644 index 00000000..f9f88068 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/DuplicatePrivateWishException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.privateWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class DuplicatePrivateWishException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new DuplicatePrivateWishException(); + + private DuplicatePrivateWishException() { + super(PrivateWishErrorCode.DUPLICATE_PRIVATE_WISH); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/ForbiddenPrivateWishException.java b/src/main/java/liaison/linkit/wish/exception/privateWish/ForbiddenPrivateWishException.java new file mode 100644 index 00000000..ab954bfc --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/ForbiddenPrivateWishException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.privateWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class ForbiddenPrivateWishException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new ForbiddenPrivateWishException(); + + private ForbiddenPrivateWishException() { + super(PrivateWishErrorCode.FORBIDDEN_PRIVATE_WISH); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java new file mode 100644 index 00000000..bfb60582 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java @@ -0,0 +1,40 @@ +package liaison.linkit.wish.exception.privateWish; + +import static liaison.linkit.common.consts.LinkitStatic.DUPLICATE; +import static liaison.linkit.common.consts.LinkitStatic.FORBIDDEN; +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; +import static liaison.linkit.common.consts.LinkitStatic.TOO_MANY_REQUESTS; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PrivateWishErrorCode implements BaseErrorCode { + + FORBIDDEN_PRIVATE_WISH(FORBIDDEN, "PRIVATE_WISH_403_1", "내 프로필을 찜하기 할 수 없습니다."), + PRIVATE_WISH_NOT_FOUND(NOT_FOUND, "PRIVATE_WISH_404_1", "프로필에 대한 좋아요 기록이 없습니다."), + DUPLICATE_PRIVATE_WISH(DUPLICATE, "PRIVATE_WISH_409_1", "이미 좋아요한 프로필입니다."), + TOO_MANY_PRIVATE_WISH_REQUEST(TOO_MANY_REQUESTS, "PRIVATE_WISH_429_1", "프로필 최대 찜하기 개수를 초과하였습니다"); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishManyRequestException.java b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishManyRequestException.java new file mode 100644 index 00000000..d7449d99 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishManyRequestException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.privateWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class PrivateWishManyRequestException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new PrivateWishManyRequestException(); + + private PrivateWishManyRequestException() { + super(PrivateWishErrorCode.TOO_MANY_PRIVATE_WISH_REQUEST); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishNotFoundException.java b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishNotFoundException.java new file mode 100644 index 00000000..1aaa470f --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishNotFoundException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.privateWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class PrivateWishNotFoundException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new PrivateWishNotFoundException(); + + private PrivateWishNotFoundException() { + super(PrivateWishErrorCode.PRIVATE_WISH_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/DuplicateTeamWishException.java b/src/main/java/liaison/linkit/wish/exception/teamWish/DuplicateTeamWishException.java new file mode 100644 index 00000000..707e2ab2 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/DuplicateTeamWishException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.teamWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class DuplicateTeamWishException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new DuplicateTeamWishException(); + + private DuplicateTeamWishException() { + super(TeamWishErrorCode.DUPLICATE_TEAM_WISH); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/ForbiddenTeamWishException.java b/src/main/java/liaison/linkit/wish/exception/teamWish/ForbiddenTeamWishException.java new file mode 100644 index 00000000..be467c25 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/ForbiddenTeamWishException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.teamWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class ForbiddenTeamWishException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new ForbiddenTeamWishException(); + + private ForbiddenTeamWishException() { + super(TeamWishErrorCode.FORBIDDEN_TEAM_WISH); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java new file mode 100644 index 00000000..2863c5ea --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java @@ -0,0 +1,39 @@ +package liaison.linkit.wish.exception.teamWish; + +import static liaison.linkit.common.consts.LinkitStatic.DUPLICATE; +import static liaison.linkit.common.consts.LinkitStatic.FORBIDDEN; +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; +import static liaison.linkit.common.consts.LinkitStatic.TOO_MANY_REQUESTS; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum TeamWishErrorCode implements BaseErrorCode { + FORBIDDEN_TEAM_WISH(FORBIDDEN, "TEAM_WISH_403_1", "내가 올린 팀원 공고를 찜할 수 없습니다"), + TEAM_WISH_NOT_FOUND(NOT_FOUND, "TEAM_WISH_404_1", "팀원 공고에 대한 좋아요 기록이 없습니다."), + DUPLICATE_TEAM_WISH(DUPLICATE, "TEAM_WISH_409_1", "이미 좋아요한 팀원 공고입니다."), + TOO_MANY_TEAM_WISH_REQUEST(TOO_MANY_REQUESTS, "TEAM_WISH_429_1", "팀원 공고 최대 찜하기 개수를 초과하였습니다."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishManyRequestException.java b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishManyRequestException.java new file mode 100644 index 00000000..9c87fd1b --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishManyRequestException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.teamWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class TeamWishManyRequestException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new TeamWishManyRequestException(); + + private TeamWishManyRequestException() { + super(TeamWishErrorCode.TOO_MANY_TEAM_WISH_REQUEST); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishNotFoundException.java b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishNotFoundException.java new file mode 100644 index 00000000..fd4978c4 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishNotFoundException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.teamWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class TeamWishNotFoundException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new TeamWishNotFoundException(); + + private TeamWishNotFoundException() { + super(TeamWishErrorCode.TEAM_WISH_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishCommandAdapter.java b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishCommandAdapter.java new file mode 100644 index 00000000..0a67d99d --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishCommandAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.wish.implement.privateWish; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.PrivateWish; +import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class PrivateWishCommandAdapter { + private final PrivateWishRepository privateWishRepository; + + public PrivateWish create(final PrivateWish privateWish) { + return privateWishRepository.save(privateWish); + } + + public void deleteByMemberId(final Long memberId) { + privateWishRepository.deleteByMemberId(memberId); + } + + public void deleteByProfileId(final Long profileId) { + privateWishRepository.deleteByProfileId(profileId); + } + + public void deleteByMemberIdAndProfileId(final Long memberId, final Long profileId) { + privateWishRepository.deleteByMemberIdAndProfileId(memberId, profileId); + } + +} diff --git a/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishQueryAdapter.java b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishQueryAdapter.java new file mode 100644 index 00000000..dfc04173 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishQueryAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.wish.implement.privateWish; + +import java.util.List; +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.PrivateWish; +import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class PrivateWishQueryAdapter { + private final PrivateWishRepository privateWishRepository; + + public List findAllPrivateWish(final Long memberId) { + return privateWishRepository.findAllByMemberId(memberId); + } + + public boolean existsByMemberId(final Long memberId) { + return privateWishRepository.existsByMemberId(memberId); + } + + public boolean existsByProfileId(final Long profileId) { + return privateWishRepository.existsByProfileId(profileId); + } + + public boolean existsByMemberIdAndProfileId(final Long memberId, final Long profileId) { + return privateWishRepository.existsByMemberIdAndProfileId(memberId, profileId); + } +} diff --git a/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishCommandAdapter.java b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishCommandAdapter.java new file mode 100644 index 00000000..a89632d5 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishCommandAdapter.java @@ -0,0 +1,24 @@ +package liaison.linkit.wish.implement.teamWish; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.TeamWish; +import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class TeamWishCommandAdapter { + private TeamWishRepository teamWishRepository; + + public TeamWish create(final TeamWish teamWish) { + return teamWishRepository.save(teamWish); + } + + public void delete(final TeamWish teamWish) { + teamWishRepository.delete(teamWish); + } + + public void deleteByMemberIdAndTeamMemberAnnouncementId(final Long memberId, final Long teamMemberAnnouncementId) { + teamWishRepository.deleteByMemberIdAndTeamMemberAnnouncementId(memberId, teamMemberAnnouncementId); + } +} diff --git a/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishQueryAdapter.java b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishQueryAdapter.java new file mode 100644 index 00000000..96b6396d --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishQueryAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.wish.implement.teamWish; + +import java.util.List; +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.TeamWish; +import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; +import liaison.linkit.wish.exception.teamWish.TeamWishNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class TeamWishQueryAdapter { + private final TeamWishRepository teamWishRepository; + + public List findAllByMemberId(final Long memberId) { + return teamWishRepository.findAllByMemberId(memberId); + } + + public TeamWish findByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId) { + return teamWishRepository.findByTeamMemberAnnouncementId(teamMemberAnnouncementId) + .orElseThrow(() -> TeamWishNotFoundException.EXCEPTION); + } + + public TeamWish findByMemberIdAndTeamMemberAnnouncementId(final Long memberId, + final Long teamMemberAnnouncementId) { + return teamWishRepository.findByMemberIdAndTeamMemberAnnouncementId(teamMemberAnnouncementId, memberId) + .orElseThrow(() -> TeamWishNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/liaison/linkit/wish/presentation/WishController.java b/src/main/java/liaison/linkit/wish/presentation/WishController.java index 58a6d386..84d8e721 100644 --- a/src/main/java/liaison/linkit/wish/presentation/WishController.java +++ b/src/main/java/liaison/linkit/wish/presentation/WishController.java @@ -1,18 +1,24 @@ package liaison.linkit.wish.presentation; +import java.util.List; import liaison.linkit.auth.Auth; import liaison.linkit.auth.MemberOnly; import liaison.linkit.auth.domain.Accessor; +import liaison.linkit.common.presentation.CommonResponse; import liaison.linkit.search.dto.response.browseAfterLogin.BrowseMiniProfileResponse; -import liaison.linkit.wish.dto.response.WishTeamProfileResponse; -import liaison.linkit.wish.service.WishService; +import liaison.linkit.wish.business.WishService; +import liaison.linkit.wish.presentation.dto.privateWish.PrivateWishResponseDTO; +import liaison.linkit.wish.presentation.dto.response.WishTeamProfileResponse; +import liaison.linkit.wish.presentation.dto.teamWish.TeamWishResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @@ -22,81 +28,53 @@ public class WishController { public final WishService wishService; - // 내 이력서 찜하기 - @PostMapping("/wish/private/profile/{miniProfileId}") + // 내 프로필 찜하기 + @PostMapping("/wish/private/profile/{profileId}") @MemberOnly - public ResponseEntity createWishToPrivateProfile( - @Auth final Accessor accessor, - @PathVariable final Long miniProfileId - ) { - log.info("miniProfileId={} 을 memberId={}가 찜하는 요청이 발생했습니다.", miniProfileId, accessor.getMemberId()); + public CommonResponse createWishToPrivateProfile(@Auth final Accessor accessor, @PathVariable final Long profileId) { wishService.validateMemberMaxPrivateWish(accessor.getMemberId()); - // 최대 개수를 넘지 않았다면 아래가 실행된다. - wishService.createWishToPrivateProfile(accessor.getMemberId(), miniProfileId); - return ResponseEntity.status(HttpStatus.CREATED).build(); + return CommonResponse.onSuccess(wishService.createWishToPrivateProfile(accessor.getMemberId(), profileId)); } - // 팀 소개서 찜하기 + // 팀원 공고 찜하기 (미확정 09.20) @PostMapping("/wish/team/profile/{teamMemberAnnouncementId}") @MemberOnly - public ResponseEntity createWishToTeamProfile( - @Auth final Accessor accessor, - @PathVariable final Long teamMemberAnnouncementId - ) { - log.info("teamMemberAnnouncementId={} 을 memberId={}가 찜하는 요청이 발생했습니다.", teamMemberAnnouncementId, accessor.getMemberId()); + public CommonResponse createWishToTeamProfile(@Auth final Accessor accessor, @PathVariable final Long teamMemberAnnouncementId) { wishService.validateMemberMaxTeamWish(accessor.getMemberId()); - - // 최대 개수를 넘지 않았다면 아래가 실행된다. - wishService.createWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId); - return ResponseEntity.status(HttpStatus.CREATED).build(); + return CommonResponse.onSuccess(wishService.createWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId)); } - - // 내 이력서 찜하기 취소 - @DeleteMapping("/wish/private/profile/{miniProfileId}") + // 내 프로필 찜하기 취소 + @DeleteMapping("/wish/private/profile/{profileId}") @MemberOnly - public ResponseEntity cancelWishToPrivateProfile( - @Auth final Accessor accessor, - @PathVariable final Long miniProfileId - ) { - log.info("miniProfileId={} 을 memberId={}가 찜 취소하는 요청이 발생했습니다.", miniProfileId, accessor.getMemberId()); - wishService.cancelWishToPrivateProfile(accessor.getMemberId(), miniProfileId); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + public CommonResponse removeWishToPrivateProfile(@Auth final Accessor accessor, @PathVariable final Long profileId) { + return CommonResponse.onSuccess(wishService.cancelWishToPrivateProfile(accessor.getMemberId(), profileId)); } - // 팀 소개서 찜하기 취소 + // 팀원 공고 찜하기 취소 (미확정 09.20) @DeleteMapping("/wish/team/profile/{teamMemberAnnouncementId}") @MemberOnly - public ResponseEntity cancelWishToTeamProfile( - @Auth final Accessor accessor, - @PathVariable final Long teamMemberAnnouncementId - ) { - log.info("teamMemberAnnouncementId={} 을 memberId={}가 찜하는 요청이 발생했습니다.", teamMemberAnnouncementId, accessor.getMemberId()); - wishService.cancelWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + public CommonResponse cancelWishToTeamProfile(@Auth final Accessor accessor, @PathVariable final Long teamMemberAnnouncementId) { + return CommonResponse.onSuccess(wishService.cancelWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId)); } - - // 내 이력서 찜한 목록 조회 + + // 내 이력서 찜한 목록 조회 (미확정 09.20) @GetMapping("/wish/private/profile/list") @MemberOnly - public ResponseEntity> getPrivateProfileWishList( - @Auth final Accessor accessor - ) { - log.info("memberId={}의 내 이력서 찜하기 목록을 가져옵니다.", accessor.getMemberId()); - // 찜한 주체의 ID를 전달한다. + public ResponseEntity> getPrivateProfileWishList(@Auth final Accessor accessor) { final List browseMiniProfileResponseList = wishService.getPrivateProfileWishList(accessor.getMemberId()); return ResponseEntity.ok(browseMiniProfileResponseList); } - // 팀 소개서 찜한 목록 조회 + // 팀 소개서 찜한 목록 조회 (미확정 09.20) @GetMapping("/wish/team/profile/list") @MemberOnly public ResponseEntity> getTeamProfileWishList( @Auth final Accessor accessor ) { - log.info("memberId={}의 팀 소개서 찜하기 목록을 가져옵니다.", accessor.getMemberId()); // 찜한 주체의 ID를 전달한다. - final List wishTeamProfileResponseList = wishService.getTeamProfileWishList(accessor.getMemberId()); + final List wishTeamProfileResponseList = wishService.getTeamProfileWishList( + accessor.getMemberId()); return ResponseEntity.ok(wishTeamProfileResponseList); } } diff --git a/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java b/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java new file mode 100644 index 00000000..fd6b6ee1 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java @@ -0,0 +1,32 @@ +package liaison.linkit.wish.presentation.dto.privateWish; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class PrivateWishResponseDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class AddPrivateWish { + @Builder.Default + @JsonProperty("isPrivateWish") + private boolean like = true; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RemovePrivateWish { + @Builder.Default + @JsonProperty("isPrivateWish") + private boolean like = false; + } +} diff --git a/src/main/java/liaison/linkit/wish/dto/response/WishTeamProfileResponse.java b/src/main/java/liaison/linkit/wish/presentation/dto/response/WishTeamProfileResponse.java similarity index 89% rename from src/main/java/liaison/linkit/wish/dto/response/WishTeamProfileResponse.java rename to src/main/java/liaison/linkit/wish/presentation/dto/response/WishTeamProfileResponse.java index fa81d2ea..41e32743 100644 --- a/src/main/java/liaison/linkit/wish/dto/response/WishTeamProfileResponse.java +++ b/src/main/java/liaison/linkit/wish/presentation/dto/response/WishTeamProfileResponse.java @@ -1,4 +1,4 @@ -package liaison.linkit.wish.dto.response; +package liaison.linkit.wish.presentation.dto.response; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; diff --git a/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java b/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java new file mode 100644 index 00000000..d0da1343 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java @@ -0,0 +1,32 @@ +package liaison.linkit.wish.presentation.dto.teamWish; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TeamWishResponseDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class AddTeamWish { + @Builder.Default + @JsonProperty("isTeamWish") + private boolean like = true; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RemoveTeamWish { + @Builder.Default + @JsonProperty("isTeamWish") + private boolean like = false; + } +} diff --git a/src/main/resources/db/migration/V1.1.6__Update_Member_Modify_Time.sql b/src/main/resources/db/migration/V1.1.6__Update_Member_Modify_Time.sql new file mode 100644 index 00000000..48829cbb --- /dev/null +++ b/src/main/resources/db/migration/V1.1.6__Update_Member_Modify_Time.sql @@ -0,0 +1,5 @@ +ALTER TABLE member +RENAME COLUMN modified_at TO updated_at; + +ALTER TABLE private_wish DROP COLUMN wish_type; +ALTER TABLE team_wish DROP COLUMN wish_type; diff --git a/src/test/java/liaison/linkit/member/presentation/MemberControllerTest.java b/src/test/java/liaison/linkit/member/presentation/MemberControllerTest.java index 39b4f04b..f5e5158a 100644 --- a/src/test/java/liaison/linkit/member/presentation/MemberControllerTest.java +++ b/src/test/java/liaison/linkit/member/presentation/MemberControllerTest.java @@ -7,7 +7,7 @@ import liaison.linkit.login.domain.MemberTokens; import liaison.linkit.member.dto.request.memberBasicInform.MemberBasicInformCreateRequest; import liaison.linkit.member.dto.response.MemberBasicInformResponse; -import liaison.linkit.member.service.MemberService; +import liaison.linkit.member.business.MemberService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -57,7 +57,8 @@ void setUp() { doNothing().when(memberService).validateMemberBasicInformByMember(1L); } - private ResultActions performPostRequest(final MemberBasicInformCreateRequest memberBasicInformCreateRequest) throws Exception { + private ResultActions performPostRequest(final MemberBasicInformCreateRequest memberBasicInformCreateRequest) + throws Exception { return mockMvc.perform( post("/members/basic-inform") .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) diff --git a/src/test/java/liaison/linkit/profile/presentation/AttachControllerTest.java b/src/test/java/liaison/linkit/profile/presentation/AttachControllerTest.java index 7b5d613e..2b5a119b 100644 --- a/src/test/java/liaison/linkit/profile/presentation/AttachControllerTest.java +++ b/src/test/java/liaison/linkit/profile/presentation/AttachControllerTest.java @@ -6,7 +6,6 @@ import liaison.linkit.login.domain.MemberTokens; import liaison.linkit.profile.dto.request.attach.AttachFileCreateRequest; import liaison.linkit.profile.dto.request.attach.AttachUrlCreateRequest; -import liaison.linkit.profile.service.AttachService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -74,13 +73,15 @@ private void makeAttachUrl() throws Exception { "https://www.notion.no" ); - final List attachUrlCreateRequestList = Arrays.asList(attachUrlCreateRequest1, attachUrlCreateRequest2); + final List attachUrlCreateRequestList = Arrays.asList(attachUrlCreateRequest1, + attachUrlCreateRequest2); doNothing().when(attachService).saveUrl(1L, attachUrlCreateRequestList); performPostUrlRequest(attachUrlCreateRequestList); } - private ResultActions performPostUrlRequest(final List attachUrlCreateRequests) throws Exception { + private ResultActions performPostUrlRequest(final List attachUrlCreateRequests) + throws Exception { return mockMvc.perform( post("/private/attach/url") .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) @@ -114,7 +115,8 @@ private ResultActions performDeleteUrlRequest( ); } - private ResultActions performPostFileRequest(final AttachFileCreateRequest attachFileCreateRequest) throws Exception { + private ResultActions performPostFileRequest(final AttachFileCreateRequest attachFileCreateRequest) + throws Exception { return mockMvc.perform( post("/attach/file") .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) @@ -138,7 +140,8 @@ void createAttachUrl() throws Exception { "https://www.notion.no" ); - final List attachUrlCreateRequestList = Arrays.asList(attachUrlCreateRequest1, attachUrlCreateRequest2); + final List attachUrlCreateRequestList = Arrays.asList(attachUrlCreateRequest1, + attachUrlCreateRequest2); // doNothing().when(attachService).saveUrl(anyLong(), attachUrlCreateRequestList); // when diff --git a/src/test/java/liaison/linkit/profile/presentation/BrowsePrivateProfileControllerTest.java b/src/test/java/liaison/linkit/profile/presentation/BrowsePrivateProfileControllerTest.java index ee1315e9..7dc99fa1 100644 --- a/src/test/java/liaison/linkit/profile/presentation/BrowsePrivateProfileControllerTest.java +++ b/src/test/java/liaison/linkit/profile/presentation/BrowsePrivateProfileControllerTest.java @@ -1,13 +1,25 @@ package liaison.linkit.profile.presentation; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.Cookie; +import java.util.Arrays; +import java.util.List; import liaison.linkit.global.ControllerTest; import liaison.linkit.login.domain.MemberTokens; import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; -import liaison.linkit.profile.dto.response.attach.AttachResponse; -import liaison.linkit.profile.dto.response.attach.AttachUrlResponse; import liaison.linkit.profile.dto.response.awards.AwardsResponse; import liaison.linkit.profile.dto.response.browse.BrowsePrivateProfileResponse; import liaison.linkit.profile.dto.response.completion.CompletionResponse; @@ -17,7 +29,16 @@ import liaison.linkit.profile.dto.response.onBoarding.JobAndSkillResponse; import liaison.linkit.profile.dto.response.profileRegion.ProfileRegionResponse; import liaison.linkit.profile.dto.response.teamBuilding.ProfileTeamBuildingFieldResponse; -import liaison.linkit.profile.service.*; +import liaison.linkit.profile.service.AntecedentsService; +import liaison.linkit.profile.service.AwardsService; +import liaison.linkit.profile.service.BrowsePrivateProfileService; +import liaison.linkit.profile.service.CompletionService; +import liaison.linkit.profile.service.EducationService; +import liaison.linkit.profile.service.MiniProfileService; +import liaison.linkit.profile.service.ProfileOnBoardingService; +import liaison.linkit.profile.service.ProfileRegionService; +import liaison.linkit.profile.service.ProfileService; +import liaison.linkit.profile.service.TeamBuildingFieldService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -30,19 +51,6 @@ import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.ResultActions; -import java.util.Arrays; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.when; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @WebMvcTest(BrowsePrivateProfileController.class) @MockBean(JpaMetamodelMappingContext.class) @AutoConfigureRestDocs @@ -70,8 +78,6 @@ public class BrowsePrivateProfileControllerTest extends ControllerTest { @MockBean public AwardsService awardsService; @MockBean - public AttachService attachService; - @MockBean public ProfileRegionService profileRegionService; @MockBean public BrowsePrivateProfileService browsePrivateProfileService; @@ -84,7 +90,7 @@ void setUp() { } private ResultActions performGetBrowsePrivateProfile( - final int miniProfileId + final int miniProfileId ) throws Exception { return mockMvc.perform( RestDocumentationRequestBuilders.get("/browse/private/profile/{miniProfileId}", miniProfileId) @@ -134,8 +140,10 @@ void getBrowsePrivateProfile() throws Exception { given(profileOnBoardingService.getJobAndSkill(1L)).willReturn(jobAndSkillResponse); List teamBuildingFieldNames = Arrays.asList("공모전", "대회", "창업"); - final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = new ProfileTeamBuildingFieldResponse(teamBuildingFieldNames); - given(teamBuildingFieldService.getAllProfileTeamBuildingFields(1L)).willReturn(profileTeamBuildingFieldResponse); + final ProfileTeamBuildingFieldResponse profileTeamBuildingFieldResponse = new ProfileTeamBuildingFieldResponse( + teamBuildingFieldNames); + given(teamBuildingFieldService.getAllProfileTeamBuildingFields(1L)).willReturn( + profileTeamBuildingFieldResponse); final ProfileRegionResponse profileRegionResponse = new ProfileRegionResponse("서울특별시", "강남구"); given(profileRegionService.getPersonalProfileRegion(1L)).willReturn(profileRegionResponse); @@ -167,16 +175,8 @@ void getBrowsePrivateProfile() throws Exception { final List awardsResponses = Arrays.asList(firstAwardsResponse, secondAwardsResponse); given(awardsService.getAllAwards(1L)).willReturn(awardsResponses); - final AttachResponse attachResponse = new AttachResponse( - Arrays.asList( - new AttachUrlResponse(2L, "깃허브", "https://github.com/TEAM-LIAISON"), - new AttachUrlResponse(3L, "노션", "https://www.notion.so/ko-kr") - ) - ); - given(attachService.getAttachList(1L)).willReturn(attachResponse); - when(browsePrivateProfileService.getProfileResponse( - any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any() + any(), any(), any(), any(), any(), any(), any(), any(), any(), any() )).thenReturn(BrowsePrivateProfileResponse.privateProfile( 1L, miniProfileResponse, @@ -187,8 +187,7 @@ void getBrowsePrivateProfile() throws Exception { profileRegionResponse, antecedentsResponses, educationResponses, - awardsResponses, - attachResponse + awardsResponses )); // when final ResultActions resultActions = performGetBrowsePrivateProfile(miniProfileId); @@ -205,76 +204,118 @@ void getBrowsePrivateProfile() throws Exception { // miniProfileResponse subsectionWithPath("miniProfileResponse").description("사용자의 미니 프로필 정보"), - fieldWithPath("miniProfileResponse.profileTitle").type(JsonFieldType.STRING).description("프로필의 제목"), - fieldWithPath("miniProfileResponse.miniProfileImg").type(JsonFieldType.STRING).description("미니 프로필 이미지 URL"), - fieldWithPath("miniProfileResponse.myKeywordNames").type(JsonFieldType.ARRAY).description("나를 소개하는 키워드 목록"), - fieldWithPath("miniProfileResponse.isActivate").type(JsonFieldType.BOOLEAN).description("미니 프로필 활성화 여부"), - fieldWithPath("miniProfileResponse.memberName").type(JsonFieldType.STRING).description("회원 이름"), - fieldWithPath("miniProfileResponse.jobRoleNames").type(JsonFieldType.ARRAY).description("직무 및 역할"), + fieldWithPath("miniProfileResponse.profileTitle").type(JsonFieldType.STRING) + .description("프로필의 제목"), + fieldWithPath("miniProfileResponse.miniProfileImg").type(JsonFieldType.STRING) + .description("미니 프로필 이미지 URL"), + fieldWithPath("miniProfileResponse.myKeywordNames").type(JsonFieldType.ARRAY) + .description("나를 소개하는 키워드 목록"), + fieldWithPath("miniProfileResponse.isActivate").type(JsonFieldType.BOOLEAN) + .description("미니 프로필 활성화 여부"), + fieldWithPath("miniProfileResponse.memberName").type(JsonFieldType.STRING) + .description("회원 이름"), + fieldWithPath("miniProfileResponse.jobRoleNames").type(JsonFieldType.ARRAY) + .description("직무 및 역할"), // completionResponse subsectionWithPath("completionResponse").description("프로필의 완성도 정보"), - fieldWithPath("completionResponse.completion").type(JsonFieldType.STRING).description("프로필 완성도 (백분율)"), - fieldWithPath("completionResponse.introduction").type(JsonFieldType.BOOLEAN).description("소개의 완성 여부"), - fieldWithPath("completionResponse.profileSkill").type(JsonFieldType.BOOLEAN).description("스킬 섹션의 완성 여부"), - fieldWithPath("completionResponse.profileTeamBuildingField").type(JsonFieldType.BOOLEAN).description("팀 빌딩 필드의 완성 여부"), - fieldWithPath("completionResponse.profileRegion").type(JsonFieldType.BOOLEAN).description("지역 정보의 완성 여부"), - fieldWithPath("completionResponse.antecedents").type(JsonFieldType.BOOLEAN).description("이력 사항의 완성 여부"), - fieldWithPath("completionResponse.education").type(JsonFieldType.BOOLEAN).description("교육 이력의 완성 여부"), - fieldWithPath("completionResponse.awards").type(JsonFieldType.BOOLEAN).description("수상 이력의 완성 여부"), - fieldWithPath("completionResponse.attach").type(JsonFieldType.BOOLEAN).description("첨부 파일의 유무"), + fieldWithPath("completionResponse.completion").type(JsonFieldType.STRING) + .description("프로필 완성도 (백분율)"), + fieldWithPath("completionResponse.introduction").type(JsonFieldType.BOOLEAN) + .description("소개의 완성 여부"), + fieldWithPath("completionResponse.profileSkill").type(JsonFieldType.BOOLEAN) + .description("스킬 섹션의 완성 여부"), + fieldWithPath("completionResponse.profileTeamBuildingField").type(JsonFieldType.BOOLEAN) + .description("팀 빌딩 필드의 완성 여부"), + fieldWithPath("completionResponse.profileRegion").type(JsonFieldType.BOOLEAN) + .description("지역 정보의 완성 여부"), + fieldWithPath("completionResponse.antecedents").type(JsonFieldType.BOOLEAN) + .description("이력 사항의 완성 여부"), + fieldWithPath("completionResponse.education").type(JsonFieldType.BOOLEAN) + .description("교육 이력의 완성 여부"), + fieldWithPath("completionResponse.awards").type(JsonFieldType.BOOLEAN) + .description("수상 이력의 완성 여부"), + fieldWithPath("completionResponse.attach").type(JsonFieldType.BOOLEAN) + .description("첨부 파일의 유무"), // profileIntroductionResponse subsectionWithPath("profileIntroductionResponse").description("프로필 소개"), - fieldWithPath("profileIntroductionResponse.introduction").type(JsonFieldType.STRING).description("소개 내용"), + fieldWithPath("profileIntroductionResponse.introduction").type(JsonFieldType.STRING) + .description("소개 내용"), // jobAndSkillResponse subsectionWithPath("jobAndSkillResponse").description("나의 직무/역할 및 보유 기술 정보"), - fieldWithPath("jobAndSkillResponse.jobRoleNames").type(JsonFieldType.ARRAY).description("직무/역할 명칭"), - fieldWithPath("jobAndSkillResponse.skillNames").type(JsonFieldType.ARRAY).description("보유 기술 명칭"), + fieldWithPath("jobAndSkillResponse.jobRoleNames").type(JsonFieldType.ARRAY) + .description("직무/역할 명칭"), + fieldWithPath("jobAndSkillResponse.skillNames").type(JsonFieldType.ARRAY) + .description("보유 기술 명칭"), // profileTeamBuildingFieldResponse subsectionWithPath("profileTeamBuildingFieldResponse").description("팀 빌딩 필드 응답"), - fieldWithPath("profileTeamBuildingFieldResponse.teamBuildingFieldNames").type(JsonFieldType.ARRAY).description("팀 빌딩 필드 이름"), + fieldWithPath("profileTeamBuildingFieldResponse.teamBuildingFieldNames").type( + JsonFieldType.ARRAY).description("팀 빌딩 필드 이름"), // profileRegionResponse subsectionWithPath("profileRegionResponse").description("활동 지역 및 위치 응답"), - fieldWithPath("profileRegionResponse.cityName").type(JsonFieldType.STRING).description("시/도 이름"), - fieldWithPath("profileRegionResponse.divisionName").type(JsonFieldType.STRING).description("시/군/구 이름"), + fieldWithPath("profileRegionResponse.cityName").type(JsonFieldType.STRING) + .description("시/도 이름"), + fieldWithPath("profileRegionResponse.divisionName").type(JsonFieldType.STRING) + .description("시/군/구 이름"), // antecedentsResponse subsectionWithPath("antecedentsResponse").description("과거 경력 정보"), - fieldWithPath("antecedentsResponse[].id").type(JsonFieldType.NUMBER).description("경력 ID"), - fieldWithPath("antecedentsResponse[].projectName").type(JsonFieldType.STRING).description("프로젝트 이름"), - fieldWithPath("antecedentsResponse[].projectRole").type(JsonFieldType.STRING).description("프로젝트 역할"), - fieldWithPath("antecedentsResponse[].startDate").type(JsonFieldType.STRING).description("시작 연도/월"), - fieldWithPath("antecedentsResponse[].endDate").type(JsonFieldType.STRING).description("종료 연도/월"), - fieldWithPath("antecedentsResponse[].retirement").type(JsonFieldType.BOOLEAN).description("퇴직 여부"), + fieldWithPath("antecedentsResponse[].id").type(JsonFieldType.NUMBER) + .description("경력 ID"), + fieldWithPath("antecedentsResponse[].projectName").type(JsonFieldType.STRING) + .description("프로젝트 이름"), + fieldWithPath("antecedentsResponse[].projectRole").type(JsonFieldType.STRING) + .description("프로젝트 역할"), + fieldWithPath("antecedentsResponse[].startDate").type(JsonFieldType.STRING) + .description("시작 연도/월"), + fieldWithPath("antecedentsResponse[].endDate").type(JsonFieldType.STRING) + .description("종료 연도/월"), + fieldWithPath("antecedentsResponse[].retirement").type(JsonFieldType.BOOLEAN) + .description("퇴직 여부"), // educationResponse subsectionWithPath("educationResponse").description("교육 이력 정보"), - fieldWithPath("educationResponse[].id").type(JsonFieldType.NUMBER).description("교육 이력 ID"), - fieldWithPath("educationResponse[].admissionYear").type(JsonFieldType.NUMBER).description("입학 연도"), - fieldWithPath("educationResponse[].graduationYear").type(JsonFieldType.NUMBER).description("졸업 연도"), - fieldWithPath("educationResponse[].universityName").type(JsonFieldType.STRING).description("대학교 이름"), - fieldWithPath("educationResponse[].majorName").type(JsonFieldType.STRING).description("전공 이름"), - fieldWithPath("educationResponse[].degreeName").type(JsonFieldType.STRING).description("학위명"), + fieldWithPath("educationResponse[].id").type(JsonFieldType.NUMBER) + .description("교육 이력 ID"), + fieldWithPath("educationResponse[].admissionYear").type(JsonFieldType.NUMBER) + .description("입학 연도"), + fieldWithPath("educationResponse[].graduationYear").type(JsonFieldType.NUMBER) + .description("졸업 연도"), + fieldWithPath("educationResponse[].universityName").type(JsonFieldType.STRING) + .description("대학교 이름"), + fieldWithPath("educationResponse[].majorName").type(JsonFieldType.STRING) + .description("전공 이름"), + fieldWithPath("educationResponse[].degreeName").type(JsonFieldType.STRING) + .description("학위명"), // awardsResponse subsectionWithPath("awardsResponse").description("수상 이력 정보"), fieldWithPath("awardsResponse[].id").type(JsonFieldType.NUMBER).description("수상 ID"), - fieldWithPath("awardsResponse[].awardsName").type(JsonFieldType.STRING).description("수상 이름"), - fieldWithPath("awardsResponse[].ranking").type(JsonFieldType.STRING).description("수상 순위"), - fieldWithPath("awardsResponse[].organizer").type(JsonFieldType.STRING).description("주최자"), - fieldWithPath("awardsResponse[].awardsYear").type(JsonFieldType.NUMBER).description("수상 연도"), - fieldWithPath("awardsResponse[].awardsMonth").type(JsonFieldType.NUMBER).description("수상 월"), - fieldWithPath("awardsResponse[].awardsDescription").type(JsonFieldType.STRING).description("수상 내용"), + fieldWithPath("awardsResponse[].awardsName").type(JsonFieldType.STRING) + .description("수상 이름"), + fieldWithPath("awardsResponse[].ranking").type(JsonFieldType.STRING) + .description("수상 순위"), + fieldWithPath("awardsResponse[].organizer").type(JsonFieldType.STRING) + .description("주최자"), + fieldWithPath("awardsResponse[].awardsYear").type(JsonFieldType.NUMBER) + .description("수상 연도"), + fieldWithPath("awardsResponse[].awardsMonth").type(JsonFieldType.NUMBER) + .description("수상 월"), + fieldWithPath("awardsResponse[].awardsDescription").type(JsonFieldType.STRING) + .description("수상 내용"), // attachResponse subsectionWithPath("attachResponse").description("첨부 파일 정보"), - fieldWithPath("attachResponse.attachUrlResponseList[].id").type(JsonFieldType.NUMBER).description("첨부 URL ID"), - fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlName").type(JsonFieldType.STRING).description("첨부된 URL 이름"), - fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlPath").type(JsonFieldType.STRING).description("첨부된 URL") + fieldWithPath("attachResponse.attachUrlResponseList[].id").type(JsonFieldType.NUMBER) + .description("첨부 URL ID"), + fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlName").type( + JsonFieldType.STRING).description("첨부된 URL 이름"), + fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlPath").type( + JsonFieldType.STRING).description("첨부된 URL") // fieldWithPath("attachResponse.attachFileResponseList[].id").type(JsonFieldType.NUMBER).description("첨부 파일 ID"), // fieldWithPath("attachResponse.attachFileResponseList[].attachFilePath").type(JsonFieldType.STRING).description("첨부 파일 URL") ))); diff --git a/src/test/java/liaison/linkit/profile/presentation/ProfileControllerTest.java b/src/test/java/liaison/linkit/profile/presentation/ProfileControllerTest.java index 86ae2481..5a8bcbf3 100644 --- a/src/test/java/liaison/linkit/profile/presentation/ProfileControllerTest.java +++ b/src/test/java/liaison/linkit/profile/presentation/ProfileControllerTest.java @@ -5,7 +5,7 @@ import jakarta.servlet.http.Cookie; import liaison.linkit.global.ControllerTest; import liaison.linkit.login.domain.MemberTokens; -import liaison.linkit.member.service.MemberService; +import liaison.linkit.member.business.MemberService; import liaison.linkit.profile.dto.request.IntroductionRequest; import liaison.linkit.profile.dto.response.ProfileIntroductionResponse; import liaison.linkit.profile.dto.response.ProfileResponse; @@ -99,7 +99,7 @@ void setUp() { } - private void makeIntroduction() throws Exception{ + private void makeIntroduction() throws Exception { final IntroductionRequest introductionRequest = new IntroductionRequest( "자기소개 정보를 생성합니다." ); @@ -315,7 +315,8 @@ void getProfile() throws Exception { // "https://linkit-dev-env-bucket.s3.ap-northeast-1.amazonaws.com/files/A4+-+1.pdf" // ); - final List attachUrlResponseList = Arrays.asList(firstAttachUrlResponse, secondAttachUrlResponse); + final List attachUrlResponseList = Arrays.asList(firstAttachUrlResponse, + secondAttachUrlResponse); // final List attachFileResponseList = Arrays.asList(firstAttachFileResponse); final AttachResponse attachResponses = new AttachResponse( attachUrlResponseList @@ -369,79 +370,124 @@ void getProfile() throws Exception { .attributes(field("constraint", "문자열(jwt)")) ), responseFields( - fieldWithPath("privateProfileEssential").type(JsonFieldType.BOOLEAN).description("내 이력서 필수 입력 항목 존재 여부"), + fieldWithPath("privateProfileEssential").type(JsonFieldType.BOOLEAN) + .description("내 이력서 필수 입력 항목 존재 여부"), // miniProfileResponse subsectionWithPath("miniProfileResponse").description("사용자의 미니 프로필 정보"), - fieldWithPath("miniProfileResponse.profileTitle").type(JsonFieldType.STRING).description("프로필의 제목"), - fieldWithPath("miniProfileResponse.miniProfileImg").type(JsonFieldType.STRING).description("미니 프로필 이미지 URL"), - fieldWithPath("miniProfileResponse.myKeywordNames").type(JsonFieldType.ARRAY).description("나를 소개하는 키워드 목록"), - fieldWithPath("miniProfileResponse.isActivate").type(JsonFieldType.BOOLEAN).description("미니 프로필 활성화 여부"), - fieldWithPath("miniProfileResponse.memberName").type(JsonFieldType.STRING).description("회원 이름"), - fieldWithPath("miniProfileResponse.jobRoleNames").type(JsonFieldType.ARRAY).description("직무 및 역할"), + fieldWithPath("miniProfileResponse.profileTitle").type(JsonFieldType.STRING) + .description("프로필의 제목"), + fieldWithPath("miniProfileResponse.miniProfileImg").type(JsonFieldType.STRING) + .description("미니 프로필 이미지 URL"), + fieldWithPath("miniProfileResponse.myKeywordNames").type(JsonFieldType.ARRAY) + .description("나를 소개하는 키워드 목록"), + fieldWithPath("miniProfileResponse.isActivate").type(JsonFieldType.BOOLEAN) + .description("미니 프로필 활성화 여부"), + fieldWithPath("miniProfileResponse.memberName").type(JsonFieldType.STRING) + .description("회원 이름"), + fieldWithPath("miniProfileResponse.jobRoleNames").type(JsonFieldType.ARRAY) + .description("직무 및 역할"), // completionResponse subsectionWithPath("completionResponse").description("프로필의 완성도 정보"), - fieldWithPath("completionResponse.completion").type(JsonFieldType.STRING).description("프로필 완성도 (백분율)"), - fieldWithPath("completionResponse.introduction").type(JsonFieldType.BOOLEAN).description("소개의 완성 여부"), - fieldWithPath("completionResponse.profileSkill").type(JsonFieldType.BOOLEAN).description("스킬 섹션의 완성 여부"), - fieldWithPath("completionResponse.profileTeamBuildingField").type(JsonFieldType.BOOLEAN).description("팀 빌딩 필드의 완성 여부"), - fieldWithPath("completionResponse.profileRegion").type(JsonFieldType.BOOLEAN).description("지역 정보의 완성 여부"), - fieldWithPath("completionResponse.antecedents").type(JsonFieldType.BOOLEAN).description("이력 사항의 완성 여부"), - fieldWithPath("completionResponse.education").type(JsonFieldType.BOOLEAN).description("교육 이력의 완성 여부"), - fieldWithPath("completionResponse.awards").type(JsonFieldType.BOOLEAN).description("수상 이력의 완성 여부"), - fieldWithPath("completionResponse.attach").type(JsonFieldType.BOOLEAN).description("첨부 파일의 유무"), + fieldWithPath("completionResponse.completion").type(JsonFieldType.STRING) + .description("프로필 완성도 (백분율)"), + fieldWithPath("completionResponse.introduction").type(JsonFieldType.BOOLEAN) + .description("소개의 완성 여부"), + fieldWithPath("completionResponse.profileSkill").type(JsonFieldType.BOOLEAN) + .description("스킬 섹션의 완성 여부"), + fieldWithPath("completionResponse.profileTeamBuildingField").type( + JsonFieldType.BOOLEAN).description("팀 빌딩 필드의 완성 여부"), + fieldWithPath("completionResponse.profileRegion").type(JsonFieldType.BOOLEAN) + .description("지역 정보의 완성 여부"), + fieldWithPath("completionResponse.antecedents").type(JsonFieldType.BOOLEAN) + .description("이력 사항의 완성 여부"), + fieldWithPath("completionResponse.education").type(JsonFieldType.BOOLEAN) + .description("교육 이력의 완성 여부"), + fieldWithPath("completionResponse.awards").type(JsonFieldType.BOOLEAN) + .description("수상 이력의 완성 여부"), + fieldWithPath("completionResponse.attach").type(JsonFieldType.BOOLEAN) + .description("첨부 파일의 유무"), // profileIntroductionResponse subsectionWithPath("profileIntroductionResponse").description("프로필 소개"), - fieldWithPath("profileIntroductionResponse.introduction").type(JsonFieldType.STRING).description("소개 내용"), + fieldWithPath("profileIntroductionResponse.introduction").type( + JsonFieldType.STRING).description("소개 내용"), // jobAndSkillResponse subsectionWithPath("jobAndSkillResponse").description("나의 직무/역할 및 보유 기술 정보"), - fieldWithPath("jobAndSkillResponse.jobRoleNames").type(JsonFieldType.ARRAY).description("직무/역할 명칭"), - fieldWithPath("jobAndSkillResponse.skillNames").type(JsonFieldType.ARRAY).description("보유 기술 명칭"), + fieldWithPath("jobAndSkillResponse.jobRoleNames").type(JsonFieldType.ARRAY) + .description("직무/역할 명칭"), + fieldWithPath("jobAndSkillResponse.skillNames").type(JsonFieldType.ARRAY) + .description("보유 기술 명칭"), // profileTeamBuildingFieldResponse - subsectionWithPath("profileTeamBuildingFieldResponse").description("팀 빌딩 필드 응답"), - fieldWithPath("profileTeamBuildingFieldResponse.teamBuildingFieldNames").type(JsonFieldType.ARRAY).description("팀 빌딩 필드 이름"), + subsectionWithPath("profileTeamBuildingFieldResponse").description( + "팀 빌딩 필드 응답"), + fieldWithPath("profileTeamBuildingFieldResponse.teamBuildingFieldNames").type( + JsonFieldType.ARRAY).description("팀 빌딩 필드 이름"), // profileRegionResponse subsectionWithPath("profileRegionResponse").description("활동 지역 및 위치 응답"), - fieldWithPath("profileRegionResponse.cityName").type(JsonFieldType.STRING).description("시/도 이름"), - fieldWithPath("profileRegionResponse.divisionName").type(JsonFieldType.STRING).description("시/군/구 이름"), + fieldWithPath("profileRegionResponse.cityName").type(JsonFieldType.STRING) + .description("시/도 이름"), + fieldWithPath("profileRegionResponse.divisionName").type(JsonFieldType.STRING) + .description("시/군/구 이름"), // antecedentsResponse subsectionWithPath("antecedentsResponse").description("과거 경력 정보"), - fieldWithPath("antecedentsResponse[].id").type(JsonFieldType.NUMBER).description("경력 ID"), - fieldWithPath("antecedentsResponse[].projectName").type(JsonFieldType.STRING).description("프로젝트 이름"), - fieldWithPath("antecedentsResponse[].projectRole").type(JsonFieldType.STRING).description("프로젝트 역할"), - fieldWithPath("antecedentsResponse[].startDate").type(JsonFieldType.STRING).description("시작 연도/월"), - fieldWithPath("antecedentsResponse[].endDate").type(JsonFieldType.STRING).description("종료 연도/월"), - fieldWithPath("antecedentsResponse[].retirement").type(JsonFieldType.BOOLEAN).description("퇴직 여부"), + fieldWithPath("antecedentsResponse[].id").type(JsonFieldType.NUMBER) + .description("경력 ID"), + fieldWithPath("antecedentsResponse[].projectName").type(JsonFieldType.STRING) + .description("프로젝트 이름"), + fieldWithPath("antecedentsResponse[].projectRole").type(JsonFieldType.STRING) + .description("프로젝트 역할"), + fieldWithPath("antecedentsResponse[].startDate").type(JsonFieldType.STRING) + .description("시작 연도/월"), + fieldWithPath("antecedentsResponse[].endDate").type(JsonFieldType.STRING) + .description("종료 연도/월"), + fieldWithPath("antecedentsResponse[].retirement").type(JsonFieldType.BOOLEAN) + .description("퇴직 여부"), // educationResponse subsectionWithPath("educationResponse").description("교육 이력 정보"), - fieldWithPath("educationResponse[].id").type(JsonFieldType.NUMBER).description("교육 이력 ID"), - fieldWithPath("educationResponse[].admissionYear").type(JsonFieldType.NUMBER).description("입학 연도"), - fieldWithPath("educationResponse[].graduationYear").type(JsonFieldType.NUMBER).description("졸업 연도"), - fieldWithPath("educationResponse[].universityName").type(JsonFieldType.STRING).description("대학교 이름"), - fieldWithPath("educationResponse[].majorName").type(JsonFieldType.STRING).description("전공 이름"), - fieldWithPath("educationResponse[].degreeName").type(JsonFieldType.STRING).description("학위명"), + fieldWithPath("educationResponse[].id").type(JsonFieldType.NUMBER) + .description("교육 이력 ID"), + fieldWithPath("educationResponse[].admissionYear").type(JsonFieldType.NUMBER) + .description("입학 연도"), + fieldWithPath("educationResponse[].graduationYear").type(JsonFieldType.NUMBER) + .description("졸업 연도"), + fieldWithPath("educationResponse[].universityName").type(JsonFieldType.STRING) + .description("대학교 이름"), + fieldWithPath("educationResponse[].majorName").type(JsonFieldType.STRING) + .description("전공 이름"), + fieldWithPath("educationResponse[].degreeName").type(JsonFieldType.STRING) + .description("학위명"), // awardsResponse subsectionWithPath("awardsResponse").description("수상 이력 정보"), - fieldWithPath("awardsResponse[].id").type(JsonFieldType.NUMBER).description("수상 ID"), - fieldWithPath("awardsResponse[].awardsName").type(JsonFieldType.STRING).description("수상 이름"), - fieldWithPath("awardsResponse[].ranking").type(JsonFieldType.STRING).description("수상 순위"), - fieldWithPath("awardsResponse[].organizer").type(JsonFieldType.STRING).description("주최자"), - fieldWithPath("awardsResponse[].awardsYear").type(JsonFieldType.NUMBER).description("수상 연도"), - fieldWithPath("awardsResponse[].awardsMonth").type(JsonFieldType.NUMBER).description("수상 월"), - fieldWithPath("awardsResponse[].awardsDescription").type(JsonFieldType.STRING).description("수상 내용"), + fieldWithPath("awardsResponse[].id").type(JsonFieldType.NUMBER) + .description("수상 ID"), + fieldWithPath("awardsResponse[].awardsName").type(JsonFieldType.STRING) + .description("수상 이름"), + fieldWithPath("awardsResponse[].ranking").type(JsonFieldType.STRING) + .description("수상 순위"), + fieldWithPath("awardsResponse[].organizer").type(JsonFieldType.STRING) + .description("주최자"), + fieldWithPath("awardsResponse[].awardsYear").type(JsonFieldType.NUMBER) + .description("수상 연도"), + fieldWithPath("awardsResponse[].awardsMonth").type(JsonFieldType.NUMBER) + .description("수상 월"), + fieldWithPath("awardsResponse[].awardsDescription").type(JsonFieldType.STRING) + .description("수상 내용"), // attachResponse subsectionWithPath("attachResponse").description("첨부 파일 정보"), - fieldWithPath("attachResponse.attachUrlResponseList[].id").type(JsonFieldType.NUMBER).description("첨부 URL ID"), - fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlName").type(JsonFieldType.STRING).description("첨부된 URL 이름"), - fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlPath").type(JsonFieldType.STRING).description("첨부된 URL") + fieldWithPath("attachResponse.attachUrlResponseList[].id").type( + JsonFieldType.NUMBER).description("첨부 URL ID"), + fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlName").type( + JsonFieldType.STRING).description("첨부된 URL 이름"), + fieldWithPath("attachResponse.attachUrlResponseList[].attachUrlPath").type( + JsonFieldType.STRING).description("첨부된 URL") // fieldWithPath("attachResponse.attachFileResponseList[].id").type(JsonFieldType.NUMBER).description("첨부 파일 ID"), // fieldWithPath("attachResponse.attachFileResponseList[].attachFilePath").type(JsonFieldType.STRING).description("첨부 파일 URL") ) diff --git a/src/test/java/liaison/linkit/profile/presentation/ProfileOnBoardingControllerTest.java b/src/test/java/liaison/linkit/profile/presentation/ProfileOnBoardingControllerTest.java index 8a131890..861ed25c 100644 --- a/src/test/java/liaison/linkit/profile/presentation/ProfileOnBoardingControllerTest.java +++ b/src/test/java/liaison/linkit/profile/presentation/ProfileOnBoardingControllerTest.java @@ -5,7 +5,7 @@ import jakarta.servlet.http.Cookie; import liaison.linkit.global.ControllerTest; import liaison.linkit.login.domain.MemberTokens; -import liaison.linkit.member.service.MemberService; +import liaison.linkit.member.business.MemberService; import liaison.linkit.profile.dto.request.onBoarding.OnBoardingPersonalJobAndSkillCreateRequest; import liaison.linkit.profile.dto.response.antecedents.AntecedentsResponse; import liaison.linkit.profile.dto.response.education.EducationResponse; @@ -117,7 +117,8 @@ void createOnBoardingPersonalJobAndSkill() throws Exception { List jobRoleNames = Arrays.asList("공모전, 대회, 창업"); List skillNames = Arrays.asList("Notion, Figma"); - final OnBoardingPersonalJobAndSkillCreateRequest createRequest = new OnBoardingPersonalJobAndSkillCreateRequest(jobRoleNames, skillNames); + final OnBoardingPersonalJobAndSkillCreateRequest createRequest = new OnBoardingPersonalJobAndSkillCreateRequest( + jobRoleNames, skillNames); // when final ResultActions resultActions = performCreateOnBoardingPersonalJobAndSkillRequest(createRequest); @@ -275,40 +276,68 @@ void getOnBoardingProfile() throws Exception { .attributes(field("constraint", "문자열(jwt)")) ), responseFields( - subsectionWithPath("profileTeamBuildingFieldResponse").description("희망 팀빌딩 분야 항목").attributes(field("constraint", "객체")), - fieldWithPath("profileTeamBuildingFieldResponse.teamBuildingFieldNames").description("희망 팀빌딩 분야 이름").attributes(field("constraint", "문자열(배열)")), + subsectionWithPath("profileTeamBuildingFieldResponse").description( + "희망 팀빌딩 분야 항목").attributes(field("constraint", "객체")), + fieldWithPath( + "profileTeamBuildingFieldResponse.teamBuildingFieldNames").description( + "희망 팀빌딩 분야 이름").attributes(field("constraint", "문자열(배열)")), // jobAndSkillResponse subsectionWithPath("jobAndSkillResponse").description("나의 직무/역할 및 보유 기술 정보"), - fieldWithPath("jobAndSkillResponse.jobRoleNames").type(JsonFieldType.ARRAY).description("직무/역할 명칭"), - fieldWithPath("jobAndSkillResponse.skillNames").type(JsonFieldType.ARRAY).description("보유 기술 명칭"), - - subsectionWithPath("profileRegionResponse").description("지역 및 위치 항목").attributes(field("constraint", "객체")), - fieldWithPath("profileRegionResponse.cityName").description("시/구 이름").attributes(field("constraint", "문자열")), - fieldWithPath("profileRegionResponse.divisionName").description("시/군/구 이름").attributes(field("constraint", "문자열")), - - subsectionWithPath("educationResponses").description("학력 항목").attributes(field("constraint", "객체 (배열)")), - fieldWithPath("educationResponses[].id").description("학력 ID").attributes(field("constraint", "양의 정수")), - fieldWithPath("educationResponses[].admissionYear").description("입학 연도").attributes(field("constraint", "양의 정수")), - fieldWithPath("educationResponses[].graduationYear").description("졸업 연도").attributes(field("constraint", "양의 정수")), - fieldWithPath("educationResponses[].universityName").description("학교 이름").attributes(field("constraint", "문자열")), - fieldWithPath("educationResponses[].majorName").description("전공 이름").attributes(field("constraint", "문자열")), - fieldWithPath("educationResponses[].degreeName").description("학위 이름").attributes(field("constraint", "문자열")), - - subsectionWithPath("antecedentsResponses").description("이력 항목").attributes(field("constraint", "객체(배열)")), - fieldWithPath("antecedentsResponses[].projectName").description("회사 이름").attributes(field("constraint", "문자열")), - fieldWithPath("antecedentsResponses[].projectRole").description("포지션").attributes(field("constraint", "문자열")), - fieldWithPath("antecedentsResponses[].startDate").type(JsonFieldType.STRING).description("시작 연도/월"), - fieldWithPath("antecedentsResponses[].endDate").type(JsonFieldType.STRING).description("종료 연도/월"), - fieldWithPath("antecedentsResponses[].retirement").description("재직 여부").attributes(field("constraint", "boolean")), - - subsectionWithPath("miniProfileResponse").description("미니 프로필(내 이력서) 항목").attributes(field("constraint", "객체 (배열)")), - fieldWithPath("miniProfileResponse.profileTitle").type(JsonFieldType.STRING).description("프로필의 제목"), - fieldWithPath("miniProfileResponse.miniProfileImg").type(JsonFieldType.STRING).description("미니 프로필 이미지 URL"), - fieldWithPath("miniProfileResponse.myKeywordNames").type(JsonFieldType.ARRAY).description("나를 소개하는 키워드 목록"), - fieldWithPath("miniProfileResponse.isActivate").type(JsonFieldType.BOOLEAN).description("미니 프로필 활성화 여부"), - fieldWithPath("miniProfileResponse.memberName").type(JsonFieldType.STRING).description("회원 이름"), - fieldWithPath("miniProfileResponse.jobRoleNames").type(JsonFieldType.ARRAY).description("직무 및 역할") + fieldWithPath("jobAndSkillResponse.jobRoleNames").type(JsonFieldType.ARRAY) + .description("직무/역할 명칭"), + fieldWithPath("jobAndSkillResponse.skillNames").type(JsonFieldType.ARRAY) + .description("보유 기술 명칭"), + + subsectionWithPath("profileRegionResponse").description("지역 및 위치 항목") + .attributes(field("constraint", "객체")), + fieldWithPath("profileRegionResponse.cityName").description("시/구 이름") + .attributes(field("constraint", "문자열")), + fieldWithPath("profileRegionResponse.divisionName").description("시/군/구 이름") + .attributes(field("constraint", "문자열")), + + subsectionWithPath("educationResponses").description("학력 항목") + .attributes(field("constraint", "객체 (배열)")), + fieldWithPath("educationResponses[].id").description("학력 ID") + .attributes(field("constraint", "양의 정수")), + fieldWithPath("educationResponses[].admissionYear").description("입학 연도") + .attributes(field("constraint", "양의 정수")), + fieldWithPath("educationResponses[].graduationYear").description("졸업 연도") + .attributes(field("constraint", "양의 정수")), + fieldWithPath("educationResponses[].universityName").description("학교 이름") + .attributes(field("constraint", "문자열")), + fieldWithPath("educationResponses[].majorName").description("전공 이름") + .attributes(field("constraint", "문자열")), + fieldWithPath("educationResponses[].degreeName").description("학위 이름") + .attributes(field("constraint", "문자열")), + + subsectionWithPath("antecedentsResponses").description("이력 항목") + .attributes(field("constraint", "객체(배열)")), + fieldWithPath("antecedentsResponses[].projectName").description("회사 이름") + .attributes(field("constraint", "문자열")), + fieldWithPath("antecedentsResponses[].projectRole").description("포지션") + .attributes(field("constraint", "문자열")), + fieldWithPath("antecedentsResponses[].startDate").type(JsonFieldType.STRING) + .description("시작 연도/월"), + fieldWithPath("antecedentsResponses[].endDate").type(JsonFieldType.STRING) + .description("종료 연도/월"), + fieldWithPath("antecedentsResponses[].retirement").description("재직 여부") + .attributes(field("constraint", "boolean")), + + subsectionWithPath("miniProfileResponse").description("미니 프로필(내 이력서) 항목") + .attributes(field("constraint", "객체 (배열)")), + fieldWithPath("miniProfileResponse.profileTitle").type(JsonFieldType.STRING) + .description("프로필의 제목"), + fieldWithPath("miniProfileResponse.miniProfileImg").type(JsonFieldType.STRING) + .description("미니 프로필 이미지 URL"), + fieldWithPath("miniProfileResponse.myKeywordNames").type(JsonFieldType.ARRAY) + .description("나를 소개하는 키워드 목록"), + fieldWithPath("miniProfileResponse.isActivate").type(JsonFieldType.BOOLEAN) + .description("미니 프로필 활성화 여부"), + fieldWithPath("miniProfileResponse.memberName").type(JsonFieldType.STRING) + .description("회원 이름"), + fieldWithPath("miniProfileResponse.jobRoleNames").type(JsonFieldType.ARRAY) + .description("직무 및 역할") ) ) ); diff --git a/src/test/java/liaison/linkit/team/presentation/BrowseTeamProfileControllerTest.java b/src/test/java/liaison/linkit/team/presentation/BrowseTeamProfileControllerTest.java index fda3842b..b6680fbc 100644 --- a/src/test/java/liaison/linkit/team/presentation/BrowseTeamProfileControllerTest.java +++ b/src/test/java/liaison/linkit/team/presentation/BrowseTeamProfileControllerTest.java @@ -1,8 +1,23 @@ package liaison.linkit.team.presentation; +import static liaison.linkit.global.restdocs.RestDocsConfiguration.field; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.Cookie; +import java.util.Arrays; +import java.util.List; import liaison.linkit.global.ControllerTest; import liaison.linkit.login.domain.MemberTokens; import liaison.linkit.team.dto.response.TeamMemberIntroductionResponse; @@ -11,13 +26,19 @@ import liaison.linkit.team.dto.response.TeamProfileTeamBuildingFieldResponse; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachUrlResponse; import liaison.linkit.team.dto.response.browse.BrowseTeamProfileResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; -import liaison.linkit.team.service.*; +import liaison.linkit.team.service.ActivityService; +import liaison.linkit.team.service.BrowseTeamProfileService; +import liaison.linkit.team.service.HistoryService; +import liaison.linkit.team.service.TeamCompletionService; +import liaison.linkit.team.service.TeamMemberAnnouncementService; +import liaison.linkit.team.service.TeamMemberIntroductionService; +import liaison.linkit.team.service.TeamMiniProfileService; +import liaison.linkit.team.service.TeamProfileService; +import liaison.linkit.team.service.TeamProfileTeamBuildingFieldService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -30,20 +51,6 @@ import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.ResultActions; -import java.util.Arrays; -import java.util.List; - -import static liaison.linkit.global.restdocs.RestDocsConfiguration.field; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.when; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @WebMvcTest(BrowseTeamProfileController.class) @MockBean(JpaMetamodelMappingContext.class) @AutoConfigureRestDocs @@ -72,8 +79,6 @@ public class BrowseTeamProfileControllerTest extends ControllerTest { public TeamMemberIntroductionService teamMemberIntroductionService; @MockBean public HistoryService historyService; - @MockBean - public TeamAttachService teamAttachService; @BeforeEach void setUp() { @@ -106,7 +111,9 @@ void getBrowseTeamProfile() throws Exception { given(browseTeamProfileService.getTeamProfileIsValue(1L)).willReturn(teamProfileIsValueResponse); // 팀 소개서 필수 항목 존재 여부 - final boolean isTeamProfileEssential = (teamProfileIsValueResponse.isTeamMiniProfile() && teamProfileIsValueResponse.isActivity() && teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); + final boolean isTeamProfileEssential = (teamProfileIsValueResponse.isTeamMiniProfile() + && teamProfileIsValueResponse.isActivity() + && teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); // 4.1. 미니 프로필 final TeamMiniProfileResponse teamMiniProfileResponse = new TeamMiniProfileResponse( @@ -134,7 +141,8 @@ void getBrowseTeamProfile() throws Exception { final TeamProfileTeamBuildingFieldResponse teamProfileTeamBuildingFieldResponse = new TeamProfileTeamBuildingFieldResponse( teamBuildingFieldNames ); - given(teamProfileTeamBuildingFieldService.getAllTeamProfileTeamBuildingFields(1L)).willReturn(teamProfileTeamBuildingFieldResponse); + given(teamProfileTeamBuildingFieldService.getAllTeamProfileTeamBuildingFields(1L)).willReturn( + teamProfileTeamBuildingFieldResponse); // 4.5. 팀원 공고 final TeamMemberAnnouncementResponse firstTeamMemberAnnouncementResponse = new TeamMemberAnnouncementResponse( @@ -159,10 +167,11 @@ void getBrowseTeamProfile() throws Exception { false ); + final List teamMemberAnnouncementResponseList = Arrays.asList( + firstTeamMemberAnnouncementResponse, secondTeamMemberAnnouncementResponse); - final List teamMemberAnnouncementResponseList = Arrays.asList(firstTeamMemberAnnouncementResponse, secondTeamMemberAnnouncementResponse); - - given(teamMemberAnnouncementService.getTeamMemberAnnouncements(1L)).willReturn(teamMemberAnnouncementResponseList); + given(teamMemberAnnouncementService.getTeamMemberAnnouncements(1L)).willReturn( + teamMemberAnnouncementResponseList); // 4.6. 활동 방식 + 활동 지역/위치 final List activityTagName = Arrays.asList("사무실 있음", "비대면 활동"); @@ -194,8 +203,10 @@ void getBrowseTeamProfile() throws Exception { "백엔드 개발자입니다." ); - final List teamMemberIntroductionResponseList = Arrays.asList(firstTeamMemberIntroductionResponse, secondTeamMemberIntroductionResponse); - given(teamMemberIntroductionService.getAllTeamMemberIntroduction(1L)).willReturn(teamMemberIntroductionResponseList); + final List teamMemberIntroductionResponseList = Arrays.asList( + firstTeamMemberIntroductionResponse, secondTeamMemberIntroductionResponse); + given(teamMemberIntroductionService.getAllTeamMemberIntroduction(1L)).willReturn( + teamMemberIntroductionResponseList); // 4.9. 연혁 final HistoryResponse firstHistoryResponse = new HistoryResponse( @@ -218,29 +229,8 @@ void getBrowseTeamProfile() throws Exception { final List historyResponseList = Arrays.asList(firstHistoryResponse, secondHistoryResponse); given(historyService.getAllHistories(1L)).willReturn(historyResponseList); - // 4.10. 첨부 - final TeamAttachUrlResponse firstTeamAttachUrlResponse = new TeamAttachUrlResponse( - 1L, - "깃허브", - "https://github.com/TEAM-LIAISON" - ); - - final TeamAttachUrlResponse secondTeamAttachUrlResponse = new TeamAttachUrlResponse( - 2L, - "노션", - "https://www.notion.so/ko-kr" - ); - - final List teamAttachUrlResponseList = Arrays.asList(firstTeamAttachUrlResponse, secondTeamAttachUrlResponse); - final TeamAttachResponse teamAttachResponse = new TeamAttachResponse( - teamAttachUrlResponseList - ); - given(teamAttachService.getTeamAttachList(1L)).willReturn(teamAttachResponse); - - - when(browseTeamProfileService.getBrowseTeamProfileResponse( - any(), any(), any(), any(), any(), any(), any(), any(), any(), any() + any(), any(), any(), any(), any(), any(), any(), any(), any() )).thenReturn(BrowseTeamProfileResponse.teamProfile( 1L, teamMiniProfileResponse, @@ -250,8 +240,7 @@ void getBrowseTeamProfile() throws Exception { activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponseList, - historyResponseList, - teamAttachResponse + historyResponseList )); // when @@ -266,73 +255,127 @@ void getBrowseTeamProfile() throws Exception { .description("팀 미니 프로필 ID") ), responseFields( - fieldWithPath("teamProfileId").type(JsonFieldType.NUMBER).description("타깃 열람 팀 소개서 PK ID"), + fieldWithPath("teamProfileId").type(JsonFieldType.NUMBER) + .description("타깃 열람 팀 소개서 PK ID"), // 4.1. - subsectionWithPath("teamMiniProfileResponse").type(JsonFieldType.OBJECT).description("팀 미니 프로필 응답 객체"), - - fieldWithPath("teamMiniProfileResponse.sectorName").type(JsonFieldType.STRING).description("팀 미니 프로필 분야"), - fieldWithPath("teamMiniProfileResponse.sizeType").type(JsonFieldType.STRING).description("팀 미니 프로필 규모"), - fieldWithPath("teamMiniProfileResponse.teamName").type(JsonFieldType.STRING).description("팀 이름"), - fieldWithPath("teamMiniProfileResponse.teamProfileTitle").type(JsonFieldType.STRING).description("팀 미니 프로필 제목"), - fieldWithPath("teamMiniProfileResponse.isTeamActivate").type(JsonFieldType.BOOLEAN).description("팀 소개서 활성화 여부"), - fieldWithPath("teamMiniProfileResponse.teamLogoImageUrl").type(JsonFieldType.STRING).description("이미지 파일 소스 경로"), - fieldWithPath("teamMiniProfileResponse.teamKeywordNames").type(JsonFieldType.ARRAY).description("팀 소개 항목").attributes(field("constraint", "문자열 배열")), + subsectionWithPath("teamMiniProfileResponse").type(JsonFieldType.OBJECT) + .description("팀 미니 프로필 응답 객체"), + + fieldWithPath("teamMiniProfileResponse.sectorName").type(JsonFieldType.STRING) + .description("팀 미니 프로필 분야"), + fieldWithPath("teamMiniProfileResponse.sizeType").type(JsonFieldType.STRING) + .description("팀 미니 프로필 규모"), + fieldWithPath("teamMiniProfileResponse.teamName").type(JsonFieldType.STRING) + .description("팀 이름"), + fieldWithPath("teamMiniProfileResponse.teamProfileTitle").type( + JsonFieldType.STRING).description("팀 미니 프로필 제목"), + fieldWithPath("teamMiniProfileResponse.isTeamActivate").type( + JsonFieldType.BOOLEAN).description("팀 소개서 활성화 여부"), + fieldWithPath("teamMiniProfileResponse.teamLogoImageUrl").type( + JsonFieldType.STRING).description("이미지 파일 소스 경로"), + fieldWithPath("teamMiniProfileResponse.teamKeywordNames").type( + JsonFieldType.ARRAY).description("팀 소개 항목") + .attributes(field("constraint", "문자열 배열")), // 4.3. - subsectionWithPath("teamCompletionResponse").type(JsonFieldType.OBJECT).description("팀 소개서 완성도 응답 객체"), - fieldWithPath("teamCompletionResponse.teamCompletion").type(JsonFieldType.STRING).description("팀 소개서 완성도 % 값"), - fieldWithPath("teamCompletionResponse.teamProfileTeamBuildingField").type(JsonFieldType.BOOLEAN).description("희망 팀빌딩 분야 기입 여부"), - fieldWithPath("teamCompletionResponse.teamMemberAnnouncement").type(JsonFieldType.BOOLEAN).description("팀원 공고"), - fieldWithPath("teamCompletionResponse.activity").type(JsonFieldType.BOOLEAN).description("활동 방식 및 활동 지역 및 위치"), - fieldWithPath("teamCompletionResponse.teamIntroduction").type(JsonFieldType.BOOLEAN).description("팀 소개"), - fieldWithPath("teamCompletionResponse.teamMemberIntroduction").type(JsonFieldType.BOOLEAN).description("팀원 소개"), - fieldWithPath("teamCompletionResponse.history").type(JsonFieldType.BOOLEAN).description("연혁"), - fieldWithPath("teamCompletionResponse.teamAttach").type(JsonFieldType.BOOLEAN).description("첨부"), + subsectionWithPath("teamCompletionResponse").type(JsonFieldType.OBJECT) + .description("팀 소개서 완성도 응답 객체"), + fieldWithPath("teamCompletionResponse.teamCompletion").type( + JsonFieldType.STRING).description("팀 소개서 완성도 % 값"), + fieldWithPath("teamCompletionResponse.teamProfileTeamBuildingField").type( + JsonFieldType.BOOLEAN).description("희망 팀빌딩 분야 기입 여부"), + fieldWithPath("teamCompletionResponse.teamMemberAnnouncement").type( + JsonFieldType.BOOLEAN).description("팀원 공고"), + fieldWithPath("teamCompletionResponse.activity").type(JsonFieldType.BOOLEAN) + .description("활동 방식 및 활동 지역 및 위치"), + fieldWithPath("teamCompletionResponse.teamIntroduction").type( + JsonFieldType.BOOLEAN).description("팀 소개"), + fieldWithPath("teamCompletionResponse.teamMemberIntroduction").type( + JsonFieldType.BOOLEAN).description("팀원 소개"), + fieldWithPath("teamCompletionResponse.history").type(JsonFieldType.BOOLEAN) + .description("연혁"), + fieldWithPath("teamCompletionResponse.teamAttach").type(JsonFieldType.BOOLEAN) + .description("첨부"), // 4.4. - subsectionWithPath("teamProfileTeamBuildingFieldResponse").type(JsonFieldType.OBJECT).description("희망 팀빌딩 분야 응답 객체"), - fieldWithPath("teamProfileTeamBuildingFieldResponse.teamProfileTeamBuildingFieldNames").type(JsonFieldType.ARRAY).description("희망 팀빌딩 분야 이름"), + subsectionWithPath("teamProfileTeamBuildingFieldResponse").type( + JsonFieldType.OBJECT).description("희망 팀빌딩 분야 응답 객체"), + fieldWithPath( + "teamProfileTeamBuildingFieldResponse.teamProfileTeamBuildingFieldNames").type( + JsonFieldType.ARRAY).description("희망 팀빌딩 분야 이름"), // 4.5. - subsectionWithPath("teamMemberAnnouncementResponses").type(JsonFieldType.ARRAY).description("팀원 공고 응답 객체"), - fieldWithPath("teamMemberAnnouncementResponses[].id").type(JsonFieldType.NUMBER).description("팀원 공고 응답 객체 ID"), - fieldWithPath("teamMemberAnnouncementResponses[].teamName").type(JsonFieldType.STRING).description("팀 이름"), - fieldWithPath("teamMemberAnnouncementResponses[].jobRoleName").type(JsonFieldType.STRING).description("직무, 역할 이름"), - fieldWithPath("teamMemberAnnouncementResponses[].mainBusiness").type(JsonFieldType.STRING).description("팀원 공고 주요 업무"), - fieldWithPath("teamMemberAnnouncementResponses[].skillNames").type(JsonFieldType.ARRAY).description("보유 역량 이름 배열"), - fieldWithPath("teamMemberAnnouncementResponses[].applicationProcess").type(JsonFieldType.STRING).description("지원 절차"), + subsectionWithPath("teamMemberAnnouncementResponses").type(JsonFieldType.ARRAY) + .description("팀원 공고 응답 객체"), + fieldWithPath("teamMemberAnnouncementResponses[].id").type(JsonFieldType.NUMBER) + .description("팀원 공고 응답 객체 ID"), + fieldWithPath("teamMemberAnnouncementResponses[].teamName").type( + JsonFieldType.STRING).description("팀 이름"), + fieldWithPath("teamMemberAnnouncementResponses[].jobRoleName").type( + JsonFieldType.STRING).description("직무, 역할 이름"), + fieldWithPath("teamMemberAnnouncementResponses[].mainBusiness").type( + JsonFieldType.STRING).description("팀원 공고 주요 업무"), + fieldWithPath("teamMemberAnnouncementResponses[].skillNames").type( + JsonFieldType.ARRAY).description("보유 역량 이름 배열"), + fieldWithPath("teamMemberAnnouncementResponses[].applicationProcess").type( + JsonFieldType.STRING).description("지원 절차"), // 4.6. - subsectionWithPath("activityResponse").type(JsonFieldType.OBJECT).description("활동 방식 및 활동 지역 및 위치 응답 객체"), - fieldWithPath("activityResponse.activityTagName").type(JsonFieldType.ARRAY).description("활동 방식"), - fieldWithPath("activityResponse.cityName").type(JsonFieldType.STRING).description("시/도 이름"), - fieldWithPath("activityResponse.divisionName").type(JsonFieldType.STRING).description("시/군/구 이름"), + subsectionWithPath("activityResponse").type(JsonFieldType.OBJECT) + .description("활동 방식 및 활동 지역 및 위치 응답 객체"), + fieldWithPath("activityResponse.activityTagName").type(JsonFieldType.ARRAY) + .description("활동 방식"), + fieldWithPath("activityResponse.cityName").type(JsonFieldType.STRING) + .description("시/도 이름"), + fieldWithPath("activityResponse.divisionName").type(JsonFieldType.STRING) + .description("시/군/구 이름"), // 4.7. - subsectionWithPath("teamProfileIntroductionResponse").type(JsonFieldType.OBJECT).description("팀 소개 응답 객체"), - fieldWithPath("teamProfileIntroductionResponse.teamIntroduction").type(JsonFieldType.STRING).description("팀 소개 텍스트"), + subsectionWithPath("teamProfileIntroductionResponse").type(JsonFieldType.OBJECT) + .description("팀 소개 응답 객체"), + fieldWithPath("teamProfileIntroductionResponse.teamIntroduction").type( + JsonFieldType.STRING).description("팀 소개 텍스트"), // 4.8. - subsectionWithPath("teamMemberIntroductionResponses").type(JsonFieldType.ARRAY).description("팀원 소개 응답 객체"), - fieldWithPath("teamMemberIntroductionResponses[].id").type(JsonFieldType.NUMBER).description("팀원 소개 응답 객체 ID"), - fieldWithPath("teamMemberIntroductionResponses[].teamMemberName").type(JsonFieldType.STRING).description("팀원 이름"), - fieldWithPath("teamMemberIntroductionResponses[].teamMemberRole").type(JsonFieldType.STRING).description("팀원 직무/역할"), - fieldWithPath("teamMemberIntroductionResponses[].teamMemberIntroductionText").type(JsonFieldType.STRING).description("팀원 소개 텍스트"), + subsectionWithPath("teamMemberIntroductionResponses").type(JsonFieldType.ARRAY) + .description("팀원 소개 응답 객체"), + fieldWithPath("teamMemberIntroductionResponses[].id").type(JsonFieldType.NUMBER) + .description("팀원 소개 응답 객체 ID"), + fieldWithPath("teamMemberIntroductionResponses[].teamMemberName").type( + JsonFieldType.STRING).description("팀원 이름"), + fieldWithPath("teamMemberIntroductionResponses[].teamMemberRole").type( + JsonFieldType.STRING).description("팀원 직무/역할"), + fieldWithPath( + "teamMemberIntroductionResponses[].teamMemberIntroductionText").type( + JsonFieldType.STRING).description("팀원 소개 텍스트"), // 4.9 - subsectionWithPath("historyResponses").type(JsonFieldType.ARRAY).description("연혁 응답 객체"), - fieldWithPath("historyResponses[].id").type(JsonFieldType.NUMBER).description("연혁 응답 객체 ID"), - fieldWithPath("historyResponses[].historyOneLineIntroduction").type(JsonFieldType.STRING).description("연혁 한 줄 소개"), - fieldWithPath("historyResponses[].startYear").type(JsonFieldType.NUMBER).description("시작 연도"), - fieldWithPath("historyResponses[].endYear").type(JsonFieldType.NUMBER).description("종료 연도"), - fieldWithPath("historyResponses[].historyIntroduction").type(JsonFieldType.STRING).description("연혁 소개"), - fieldWithPath("historyResponses[].inProgress").type(JsonFieldType.BOOLEAN).description("진행 여부"), + subsectionWithPath("historyResponses").type(JsonFieldType.ARRAY) + .description("연혁 응답 객체"), + fieldWithPath("historyResponses[].id").type(JsonFieldType.NUMBER) + .description("연혁 응답 객체 ID"), + fieldWithPath("historyResponses[].historyOneLineIntroduction").type( + JsonFieldType.STRING).description("연혁 한 줄 소개"), + fieldWithPath("historyResponses[].startYear").type(JsonFieldType.NUMBER) + .description("시작 연도"), + fieldWithPath("historyResponses[].endYear").type(JsonFieldType.NUMBER) + .description("종료 연도"), + fieldWithPath("historyResponses[].historyIntroduction").type( + JsonFieldType.STRING).description("연혁 소개"), + fieldWithPath("historyResponses[].inProgress").type(JsonFieldType.BOOLEAN) + .description("진행 여부"), // 4.10. - subsectionWithPath("teamAttachResponse").type(JsonFieldType.OBJECT).description("팀 첨부 응답 객체"), - fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].id").type(JsonFieldType.NUMBER).description("첨부 URL 객체 ID"), - fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlName").type(JsonFieldType.STRING).description("팀 첨부 URL 이름"), - fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlPath").type(JsonFieldType.STRING).description("팀 첨부 URL 경로") + subsectionWithPath("teamAttachResponse").type(JsonFieldType.OBJECT) + .description("팀 첨부 응답 객체"), + fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].id").type( + JsonFieldType.NUMBER).description("첨부 URL 객체 ID"), + fieldWithPath( + "teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlName").type( + JsonFieldType.STRING).description("팀 첨부 URL 이름"), + fieldWithPath( + "teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlPath").type( + JsonFieldType.STRING).description("팀 첨부 URL 경로") ) ) ); diff --git a/src/test/java/liaison/linkit/team/presentation/TeamAttachControllerTest.java b/src/test/java/liaison/linkit/team/presentation/TeamAttachControllerTest.java index 41c46838..8474c11d 100644 --- a/src/test/java/liaison/linkit/team/presentation/TeamAttachControllerTest.java +++ b/src/test/java/liaison/linkit/team/presentation/TeamAttachControllerTest.java @@ -5,7 +5,6 @@ import liaison.linkit.global.ControllerTest; import liaison.linkit.login.domain.MemberTokens; import liaison.linkit.team.dto.request.attach.TeamAttachUrlCreateRequest; -import liaison.linkit.team.service.TeamAttachService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -72,14 +71,16 @@ private void makeTeamAttachUrl() throws Exception { "https://github.com/TEAM-LIAISON" ); - final List teamAttachUrlCreateRequestList = Arrays.asList(teamAttachUrlCreateRequest1, teamAttachUrlCreateRequest2); + final List teamAttachUrlCreateRequestList = Arrays.asList( + teamAttachUrlCreateRequest1, teamAttachUrlCreateRequest2); doNothing().when(teamAttachService).saveUrl(1L, teamAttachUrlCreateRequestList); performPostTeamUrlRequest(teamAttachUrlCreateRequestList); } - private ResultActions performPostTeamUrlRequest(final List teamAttachUrlCreateRequests) throws Exception { + private ResultActions performPostTeamUrlRequest(final List teamAttachUrlCreateRequests) + throws Exception { return mockMvc.perform( post("/team/attach/url") .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) @@ -91,7 +92,7 @@ private ResultActions performPostTeamUrlRequest(final List teamAttachUrlCreateRequestList = Arrays.asList(firstTeamAttachUrlCreateRequest, secondTeamAttachUrlCreateRequest); + final List teamAttachUrlCreateRequestList = Arrays.asList( + firstTeamAttachUrlCreateRequest, secondTeamAttachUrlCreateRequest); // when final ResultActions resultActions = performPostTeamUrlRequest(teamAttachUrlCreateRequestList); diff --git a/src/test/java/liaison/linkit/team/presentation/TeamProfileControllerTest.java b/src/test/java/liaison/linkit/team/presentation/TeamProfileControllerTest.java index 4d0991b6..903f4fd0 100644 --- a/src/test/java/liaison/linkit/team/presentation/TeamProfileControllerTest.java +++ b/src/test/java/liaison/linkit/team/presentation/TeamProfileControllerTest.java @@ -1,20 +1,49 @@ package liaison.linkit.team.presentation; +import static liaison.linkit.global.restdocs.RestDocsConfiguration.field; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doNothing; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.restdocs.cookies.CookieDocumentation.cookieWithName; +import static org.springframework.restdocs.cookies.CookieDocumentation.requestCookies; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import groovy.util.logging.Slf4j; import jakarta.servlet.http.Cookie; +import java.util.Arrays; +import java.util.List; import liaison.linkit.global.ControllerTest; import liaison.linkit.login.domain.MemberTokens; import liaison.linkit.team.dto.request.TeamIntroductionCreateRequest; -import liaison.linkit.team.dto.response.*; +import liaison.linkit.team.dto.response.TeamMemberIntroductionResponse; +import liaison.linkit.team.dto.response.TeamProfileIntroductionResponse; +import liaison.linkit.team.dto.response.TeamProfileIsValueResponse; +import liaison.linkit.team.dto.response.TeamProfileResponse; +import liaison.linkit.team.dto.response.TeamProfileTeamBuildingFieldResponse; import liaison.linkit.team.dto.response.activity.ActivityResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachResponse; -import liaison.linkit.team.dto.response.attach.TeamAttachUrlResponse; import liaison.linkit.team.dto.response.completion.TeamCompletionResponse; import liaison.linkit.team.dto.response.history.HistoryResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; -import liaison.linkit.team.service.*; +import liaison.linkit.team.service.ActivityService; +import liaison.linkit.team.service.HistoryService; +import liaison.linkit.team.service.TeamCompletionService; +import liaison.linkit.team.service.TeamMemberAnnouncementService; +import liaison.linkit.team.service.TeamMemberIntroductionService; +import liaison.linkit.team.service.TeamMiniProfileService; +import liaison.linkit.team.service.TeamProfileService; +import liaison.linkit.team.service.TeamProfileTeamBuildingFieldService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,24 +55,6 @@ import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.ResultActions; -import java.util.Arrays; -import java.util.List; - -import static liaison.linkit.global.restdocs.RestDocsConfiguration.field; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; -import static org.springframework.http.MediaType.APPLICATION_JSON; -import static org.springframework.restdocs.cookies.CookieDocumentation.cookieWithName; -import static org.springframework.restdocs.cookies.CookieDocumentation.requestCookies; -import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; -import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @WebMvcTest(TeamProfileController.class) @MockBean(JpaMetamodelMappingContext.class) @@ -73,8 +84,6 @@ public class TeamProfileControllerTest extends ControllerTest { private TeamMemberIntroductionService teamMemberIntroductionService; @MockBean private HistoryService historyService; - @MockBean - private TeamAttachService teamAttachService; @BeforeEach @@ -95,7 +104,8 @@ private ResultActions performGetTeamProfileRequest() throws Exception { ); } - private ResultActions performPostTeamIntroductionRequest(final TeamIntroductionCreateRequest teamIntroductionCreateRequest) throws Exception { + private ResultActions performPostTeamIntroductionRequest( + final TeamIntroductionCreateRequest teamIntroductionCreateRequest) throws Exception { return mockMvc.perform( post("/team/introduction") .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) @@ -123,8 +133,9 @@ void getTeamProfile() throws Exception { given(teamProfileService.getTeamProfileIsValue(1L)).willReturn(teamProfileIsValueResponse); // 팀 소개서 필수 항목 존재 여부 - final boolean isTeamProfileEssential = (teamProfileIsValueResponse.isTeamMiniProfile() && teamProfileIsValueResponse.isActivity() && teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); - + final boolean isTeamProfileEssential = (teamProfileIsValueResponse.isTeamMiniProfile() + && teamProfileIsValueResponse.isActivity() + && teamProfileIsValueResponse.isTeamProfileTeamBuildingField()); // 4.1. 미니 프로필 final TeamMiniProfileResponse teamMiniProfileResponse = new TeamMiniProfileResponse( @@ -159,7 +170,8 @@ void getTeamProfile() throws Exception { final TeamProfileTeamBuildingFieldResponse teamProfileTeamBuildingFieldResponse = new TeamProfileTeamBuildingFieldResponse( teamBuildingFieldNames ); - given(teamProfileTeamBuildingFieldService.getAllTeamProfileTeamBuildingFields(1L)).willReturn(teamProfileTeamBuildingFieldResponse); + given(teamProfileTeamBuildingFieldService.getAllTeamProfileTeamBuildingFields(1L)).willReturn( + teamProfileTeamBuildingFieldResponse); // 4.5. 팀원 공고 final TeamMemberAnnouncementResponse firstTeamMemberAnnouncementResponse = new TeamMemberAnnouncementResponse( @@ -184,9 +196,11 @@ void getTeamProfile() throws Exception { false ); - final List teamMemberAnnouncementResponseList = Arrays.asList(firstTeamMemberAnnouncementResponse, secondTeamMemberAnnouncementResponse); + final List teamMemberAnnouncementResponseList = Arrays.asList( + firstTeamMemberAnnouncementResponse, secondTeamMemberAnnouncementResponse); - given(teamMemberAnnouncementService.getTeamMemberAnnouncements(1L)).willReturn(teamMemberAnnouncementResponseList); + given(teamMemberAnnouncementService.getTeamMemberAnnouncements(1L)).willReturn( + teamMemberAnnouncementResponseList); // 4.6. 활동 방식 + 활동 지역/위치 final List activityTagName = Arrays.asList("사무실 있음", "비대면 활동"); @@ -199,7 +213,7 @@ void getTeamProfile() throws Exception { // 4.7. 팀 소개 final TeamProfileIntroductionResponse teamProfileIntroductionResponse = new TeamProfileIntroductionResponse( - "팀 소개입니다." + "팀 소개입니다." ); given(teamProfileService.getTeamIntroduction(1L)).willReturn(teamProfileIntroductionResponse); @@ -218,8 +232,10 @@ void getTeamProfile() throws Exception { "백엔드 개발자입니다." ); - final List teamMemberIntroductionResponseList = Arrays.asList(firstTeamMemberIntroductionResponse, secondTeamMemberIntroductionResponse); - given(teamMemberIntroductionService.getAllTeamMemberIntroduction(1L)).willReturn(teamMemberIntroductionResponseList); + final List teamMemberIntroductionResponseList = Arrays.asList( + firstTeamMemberIntroductionResponse, secondTeamMemberIntroductionResponse); + given(teamMemberIntroductionService.getAllTeamMemberIntroduction(1L)).willReturn( + teamMemberIntroductionResponseList); // 4.9. 연혁 final HistoryResponse firstHistoryResponse = new HistoryResponse( @@ -242,33 +258,6 @@ void getTeamProfile() throws Exception { final List historyResponseList = Arrays.asList(firstHistoryResponse, secondHistoryResponse); given(historyService.getAllHistories(1L)).willReturn(historyResponseList); - // 4.10. 첨부 - final TeamAttachUrlResponse firstTeamAttachUrlResponse = new TeamAttachUrlResponse( - 1L, - "깃허브", - "https://github.com/TEAM-LIAISON" - ); - - final TeamAttachUrlResponse secondTeamAttachUrlResponse = new TeamAttachUrlResponse( - 2L, - "노션", - "https://www.notion.so/ko-kr" - ); - -// final TeamAttachFileResponse firstAttachFileResponse = new TeamAttachFileResponse( -// 1L, -// "A4+-=1.pdf", -// "https://linkit-dev-env-bucket.s3.ap-northeast-1.amazonaws.com/files/A4+-+1.pdf" -// ); - - final List teamAttachUrlResponseList = Arrays.asList(firstTeamAttachUrlResponse, secondTeamAttachUrlResponse); -// final List teamAttachFileResponseList = Arrays.asList(firstAttachFileResponse); - final TeamAttachResponse teamAttachResponse = new TeamAttachResponse( - teamAttachUrlResponseList -// teamAttachFileResponseList - ); - given(teamAttachService.getTeamAttachList(1L)).willReturn(teamAttachResponse); - final TeamProfileResponse teamProfileResponse = new TeamProfileResponse( isTeamProfileEssential, teamMiniProfileResponse, @@ -278,8 +267,7 @@ void getTeamProfile() throws Exception { activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponseList, - historyResponseList, - teamAttachResponse + historyResponseList ); given(teamProfileService.getTeamProfileResponse( @@ -291,8 +279,7 @@ void getTeamProfile() throws Exception { activityResponse, teamProfileIntroductionResponse, teamMemberIntroductionResponseList, - historyResponseList, - teamAttachResponse + historyResponseList )).willReturn(teamProfileResponse); // when @@ -312,74 +299,128 @@ void getTeamProfile() throws Exception { .attributes(field("constraint", "문자열(jwt)")) ), responseFields( - fieldWithPath("teamProfileEssential").type(JsonFieldType.BOOLEAN).description("팀 소개서 기본 항목 존재 여부"), + fieldWithPath("teamProfileEssential").type(JsonFieldType.BOOLEAN) + .description("팀 소개서 기본 항목 존재 여부"), // 4.1. - subsectionWithPath("teamMiniProfileResponse").type(JsonFieldType.OBJECT).description("팀 미니 프로필 응답 객체"), - - fieldWithPath("teamMiniProfileResponse.sectorName").type(JsonFieldType.STRING).description("팀 미니 프로필 분야"), - fieldWithPath("teamMiniProfileResponse.sizeType").type(JsonFieldType.STRING).description("팀 미니 프로필 규모"), - fieldWithPath("teamMiniProfileResponse.teamName").type(JsonFieldType.STRING).description("팀 이름"), - fieldWithPath("teamMiniProfileResponse.teamProfileTitle").type(JsonFieldType.STRING).description("팀 미니 프로필 제목"), - fieldWithPath("teamMiniProfileResponse.isTeamActivate").type(JsonFieldType.BOOLEAN).description("팀 소개서 활성화 여부"), - fieldWithPath("teamMiniProfileResponse.teamLogoImageUrl").type(JsonFieldType.STRING).description("이미지 파일 소스 경로"), - fieldWithPath("teamMiniProfileResponse.teamKeywordNames").type(JsonFieldType.ARRAY).description("팀 소개 항목").attributes(field("constraint", "문자열 배열")), + subsectionWithPath("teamMiniProfileResponse").type(JsonFieldType.OBJECT) + .description("팀 미니 프로필 응답 객체"), + + fieldWithPath("teamMiniProfileResponse.sectorName").type(JsonFieldType.STRING) + .description("팀 미니 프로필 분야"), + fieldWithPath("teamMiniProfileResponse.sizeType").type(JsonFieldType.STRING) + .description("팀 미니 프로필 규모"), + fieldWithPath("teamMiniProfileResponse.teamName").type(JsonFieldType.STRING) + .description("팀 이름"), + fieldWithPath("teamMiniProfileResponse.teamProfileTitle").type( + JsonFieldType.STRING).description("팀 미니 프로필 제목"), + fieldWithPath("teamMiniProfileResponse.isTeamActivate").type( + JsonFieldType.BOOLEAN).description("팀 소개서 활성화 여부"), + fieldWithPath("teamMiniProfileResponse.teamLogoImageUrl").type( + JsonFieldType.STRING).description("이미지 파일 소스 경로"), + fieldWithPath("teamMiniProfileResponse.teamKeywordNames").type( + JsonFieldType.ARRAY).description("팀 소개 항목") + .attributes(field("constraint", "문자열 배열")), // 4.3. - subsectionWithPath("teamCompletionResponse").type(JsonFieldType.OBJECT).description("팀 소개서 완성도 응답 객체"), - fieldWithPath("teamCompletionResponse.teamCompletion").type(JsonFieldType.STRING).description("팀 소개서 완성도 % 값"), - fieldWithPath("teamCompletionResponse.teamProfileTeamBuildingField").type(JsonFieldType.BOOLEAN).description("희망 팀빌딩 분야 기입 여부"), - fieldWithPath("teamCompletionResponse.teamMemberAnnouncement").type(JsonFieldType.BOOLEAN).description("팀원 공고"), - fieldWithPath("teamCompletionResponse.activity").type(JsonFieldType.BOOLEAN).description("활동 방식 및 활동 지역 및 위치"), - fieldWithPath("teamCompletionResponse.teamIntroduction").type(JsonFieldType.BOOLEAN).description("팀 소개"), - fieldWithPath("teamCompletionResponse.teamMemberIntroduction").type(JsonFieldType.BOOLEAN).description("팀원 소개"), - fieldWithPath("teamCompletionResponse.history").type(JsonFieldType.BOOLEAN).description("연혁"), - fieldWithPath("teamCompletionResponse.teamAttach").type(JsonFieldType.BOOLEAN).description("첨부"), + subsectionWithPath("teamCompletionResponse").type(JsonFieldType.OBJECT) + .description("팀 소개서 완성도 응답 객체"), + fieldWithPath("teamCompletionResponse.teamCompletion").type( + JsonFieldType.STRING).description("팀 소개서 완성도 % 값"), + fieldWithPath("teamCompletionResponse.teamProfileTeamBuildingField").type( + JsonFieldType.BOOLEAN).description("희망 팀빌딩 분야 기입 여부"), + fieldWithPath("teamCompletionResponse.teamMemberAnnouncement").type( + JsonFieldType.BOOLEAN).description("팀원 공고"), + fieldWithPath("teamCompletionResponse.activity").type(JsonFieldType.BOOLEAN) + .description("활동 방식 및 활동 지역 및 위치"), + fieldWithPath("teamCompletionResponse.teamIntroduction").type( + JsonFieldType.BOOLEAN).description("팀 소개"), + fieldWithPath("teamCompletionResponse.teamMemberIntroduction").type( + JsonFieldType.BOOLEAN).description("팀원 소개"), + fieldWithPath("teamCompletionResponse.history").type(JsonFieldType.BOOLEAN) + .description("연혁"), + fieldWithPath("teamCompletionResponse.teamAttach").type(JsonFieldType.BOOLEAN) + .description("첨부"), // 4.4. - subsectionWithPath("teamProfileTeamBuildingFieldResponse").type(JsonFieldType.OBJECT).description("희망 팀빌딩 분야 응답 객체"), - fieldWithPath("teamProfileTeamBuildingFieldResponse.teamProfileTeamBuildingFieldNames").type(JsonFieldType.ARRAY).description("희망 팀빌딩 분야 이름"), + subsectionWithPath("teamProfileTeamBuildingFieldResponse").type( + JsonFieldType.OBJECT).description("희망 팀빌딩 분야 응답 객체"), + fieldWithPath( + "teamProfileTeamBuildingFieldResponse.teamProfileTeamBuildingFieldNames").type( + JsonFieldType.ARRAY).description("희망 팀빌딩 분야 이름"), // 4.5. - subsectionWithPath("teamMemberAnnouncementResponses").type(JsonFieldType.ARRAY).description("팀원 공고 응답 객체"), - fieldWithPath("teamMemberAnnouncementResponses[].id").type(JsonFieldType.NUMBER).description("팀원 공고 응답 객체 ID"), - fieldWithPath("teamMemberAnnouncementResponses[].teamName").type(JsonFieldType.STRING).description("팀 이름"), - fieldWithPath("teamMemberAnnouncementResponses[].jobRoleName").type(JsonFieldType.STRING).description("직무, 역할 이름"), - fieldWithPath("teamMemberAnnouncementResponses[].mainBusiness").type(JsonFieldType.STRING).description("팀원 공고 주요 업무"), - fieldWithPath("teamMemberAnnouncementResponses[].skillNames").type(JsonFieldType.ARRAY).description("보유 역량 이름 배열"), - fieldWithPath("teamMemberAnnouncementResponses[].applicationProcess").type(JsonFieldType.STRING).description("지원 절차"), + subsectionWithPath("teamMemberAnnouncementResponses").type(JsonFieldType.ARRAY) + .description("팀원 공고 응답 객체"), + fieldWithPath("teamMemberAnnouncementResponses[].id").type(JsonFieldType.NUMBER) + .description("팀원 공고 응답 객체 ID"), + fieldWithPath("teamMemberAnnouncementResponses[].teamName").type( + JsonFieldType.STRING).description("팀 이름"), + fieldWithPath("teamMemberAnnouncementResponses[].jobRoleName").type( + JsonFieldType.STRING).description("직무, 역할 이름"), + fieldWithPath("teamMemberAnnouncementResponses[].mainBusiness").type( + JsonFieldType.STRING).description("팀원 공고 주요 업무"), + fieldWithPath("teamMemberAnnouncementResponses[].skillNames").type( + JsonFieldType.ARRAY).description("보유 역량 이름 배열"), + fieldWithPath("teamMemberAnnouncementResponses[].applicationProcess").type( + JsonFieldType.STRING).description("지원 절차"), // 4.6. - subsectionWithPath("activityResponse").type(JsonFieldType.OBJECT).description("활동 방식 및 활동 지역 및 위치 응답 객체"), - fieldWithPath("activityResponse.activityTagName").type(JsonFieldType.ARRAY).description("활동 방식"), - fieldWithPath("activityResponse.cityName").type(JsonFieldType.STRING).description("시/도 이름"), - fieldWithPath("activityResponse.divisionName").type(JsonFieldType.STRING).description("시/군/구 이름"), + subsectionWithPath("activityResponse").type(JsonFieldType.OBJECT) + .description("활동 방식 및 활동 지역 및 위치 응답 객체"), + fieldWithPath("activityResponse.activityTagName").type(JsonFieldType.ARRAY) + .description("활동 방식"), + fieldWithPath("activityResponse.cityName").type(JsonFieldType.STRING) + .description("시/도 이름"), + fieldWithPath("activityResponse.divisionName").type(JsonFieldType.STRING) + .description("시/군/구 이름"), // 4.7. - subsectionWithPath("teamProfileIntroductionResponse").type(JsonFieldType.OBJECT).description("팀 소개 응답 객체"), - fieldWithPath("teamProfileIntroductionResponse.teamIntroduction").type(JsonFieldType.STRING).description("팀 소개 텍스트"), + subsectionWithPath("teamProfileIntroductionResponse").type(JsonFieldType.OBJECT) + .description("팀 소개 응답 객체"), + fieldWithPath("teamProfileIntroductionResponse.teamIntroduction").type( + JsonFieldType.STRING).description("팀 소개 텍스트"), // 4.8. - subsectionWithPath("teamMemberIntroductionResponses").type(JsonFieldType.ARRAY).description("팀원 소개 응답 객체"), - fieldWithPath("teamMemberIntroductionResponses[].id").type(JsonFieldType.NUMBER).description("팀원 소개 응답 객체 ID"), - fieldWithPath("teamMemberIntroductionResponses[].teamMemberName").type(JsonFieldType.STRING).description("팀원 이름"), - fieldWithPath("teamMemberIntroductionResponses[].teamMemberRole").type(JsonFieldType.STRING).description("팀원 직무/역할"), - fieldWithPath("teamMemberIntroductionResponses[].teamMemberIntroductionText").type(JsonFieldType.STRING).description("팀원 소개 텍스트"), + subsectionWithPath("teamMemberIntroductionResponses").type(JsonFieldType.ARRAY) + .description("팀원 소개 응답 객체"), + fieldWithPath("teamMemberIntroductionResponses[].id").type(JsonFieldType.NUMBER) + .description("팀원 소개 응답 객체 ID"), + fieldWithPath("teamMemberIntroductionResponses[].teamMemberName").type( + JsonFieldType.STRING).description("팀원 이름"), + fieldWithPath("teamMemberIntroductionResponses[].teamMemberRole").type( + JsonFieldType.STRING).description("팀원 직무/역할"), + fieldWithPath( + "teamMemberIntroductionResponses[].teamMemberIntroductionText").type( + JsonFieldType.STRING).description("팀원 소개 텍스트"), // 4.9 - subsectionWithPath("historyResponses").type(JsonFieldType.ARRAY).description("연혁 응답 객체"), - fieldWithPath("historyResponses[].id").type(JsonFieldType.NUMBER).description("연혁 응답 객체 ID"), - fieldWithPath("historyResponses[].historyOneLineIntroduction").type(JsonFieldType.STRING).description("연혁 한 줄 소개"), - fieldWithPath("historyResponses[].startYear").type(JsonFieldType.NUMBER).description("시작 연도"), - fieldWithPath("historyResponses[].endYear").type(JsonFieldType.NUMBER).description("종료 연도"), - fieldWithPath("historyResponses[].historyIntroduction").type(JsonFieldType.STRING).description("연혁 소개"), - fieldWithPath("historyResponses[].inProgress").type(JsonFieldType.BOOLEAN).description("진행 여부"), + subsectionWithPath("historyResponses").type(JsonFieldType.ARRAY) + .description("연혁 응답 객체"), + fieldWithPath("historyResponses[].id").type(JsonFieldType.NUMBER) + .description("연혁 응답 객체 ID"), + fieldWithPath("historyResponses[].historyOneLineIntroduction").type( + JsonFieldType.STRING).description("연혁 한 줄 소개"), + fieldWithPath("historyResponses[].startYear").type(JsonFieldType.NUMBER) + .description("시작 연도"), + fieldWithPath("historyResponses[].endYear").type(JsonFieldType.NUMBER) + .description("종료 연도"), + fieldWithPath("historyResponses[].historyIntroduction").type( + JsonFieldType.STRING).description("연혁 소개"), + fieldWithPath("historyResponses[].inProgress").type(JsonFieldType.BOOLEAN) + .description("진행 여부"), // 4.10. - subsectionWithPath("teamAttachResponse").type(JsonFieldType.OBJECT).description("팀 첨부 응답 객체"), - fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].id").type(JsonFieldType.NUMBER).description("첨부 URL 객체 ID"), - fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlName").type(JsonFieldType.STRING).description("팀 첨부 URL 이름"), - fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlPath").type(JsonFieldType.STRING).description("팀 첨부 URL 경로") + subsectionWithPath("teamAttachResponse").type(JsonFieldType.OBJECT) + .description("팀 첨부 응답 객체"), + fieldWithPath("teamAttachResponse.teamAttachUrlResponseList[].id").type( + JsonFieldType.NUMBER).description("첨부 URL 객체 ID"), + fieldWithPath( + "teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlName").type( + JsonFieldType.STRING).description("팀 첨부 URL 이름"), + fieldWithPath( + "teamAttachResponse.teamAttachUrlResponseList[].teamAttachUrlPath").type( + JsonFieldType.STRING).description("팀 첨부 URL 경로") ) ) ); diff --git a/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java b/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java index 24b0177f..df600ac9 100644 --- a/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java +++ b/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java @@ -7,8 +7,8 @@ import liaison.linkit.search.dto.response.browseAfterLogin.BrowseMiniProfileResponse; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; -import liaison.linkit.wish.dto.response.WishTeamProfileResponse; -import liaison.linkit.wish.service.WishService; +import liaison.linkit.wish.presentation.dto.response.WishTeamProfileResponse; +import liaison.linkit.wish.business.WishService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -74,7 +74,8 @@ private ResultActions performCreateWishToTeamProfile( final int teamMemberAnnouncementId ) throws Exception { return mockMvc.perform( - RestDocumentationRequestBuilders.post("/wish/team/profile/{teamMemberAnnouncementId}", teamMemberAnnouncementId) + RestDocumentationRequestBuilders.post("/wish/team/profile/{teamMemberAnnouncementId}", + teamMemberAnnouncementId) .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) .cookie(COOKIE) ); @@ -96,7 +97,8 @@ private ResultActions performDeleteWishToTeamProfile( final int teamMemberAnnouncementId ) throws Exception { return mockMvc.perform( - RestDocumentationRequestBuilders.delete("/wish/team/profile/{teamMemberAnnouncementId}", teamMemberAnnouncementId) + RestDocumentationRequestBuilders.delete("/wish/team/profile/{teamMemberAnnouncementId}", + teamMemberAnnouncementId) .header(AUTHORIZATION, MEMBER_TOKENS.getAccessToken()) .cookie(COOKIE) ); @@ -221,7 +223,8 @@ void getPrivateProfileWishList() throws Exception { true ); - final List browseMiniProfileResponseList = Arrays.asList(firstBrowseMiniProfileResponse, secondBrowseMiniProfileResponse); + final List browseMiniProfileResponseList = Arrays.asList( + firstBrowseMiniProfileResponse, secondBrowseMiniProfileResponse); given(wishService.getPrivateProfileWishList(1L)).willReturn(browseMiniProfileResponseList); @@ -234,8 +237,10 @@ void getPrivateProfileWishList() throws Exception { responseFields( fieldWithPath("[].id").type(JsonFieldType.NUMBER).description("미니 프로필 ID"), fieldWithPath("[].profileTitle").type(JsonFieldType.STRING).description("프로필의 제목"), - fieldWithPath("[].miniProfileImg").type(JsonFieldType.STRING).description("미니 프로필 이미지 URL"), - fieldWithPath("[].myKeywordNames").type(JsonFieldType.ARRAY).description("나를 소개하는 키워드 목록"), + fieldWithPath("[].miniProfileImg").type(JsonFieldType.STRING) + .description("미니 프로필 이미지 URL"), + fieldWithPath("[].myKeywordNames").type(JsonFieldType.ARRAY) + .description("나를 소개하는 키워드 목록"), fieldWithPath("[].isActivate").type(JsonFieldType.BOOLEAN).description("미니 프로필 활성화 여부"), fieldWithPath("[].memberName").type(JsonFieldType.STRING).description("회원 이름"), fieldWithPath("[].jobRoleNames").type(JsonFieldType.ARRAY).description("직무 및 역할"), @@ -292,10 +297,13 @@ void getTeamProfileWishList() throws Exception { true ); - final WishTeamProfileResponse firstWishTeamProfileResponse = new WishTeamProfileResponse(firstTeamMiniProfileResponse, firstTeamMemberAnnouncementResponse); - final WishTeamProfileResponse secondWishTeamProfileResponse = new WishTeamProfileResponse(secondTeamMiniProfileResponse, secondTeamMemberAnnouncementResponse); + final WishTeamProfileResponse firstWishTeamProfileResponse = new WishTeamProfileResponse( + firstTeamMiniProfileResponse, firstTeamMemberAnnouncementResponse); + final WishTeamProfileResponse secondWishTeamProfileResponse = new WishTeamProfileResponse( + secondTeamMiniProfileResponse, secondTeamMemberAnnouncementResponse); - final List wishTeamProfileResponseList = Arrays.asList(firstWishTeamProfileResponse, secondWishTeamProfileResponse); + final List wishTeamProfileResponseList = Arrays.asList(firstWishTeamProfileResponse, + secondWishTeamProfileResponse); given(wishService.getTeamProfileWishList(1L)).willReturn(wishTeamProfileResponseList); // when @@ -305,23 +313,39 @@ void getTeamProfileWishList() throws Exception { resultActions.andExpect(status().isOk()) .andDo(restDocs.document( responseFields( - fieldWithPath("[].teamMiniProfileResponse.id").type(JsonFieldType.NUMBER).description("팀 미니 프로필 ID"), - fieldWithPath("[].teamMiniProfileResponse.sectorName").type(JsonFieldType.STRING).description("산업 분야"), - fieldWithPath("[].teamMiniProfileResponse.sizeType").type(JsonFieldType.STRING).description("팀 규모"), - fieldWithPath("[].teamMiniProfileResponse.teamName").type(JsonFieldType.STRING).description("팀 이름"), - fieldWithPath("[].teamMiniProfileResponse.teamProfileTitle").type(JsonFieldType.STRING).description("팀 프로필 제목"), - fieldWithPath("[].teamMiniProfileResponse.isTeamActivate").type(JsonFieldType.BOOLEAN).description("팀 활성화 상태"), - fieldWithPath("[].teamMiniProfileResponse.teamLogoImageUrl").type(JsonFieldType.STRING).description("팀 로고 이미지 URL"), - fieldWithPath("[].teamMiniProfileResponse.teamKeywordNames").type(JsonFieldType.ARRAY).description("팀 키워드 목록"), - - fieldWithPath("[].teamMemberAnnouncementResponse.id").type(JsonFieldType.NUMBER).description("팀원 공고 ID"), - fieldWithPath("[].teamMemberAnnouncementResponse.teamLogoImageUrl").type(JsonFieldType.STRING).description("팀 로고 이미지 경로"), - fieldWithPath("[].teamMemberAnnouncementResponse.teamName").type(JsonFieldType.STRING).description("공고에 대한 팀 이름"), - fieldWithPath("[].teamMemberAnnouncementResponse.jobRoleName").type(JsonFieldType.STRING).description("직무 이름"), - fieldWithPath("[].teamMemberAnnouncementResponse.mainBusiness").type(JsonFieldType.STRING).description("주요 업무 내용"), - fieldWithPath("[].teamMemberAnnouncementResponse.skillNames").type(JsonFieldType.ARRAY).description("필요 기술 목록"), - fieldWithPath("[].teamMemberAnnouncementResponse.applicationProcess").type(JsonFieldType.STRING).description("지원 절차 설명"), - fieldWithPath("[].teamMemberAnnouncementResponse.isTeamSaved").type(JsonFieldType.BOOLEAN).description("팀 찜 여부") + fieldWithPath("[].teamMiniProfileResponse.id").type(JsonFieldType.NUMBER) + .description("팀 미니 프로필 ID"), + fieldWithPath("[].teamMiniProfileResponse.sectorName").type(JsonFieldType.STRING) + .description("산업 분야"), + fieldWithPath("[].teamMiniProfileResponse.sizeType").type(JsonFieldType.STRING) + .description("팀 규모"), + fieldWithPath("[].teamMiniProfileResponse.teamName").type(JsonFieldType.STRING) + .description("팀 이름"), + fieldWithPath("[].teamMiniProfileResponse.teamProfileTitle").type(JsonFieldType.STRING) + .description("팀 프로필 제목"), + fieldWithPath("[].teamMiniProfileResponse.isTeamActivate").type(JsonFieldType.BOOLEAN) + .description("팀 활성화 상태"), + fieldWithPath("[].teamMiniProfileResponse.teamLogoImageUrl").type(JsonFieldType.STRING) + .description("팀 로고 이미지 URL"), + fieldWithPath("[].teamMiniProfileResponse.teamKeywordNames").type(JsonFieldType.ARRAY) + .description("팀 키워드 목록"), + + fieldWithPath("[].teamMemberAnnouncementResponse.id").type(JsonFieldType.NUMBER) + .description("팀원 공고 ID"), + fieldWithPath("[].teamMemberAnnouncementResponse.teamLogoImageUrl").type( + JsonFieldType.STRING).description("팀 로고 이미지 경로"), + fieldWithPath("[].teamMemberAnnouncementResponse.teamName").type(JsonFieldType.STRING) + .description("공고에 대한 팀 이름"), + fieldWithPath("[].teamMemberAnnouncementResponse.jobRoleName").type( + JsonFieldType.STRING).description("직무 이름"), + fieldWithPath("[].teamMemberAnnouncementResponse.mainBusiness").type( + JsonFieldType.STRING).description("주요 업무 내용"), + fieldWithPath("[].teamMemberAnnouncementResponse.skillNames").type(JsonFieldType.ARRAY) + .description("필요 기술 목록"), + fieldWithPath("[].teamMemberAnnouncementResponse.applicationProcess").type( + JsonFieldType.STRING).description("지원 절차 설명"), + fieldWithPath("[].teamMemberAnnouncementResponse.isTeamSaved").type( + JsonFieldType.BOOLEAN).description("팀 찜 여부") ) ));