All notable changes to WebTrack are documented here. The format follows Keep a Changelog.
occ webtrack:check— run monitor checks now;--monitor-id,--user,--debug(per-entry score + keyword match),--dry-runocc webtrack:test-tables— dry-run Tables row insertion;--list-tables,--check-dup,--insert; shows domain-lookup results and full payloadocc webtrack:score-url— score a URL against a monitor's boost/exclude rules with per-rule breakdownMonitorMapper::find(int $id)— admin-level lookup by ID for CLI useMonitorService::runCheckForMonitor()— public entry point that bypasses the interval gate (used byocc webtrack:check)- Duplicate detection: before inserting a Tables row,
MonitorServicesearches the Headline column for the article URL; rows already present are skipped TablesService::rowExistsForUrl()performs thecontainssearchTablesRowBuilder: assembles thedatapayload for a Tables row from a feed entry; resolves column IDs by title matching; usesDomainLookupServicefor Country, Tier, and Category; derives Publication from article hostname; formats Headline as a Markdown hyperlink; sets Source=Organic, Counter=1FeedService::parseEntries()now includespubDatefrom RSS and Atom feedsMonitorService: when a matched feed entry has a configuredtablesTableId, inserts a row viaTablesService(columns fetched once per check cycle)ScoringService: scores feed entries (+1 per boost keyword, −2 per exclude pattern) and gates entries belowscoreThreshold; integrated intoMonitorService::handleFeedContent()MonitorForm: source type selector (Custom / Google News / YouTube), language/region picker, relevance-score threshold, boost-keyword and exclude-pattern inputs, target-table picker, and Campaign pre-fill selectorTablesController: proxies Tables list and column schema to the frontend (GET /api/v1/tables,GET /api/v1/tables/{id}/columns); gracefully returns empty array when the Tables app is not installedTablesService: thin HTTP wrapper around Nextcloud Tables REST API v1 (listTables,getTableSchema,getColumns,insertRow,searchRows)DomainLookupService: maps article URLs to Nextcloud Tables selection IDs for Country, Tier, and Category; seeded from ~1 500 historical PR Coverage rows with TLD-based fallback for unknown domains- New
wn_monitorscolumns for Google News / YouTube source type, relevance scoring, and Nextcloud Tables integration (source_type,source_language,score_threshold,boost_keywords,exclude_patterns,tables_table_id,tables_campaign_id) — database migration Version1003 Monitorentity: getters/setters andjsonSerialize()entries for all new columns; convenience helpersgetBoostKeywordsArray()andgetExcludePatternsArray()MonitorService::applyData()handles new fields from create/update requests
- Upgrade frontend from Vue 2.7 to Vue 3 and
@nextcloud/vue8 → 9 - Replace
vue-router3 withvue-router4 (hash-history mode preserved) - Replace
$root.$on/$root.$emitglobal event bus with@nextcloud/event-bus - Update all
@nextcloud/vuecomponent imports to use named exports from the package root (import { NcButton } from '@nextcloud/vue') - Bump
@nextcloud/vite-config1.x → 2.x - Add
"type": "module"topackage.json