Skip to content
This repository has been archived by the owner on Nov 27, 2024. It is now read-only.

Commit

Permalink
Merge pull request #7 from daemawiki/develop
Browse files Browse the repository at this point in the history
update
  • Loading branch information
ori0o0p authored Apr 23, 2024
2 parents 0168414 + 89f15ac commit af5bb91
Show file tree
Hide file tree
Showing 27 changed files with 221 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,28 +90,24 @@ public Flux<DocumentSearchResult> searchDocumentContent(
return getDocumentUsecase.searchDocumentContent(text, PagingInfo.of(sortBy, sortDirection, page, size));
}

@GetMapping("/most-revision/top-10")
public Flux<SimpleDocumentResponse> getDocumentsOrderByVersionTop10() {
return getDocumentUsecase.getDocumentMostRevisionTop10();
}

@GetMapping("/most-revision")
public Flux<SimpleDocumentResponse> getDocumentsOrderByVersion(
@RequestBody PagingInfo pagingInfo
@RequestParam(defaultValue = "dateTime.created") String sortBy,
@RequestParam(defaultValue = "1") Integer sortDirection,
@RequestParam(defaultValue = "0") Integer page,
@RequestParam(defaultValue = "10") Integer size
) {
return getDocumentUsecase.getDocumentsMostRevision(pagingInfo);
return getDocumentUsecase.getDocumentsMostRevision(PagingInfo.of(sortBy, sortDirection, page, size));
}

@GetMapping("/most-view")
public Flux<GetMostViewDocumentResponse> getDocumentsOrderByView(
@RequestBody PagingInfo pagingInfo
@RequestParam(defaultValue = "dateTime.created") String sortBy,
@RequestParam(defaultValue = "1") Integer sortDirection,
@RequestParam(defaultValue = "0") Integer page,
@RequestParam(defaultValue = "10") Integer size
) {
return getDocumentUsecase.getDocumentOrderByView(pagingInfo);
}

@GetMapping("/most-view/top-10")
public Flux<GetMostViewDocumentResponse> getDocumentsOrderByViewTop10() {
return getDocumentUsecase.getDocumentOrderByViewTop10();
return getDocumentUsecase.getDocumentOrderByView(PagingInfo.of(sortBy, sortDirection, page, size));
}

@DeleteMapping("/{documentId}")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.daemawiki.domain.article.adapter;

import org.daemawiki.domain.article.model.Article;
import org.daemawiki.domain.article.port.DeleteArticlePort;
import org.daemawiki.domain.article.port.FindArticlePort;
import org.daemawiki.domain.article.port.SaveArticlePort;
import org.daemawiki.domain.article.repository.ArticleRepository;
import org.daemawiki.utils.PagingInfo;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Component
public class ArticleAdapter implements FindArticlePort, SaveArticlePort, DeleteArticlePort {
private final ArticleRepository articleRepository;

public ArticleAdapter(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}

@Override
public Mono<Void> delete(String articleId) {
return articleRepository.deleteById(articleId);
}

@Override
public Flux<Article> findAll(PagingInfo pagingInfo) {
return articleRepository.findAll(
pagingInfo.sortBy(),
pagingInfo.sortDirection(),
pagingInfo.page() * pagingInfo.size(),
pagingInfo.size()
);
}

@Override
public Flux<Article> search(String keyword, PagingInfo pagingInfo) {
return articleRepository.search(
keyword,
pagingInfo.sortBy(),
pagingInfo.sortDirection(),
pagingInfo.page() * pagingInfo.size(),
pagingInfo.size()
);
}

@Override
public Mono<Article> findById(String articleId) {
return articleRepository.findById(articleId);
}

@Override
public Mono<Article> save(Article article) {
return articleRepository.save(article);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.daemawiki.domain.article.dto;

public record WriteArticleRequest(
String title,
String content
) {
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.daemawiki.domain.article.model;

import lombok.Getter;
import org.daemawiki.domain.user.model.User;
import org.daemawiki.domain.user.model.Writer;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
Expand All @@ -24,21 +23,23 @@ public class Article {
private Long view = 0L;

public void increaseView() {
this.view++;
view++;
}

public void increaseRecommend() {
this.recommend++;
recommend++;
}

public Article(String title, String content, Writer writer) {
protected Article() {}

protected Article(String title, String content, Writer writer) {
this.title = title;
this.content = content;
this.writer = writer;
}

public static Article create(String title, String content, User user) {
return new Article(title, content, Writer.of(user));
public static Article create(String title, String content, Writer writer) {
return new Article(title, content, writer);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.daemawiki.domain.article.port;

import reactor.core.publisher.Mono;

public interface DeleteArticlePort {
Mono<Void> delete(String articleId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.daemawiki.domain.article.port;

import org.daemawiki.domain.article.model.Article;
import org.daemawiki.utils.PagingInfo;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public interface FindArticlePort {
Flux<Article> findAll(PagingInfo pagingInfo);
Flux<Article> search(String keyword, PagingInfo pagingInfo);
Mono<Article> findById(String articleId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.daemawiki.domain.article.port;

import org.daemawiki.domain.article.model.Article;
import reactor.core.publisher.Mono;

public interface SaveArticlePort {
Mono<Article> save(Article article);

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,17 @@ public interface ArticleRepository extends ReactiveMongoRepository<Article, Stri
"{ 'title': { $regex: '?0', $options: 'i' } }, " +
"{ 'content': { $regex: '?0', $options: 'i' } }" +
"] } }",
"{ $sort: { ?1: 1 } }"
"{ $sort: { ?1: '?2' } }",
"{ $skip: ?3 }",
"{ $limit: ?4 }"
})
Flux<Article> search(String keyword, String sortBy);
Flux<Article> search(String keyword, String sortBy, Integer sortDirection, Integer skip, Integer limit);

@Aggregation(pipeline = {
"{ $sort: { ?0: '?1' } }",
"{ $skip: ?2 }",
"{ $limit: ?3 }"
})
Flux<Article> findAll(String sortBy, Integer sortDirection, Integer skip, Integer limit);

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ public interface FindDocumentPort {
Flux<DocumentSearchResult> searchDocument(String text, PagingInfo pagingInfo);
Flux<DefaultDocument> searchDocumentTitle(String text, PagingInfo pagingInfo);
Flux<DocumentSearchResult> searchDocumentContent(String text, PagingInfo pagingInfo);
Flux<DefaultDocument> getDocumentTop10();
Flux<DefaultDocument> getDocumentMostRevision(PagingInfo pagingInfo);
Flux<DefaultDocument> getDocumentOrderByView(PagingInfo pagingInfo);
Flux<DefaultDocument> getDocumentOrderByViewTop10();

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public DocumentPersistenceAdapter(DocumentRepository documentRepository) {
@Override
public Mono<DefaultDocument> getDocumentById(String id) {
return documentRepository.findById(id)
.switchIfEmpty(Mono.error(DocumentNotFoundException.EXCEPTION));
.switchIfEmpty(Mono.defer(() -> Mono.error(DocumentNotFoundException.EXCEPTION)));
}

@Override
Expand All @@ -46,11 +46,6 @@ public Flux<DocumentSearchResult> searchDocumentContent(String text, PagingInfo
return documentRepository.findByContentTextContaining(text, pagingInfo.sortBy(), pagingInfo.sortDirection(), pagingInfo.page() * pagingInfo.size(), pagingInfo.size());
}

@Override
public Flux<DefaultDocument> getDocumentTop10() {
return documentRepository.findTop10ByOrderByVersionDesc();
}

public Flux<DefaultDocument> getDocumentMostRevision(PagingInfo pagingInfo) {
return documentRepository.findAllByOrderByVersion(pagingInfo.sortDirection(), pagingInfo.page() * pagingInfo.size(), pagingInfo.size());
}
Expand All @@ -60,11 +55,6 @@ public Flux<DefaultDocument> getDocumentOrderByView(PagingInfo pagingInfo) {
return documentRepository.findAllByOrderByView(pagingInfo.sortDirection(), pagingInfo.page() * pagingInfo.size(), pagingInfo.size());
}

@Override
public Flux<DefaultDocument> getDocumentOrderByViewTop10() {
return documentRepository.findTop10ByOrderByViewDesc();
}

@Override
public Mono<DefaultDocument> save(DefaultDocument document) {
return documentRepository.save(document);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ public interface DocumentRepository extends ReactiveMongoRepository<DefaultDocum
@Aggregation("{ $sample: {'size': 1} }")
Mono<DefaultDocument> findRandomDocument();

Flux<DefaultDocument> findTop10ByOrderByVersionDesc();

@Aggregation(pipeline = {
"{ $sort: { 'view': ?0 } }",
"{ $skip: ?1 }",
Expand All @@ -56,8 +54,6 @@ public interface DocumentRepository extends ReactiveMongoRepository<DefaultDocum
})
Flux<DefaultDocument> findAllByOrderByVersion(Integer sortDirection, Integer skip, Integer limit);

Flux<DefaultDocument> findTop10ByOrderByViewDesc();

default Mono<DefaultDocument> increaseView(DefaultDocument document) {
return Mono.justOrEmpty(document)
.doOnNext(DefaultDocument::increaseView)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public Mono<User> currentUser() {
@Override
public Mono<User> findById(String id) {
return userRepository.findById(id)
.switchIfEmpty(Mono.error(UserNotFoundException.EXCEPTION));
.switchIfEmpty(Mono.defer(() -> Mono.error(UserNotFoundException.EXCEPTION)));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.daemawiki.domain.article.service;

import org.daemawiki.domain.article.dto.WriteArticleRequest;
import org.daemawiki.domain.article.model.Article;
import org.daemawiki.domain.article.port.SaveArticlePort;
import org.daemawiki.domain.article.usecase.WriteArticleUseCase;
import org.daemawiki.domain.user.application.FindUserPort;
import org.daemawiki.domain.user.model.Writer;
import org.daemawiki.exception.h403.NoPermissionUserException;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class WriteArticleService implements WriteArticleUseCase {
private final FindUserPort findUserPort;
private final SaveArticlePort saveArticlePort;

public WriteArticleService(FindUserPort findUserPort, SaveArticlePort saveArticlePort) {
this.findUserPort = findUserPort;
this.saveArticlePort = saveArticlePort;
}

@Override
public Mono<Void> write(WriteArticleRequest request) {
return findUserPort.currentUser()
.filter(user -> !user.getIsBlocked())
.switchIfEmpty(Mono.defer(() -> Mono.error(NoPermissionUserException.EXCEPTION)))
.flatMap(user -> {
Article article = Article.create(request.title(), request.content(), Writer.of(user));
return saveArticlePort.save(article);
})
.then();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.daemawiki.domain.article.usecase;

import org.daemawiki.domain.article.dto.WriteArticleRequest;
import reactor.core.publisher.Mono;

public interface WriteArticleUseCase {
Mono<Void> write(WriteArticleRequest request);

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public ReissueService(Tokenizer tokenizer) {
public Mono<TokenResponse> reissue(String token ) {
return tokenizer.reissue(tokenParse(token))
.map(TokenResponse::create)
.switchIfEmpty(Mono.error(TokenReissueFailedException.EXCEPTION));
.switchIfEmpty(Mono.defer(() -> Mono.error(TokenReissueFailedException.EXCEPTION)));
}

private String tokenParse(String token) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public SigninService(FindUserPort findUserPort, PasswordEncoder passwordEncoder,
@Override
public Mono<TokenResponse> signin(LoginRequest request) {
return findUserPort.findByEmail(request.email())
.switchIfEmpty(Mono.error(UserNotFoundException.EXCEPTION))
.switchIfEmpty(Mono.defer(() -> Mono.error(UserNotFoundException.EXCEPTION)))
.flatMap(user -> validateUserWithPassword(user, request.password()))
.flatMap(this::generateTokenResponse);
}
Expand All @@ -59,7 +59,7 @@ private Mono<TokenResponse> generateTokenResponse(User user) {
private Mono<User> validateUserWithPassword(User user, String inputPassword) {
return Mono.just(user)
.filter(u -> passwordEncoder.matches(inputPassword, u.getPassword()))
.switchIfEmpty(Mono.error(PasswordMismatchException.EXCEPTION));
.switchIfEmpty(Mono.defer(() -> Mono.error(PasswordMismatchException.EXCEPTION)));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public Mono<Void> signup(SignupRequest request) {
private Mono<Void> checkAndCreateUser(SignupRequest request) {
return findAuthMailPort.findByMail(request.email())
.filter(verified -> verified)
.switchIfEmpty(Mono.error(UnVerifiedEmailException.EXCEPTION))
.switchIfEmpty(Mono.defer(() -> Mono.error(UnVerifiedEmailException.EXCEPTION)))
.map(verified -> passwordEncoder.encode(request.password()))
.flatMap(password -> createUser(request, password))
.flatMap(this::saveUserAndCreateDocument)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,15 @@ public Mono<Void> remove(DeleteContentRequest request, String documentId) {
return findUserPort.currentUser()
.zipWith(findDocumentPort.getDocumentById(documentId))
.map(tuple -> checkPermissionAndDeleteDocumentContentTable(tuple, request))
.flatMap(document -> saveDocumentPort.save(document)
.then(createRevision(document)))
.flatMap(this::saveDocumentAndCreateRevision)
.onErrorMap(this::mapException);
}

private Mono<Void> saveDocumentAndCreateRevision(DefaultDocument document) {
return saveDocumentPort.save(document)
.then(createRevision(document));
}

private DefaultDocument checkPermissionAndDeleteDocumentContentTable(Tuple2<User, DefaultDocument> tuple, DeleteContentRequest request) {
userFilter.userPermissionAndDocumentVersionCheck(tuple.getT2(), tuple.getT1(), request.version());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,12 @@ public Mono<Void> update(EditContentTableTitleRequest request, String documentId
.zipWith(findDocumentPort.getDocumentById(documentId))
.flatMap(tuple -> checkPermissionAndUpdateDocument(tuple, request))
.subscribeOn(scheduler)
.flatMap(document -> saveDocumentPort.save(document)
.then(createRevision(document)));
.flatMap(this::saveDocumentAndCreateRevision);
}

private Mono<Void> saveDocumentAndCreateRevision(DefaultDocument document) {
return saveDocumentPort.save(document)
.then(createRevision(document));
}

private Mono<DefaultDocument> checkPermissionAndUpdateDocument(Tuple2<User, DefaultDocument> tuple, EditContentTableTitleRequest request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,15 @@ public Mono<Void> write(WriteContentRequest request, String documentId) {
return findUserPort.currentUser()
.zipWith(findDocumentPort.getDocumentById(documentId))
.flatMap(tuple -> checkPermissionAndWriteContent(tuple, request))
.flatMap(document -> saveDocumentPort.save(document)
.then(createRevision(document)))
.flatMap(this::saveDocumentAndCreateRevision)
.onErrorMap(this::mapException);
}

private Mono<Void> saveDocumentAndCreateRevision(DefaultDocument document) {
return saveDocumentPort.save(document)
.then(createRevision(document));
}

private Mono<DefaultDocument> checkPermissionAndWriteContent(Tuple2<User, DefaultDocument> tuple, WriteContentRequest request) {
DefaultDocument document = tuple.getT2();
User user = tuple.getT1();
Expand Down
Loading

0 comments on commit af5bb91

Please sign in to comment.