|
|
@ -48,10 +48,7 @@ import java.time.Instant; |
|
|
import java.time.LocalDate; |
|
|
import java.time.LocalDate; |
|
|
import java.time.LocalDateTime; |
|
|
import java.time.LocalDateTime; |
|
|
import java.time.ZoneOffset; |
|
|
import java.time.ZoneOffset; |
|
|
import java.util.Arrays; |
|
|
import java.util.*; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.Optional; |
|
|
|
|
|
import java.util.UUID; |
|
|
|
|
|
import java.util.concurrent.ExecutorService; |
|
|
import java.util.concurrent.ExecutorService; |
|
|
import java.util.concurrent.Executors; |
|
|
import java.util.concurrent.Executors; |
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
|
@ -135,12 +132,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
|
|
|
|
|
|
long partition = toPartitionTs(LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC).toEpochMilli()); |
|
|
long partition = toPartitionTs(LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC).toEpochMilli()); |
|
|
BoundStatement stmt = getSaveByTenantStmt().bind(); |
|
|
BoundStatement stmt = getSaveByTenantStmt().bind(); |
|
|
stmt = stmt.setUUID(0, auditLog.getId().getId()) |
|
|
stmt = setSaveStmtVariables(stmt, auditLog, partition); |
|
|
.setUUID(1, auditLog.getTenantId().getId()) |
|
|
|
|
|
.setUUID(2, auditLog.getEntityId().getId()) |
|
|
|
|
|
.setString(3, auditLog.getEntityId().getEntityType().name()) |
|
|
|
|
|
.setString(4, auditLog.getActionType().name()) |
|
|
|
|
|
.setLong(5, partition); |
|
|
|
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -149,7 +141,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
log.debug("Save saveByTenantIdAndEntityId [{}] ", auditLog); |
|
|
log.debug("Save saveByTenantIdAndEntityId [{}] ", auditLog); |
|
|
|
|
|
|
|
|
BoundStatement stmt = getSaveByTenantIdAndEntityIdStmt().bind(); |
|
|
BoundStatement stmt = getSaveByTenantIdAndEntityIdStmt().bind(); |
|
|
stmt = setSaveStmtVariables(stmt, auditLog); |
|
|
stmt = setSaveStmtVariables(stmt, auditLog, -1); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -158,7 +150,7 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
log.debug("Save saveByTenantIdAndCustomerId [{}] ", auditLog); |
|
|
log.debug("Save saveByTenantIdAndCustomerId [{}] ", auditLog); |
|
|
|
|
|
|
|
|
BoundStatement stmt = getSaveByTenantIdAndCustomerIdStmt().bind(); |
|
|
BoundStatement stmt = getSaveByTenantIdAndCustomerIdStmt().bind(); |
|
|
stmt = setSaveStmtVariables(stmt, auditLog); |
|
|
stmt = setSaveStmtVariables(stmt, auditLog, -1); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -167,12 +159,12 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
log.debug("Save saveByTenantIdAndUserId [{}] ", auditLog); |
|
|
log.debug("Save saveByTenantIdAndUserId [{}] ", auditLog); |
|
|
|
|
|
|
|
|
BoundStatement stmt = getSaveByTenantIdAndUserIdStmt().bind(); |
|
|
BoundStatement stmt = getSaveByTenantIdAndUserIdStmt().bind(); |
|
|
stmt = setSaveStmtVariables(stmt, auditLog); |
|
|
stmt = setSaveStmtVariables(stmt, auditLog, -1); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private BoundStatement setSaveStmtVariables(BoundStatement stmt, AuditLog auditLog) { |
|
|
private BoundStatement setSaveStmtVariables(BoundStatement stmt, AuditLog auditLog, long partition) { |
|
|
return stmt.setUUID(0, auditLog.getId().getId()) |
|
|
stmt.setUUID(0, auditLog.getId().getId()) |
|
|
.setUUID(1, auditLog.getTenantId().getId()) |
|
|
.setUUID(1, auditLog.getTenantId().getId()) |
|
|
.setUUID(2, auditLog.getCustomerId().getId()) |
|
|
.setUUID(2, auditLog.getCustomerId().getId()) |
|
|
.setUUID(3, auditLog.getEntityId().getId()) |
|
|
.setUUID(3, auditLog.getEntityId().getId()) |
|
|
@ -184,6 +176,10 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
.setString(9, auditLog.getActionData() != null ? auditLog.getActionData().toString() : null) |
|
|
.setString(9, auditLog.getActionData() != null ? auditLog.getActionData().toString() : null) |
|
|
.setString(10, auditLog.getActionStatus().name()) |
|
|
.setString(10, auditLog.getActionStatus().name()) |
|
|
.setString(11, auditLog.getActionFailureDetails()); |
|
|
.setString(11, auditLog.getActionFailureDetails()); |
|
|
|
|
|
if (partition > -1) { |
|
|
|
|
|
stmt.setLong(12, partition); |
|
|
|
|
|
} |
|
|
|
|
|
return stmt; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
@ -198,42 +194,57 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
return getFuture(executeAsyncWrite(stmt), rs -> null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private PreparedStatement getSaveByTenantStmt() { |
|
|
|
|
|
if (saveByTenantStmt == null) { |
|
|
|
|
|
saveByTenantStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_TENANT_ID_CF, true); |
|
|
|
|
|
} |
|
|
|
|
|
return saveByTenantStmt; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private PreparedStatement getSaveByTenantIdAndEntityIdStmt() { |
|
|
private PreparedStatement getSaveByTenantIdAndEntityIdStmt() { |
|
|
if (saveByTenantIdAndEntityIdStmt == null) { |
|
|
if (saveByTenantIdAndEntityIdStmt == null) { |
|
|
saveByTenantIdAndEntityIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_ENTITY_ID_CF); |
|
|
saveByTenantIdAndEntityIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_ENTITY_ID_CF, false); |
|
|
} |
|
|
} |
|
|
return saveByTenantIdAndEntityIdStmt; |
|
|
return saveByTenantIdAndEntityIdStmt; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private PreparedStatement getSaveByTenantIdAndCustomerIdStmt() { |
|
|
private PreparedStatement getSaveByTenantIdAndCustomerIdStmt() { |
|
|
if (saveByTenantIdAndCustomerIdStmt == null) { |
|
|
if (saveByTenantIdAndCustomerIdStmt == null) { |
|
|
saveByTenantIdAndCustomerIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_CUSTOMER_ID_CF); |
|
|
saveByTenantIdAndCustomerIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_CUSTOMER_ID_CF, false); |
|
|
} |
|
|
} |
|
|
return saveByTenantIdAndCustomerIdStmt; |
|
|
return saveByTenantIdAndCustomerIdStmt; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private PreparedStatement getSaveByTenantIdAndUserIdStmt() { |
|
|
private PreparedStatement getSaveByTenantIdAndUserIdStmt() { |
|
|
if (saveByTenantIdAndUserIdStmt == null) { |
|
|
if (saveByTenantIdAndUserIdStmt == null) { |
|
|
saveByTenantIdAndUserIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_USER_ID_CF); |
|
|
saveByTenantIdAndUserIdStmt = getSaveByTenantIdAndCFName(ModelConstants.AUDIT_LOG_BY_USER_ID_CF, false); |
|
|
} |
|
|
} |
|
|
return saveByTenantIdAndUserIdStmt; |
|
|
return saveByTenantIdAndUserIdStmt; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private PreparedStatement getSaveByTenantIdAndCFName(String cfName) { |
|
|
private PreparedStatement getSaveByTenantIdAndCFName(String cfName, boolean hasPartition) { |
|
|
return getSession().prepare(INSERT_INTO + cfName + |
|
|
List columnsList = new ArrayList(); |
|
|
"(" + ModelConstants.AUDIT_LOG_ID_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ID_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_CUSTOMER_ID_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_CUSTOMER_ID_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ENTITY_NAME_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ENTITY_NAME_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_USER_ID_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_USER_ID_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_USER_NAME_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_USER_NAME_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ACTION_STATUS_PROPERTY + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_STATUS_PROPERTY); |
|
|
"," + ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY + ")" + |
|
|
columnsList.add(ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY); |
|
|
" VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); |
|
|
if (hasPartition) { |
|
|
|
|
|
columnsList.add(ModelConstants.AUDIT_LOG_PARTITION_PROPERTY); |
|
|
|
|
|
} |
|
|
|
|
|
StringJoiner values = new StringJoiner(","); |
|
|
|
|
|
for (int i=0;i<columnsList.size();i++) { |
|
|
|
|
|
values.add("?"); |
|
|
|
|
|
} |
|
|
|
|
|
String statementString = INSERT_INTO + cfName + " (" + String.join(",", columnsList) + ") VALUES (" + values.toString() + ")"; |
|
|
|
|
|
return getSession().prepare(statementString); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private PreparedStatement getPartitionInsertStmt() { |
|
|
private PreparedStatement getPartitionInsertStmt() { |
|
|
@ -246,20 +257,6 @@ public class CassandraAuditLogDao extends CassandraAbstractSearchTimeDao<AuditLo |
|
|
return partitionInsertStmt; |
|
|
return partitionInsertStmt; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private PreparedStatement getSaveByTenantStmt() { |
|
|
|
|
|
if (saveByTenantStmt == null) { |
|
|
|
|
|
saveByTenantStmt = getSession().prepare(INSERT_INTO + ModelConstants.AUDIT_LOG_BY_TENANT_ID_CF + |
|
|
|
|
|
"(" + ModelConstants.AUDIT_LOG_ID_PROPERTY + |
|
|
|
|
|
"," + ModelConstants.AUDIT_LOG_TENANT_ID_PROPERTY + |
|
|
|
|
|
"," + ModelConstants.AUDIT_LOG_ENTITY_ID_PROPERTY + |
|
|
|
|
|
"," + ModelConstants.AUDIT_LOG_ENTITY_TYPE_PROPERTY + |
|
|
|
|
|
"," + ModelConstants.AUDIT_LOG_ACTION_TYPE_PROPERTY + |
|
|
|
|
|
"," + ModelConstants.AUDIT_LOG_PARTITION_PROPERTY + ")" + |
|
|
|
|
|
" VALUES(?, ?, ?, ?, ?, ?)"); |
|
|
|
|
|
} |
|
|
|
|
|
return saveByTenantStmt; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private long toPartitionTs(long ts) { |
|
|
private long toPartitionTs(long ts) { |
|
|
LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(ts), ZoneOffset.UTC); |
|
|
LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(ts), ZoneOffset.UTC); |
|
|
return tsFormat.truncatedTo(time).toInstant(ZoneOffset.UTC).toEpochMilli(); |
|
|
return tsFormat.truncatedTo(time).toInstant(ZoneOffset.UTC).toEpochMilli(); |
|
|
|