diff --git a/api/src/main/java/com/databasir/api/OperationLogController.java b/api/src/main/java/com/databasir/api/OperationLogController.java new file mode 100644 index 0000000..7345735 --- /dev/null +++ b/api/src/main/java/com/databasir/api/OperationLogController.java @@ -0,0 +1,30 @@ +package com.databasir.api; + +import com.databasir.common.JsonData; +import com.databasir.core.domain.log.data.OperationLogPageCondition; +import com.databasir.core.domain.log.data.OperationLogPageResponse; +import com.databasir.core.domain.log.service.OperationLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Validated +public class OperationLogController { + + private final OperationLogService operationLogService; + + @GetMapping(Routes.OperationLog.LIST) + public JsonData> list(@PageableDefault(sort = "id", direction = Sort.Direction.DESC) + Pageable page, + OperationLogPageCondition condition) { + Page pageData = operationLogService.list(page, condition); + return JsonData.ok(pageData); + } +} diff --git a/api/src/main/java/com/databasir/api/Routes.java b/api/src/main/java/com/databasir/api/Routes.java index 406d09a..49b8697 100644 --- a/api/src/main/java/com/databasir/api/Routes.java +++ b/api/src/main/java/com/databasir/api/Routes.java @@ -94,4 +94,8 @@ public interface Routes { String REFRESH_ACCESS_TOKEN = "/access_tokens"; } + + interface OperationLog { + String LIST = BASE + "/operation_logs"; + } } 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 new file mode 100644 index 0000000..e69349d --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/log/converter/OperationLogPojoConverter.java @@ -0,0 +1,13 @@ +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.OperationLogPojo; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring", uses = JsonConverter.class) +public interface OperationLogPojoConverter { + + OperationLogPageResponse to(OperationLogPojo pojo); + +} diff --git a/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageCondition.java b/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageCondition.java new file mode 100644 index 0000000..bb2f060 --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageCondition.java @@ -0,0 +1,55 @@ +package com.databasir.core.domain.log.data; + +import com.databasir.dao.Tables; +import lombok.Data; +import org.jooq.Condition; +import org.jooq.impl.DSL; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class OperationLogPageCondition { + + private String module; + + private String code; + + private Integer operatorUserId; + + private Integer involveProjectId; + + private Integer involveGroupId; + + private Integer involveUserId; + + private Boolean isSuccess; + + public Condition toCondition() { + List conditions = new ArrayList<>(); + if (module != null) { + conditions.add(Tables.OPERATION_LOG.OPERATION_MODULE.eq(module)); + } + if (code != null) { + conditions.add(Tables.OPERATION_LOG.OPERATION_CODE.eq(module)); + } + if (operatorUserId != null) { + conditions.add(Tables.OPERATION_LOG.OPERATOR_USER_ID.eq(operatorUserId)); + } + if (involveProjectId != null) { + conditions.add(Tables.OPERATION_LOG.INVOLVED_PROJECT_ID.eq(involveProjectId)); + } + if (involveGroupId != null) { + conditions.add(Tables.OPERATION_LOG.INVOLVED_GROUP_ID.eq(involveGroupId)); + } + if (involveUserId != null) { + conditions.add(Tables.OPERATION_LOG.INVOLVED_USER_ID.eq(involveUserId)); + } + if (isSuccess != null) { + conditions.add(Tables.OPERATION_LOG.IS_SUCCESS.eq(isSuccess)); + } + return conditions.stream() + .reduce(Condition::and) + .orElse(DSL.trueCondition()); + } +} 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 new file mode 100644 index 0000000..be94bf1 --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/log/data/OperationLogPageResponse.java @@ -0,0 +1,39 @@ +package com.databasir.core.domain.log.data; + +import com.databasir.common.JsonData; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Builder +public class OperationLogPageResponse { + + private Integer id; + + private Integer operatorUserId; + + private String operatorUsername; + + private String operatorNickname; + + private String operationModule; + + private String operationCode; + + private String operationName; + + private JsonData operationResponse; + + private Boolean isSuccess; + + private Integer involvedProjectId; + + private Integer involvedGroupId; + + private Integer involvedUserId; + + private LocalDateTime createAt; + +} 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 da4226e..ccd990f 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 @@ -1,10 +1,15 @@ package com.databasir.core.domain.log.service; +import com.databasir.core.domain.log.converter.OperationLogPojoConverter; 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.OperationLogDao; import com.databasir.dao.tables.pojos.OperationLogPojo; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @Service @@ -15,8 +20,16 @@ public class OperationLogService { private final OperationLogRequestConverter operationLogRequestConverter; + private final OperationLogPojoConverter operationLogPojoConverter; + public void save(OperationLogRequest request) { OperationLogPojo pojo = operationLogRequestConverter.toPojo(request); operationLogDao.insertAndReturnId(pojo); } + + public Page list(Pageable page, + OperationLogPageCondition condition) { + Page pojoData = operationLogDao.selectByPage(page, condition.toCondition()); + return pojoData.map(operationLogPojoConverter::to); + } } diff --git a/core/src/main/java/com/databasir/core/infrastructure/converter/JsonConverter.java b/core/src/main/java/com/databasir/core/infrastructure/converter/JsonConverter.java index ec2ecb6..ff6e404 100644 --- a/core/src/main/java/com/databasir/core/infrastructure/converter/JsonConverter.java +++ b/core/src/main/java/com/databasir/core/infrastructure/converter/JsonConverter.java @@ -56,6 +56,17 @@ public class JsonConverter { } } + public JsonData toJsonData(JSON json) { + try { + if (json == null) { + return null; + } + return objectMapper.readValue(json.data().getBytes(StandardCharsets.UTF_8), JsonData.class); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + public JSON toJson(JsonData data) { String json = objToJson(data); return JSON.valueOf(json);