From 2f09b2e42ea089451877f2c4bb85a2ac14c5b0f2 Mon Sep 17 00:00:00 2001 From: vran Date: Sat, 5 Mar 2022 12:20:50 +0800 Subject: [PATCH] feat: add more detail info in log --- ...ontroller.java => LoginAppController.java} | 24 +++++++----- .../com/databasir/api/SettingController.java | 3 +- .../resources/application-local.properties | 1 - .../core/domain/log/annotation/Operation.java | 1 + .../converter/OperationLogPojoConverter.java | 31 ++++++++++++++- .../log/data/OperationLogPageResponse.java | 39 +++++++++++++++++-- .../log/service/OperationLogService.java | 39 ++++++++++++++++++- .../java/com/databasir/dao/impl/GroupDao.java | 13 +++++++ 8 files changed, 134 insertions(+), 17 deletions(-) rename api/src/main/java/com/databasir/api/{OpenAuth2AppController.java => LoginAppController.java} (90%) diff --git a/api/src/main/java/com/databasir/api/OpenAuth2AppController.java b/api/src/main/java/com/databasir/api/LoginAppController.java similarity index 90% rename from api/src/main/java/com/databasir/api/OpenAuth2AppController.java rename to api/src/main/java/com/databasir/api/LoginAppController.java index 8d3748b..f9cea3a 100644 --- a/api/src/main/java/com/databasir/api/OpenAuth2AppController.java +++ b/api/src/main/java/com/databasir/api/LoginAppController.java @@ -4,6 +4,7 @@ import com.databasir.common.JsonData; import com.databasir.core.domain.app.OpenAuthAppService; import com.databasir.core.domain.app.data.*; import com.databasir.core.domain.app.handler.OpenAuthHandlers; +import com.databasir.core.domain.log.annotation.Operation; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -21,12 +22,21 @@ import static org.springframework.data.domain.Sort.Direction.DESC; @Controller @RequiredArgsConstructor -public class OpenAuth2AppController { +public class LoginAppController { private final OpenAuthAppService openAuthAppService; private final OpenAuthHandlers openAuthHandlers; + /** + * 无需授权 + */ + @GetMapping("/oauth2/apps") + @ResponseBody + public JsonData> listApps() { + return JsonData.ok(openAuthAppService.listAll()); + } + /** * 无需授权 */ @@ -39,15 +49,6 @@ public class OpenAuth2AppController { return JsonData.ok(authorization); } - /** - * 无需授权 - */ - @GetMapping("/oauth2/apps") - @ResponseBody - public JsonData> listApps() { - return JsonData.ok(openAuthAppService.listAll()); - } - @GetMapping(Routes.OAuth2App.LIST_PAGE) @PreAuthorize("hasAnyAuthority('SYS_OWNER')") @ResponseBody @@ -68,6 +69,7 @@ public class OpenAuth2AppController { @PostMapping(Routes.OAuth2App.CREATE) @PreAuthorize("hasAnyAuthority('SYS_OWNER')") @ResponseBody + @Operation(module = Operation.Modules.LOGIN_APP, name = "创建登录应用") public JsonData create(@RequestBody @Valid OAuthAppCreateRequest request) { Integer id = openAuthAppService.create(request); return JsonData.ok(id); @@ -76,6 +78,7 @@ public class OpenAuth2AppController { @PatchMapping(Routes.OAuth2App.UPDATE) @PreAuthorize("hasAnyAuthority('SYS_OWNER')") @ResponseBody + @Operation(module = Operation.Modules.LOGIN_APP, name = "更新登录应用") public JsonData updateById(@RequestBody @Valid OAuthAppUpdateRequest request) { openAuthAppService.updateById(request); return JsonData.ok(); @@ -84,6 +87,7 @@ public class OpenAuth2AppController { @DeleteMapping(Routes.OAuth2App.DELETE) @PreAuthorize("hasAnyAuthority('SYS_OWNER')") @ResponseBody + @Operation(module = Operation.Modules.LOGIN_APP, name = "删除登录应用") public JsonData deleteById(@PathVariable Integer id) { openAuthAppService.deleteById(id); return JsonData.ok(); diff --git a/api/src/main/java/com/databasir/api/SettingController.java b/api/src/main/java/com/databasir/api/SettingController.java index 5b4eeda..6478957 100644 --- a/api/src/main/java/com/databasir/api/SettingController.java +++ b/api/src/main/java/com/databasir/api/SettingController.java @@ -28,13 +28,14 @@ public class SettingController { } @DeleteMapping(Routes.Setting.DELETE_SYS_EMAIL) + @Operation(module = Operation.Modules.SETTING, name = "重置系统邮箱") public JsonData deleteSysEmail() { systemService.deleteSystemEmail(); return JsonData.ok(); } @PostMapping(Routes.Setting.UPDATE_SYS_EMAIL) - @Operation(module = Operation.Modules.PROJECT, name = "更新邮件配置") + @Operation(module = Operation.Modules.SETTING, name = "更新邮件配置") public JsonData updateSystemEmailSetting(@RequestBody @Valid SystemEmailUpdateRequest request) { systemService.updateEmailSetting(request); return JsonData.ok(); diff --git a/api/src/main/resources/application-local.properties b/api/src/main/resources/application-local.properties index 60c4656..a2ddb89 100644 --- a/api/src/main/resources/application-local.properties +++ b/api/src/main/resources/application-local.properties @@ -5,7 +5,6 @@ spring.datasource.username=root spring.datasource.password=123456 spring.datasource.url=jdbc:mysql://localhost:3306/databasir spring.jooq.sql-dialect=mysql - spring.flyway.enabled=true spring.flyway.baseline-on-migrate=true spring.flyway.locations=classpath:db/migration diff --git a/core/src/main/java/com/databasir/core/domain/log/annotation/Operation.java b/core/src/main/java/com/databasir/core/domain/log/annotation/Operation.java index 17bfa21..9c3d0f5 100644 --- a/core/src/main/java/com/databasir/core/domain/log/annotation/Operation.java +++ b/core/src/main/java/com/databasir/core/domain/log/annotation/Operation.java @@ -33,6 +33,7 @@ public @interface Operation { String PROJECT = "project"; String USER = "user"; String GROUP = "group"; + String LOGIN_APP = "login_app"; String SETTING = "setting"; } diff --git a/core/src/main/java/com/databasir/core/domain/log/converter/OperationLogPojoConverter.java b/core/src/main/java/com/databasir/core/domain/log/converter/OperationLogPojoConverter.java index e69349d..58fc027 100644 --- a/core/src/main/java/com/databasir/core/domain/log/converter/OperationLogPojoConverter.java +++ b/core/src/main/java/com/databasir/core/domain/log/converter/OperationLogPojoConverter.java @@ -2,12 +2,41 @@ package com.databasir.core.domain.log.converter; import com.databasir.core.domain.log.data.OperationLogPageResponse; import com.databasir.core.infrastructure.converter.JsonConverter; +import com.databasir.dao.tables.pojos.GroupPojo; import com.databasir.dao.tables.pojos.OperationLogPojo; +import com.databasir.dao.tables.pojos.ProjectPojo; +import com.databasir.dao.tables.pojos.UserPojo; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import java.util.Map; @Mapper(componentModel = "spring", uses = JsonConverter.class) public interface OperationLogPojoConverter { - OperationLogPageResponse to(OperationLogPojo pojo); + @Mapping(target = "id", source = "pojo.id") + @Mapping(target = "createAt", source = "pojo.createAt") + OperationLogPageResponse to(OperationLogPojo pojo, + GroupPojo involvedGroup, + UserPojo involvedUser, + ProjectPojo involvedProject); + default OperationLogPageResponse to(OperationLogPojo operationLogPojo, + Map groupMapById, + Map userMapById, + Map projectMapById) { + GroupPojo group = null; + if (operationLogPojo.getInvolvedGroupId() != null) { + group = groupMapById.get(operationLogPojo.getInvolvedGroupId()); + } + UserPojo user = null; + if (operationLogPojo.getInvolvedUserId() != null) { + user = userMapById.get(operationLogPojo.getInvolvedUserId()); + } + ProjectPojo project = null; + if (operationLogPojo.getInvolvedProjectId() != null) { + project = projectMapById.get(operationLogPojo.getInvolvedProjectId()); + } + return to(operationLogPojo, group, user, project); + } } diff --git a/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageResponse.java b/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageResponse.java index be94bf1..5047b93 100644 --- a/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageResponse.java +++ b/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageResponse.java @@ -1,8 +1,10 @@ package com.databasir.core.domain.log.data; import com.databasir.common.JsonData; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @@ -28,12 +30,43 @@ public class OperationLogPageResponse { private Boolean isSuccess; - private Integer involvedProjectId; + private InvolvedProjectData involvedProject; - private Integer involvedGroupId; + private InvolvedGroupData involvedGroup; - private Integer involvedUserId; + private InvolvedUserData involvedUser; private LocalDateTime createAt; + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class InvolvedProjectData { + + private Integer id; + + private String name; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class InvolvedGroupData { + + private Integer id; + + private String name; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class InvolvedUserData { + + private Integer id; + + private String email; + + private String nickname; + } } diff --git a/core/src/main/java/com/databasir/core/domain/log/service/OperationLogService.java b/core/src/main/java/com/databasir/core/domain/log/service/OperationLogService.java index ccd990f..f62544e 100644 --- a/core/src/main/java/com/databasir/core/domain/log/service/OperationLogService.java +++ b/core/src/main/java/com/databasir/core/domain/log/service/OperationLogService.java @@ -5,19 +5,36 @@ import com.databasir.core.domain.log.converter.OperationLogRequestConverter; import com.databasir.core.domain.log.data.OperationLogPageCondition; import com.databasir.core.domain.log.data.OperationLogPageResponse; import com.databasir.core.domain.log.data.OperationLogRequest; +import com.databasir.dao.impl.GroupDao; import com.databasir.dao.impl.OperationLogDao; +import com.databasir.dao.impl.ProjectDao; +import com.databasir.dao.impl.UserDao; +import com.databasir.dao.tables.pojos.GroupPojo; import com.databasir.dao.tables.pojos.OperationLogPojo; +import com.databasir.dao.tables.pojos.ProjectPojo; +import com.databasir.dao.tables.pojos.UserPojo; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class OperationLogService { private final OperationLogDao operationLogDao; + private final UserDao userDao; + + private final GroupDao groupDao; + + private final ProjectDao projectDao; + private final OperationLogRequestConverter operationLogRequestConverter; private final OperationLogPojoConverter operationLogPojoConverter; @@ -30,6 +47,26 @@ public class OperationLogService { public Page list(Pageable page, OperationLogPageCondition condition) { Page pojoData = operationLogDao.selectByPage(page, condition.toCondition()); - return pojoData.map(operationLogPojoConverter::to); + List groupIds = pojoData.filter(p -> p.getInvolvedGroupId() != null) + .map(OperationLogPojo::getInvolvedGroupId) + .toList(); + Map groupMapById = groupDao.selectAllInIds(groupIds) + .stream() + .collect(Collectors.toMap(GroupPojo::getId, Function.identity())); + + List userIds = pojoData.filter(p -> p.getInvolvedUserId() != null) + .map(OperationLogPojo::getInvolvedUserId) + .toList(); + Map userMapById = userDao.selectInIds(userIds) + .stream() + .collect(Collectors.toMap(UserPojo::getId, Function.identity())); + + List projectIds = pojoData.filter(p -> p.getInvolvedProjectId() != null) + .map(OperationLogPojo::getInvolvedProjectId) + .toList(); + Map projectMapById = projectDao.selectInIds(projectIds) + .stream() + .collect(Collectors.toMap(ProjectPojo::getId, Function.identity())); + return pojoData.map(pojo -> operationLogPojoConverter.to(pojo, groupMapById, userMapById, projectMapById)); } } diff --git a/dao/src/main/java/com/databasir/dao/impl/GroupDao.java b/dao/src/main/java/com/databasir/dao/impl/GroupDao.java index e843d17..685819e 100644 --- a/dao/src/main/java/com/databasir/dao/impl/GroupDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/GroupDao.java @@ -56,4 +56,17 @@ public class GroupDao extends BaseDao { .where(GROUP.ID.in(ids)).and(GROUP.DELETED.eq(false)) .fetchInto(GroupPojo.class); } + + /** + * with deleted + */ + public List selectAllInIds(List ids) { + if (ids == null || ids.isEmpty()) { + return Collections.emptyList(); + } + return getDslContext() + .select(GROUP.fields()).from(GROUP) + .where(GROUP.ID.in(ids)) + .fetchInto(GroupPojo.class); + } } \ No newline at end of file