forked from baron/baron-sso
adminFront에 Audit Log 기능 추가
This commit is contained in:
@@ -36,6 +36,7 @@ func NewClickHouseRepository(host string, port int, user, password, db string) (
|
||||
// Note: In production, use migrations.
|
||||
query := `
|
||||
CREATE TABLE IF NOT EXISTS audit_logs (
|
||||
event_id String,
|
||||
timestamp DateTime DEFAULT now(),
|
||||
user_id String,
|
||||
event_type String,
|
||||
@@ -51,6 +52,14 @@ func NewClickHouseRepository(host string, port int, user, password, db string) (
|
||||
return nil, fmt.Errorf("failed to create table: %w", err)
|
||||
}
|
||||
|
||||
alterQuery := `
|
||||
ALTER TABLE audit_logs
|
||||
ADD COLUMN IF NOT EXISTS event_id String
|
||||
`
|
||||
if err := conn.Exec(context.Background(), alterQuery); err != nil {
|
||||
return nil, fmt.Errorf("failed to alter table: %w", err)
|
||||
}
|
||||
|
||||
return &ClickHouseRepository{conn: conn}, nil
|
||||
}
|
||||
|
||||
@@ -63,10 +72,11 @@ func (r *ClickHouseRepository) Create(log *domain.AuditLog) error {
|
||||
}
|
||||
|
||||
query := `
|
||||
INSERT INTO audit_logs (timestamp, user_id, event_type, status, ip_address, user_agent, device_id, details)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||
INSERT INTO audit_logs (event_id, timestamp, user_id, event_type, status, ip_address, user_agent, device_id, details)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`
|
||||
return r.conn.Exec(ctx, query,
|
||||
log.EventID,
|
||||
log.Timestamp,
|
||||
log.UserID,
|
||||
log.EventType,
|
||||
@@ -78,21 +88,28 @@ func (r *ClickHouseRepository) Create(log *domain.AuditLog) error {
|
||||
)
|
||||
}
|
||||
|
||||
func (r *ClickHouseRepository) FindAll(ctx context.Context, limit, offset int) ([]domain.AuditLog, error) {
|
||||
func (r *ClickHouseRepository) FindPage(ctx context.Context, limit int, cursor *domain.AuditCursor) ([]domain.AuditLog, error) {
|
||||
if limit <= 0 {
|
||||
limit = 50
|
||||
}
|
||||
if offset < 0 {
|
||||
offset = 0
|
||||
}
|
||||
|
||||
query := `
|
||||
SELECT timestamp, user_id, event_type, status, ip_address, user_agent, device_id, details
|
||||
SELECT event_id, timestamp, user_id, event_type, status, ip_address, user_agent, device_id, details
|
||||
FROM audit_logs
|
||||
ORDER BY timestamp DESC
|
||||
LIMIT ? OFFSET ?
|
||||
`
|
||||
rows, err := r.conn.Query(ctx, query, limit, offset)
|
||||
args := make([]any, 0, 4)
|
||||
if cursor != nil {
|
||||
query += `
|
||||
WHERE (timestamp < ?) OR (timestamp = ? AND event_id < ?)
|
||||
`
|
||||
args = append(args, cursor.Timestamp, cursor.Timestamp, cursor.EventID)
|
||||
}
|
||||
query += `
|
||||
ORDER BY timestamp DESC, event_id DESC
|
||||
LIMIT ?
|
||||
`
|
||||
args = append(args, limit)
|
||||
|
||||
rows, err := r.conn.Query(ctx, query, args...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to query audit logs: %w", err)
|
||||
}
|
||||
@@ -102,6 +119,7 @@ func (r *ClickHouseRepository) FindAll(ctx context.Context, limit, offset int) (
|
||||
for rows.Next() {
|
||||
var log domain.AuditLog
|
||||
if err := rows.Scan(
|
||||
&log.EventID,
|
||||
&log.Timestamp,
|
||||
&log.UserID,
|
||||
&log.EventType,
|
||||
|
||||
Reference in New Issue
Block a user