Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/docs/asciidoc/api/subscription/subscribable-companies.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[[Subscribable-Companies]]
== 기업 구독 API(GET: /devdevdev/api/v1/subscriptions/companies)

* 회원 또는 익명회원이 구독 가능한 기업 목록을 조회한다.

=== 정상 요청/응답

==== HTTP Request

include::{snippets}/subscribable-companies/http-request.adoc[]

==== HTTP Request Header Fields

include::{snippets}/subscribable-companies/request-headers.adoc[]

==== HTTP Request Query Parameters Fields

include::{snippets}/subscribable-companies/query-parameters.adoc[]

==== HTTP Response

include::{snippets}/subscribable-companies/http-response.adoc[]

==== HTTP Response Fields

include::{snippets}/subscribable-companies/response-fields.adoc[]
5 changes: 5 additions & 0 deletions src/docs/asciidoc/api/subscription/subscription.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
= 기술 블로그 구독

include::subscribe.adoc[]
include::unsubscribe.adoc[]
include::subscribable-companies.adoc[]
1 change: 1 addition & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ include::api/pick/pick.adoc[]
include::api/pick-commnet/pick-comment.adoc[]
include::api/tech-article/tech-article.adoc[]
include::api/tech-article-comment/tech-article-comment.adoc[]
include::api/subscription/subscription.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,11 @@ public class Company extends BasicTime {
)
private Url officialUrl;

private String officialImageUrl;
@Embedded
@AttributeOverride(name = "url",
column = @Column(name = "official_image_url")
)
private Url officialImageUrl;

@Embedded
@AttributeOverride(name = "url",
Expand All @@ -49,10 +53,14 @@ public class Company extends BasicTime {
private List<TechArticle> techArticles = new ArrayList<>();

@Builder
private Company(CompanyName name, Url officialUrl, String officialImageUrl, Url careerUrl) {
private Company(CompanyName name, Url officialUrl, Url officialImageUrl, Url careerUrl) {
this.name = name;
this.officialUrl = officialUrl;
this.officialImageUrl = officialImageUrl;
this.careerUrl = careerUrl;
}

public boolean isEqualsId(Long companyId) {
return this.id.equals(companyId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,8 @@ public static Subscription create(Member member, Company company) {

return subscription;
}

public boolean isEqualsCompany(Company company) {
return this.company.isEqualsId(company.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.dreamypatisiel.devdevdev.exception.UrlException;
import jakarta.persistence.Embeddable;
import java.util.regex.Pattern;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand All @@ -15,8 +14,6 @@
@EqualsAndHashCode
public class Url {

private static final String URL_REGEX =
"^((http|https)://)?([a-zA-Z0-9-]+(\\.[a-zA-Z]{2,})+)(/[a-zA-Z0-9-]*)*(\\?\\S*)?$";
public static final String INVALID_URL_MESSAGE = "알맞은 URL 형식이 아닙니다.";

private String url;
Expand All @@ -32,12 +29,5 @@ private void urlValidation(String url) {
if (!valid) {
throw new UrlException(INVALID_URL_MESSAGE);
}
// if (!isValidUrl(url)) {
// throw new UrlException(INVALID_URL_MESSAGE);
// }
}

private boolean isValidUrl(String url) {
return Pattern.matches(URL_REGEX, url);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.dreamypatisiel.devdevdev.domain.repository;

import com.dreamypatisiel.devdevdev.domain.entity.Company;
import com.dreamypatisiel.devdevdev.domain.repository.techArticle.custom.CompanyRepositoryCustom;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CompanyRepository extends JpaRepository<Company, Long> {
public interface CompanyRepository extends JpaRepository<Company, Long>, CompanyRepositoryCustom {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.dreamypatisiel.devdevdev.domain.repository.pick;


import static com.dreamypatisiel.devdevdev.domain.entity.QPick.pick;

import com.dreamypatisiel.devdevdev.domain.entity.Pick;
Expand All @@ -15,7 +16,7 @@ public enum PickSort {

LATEST("최신순") {
@Override
public OrderSpecifier getOrderSpecifierByPickSort() {
public OrderSpecifier<?> getOrderSpecifierByPickSort() {
return new OrderSpecifier<>(Order.DESC, pick.createdAt);
}

Expand All @@ -26,7 +27,7 @@ public BooleanExpression getCursorCondition(Pick findPick) {
},
POPULAR("인기순") {
@Override
public OrderSpecifier getOrderSpecifierByPickSort() {
public OrderSpecifier<?> getOrderSpecifierByPickSort() {
return new OrderSpecifier<>(Order.DESC, pick.popularScore.count);
}

Expand All @@ -39,7 +40,7 @@ public BooleanExpression getCursorCondition(Pick findPick) {
},
MOST_VIEWED("조회수") {
@Override
public OrderSpecifier getOrderSpecifierByPickSort() {
public OrderSpecifier<?> getOrderSpecifierByPickSort() {
return new OrderSpecifier<>(Order.DESC, pick.viewTotalCount.count);
}

Expand All @@ -52,7 +53,7 @@ public BooleanExpression getCursorCondition(Pick findPick) {
},
MOST_COMMENTED("댓글순") {
@Override
public OrderSpecifier getOrderSpecifierByPickSort() {
public OrderSpecifier<?> getOrderSpecifierByPickSort() {
return new OrderSpecifier<>(Order.DESC, pick.commentTotalCount.count);
}

Expand All @@ -65,7 +66,8 @@ public BooleanExpression getCursorCondition(Pick findPick) {
};


abstract public OrderSpecifier getOrderSpecifierByPickSort();
abstract public OrderSpecifier<?> getOrderSpecifierByPickSort();

abstract public BooleanExpression getCursorCondition(Pick pick);

private final String description;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.dreamypatisiel.devdevdev.domain.repository.pick.custom;

import com.dreamypatisiel.devdevdev.domain.entity.PickComment;
import static com.dreamypatisiel.devdevdev.domain.entity.QMember.member;
import static com.dreamypatisiel.devdevdev.domain.entity.QPick.pick;
import static com.dreamypatisiel.devdevdev.domain.entity.QPickComment.pickComment;
import static com.dreamypatisiel.devdevdev.domain.entity.QPickOption.pickOption;
import static com.dreamypatisiel.devdevdev.domain.entity.QPickVote.pickVote;

import com.dreamypatisiel.devdevdev.domain.entity.PickComment;
import com.dreamypatisiel.devdevdev.domain.entity.enums.ContentStatus;
import com.dreamypatisiel.devdevdev.domain.entity.enums.PickOptionType;
import com.dreamypatisiel.devdevdev.domain.repository.comment.MyWrittenCommentDto;
Expand Down Expand Up @@ -120,7 +119,7 @@ public SliceCustom<MyWrittenCommentDto> findMyWrittenPickCommentsByCursor(Long m
.and(pickComment.deletedAt.isNull()))
.fetchCount();

return new SliceCustom<>(contents, pageable, hasNextPage(contents, pageable.getPageSize()), totalElements);
return new SliceCustom<>(contents, pageable, totalElements);
}

private static BooleanExpression pickOptionTypeIn(EnumSet<PickOptionType> pickOptionTypes) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dreamypatisiel.devdevdev.domain.repository.techArticle;

import static com.dreamypatisiel.devdevdev.domain.entity.QBookmark.bookmark;
import static com.dreamypatisiel.devdevdev.domain.entity.QTechArticle.techArticle;

import com.dreamypatisiel.devdevdev.domain.entity.Bookmark;
import com.dreamypatisiel.devdevdev.domain.entity.TechArticle;
import com.querydsl.core.types.Order;
Expand All @@ -8,9 +11,6 @@
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import static com.dreamypatisiel.devdevdev.domain.entity.QBookmark.bookmark;
import static com.dreamypatisiel.devdevdev.domain.entity.QTechArticle.techArticle;

@Getter
@RequiredArgsConstructor
public enum BookmarkSort {
Expand Down Expand Up @@ -60,5 +60,6 @@ public BooleanExpression getCursorCondition(Bookmark findBookmark, TechArticle f
private final String description;

abstract public OrderSpecifier<?> getOrderSpecifierByBookmarkSort();

abstract public BooleanExpression getCursorCondition(Bookmark findBookmark, TechArticle findTechArticle);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.dreamypatisiel.devdevdev.domain.repository.techArticle;

import com.dreamypatisiel.devdevdev.domain.entity.Company;
import com.dreamypatisiel.devdevdev.domain.entity.Member;
import com.dreamypatisiel.devdevdev.domain.entity.Subscription;
import com.dreamypatisiel.devdevdev.domain.repository.techArticle.custom.SubscriptionRepositoryCustom;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SubscriptionRepository extends JpaRepository<Subscription, Long>, SubscriptionRepositoryCustom {
Optional<Subscription> findByMemberAndCompanyId(Member member, Long companyId);

List<Subscription> findByMemberAndCompanyIn(Member member, List<Company> companies);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.dreamypatisiel.devdevdev.domain.repository.techArticle.custom;

import com.dreamypatisiel.devdevdev.domain.entity.Company;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

public interface CompanyRepositoryCustom {
Slice<Company> findCompanyByCursor(Pageable pageable, Long companyId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.dreamypatisiel.devdevdev.domain.repository.techArticle.custom;

import com.dreamypatisiel.devdevdev.domain.entity.Company;
import static com.dreamypatisiel.devdevdev.domain.entity.QCompany.company;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.JPQLQueryFactory;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;

@RequiredArgsConstructor
public class CompanyRepositoryImpl implements CompanyRepositoryCustom {

private final JPQLQueryFactory query;

@Override
public Slice<Company> findCompanyByCursor(Pageable pageable, Long companyId) {
List<Company> contents = query.selectFrom(company)
.where(getCursorCondition(companyId))
.orderBy(company.id.desc())
.limit(pageable.getPageSize())
.fetch();

return new SliceImpl<>(contents, pageable, contents.size() >= pageable.getPageSize());
}

private BooleanExpression getCursorCondition(Long companyId) {
if (companyId == null) {
return null;
}

return company.id.lt(companyId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.dreamypatisiel.devdevdev.domain.service.response;

import com.dreamypatisiel.devdevdev.domain.entity.Company;
import lombok.Builder;
import lombok.Data;

@Data
public class SubscriableCompanyResponse {
private final Long companyId;
private final String companyImageUrl;
private final Boolean isSubscribed;

@Builder
public SubscriableCompanyResponse(Long companyId, String companyImageUrl, Boolean isSubscribed) {
this.companyId = companyId;
this.companyImageUrl = companyImageUrl;
this.isSubscribed = isSubscribed;
}

public static SubscriableCompanyResponse create(Company company) {
return SubscriableCompanyResponse.builder()
.companyId(company.getId())
.companyImageUrl(company.getOfficialImageUrl().getUrl())
.isSubscribed(false)
.build();
}

public static SubscriableCompanyResponse createWithIsSubscribed(Company company, Boolean isSubscribed) {
return SubscriableCompanyResponse.builder()
.companyId(company.getId())
.companyImageUrl(company.getOfficialImageUrl().getUrl())
.isSubscribed(isSubscribed)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dreamypatisiel.devdevdev.domain.service.techArticle;

import com.dreamypatisiel.devdevdev.domain.service.techArticle.subscription.GuestSubscriptionService;
import com.dreamypatisiel.devdevdev.domain.service.techArticle.subscription.MemberSubscriptionService;
import com.dreamypatisiel.devdevdev.domain.service.techArticle.subscription.SubscriptionService;
import com.dreamypatisiel.devdevdev.domain.service.techArticle.techArticle.GuestTechArticleService;
import com.dreamypatisiel.devdevdev.domain.service.techArticle.techArticle.MemberTechArticleService;
import com.dreamypatisiel.devdevdev.domain.service.techArticle.techArticle.TechArticleService;
Expand All @@ -18,16 +21,23 @@ public class TechArticleServiceStrategy {
private final ApplicationContext applicationContext;

public TechArticleService getTechArticleService() {
if(AuthenticationMemberUtils.isAnonymous()) {
if (AuthenticationMemberUtils.isAnonymous()) {
return applicationContext.getBean(GuestTechArticleService.class);
}
return applicationContext.getBean(MemberTechArticleService.class);
}

public TechCommentService getTechCommentService() {
if(AuthenticationMemberUtils.isAnonymous()) {
if (AuthenticationMemberUtils.isAnonymous()) {
return applicationContext.getBean(GuestTechCommentService.class);
}
return applicationContext.getBean(MemberTechCommentService.class);
}

public SubscriptionService getSubscriptionService() {
if (AuthenticationMemberUtils.isAnonymous()) {
return applicationContext.getBean(GuestSubscriptionService.class);
}
return applicationContext.getBean(MemberSubscriptionService.class);
}
}
Loading