diff options
| author | Christian Cleberg <[email protected]> | 2026-04-22 11:46:52 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-22 11:46:52 -0500 |
| commit | 37b02e5ee360d61751951b77b7b556165a3af1fc (patch) | |
| tree | c2e30f32c4e8d2fcdf7035f97e9e353f09859114 /DomainDig/DomainViewModel.swift | |
| parent | ceac99c05f180d9008b75c9329822466ff60255b (diff) | |
| download | domain-dig-37b02e5ee360d61751951b77b7b556165a3af1fc.tar.gz domain-dig-37b02e5ee360d61751951b77b7b556165a3af1fc.tar.bz2 domain-dig-37b02e5ee360d61751951b77b7b556165a3af1fc.zip | |
feat(v3.0.0): unify platform architecture and introduce feature tiers
* consolidate DomainReport as canonical data model
* add feature tier system (free/pro/data+ scaffolding)
* apply clean feature gating across workflows and tracking
* refactor app structure for maintainability
* standardize navigation and settings
* add data lifecycle controls
* ensure consistency across UI, export, and CLI
* stabilize internal inspection API
Diffstat (limited to 'DomainDig/DomainViewModel.swift')
| -rw-r--r-- | DomainDig/DomainViewModel.swift | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/DomainDig/DomainViewModel.swift b/DomainDig/DomainViewModel.swift index 18ce4c2..5288eaa 100644 --- a/DomainDig/DomainViewModel.swift +++ b/DomainDig/DomainViewModel.swift @@ -369,11 +369,11 @@ final class DomainViewModel { } var trackingLimitMessage: String? { - nil + FeatureAccessService.trackedDomainLimitMessage(currentCount: trackedDomains.count) } var canTrackCurrentDomain: Bool { - true + FeatureAccessService.canAddTrackedDomain(currentCount: trackedDomains.count) } var resolverDisplayName: String { @@ -665,6 +665,18 @@ final class DomainViewModel { } } + func clearWorkflows() { + workflows.removeAll() + latestWorkflowRunSummary = nil + persistWorkflows() + } + + func clearTrackedDomains() { + trackedDomains.removeAll() + refreshingTrackedDomainID = nil + persistTrackedDomains() + } + func clearRecentSearches() { recentSearches.removeAll() UserDefaults.standard.removeObject(forKey: Self.recentSearchesKey) @@ -725,10 +737,12 @@ final class DomainViewModel { func runBulkLookup() { let domains = parsedDomains(from: bulkInput) guard !domains.isEmpty else { return } + guard FeatureAccessService.canRunBatch(domainCount: domains.count) else { return } startBatchLookup(domains: domains, source: .manual) } func refreshAllTrackedDomains() { + guard FeatureAccessService.canRunBatch(domainCount: sortedTrackedDomains.count) else { return } startBatchLookup(domains: sortedTrackedDomains.map(\.domain), source: .watchlistRefresh) } @@ -777,6 +791,7 @@ final class DomainViewModel { let normalizedDomains = normalizedDomains(domains) let trimmedName = name.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmedName.isEmpty, !normalizedDomains.isEmpty else { return nil } + guard FeatureAccessService.canCreateWorkflow(currentCount: workflows.count) else { return nil } let workflow = DomainWorkflow( name: trimmedName, @@ -840,6 +855,7 @@ final class DomainViewModel { func runWorkflow(_ workflow: DomainWorkflow) { guard !workflow.domains.isEmpty else { return } + guard FeatureAccessService.canRunBatch(domainCount: workflow.domains.count) else { return } startBatchLookup(domains: workflow.domains, source: .workflow, workflow: workflow) } @@ -2124,14 +2140,23 @@ final class DomainViewModel { } private func currentBatchReports() -> [DomainReport] { - currentBatchResultEntries.map(report(for:)) + currentBatchResultEntries.map { entry in + report(for: entry, workflowContext: activeWorkflowContext) + } } private func workflowReports(from summary: WorkflowRunSummary, changedOnly: Bool) -> [DomainReport] { let filteredResults = changedOnly ? summary.results.filter(\.hasMeaningfulChange) : summary.results return filteredResults.compactMap { result in guard let entry = historyEntry(for: result) else { return nil } - return report(for: entry) + return report( + for: entry, + workflowContext: DomainWorkflowContext( + workflowID: summary.workflowID, + workflowName: summary.workflowName, + source: "workflow" + ) + ) } } @@ -2150,8 +2175,19 @@ final class DomainViewModel { } } - private func report(for entry: HistoryEntry) -> DomainReport { - reportBuilder.build(from: entry, previousSnapshot: comparisonSnapshot(for: entry)) + private func report(for entry: HistoryEntry, workflowContext: DomainWorkflowContext? = nil) -> DomainReport { + reportBuilder.build(from: entry, previousSnapshot: comparisonSnapshot(for: entry), workflowContext: workflowContext) + } + + private var activeWorkflowContext: DomainWorkflowContext? { + guard batchLookupSource == .workflow, let activeWorkflowRunID, let activeWorkflowRunName else { + return nil + } + return DomainWorkflowContext( + workflowID: activeWorkflowRunID, + workflowName: activeWorkflowRunName, + source: "workflow" + ) } private func placeholderSnapshot(for trackedDomain: TrackedDomain) -> LookupSnapshot { |
