RunImport fetches tasks from an external source and writes them as local task files. Unlike RunSync, it performs no state tracking — it is a one-shot operation that detects duplicates via external_id in existing task files.
(cfg ImportConfig)
| 39 | // task files. Unlike RunSync, it performs no state tracking — it is a one-shot |
| 40 | // operation that detects duplicates via external_id in existing task files. |
| 41 | func RunImport(cfg ImportConfig) (*ImportResult, error) { |
| 42 | externalTasks, err := fetchImportTasks(cfg) |
| 43 | if err != nil { |
| 44 | return nil, err |
| 45 | } |
| 46 | |
| 47 | existingIDs, externalIDs, err := scanExistingTasks(cfg.ScanDir, cfg.Verbose) |
| 48 | if err != nil { |
| 49 | return nil, fmt.Errorf("failed to scan existing tasks: %w", err) |
| 50 | } |
| 51 | |
| 52 | fieldMap := resolveImportFieldMap(cfg.SourceName, cfg.SourceCfg.FieldMap) |
| 53 | result := &ImportResult{} |
| 54 | |
| 55 | for _, ext := range externalTasks { |
| 56 | action, ids := importTask(ext, cfg, fieldMap, existingIDs, externalIDs) |
| 57 | existingIDs = ids |
| 58 | |
| 59 | switch action.Reason { |
| 60 | case "skipped_duplicate": |
| 61 | result.Skipped = append(result.Skipped, action.ImportAction) |
| 62 | case "error": |
| 63 | result.Errors = append(result.Errors, SyncError{ |
| 64 | ExternalID: ext.ExternalID, Title: ext.Title, Err: action.err, |
| 65 | }) |
| 66 | default: |
| 67 | result.Created = append(result.Created, action.ImportAction) |
| 68 | externalIDs[ext.ExternalID] = true |
| 69 | } |
| 70 | } |
| 71 | |
| 72 | return result, nil |
| 73 | } |
| 74 | |
| 75 | func fetchImportTasks(cfg ImportConfig) ([]ExternalTask, error) { |
| 76 | src, err := GetSource(cfg.SourceName) |