""" TEE OFF - AUTOMATISK URL-IMPORTØR --------------------------------------------------------------------------- Leser tekstfiler med lenker og forsøker å matche dem mot eksisterende golfanlegg i databasen basert på domenenavn. --------------------------------------------------------------------------- """ import asyncio import asyncpg import os from urllib.parse import urlparse DB_URL = os.getenv("DATABASE_URL", "postgresql://teeoff_admin:teeoff_secret_password@db:5432/teeoff") # Hvilke filer vi skal lese, og hvilke databasefelt de tilhører FILES_TO_IMPORT = { "Medlemsskap.txt": "medlemskap_url", "GreenFee.txt": "greenfee_url", "VtG.txt": "vtg_lenke" } def extract_domain(url: str) -> str: """Henter ut hoveddomenet (f.eks. 'tyrifjord-golfklubb.no') fra en URL.""" try: domain = urlparse(url.strip()).netloc.lower() if domain.startswith("www."): domain = domain[4:] return domain except: return "" async def run_import(): print("🚀 Starter URL-importør...") conn = await asyncpg.connect(DB_URL) try: # Hent alle eksisterende anlegg og deres domener facilities = await conn.fetch("SELECT id, name, website_url, scrape_status_url FROM facilities") # Bygg en ordbok: { 'domenenavn.no': facility_id } for superraskt oppslag domain_map = {} for f in facilities: # Prøv å hente domene fra website_url if f['website_url']: domain = extract_domain(f['website_url']) if domain: domain_map[domain] = f['id'] # Prøv også scrape_status_url for sikkerhets skyld if f['scrape_status_url']: domain = extract_domain(f['scrape_status_url']) if domain: domain_map[domain] = f['id'] print(f"📋 Fant {len(domain_map)} unike domener i databasen.") # Gå gjennom fil for fil for filename, db_field in FILES_TO_IMPORT.items(): print(f"\n▶️ BEHANDLER: {filename} -> Setter felt: {db_field}") if not os.path.exists(filename): print(f" ⚠️ Filen '{filename}' ble ikke funnet. Hopper over.") continue with open(filename, 'r', encoding='utf-8') as file: lines = [line.strip() for line in file.readlines() if line.strip()] matched_count = 0 unmatched = [] for line in lines: # Hvis det er flere URL-er på samme linje separert med komma, # matcher vi basert på den FØRSTE URL-en. first_url = line.split(',')[0].strip() domain = extract_domain(first_url) # Hvis vi fant en match i databasen! if domain in domain_map: fac_id = domain_map[domain] # Oppdater databasen med HELE linjen (for å bevare ev. komma-lenker) await conn.execute(f""" UPDATE facilities SET {db_field} = $1 WHERE id = $2 """, line, fac_id) matched_count += 1 else: unmatched.append(line) print(f" ✅ Matchet og oppdatert {matched_count} anlegg.") if unmatched: print(f" ❌ Følgende {len(unmatched)} URL-er fant ingen match i databasen og må legges inn manuelt:") for url in unmatched: print(f" - {url}") finally: await conn.close() print("\n🏁 Import fullført!") if __name__ == "__main__": asyncio.run(run_import())