Feat/parapharmacy api #38

Merged
Ichitux merged 25 commits from feat/parapharmacy-api into main 2026-07-16 15:38:59 +00:00

25 Commits

Author SHA1 Message Date
Antoni Nuñez Romeu 8763f54071 fix: sync package.json and fix test scripts
Run Tests on Branches / Detect Changes (push) Successful in 12s
Run Tests on Branches / Backend Tests (push) Successful in 1m58s
Run Tests on Branches / Frontend Tests (push) Successful in 1m38s
Run Tests on Branches / Frontend Mobile Tests (push) Successful in 1m35s
Run Tests on Branches / Parapharmacy API Tests (push) Has been skipped
- scraper: changed test script to echo (no tests)
- parapharmacy-api: added --passWithNoTests to jest
- frontend: changed vitest to vitest run (exit after tests)

All tests now pass:
- backend: 17 tests passed
- frontend: 7 tests passed
- parapharmacy-api: no tests (exits cleanly)
- scraper: no tests (exits cleanly)
2026-07-16 17:31:05 +02:00
Antoni Nuñez Romeu fa74a6e060 fix: filter scraper results by search query
Run Tests on Branches / Detect Changes (push) Successful in 13s
Run Tests on Branches / Backend Tests (push) Failing after 16s
Run Tests on Branches / Frontend Tests (push) Failing after 16s
Run Tests on Branches / Frontend Mobile Tests (push) Failing after 17s
Run Tests on Branches / Parapharmacy API Tests (push) Has been skipped
The scraper was extracting ALL products from the page including
navigation menu items. Now it filters products to only include
those that contain the search query in their name.

Before: Found 47 products (mostly navigation items)
After: Found 2 Capricare products (filtered by query)
2026-07-16 17:03:21 +02:00
Antoni Nuñez Romeu de8fdbb904 feat: add sort by distance and directions to ProductView
Run Tests on Branches / Detect Changes (push) Successful in 13s
Run Tests on Branches / Backend Tests (push) Failing after 17s
Run Tests on Branches / Frontend Tests (push) Failing after 16s
Run Tests on Branches / Frontend Mobile Tests (push) Failing after 18s
Run Tests on Branches / Parapharmacy API Tests (push) Has been skipped
- Added sort by distance functionality (same as SearchView)
- Added PharmacyList component with distance display
- Added 'Cómo llegar' button in map popup (Google Maps directions)
- Uses haversineKm for distance calculation
2026-07-16 16:55:48 +02:00
Antoni Nuñez Romeu 6155fdcd15 fix: add pharmacy map to ProductView and fix pharmacies endpoint
- Added PharmacyMap component to ProductView
- Updated backend to accept all valid sources for pharmacies endpoint
- Shows map with pharmacy locations and list of pharmacies with prices
2026-07-16 16:48:25 +02:00
Antoni Nuñez Romeu 08b7437803 fix: add 'seed' and 'manual' to valid product sources
Products created via seed script or manual entry have source='seed'
or 'manual', which wasn't in the valid sources list.
2026-07-16 16:40:41 +02:00
Antoni Nuñez Romeu 26e7d92079 fix: handle both array and object responses in admin search
The CIMA search API returns {results: [...]} but the admin panel
was treating it as an array, causing CIMA products to be lost.

Now handles both formats:
- Array: [...]
- Object: {results: [...]}
2026-07-16 16:32:24 +02:00
Antoni Nuñez Romeu dca7e373cd fix: use parapharmacy endpoint for all non-CIMA sources
- ProductView now checks if source is 'cima' to decide endpoint
- All other sources (seed, promofarma, docmorris, primor) use parapharmacy endpoint
- Same fix applied to mobile getProduct function

Before: only 'parapharmacy' source used parapharmacy endpoint
After: all non-CIMA sources use parapharmacy endpoint
2026-07-16 16:23:57 +02:00
Antoni Nuñez Romeu 63b25e3f4f fix: use _id for MongoDB products in frontend
- SearchView now uses p._id || p.id for product navigation
- ProductResults uses product._id || product.id for React key
- Fixes 'undefined' error when clicking parapharmacy products
2026-07-16 16:18:22 +02:00
Antoni Nuñez Romeu e5dcfbd2f5 fix: allow parapharmacy sources in pharmacy-products endpoint
Updated validation to accept: cima, promofarma, docmorris, primor, parapharmacy

Before: product_source must be 'cima'
After: product_source must be one of: cima, promofarma, docmorris, primor, parapharmacy
2026-07-16 16:02:25 +02:00
Antoni Nuñez Romeu 3666f4dee8 fix: update ProductResults and admin panel for parapharmacy
- Updated ProductResults component with new source labels
- Added price display for parapharmacy products
- Updated admin panel to search both CIMA and Parapharmacy
- Updated getSourceBadge to handle parapharmacy sources
- Added CSS for product price display
2026-07-16 15:58:35 +02:00
Antoni Nuñez Romeu 3429b7e548 fix: product detail view for parapharmacy products
- Updated ProductView to use correct endpoint for parapharmacy
- Updated getProduct service to handle parapharmacy products
- Shows price, category, brand, source for parapharmacy products
- Updated labels from 'OFF' to 'Parafarmacia'
2026-07-16 15:47:14 +02:00
Antoni Nuñez Romeu 570d4ab43e feat: unified search - remove filter tabs, show all results together
- Frontend now searches both CIMA and Parapharmacy simultaneously
- Removed filter tabs (Todos/Medicamentos/Parafarmacia)
- Results show in a single unified list
- Mobile: Shows medicines first, then parapharmacy section
- Web: Same unified approach with results summary
2026-07-16 15:36:08 +02:00
Antoni Nuñez Romeu 05b99e9ed4 feat: working scraping for Promofarma, DocMorris, and Primor
- Fixed Primor URL format and selectors
- Created simple N8N webhook that calls scraper API
- All 3 sources now working:
  - Promofarma: 20 products
  - DocMorris: 10 products
  - Primor: 20 products
- Total: 130 products in database
- N8N webhook at /webhook/scrape working correctly
2026-07-16 15:19:07 +02:00
Antoni Nuñez Romeu 972a59662d fix: fix parapharmacy proxy route order and add axios import
- Moved parapharmacy routes before :source/:id routes to prevent conflicts
- Added axios import to server.js
- Backend proxy now correctly forwards to parapharmacy-api
- Tested: search for 'capricare' returns 1 result, 'crema' returns 7 results
2026-07-16 15:03:46 +02:00
Antoni Nuñez Romeu a5a75d3249 feat: working Puppeteer scraper for Promofarma
- Added Puppeteer with Chrome in Docker
- Scraper extracts products using data attributes
- Added /api/scrape endpoint
- Tested: 10 products scraped from Promofarma

The scraper now works with Promofarma's HTML structure which uses
data-name, data-pvp attributes on article elements.
2026-07-16 14:54:51 +02:00
Antoni Nuñez Romeu 2ad4210221 feat: add scrape script and fix N8N webhook workflow
- Add direct scrape.js script for testing
- Fix N8N webhook workflow (lastNode response mode)
- Note: Real scraping requires Puppeteer for anti-bot sites
2026-07-16 13:14:56 +02:00
Antoni Nuñez Romeu e2dd3474a4 fix: add 'seed' and 'manual' to Product source enum
Allows seed script and manual product creation to work.
2026-07-16 13:06:17 +02:00
Antoni Nuñez Romeu 30f97fe87d feat: complete N8N scrapers for 6 sources and seed script
- Create comprehensive N8N workflow for all 6 parapharmacy sources
- Create webhook-triggered manual scraping workflow
- Add seed script with 20 sample products
- Update n8n/README.md with complete documentation
- Update docs/parapharmacy.md with seeding instructions
- Add seed script to package.json

Sources configured:
- Promofarma
- Pharmarket
- DocMorris
- 1001Farma
- Primor
- MiFarma
2026-07-16 13:00:20 +02:00
Antoni Nuñez Romeu cb564fb170 docs: add comprehensive parapharmacy and N8N documentation
- Create docs/parapharmacy.md with full API, N8N, and setup documentation
- Update README.md with parapharmacy system overview and links
- Add project structure for parapharmacy-api and n8n
- Update Docker setup section with all services
- Add API endpoints for parapharmacy
- Add N8N workflow automation section
2026-07-16 12:51:48 +02:00
Antoni Nuñez Romeu 52ddb9c21c chore: add .env.example with all environment variables 2026-07-16 12:47:04 +02:00
Antoni Nuñez Romeu 1c70f0a914 feat: add N8N workflows and auto-setup configuration
- Add parapharmacy-scraper workflow (scheduled every 3 days)
- Add parapharmacy-manual-scraper workflow (webhook triggered)
- Configure N8N to auto-create owner account (skips /setup)
- Add N8N environment variables to docker-compose.yml
- Add README with setup and usage instructions
2026-07-16 12:46:20 +02:00
Antoni Nuñez Romeu 0c2f1cf928 fix: use npm install instead of npm ci in Dockerfile
npm ci requires package-lock.json which is at root level in monorepo.
npm install works without it.
2026-07-16 12:40:22 +02:00
Antoni Nuñez Romeu c509253764 fix: correct Dockerfile build context for parapharmacy-api
Changed build context from '.' to './apps/parapharmacy-api' so the
Dockerfile can find the src/ directory.
2026-07-16 12:37:54 +02:00
Antoni Nuñez Romeu 7274979f62 chore: remove Open Food Facts (OFF) integration
- Remove off-service.js and off-service.test.js
- Remove OFF import from server.js
- Simplify /api/products/search to only use CIMA
- Remove 'openfoodfacts' from valid product sources
- Update frontend-mobile Product interface to remove OFF source
- Remove OFF env vars from .env.example
- Add PARAPHARMACY_API_URL to .env.example

OFF was replaced by the new parapharmacy-api microservice.
2026-07-16 12:34:08 +02:00
Antoni Nuñez Romeu b34657c78f feat: add parapharmacy API with MongoDB and N8N setup
- Create parapharmacy-api microservice with Express + Swagger + MongoDB
- Add product model with full-text search and deduplication
- Add CRUD endpoints and bulk upsert for scrapers
- Update docker-compose.yml with MongoDB, N8N, and parapharmacy-api services
- Add proxy endpoints in FarmaFinder backend for parapharmacy
- Update frontend services to use parapharmacy API
- Add Swagger documentation at /api/docs
2026-07-16 12:26:54 +02:00