package com.mindskip.xzs.controller.student; import com.mindskip.xzs.base.BaseApiController; import com.mindskip.xzs.base.RestResponse; import com.mindskip.xzs.domain.Message; import com.mindskip.xzs.domain.MessageUser; import com.mindskip.xzs.domain.User; import com.mindskip.xzs.domain.UserEventLog; import com.mindskip.xzs.domain.enums.RoleEnum; import com.mindskip.xzs.domain.enums.UserStatusEnum; import com.mindskip.xzs.event.UserEvent; import com.mindskip.xzs.service.AuthenticationService; import com.mindskip.xzs.service.MessageService; import com.mindskip.xzs.service.UserEventLogService; import com.mindskip.xzs.service.UserService; import com.mindskip.xzs.utility.DateTimeUtil; import com.mindskip.xzs.utility.PageInfoHelper; import com.mindskip.xzs.viewmodel.student.user.*; import com.github.pagehelper.PageInfo; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.Date; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @RestController("StudentUserController") @RequestMapping(value = "/api/student/user") public class UserController extends BaseApiController { private final UserService userService; private final UserEventLogService userEventLogService; private final MessageService messageService; private final AuthenticationService authenticationService; private final ApplicationEventPublisher eventPublisher; @Autowired public UserController(UserService userService, UserEventLogService userEventLogService, MessageService messageService, AuthenticationService authenticationService, ApplicationEventPublisher eventPublisher) { this.userService = userService; this.userEventLogService = userEventLogService; this.messageService = messageService; this.authenticationService = authenticationService; this.eventPublisher = eventPublisher; } @RequestMapping(value = "/current", method = RequestMethod.POST) public RestResponse current() { User user = getCurrentUser(); UserResponseVM userVm = UserResponseVM.from(user); return RestResponse.ok(userVm); } @RequestMapping(value = "/register", method = RequestMethod.POST) public RestResponse register(@RequestBody @Valid UserRegisterVM model) { User existUser = userService.getUserByUserName(model.getUserName()); if (null != existUser) { return new RestResponse<>(2, "用户已存在"); } User user = modelMapper.map(model, User.class); String encodePwd = authenticationService.pwdEncode(model.getPassword()); user.setUserUuid(UUID.randomUUID().toString()); user.setPassword(encodePwd); user.setRole(RoleEnum.STUDENT.getCode()); user.setStatus(UserStatusEnum.Enable.getCode()); user.setLastActiveTime(new Date()); user.setCreateTime(new Date()); user.setDeleted(false); userService.insertByFilter(user); UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date()); userEventLog.setContent("欢迎 " + user.getUserName() + " 注册来到学之思开源考试系统"); eventPublisher.publishEvent(new UserEvent(userEventLog)); return RestResponse.ok(); } @RequestMapping(value = "/update", method = RequestMethod.POST) public RestResponse update(@RequestBody @Valid UserUpdateVM model) { if (StringUtils.isBlank(model.getBirthDay())) { model.setBirthDay(null); } User user = userService.selectById(getCurrentUser().getId()); modelMapper.map(model, user); user.setModifyTime(new Date()); user.setPassword(user.getPassword() != null ? authenticationService.pwdEncode(user.getPassword()) : null); userService.updateByIdFilter(user); UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date()); userEventLog.setContent(user.getUserName() + " 更新了个人资料"); eventPublisher.publishEvent(new UserEvent(userEventLog)); return RestResponse.ok(); } @RequestMapping(value = "/log", method = RequestMethod.POST) public RestResponse> log() { User user = getCurrentUser(); List userEventLogs = userEventLogService.getUserEventLogByUserId(user.getId()); List userEventLogVMS = userEventLogs.stream().map(d -> { UserEventLogVM vm = modelMapper.map(d, UserEventLogVM.class); vm.setCreateTime(DateTimeUtil.dateFormat(d.getCreateTime())); return vm; }).collect(Collectors.toList()); return RestResponse.ok(userEventLogVMS); } @RequestMapping(value = "/message/page", method = RequestMethod.POST) public RestResponse> messagePageList(@RequestBody MessageRequestVM messageRequestVM) { messageRequestVM.setReceiveUserId(getCurrentUser().getId()); PageInfo messageUserPageInfo = messageService.studentPage(messageRequestVM); List ids = messageUserPageInfo.getList().stream().map(d -> d.getMessageId()).collect(Collectors.toList()); List messages = ids.size() != 0 ? messageService.selectMessageByIds(ids) : null; PageInfo page = PageInfoHelper.copyMap(messageUserPageInfo, e -> { MessageResponseVM vm = modelMapper.map(e, MessageResponseVM.class); messages.stream().filter(d -> e.getMessageId().equals(d.getId())).findFirst().ifPresent(message -> { vm.setTitle(message.getTitle()); vm.setContent(message.getContent()); vm.setSendUserName(message.getSendUserName()); }); vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime())); return vm; }); return RestResponse.ok(page); } @RequestMapping(value = "/message/unreadCount", method = RequestMethod.POST) public RestResponse unReadCount() { Integer count = messageService.unReadCount(getCurrentUser().getId()); return RestResponse.ok(count); } @RequestMapping(value = "/message/read/{id}", method = RequestMethod.POST) public RestResponse read(@PathVariable Integer id) { messageService.read(id); return RestResponse.ok(); } @RequestMapping(value = "/connect", method = RequestMethod.GET) public RestResponse connect() { return RestResponse.ok(); } }