Files
knowledge-governance/internal/platform/postgres/artifact_fetch_store.go
T
姚章浩 74aef1e373
build / build (push) Successful in 1m17s
fix(fetch): 修复钉钉来源身份与取件失败监控
2026-10-27 14:36:24 +08:00

52 lines
2.1 KiB
Go

package postgres
import (
"context"
"errors"
"fmt"
"github.com/jackc/pgx/v5"
"knowledge-governance/internal/workflows/artifactfetch"
)
// LoadArtifactFetchManifest resolves one pending intent plus its live source
// coordinates for the fetch script, keyed by the connection-stable node id.
func (s *Store) LoadArtifactFetchManifest(ctx context.Context, connectionID, nodeID string) (artifactfetch.Manifest, error) {
return loadArtifactFetchManifest(ctx, s.db, connectionID, nodeID)
}
func loadArtifactFetchManifest(ctx context.Context, db interface {
QueryRow(context.Context, string, ...any) pgx.Row
}, connectionID, nodeID string) (artifactfetch.Manifest, error) {
var manifest artifactfetch.Manifest
var fetchState string
err := db.QueryRow(ctx, `SELECT connection.source_type,connection.name,intent.relative_path,intent.name,
intent.size_bytes,intent.modified_at,intent.locator_hash,intent.fetch_state,
CASE WHEN connection.source_type='dingtalk' THEN connection.base_url ELSE '' END
FROM catalog_import_intents intent
JOIN source_connections connection ON connection.id=intent.source_connection_id
WHERE intent.source_connection_id=$1 AND intent.node_id=$2`, connectionID, nodeID).
Scan(&manifest.SourceType, &manifest.SourceName, &manifest.RelativePath, &manifest.Name,
&manifest.SizeBytes, &manifest.ModifiedAt, &manifest.LocatorHash, &fetchState, &manifest.SourceRoot)
if errors.Is(err, pgx.ErrNoRows) {
return artifactfetch.Manifest{}, artifactfetch.ErrManifestGone
}
if err != nil {
return artifactfetch.Manifest{}, fmt.Errorf("load artifact fetch manifest: %w", err)
}
if fetchState == "filtered" {
return artifactfetch.Manifest{}, artifactfetch.ErrManifestFiltered
}
var filtered bool
if err := db.QueryRow(ctx, `SELECT filename_is_filtered($1,$2,$3)`, connectionID, manifest.RelativePath, manifest.Name).Scan(&filtered); err != nil {
return artifactfetch.Manifest{}, fmt.Errorf("evaluate artifact filename filter: %w", err)
}
if filtered {
return artifactfetch.Manifest{}, artifactfetch.ErrManifestFiltered
}
manifest.ConnectionID = connectionID
manifest.NodeID = nodeID
return manifest, nil
}