feat: refactor to ymsctl & yms-daemon

This commit is contained in:
2026-08-17 02:10:10 +08:00
parent 7755da72e7
commit 79f18fcdea
23 changed files with 394 additions and 47 deletions
+50
View File
@@ -335,6 +335,56 @@ func (s *Store) ActiveTransaction(ctx context.Context) (Transaction, error) {
return getActiveTransaction(ctx, s.db)
}
// ListRecent returns committed, rolled-back, failed, and in-progress transactions
// in reverse creation order. Filters are exact values and never inferred.
func (s *Store) ListRecent(ctx context.Context, filter ListFilter) ([]Transaction, error) {
if filter.Limit <= 0 || filter.Limit > 1000 {
return nil, errors.New("transaction history limit must be between 1 and 1000")
}
query := `SELECT id, idempotency_key, source, service, request_json, state, version, created_at, updated_at FROM transactions WHERE 1=1`
args := make([]any, 0, 3)
if filter.Service != "" {
query += " AND service = ?"
args = append(args, filter.Service)
}
if filter.State != "" {
query += " AND state = ?"
args = append(args, string(filter.State))
}
query += " ORDER BY created_at DESC, id DESC LIMIT ?"
args = append(args, filter.Limit)
rows, err := s.db.QueryContext(ctx, query, args...)
if err != nil {
return nil, fmt.Errorf("list transaction history: %w", err)
}
defer rows.Close()
result := make([]Transaction, 0, filter.Limit)
for rows.Next() {
var item Transaction
var state string
var requestJSON string
var createdAt, updatedAt string
if err := rows.Scan(&item.ID, &item.IdempotencyKey, &item.Source, &item.Service, &requestJSON, &state, &item.Version, &createdAt, &updatedAt); err != nil {
return nil, fmt.Errorf("scan transaction history: %w", err)
}
item.Request = json.RawMessage(requestJSON)
item.State = State(state)
item.CreatedAt, err = time.Parse(time.RFC3339Nano, createdAt)
if err != nil {
return nil, fmt.Errorf("parse transaction history creation time: %w", err)
}
item.UpdatedAt, err = time.Parse(time.RFC3339Nano, updatedAt)
if err != nil {
return nil, fmt.Errorf("parse transaction history update time: %w", err)
}
result = append(result, item)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("iterate transaction history: %w", err)
}
return result, nil
}
// Transition 校验并原子提交状态变化及其恢复事件。
func (s *Store) Transition(ctx context.Context, id string, next State, message string) (Transaction, error) {
if !next.Valid() {