Skip to content

Add RSS feed monitoring for tender opportunities#95

Merged
zinkh merged 1 commit into
mainfrom
claude/appels-offres-rss-surveillance-h7cj3h
Jul 21, 2026
Merged

Add RSS feed monitoring for tender opportunities#95
zinkh merged 1 commit into
mainfrom
claude/appels-offres-rss-surveillance-h7cj3h

Conversation

@zinkh

@zinkh zinkh commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Summary

Adds a comprehensive RSS feed monitoring system ("Veille RSS") to track tender opportunities from external RSS sources. Users can configure RSS feeds with keyword-based filtering, and the system automatically polls feeds at regular intervals to detect matching opportunities that can be converted into tender records.

Key Changes

  • New Component: TenderRssWatch.tsx — Full-featured UI for managing RSS sources and viewing detected matches

    • Create, edit, and delete RSS feed sources
    • Configure include/exclude keyword filters per source
    • View detected items with status tracking (new, read, dismissed, converted)
    • Convert RSS items directly into tender records
    • Manual polling trigger and last-checked timestamps
    • Responsive design with mobile accordion table support
  • Backend Polling Service: server/tenderRssPoller.ts — Autonomous RSS feed polling

    • Periodic polling of all enabled RSS sources across tenants
    • Keyword filtering (include/exclude) applied to feed items
    • Deduplication via unique constraint on (source_id, guid)
    • Error tracking and last-polled timestamps
    • Configurable poll interval via TENDER_RSS_POLL_INTERVAL_MINUTES env var (default 30 min)
  • Database Schema: supabase/migrate_add_tender_rss_watch.sql

    • tender_rss_sources table — User-configured RSS feeds with keyword filters
    • tender_rss_matches table — Detected feed items with status lifecycle
    • Row-level security policies for tenant isolation
    • Indexes on tenant_id and status for query performance
  • API Endpoints (in server.ts):

    • GET /api/tender-rss-sources — List configured sources
    • POST /api/tender-rss-sources — Create new source
    • PUT /api/tender-rss-sources/:id — Update source
    • DELETE /api/tender-rss-sources/:id — Delete source
    • POST /api/tender-rss-sources/poll-now — Trigger immediate poll
    • GET /api/tender-rss-matches — List detected items
    • PUT /api/tender-rss-matches/:id — Update match status
    • POST /api/tender-rss-matches/:id/convert — Convert item to tender
  • UI Integration: src/pages/Tenders.tsx

    • Added "RSS Watch" tab alongside tender list
    • Tab switching between list view and RSS monitoring
  • Types: Added TenderRssSource and TenderRssMatch interfaces to src/types.ts

  • Translations: French and English strings for all UI elements in src/locales/

  • Dependencies: Added rss-parser package for RSS feed parsing

Implementation Details

  • RSS polling runs continuously in the background via setInterval() after server startup
  • Keyword matching is case-insensitive and applied to both title and description
  • Converted items create draft tenders with the RSS link and description in notes
  • Activity logging tracks source creation/deletion and tender conversions
  • Toast notifications provide user feedback for all operations
  • Modal dialog for source creation/editing with form validation
  • Responsive UI with Tabler icons and Framer Motion animations

https://claude.ai/code/session_013DT2bkCp3f7xKaNfsxC4Kb

Nouvel onglet "Veille RSS" dans la page Appels d'offres permettant de
déclarer des sources RSS, filtrer les annonces par mots-clés inclus/exclus,
et convertir une annonce détectée en fiche appel d'offre. Un sondage
périodique backend (server/tenderRssPoller.ts) interroge les flux toutes
les 30 minutes et stocke les nouvelles annonces dans tender_rss_matches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013DT2bkCp3f7xKaNfsxC4Kb
@zinkh
zinkh merged commit ec7e9a9 into main Jul 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants