mirror of https://github.com/halo-dev/halo
Refactor partial AdminController
parent
e244a91a2e
commit
e580f4fa96
|
@ -6,13 +6,11 @@ import org.springframework.web.bind.annotation.*;
|
|||
import run.halo.app.cache.lock.CacheLock;
|
||||
import run.halo.app.exception.BadRequestException;
|
||||
import run.halo.app.model.dto.CountDTO;
|
||||
import run.halo.app.model.dto.UserDTO;
|
||||
import run.halo.app.model.enums.PostStatus;
|
||||
import run.halo.app.model.params.LoginParam;
|
||||
import run.halo.app.model.properties.PrimaryProperties;
|
||||
import run.halo.app.security.context.SecurityContextHolder;
|
||||
import run.halo.app.security.filter.AdminAuthenticationFilter;
|
||||
import run.halo.app.service.*;
|
||||
import run.halo.app.security.token.AuthToken;
|
||||
import run.halo.app.service.AdminService;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
|
@ -28,30 +26,10 @@ import javax.validation.Valid;
|
|||
@RequestMapping("/api/admin")
|
||||
public class AdminController {
|
||||
|
||||
private final PostService postService;
|
||||
private final AdminService adminService;
|
||||
|
||||
private final AttachmentService attachmentService;
|
||||
|
||||
private final PostCommentService postCommentService;
|
||||
|
||||
private final OptionService optionService;
|
||||
|
||||
private final UserService userService;
|
||||
|
||||
private final LinkService linkService;
|
||||
|
||||
public AdminController(PostService postService,
|
||||
AttachmentService attachmentService,
|
||||
PostCommentService postCommentService,
|
||||
OptionService optionService,
|
||||
UserService userService,
|
||||
LinkService linkService) {
|
||||
this.postService = postService;
|
||||
this.attachmentService = attachmentService;
|
||||
this.postCommentService = postCommentService;
|
||||
this.optionService = optionService;
|
||||
this.userService = userService;
|
||||
this.linkService = linkService;
|
||||
public AdminController(AdminService adminService) {
|
||||
this.adminService = adminService;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -62,36 +40,20 @@ public class AdminController {
|
|||
@GetMapping("counts")
|
||||
@ApiOperation("Gets count info")
|
||||
public CountDTO getCount() {
|
||||
CountDTO countDTO = new CountDTO();
|
||||
countDTO.setPostCount(postService.countByStatus(PostStatus.PUBLISHED));
|
||||
countDTO.setAttachmentCount(attachmentService.count());
|
||||
countDTO.setCommentCount(postCommentService.count());
|
||||
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
|
||||
// Calculate birthday
|
||||
// TODO Initialize the birthday if absent
|
||||
Long birthday = optionService.getByPropertyOrDefault(PrimaryProperties.BIRTHDAY, Long.class, currentTimeMillis);
|
||||
long days = (currentTimeMillis - birthday) / (1000 * 24 * 3600);
|
||||
countDTO.setEstablishDays(days);
|
||||
|
||||
countDTO.setLinkCount(linkService.count());
|
||||
countDTO.setVisitCount(postService.countVisit());
|
||||
countDTO.setLikeCount(postService.countLike());
|
||||
return countDTO;
|
||||
return adminService.getCount();
|
||||
}
|
||||
|
||||
@PostMapping("login")
|
||||
@ApiOperation("Login with session")
|
||||
@CacheLock(autoDelete = false, traceRequest = true)
|
||||
public UserDTO login(@Valid @RequestBody LoginParam loginParam, HttpServletRequest request) {
|
||||
return new UserDTO().convertFrom(userService.login(loginParam.getUsername(), loginParam.getPassword(), request.getSession()));
|
||||
@PostMapping("auth/login")
|
||||
@ApiOperation("Login")
|
||||
public AuthToken auth(@RequestBody @Valid LoginParam loginParam) {
|
||||
return adminService.authenticate(loginParam);
|
||||
}
|
||||
|
||||
@PostMapping("logout")
|
||||
@ApiOperation("Logs out (Clear session)")
|
||||
@CacheLock
|
||||
public void logout(HttpServletRequest request) {
|
||||
adminService.clearAuthentication();
|
||||
// Check if the current is logging in
|
||||
boolean authenticated = SecurityContextHolder.getContext().isAuthenticated();
|
||||
|
||||
|
|
|
@ -61,6 +61,14 @@ public interface BaseCommentRepository<COMMENT extends BaseComment> extends Base
|
|||
@NonNull
|
||||
List<CommentCountProjection> countByPostIds(@NonNull Iterable<Integer> postIds);
|
||||
|
||||
/**
|
||||
* Counts by comment status.
|
||||
*
|
||||
* @param status comment status must not be null
|
||||
* @return comment count
|
||||
*/
|
||||
long countByStatus(@NonNull CommentStatus status);
|
||||
|
||||
/**
|
||||
* Finds comments by post id, comment status.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
package run.halo.app.service;
|
||||
|
||||
import org.springframework.lang.NonNull;
|
||||
import run.halo.app.model.dto.CountDTO;
|
||||
import run.halo.app.model.params.LoginParam;
|
||||
import run.halo.app.security.token.AuthToken;
|
||||
|
||||
/**
|
||||
* Admin service.
|
||||
*
|
||||
* @author johnniang
|
||||
* @date 19-4-29
|
||||
*/
|
||||
public interface AdminService {
|
||||
|
||||
/**
|
||||
* Authenticates.
|
||||
*
|
||||
* @param loginParam login param must not be null
|
||||
* @return authentication token
|
||||
*/
|
||||
@NonNull
|
||||
AuthToken authenticate(@NonNull LoginParam loginParam);
|
||||
|
||||
/**
|
||||
* Clears authentication.
|
||||
*/
|
||||
void clearAuthentication();
|
||||
|
||||
/**
|
||||
* Get system counts.
|
||||
*
|
||||
* @return count dto
|
||||
*/
|
||||
@NonNull
|
||||
CountDTO getCount();
|
||||
}
|
|
@ -288,4 +288,11 @@ public interface OptionService extends CrudService<Option, Integer> {
|
|||
@NonNull
|
||||
String getBlogBaseUrl();
|
||||
|
||||
/**
|
||||
* Gets blog birthday.
|
||||
*
|
||||
* @return birthday timestamp
|
||||
*/
|
||||
long getBirthday();
|
||||
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package run.halo.app.service;
|
||||
|
||||
import org.springframework.lang.NonNull;
|
||||
import run.halo.app.exception.NotFoundException;
|
||||
import run.halo.app.model.entity.User;
|
||||
import run.halo.app.model.params.UserParam;
|
||||
import run.halo.app.service.base.CrudService;
|
||||
import org.springframework.lang.NonNull;
|
||||
|
||||
import javax.servlet.http.HttpSession;
|
||||
import java.util.Optional;
|
||||
|
@ -82,11 +82,11 @@ public interface UserService extends CrudService<User, Integer> {
|
|||
*
|
||||
* @param key username or email must not be blank
|
||||
* @param password password must not be blank
|
||||
* @param httpSession http session must not be null
|
||||
* @return user info
|
||||
*/
|
||||
@NonNull
|
||||
User login(@NonNull String key, @NonNull String password, @NonNull HttpSession httpSession);
|
||||
@Deprecated
|
||||
User login(@NonNull String key, @NonNull String password);
|
||||
|
||||
/**
|
||||
* Updates user password.
|
||||
|
|
|
@ -99,6 +99,14 @@ public interface BaseCommentService<COMMENT extends BaseComment> extends CrudSer
|
|||
@NonNull
|
||||
Map<Integer, Long> countByPostIds(@Nullable Collection<Integer> postIds);
|
||||
|
||||
/**
|
||||
* Counts by comment status.
|
||||
*
|
||||
* @param status comment status must not be null
|
||||
* @return comment count
|
||||
*/
|
||||
long countByStatus(@NonNull CommentStatus status);
|
||||
|
||||
/**
|
||||
* Creates a comment by comment.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
package run.halo.app.service.impl;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.Assert;
|
||||
import run.halo.app.cache.StringCacheStore;
|
||||
import run.halo.app.exception.BadRequestException;
|
||||
import run.halo.app.model.dto.CountDTO;
|
||||
import run.halo.app.model.enums.CommentStatus;
|
||||
import run.halo.app.model.enums.PostStatus;
|
||||
import run.halo.app.model.params.LoginParam;
|
||||
import run.halo.app.security.context.SecurityContextHolder;
|
||||
import run.halo.app.security.token.AuthToken;
|
||||
import run.halo.app.service.*;
|
||||
|
||||
/**
|
||||
* Admin service implementation.
|
||||
*
|
||||
* @author johnniang
|
||||
* @date 19-4-29
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class AdminServiceImpl implements AdminService {
|
||||
|
||||
private final PostService postService;
|
||||
|
||||
private final SheetService sheetService;
|
||||
|
||||
private final AttachmentService attachmentService;
|
||||
|
||||
private final PostCommentService postCommentService;
|
||||
|
||||
private final SheetCommentService sheetCommentService;
|
||||
|
||||
private final JournalCommentService journalCommentService;
|
||||
|
||||
private final OptionService optionService;
|
||||
|
||||
private final UserService userService;
|
||||
|
||||
private final LinkService linkService;
|
||||
|
||||
private final StringCacheStore cacheStore;
|
||||
|
||||
public AdminServiceImpl(PostService postService,
|
||||
SheetService sheetService,
|
||||
AttachmentService attachmentService,
|
||||
PostCommentService postCommentService,
|
||||
SheetCommentService sheetCommentService,
|
||||
JournalCommentService journalCommentService,
|
||||
OptionService optionService,
|
||||
UserService userService,
|
||||
LinkService linkService,
|
||||
StringCacheStore cacheStore) {
|
||||
this.postService = postService;
|
||||
this.sheetService = sheetService;
|
||||
this.attachmentService = attachmentService;
|
||||
this.postCommentService = postCommentService;
|
||||
this.sheetCommentService = sheetCommentService;
|
||||
this.journalCommentService = journalCommentService;
|
||||
this.optionService = optionService;
|
||||
this.userService = userService;
|
||||
this.linkService = linkService;
|
||||
this.cacheStore = cacheStore;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AuthToken authenticate(LoginParam loginParam) {
|
||||
Assert.notNull(loginParam, "Login param must not be null");
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearAuthentication() {
|
||||
// Check if the current is logging in
|
||||
boolean authenticated = SecurityContextHolder.getContext().isAuthenticated();
|
||||
|
||||
if (!authenticated) {
|
||||
throw new BadRequestException("You haven't logged in yet, so you can't log out");
|
||||
}
|
||||
|
||||
log.info("You have been logged out, looking forward to your next visit!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CountDTO getCount() {
|
||||
CountDTO countDTO = new CountDTO();
|
||||
countDTO.setPostCount(postService.countByStatus(PostStatus.PUBLISHED));
|
||||
countDTO.setAttachmentCount(attachmentService.count());
|
||||
|
||||
// Handle comment count
|
||||
long postCommentCount = postCommentService.countByStatus(CommentStatus.PUBLISHED);
|
||||
long sheetCommentCount = sheetCommentService.countByStatus(CommentStatus.PUBLISHED);
|
||||
long journalCommentCount = journalCommentService.countByStatus(CommentStatus.PUBLISHED);
|
||||
|
||||
countDTO.setCommentCount(postCommentCount + sheetCommentCount + journalCommentCount);
|
||||
|
||||
long birthday = optionService.getBirthday();
|
||||
long days = (System.currentTimeMillis() - birthday) / (1000 * 24 * 3600);
|
||||
countDTO.setEstablishDays(days);
|
||||
|
||||
countDTO.setLinkCount(linkService.count());
|
||||
|
||||
countDTO.setVisitCount(postService.countVisit() + sheetService.countVisit());
|
||||
countDTO.setLikeCount(postService.countLike() + sheetService.countLike());
|
||||
return countDTO;
|
||||
}
|
||||
}
|
|
@ -196,6 +196,11 @@ public abstract class BaseCommentServiceImpl<COMMENT extends BaseComment> extend
|
|||
return ServiceUtils.convertToMap(commentCountProjections, CommentCountProjection::getPostId, CommentCountProjection::getCount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long countByStatus(CommentStatus status) {
|
||||
return baseCommentRepository.countByStatus(status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public COMMENT create(COMMENT comment) {
|
||||
Assert.notNull(comment, "Domain must not be null");
|
||||
|
|
|
@ -20,6 +20,7 @@ import run.halo.app.model.properties.*;
|
|||
import run.halo.app.repository.OptionRepository;
|
||||
import run.halo.app.service.OptionService;
|
||||
import run.halo.app.service.base.AbstractCrudService;
|
||||
import run.halo.app.utils.DateUtils;
|
||||
import run.halo.app.utils.HaloUtils;
|
||||
import run.halo.app.utils.ServiceUtils;
|
||||
|
||||
|
@ -380,6 +381,15 @@ public class OptionServiceImpl extends AbstractCrudService<Option, Integer> impl
|
|||
return blogUrl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getBirthday() {
|
||||
return getByProperty(PrimaryProperties.BIRTHDAY, Long.class).orElseGet(() -> {
|
||||
long currentTime = DateUtils.now().getTime();
|
||||
saveProperty(PrimaryProperties.BIRTHDAY, String.valueOf(currentTime));
|
||||
return currentTime;
|
||||
});
|
||||
}
|
||||
|
||||
private void publishOptionUpdatedEvent() {
|
||||
eventPublisher.publishEvent(new OptionUpdatedEvent(this));
|
||||
}
|
||||
|
|
|
@ -24,8 +24,8 @@ import run.halo.app.service.UserService;
|
|||
import run.halo.app.service.base.AbstractCrudService;
|
||||
import run.halo.app.utils.DateUtils;
|
||||
import run.halo.app.utils.HaloUtils;
|
||||
import run.halo.app.utils.ServletUtils;
|
||||
|
||||
import javax.servlet.http.HttpSession;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
@ -103,10 +103,9 @@ public class UserServiceImpl extends AbstractCrudService<User, Integer> implemen
|
|||
}
|
||||
|
||||
@Override
|
||||
public User login(String key, String password, HttpSession httpSession) {
|
||||
public User login(String key, String password) {
|
||||
Assert.hasText(key, "Username or email must not be blank");
|
||||
Assert.hasText(password, "Password must not be blank");
|
||||
Assert.notNull(httpSession, "Http session must not be null");
|
||||
|
||||
// Check login status
|
||||
if (SecurityContextHolder.getContext().isAuthenticated()) {
|
||||
|
@ -155,7 +154,9 @@ public class UserServiceImpl extends AbstractCrudService<User, Integer> implemen
|
|||
stringCacheStore.delete(LOGIN_FAILURE_COUNT_KEY);
|
||||
|
||||
// Set session
|
||||
httpSession.setAttribute(AdminAuthenticationFilter.ADMIN_SESSION_KEY, new UserDetail(user));
|
||||
ServletUtils.getCurrentRequest().ifPresent(request -> {
|
||||
request.getSession().setAttribute(AdminAuthenticationFilter.ADMIN_SESSION_KEY, new UserDetail(user));
|
||||
});
|
||||
|
||||
// Log it
|
||||
eventPublisher.publishEvent(new LogEvent(this, user.getId().toString(), LogType.LOGGED_IN, user.getUsername()));
|
||||
|
|
Loading…
Reference in New Issue