def delete_db_doc( client: AsyncClient, db: str, docid: str, params: Optional[dict[str, str]] = None, **client_kwargs: dict[str, Any]) -> Coroutine[Any, Any, Response]: """ Mark a document as deleted. https://docs.couchdb.org/en/stable/api/document/common.html#delete--db-docid :param client: An HTTP client with which to perform the request. :param db: The name of the CocuhDB database that stores the document to be deleted. :param docid: The document ID of the document to be deleted. :param params: Optional query parameter options. :param client_kwargs: Arguments passed to the HTTP client. :return: The response of the HTTP request. """ return client.delete(url=f'/{db}/{docid}', params=params, **client_kwargs)
async def sync_dns_record( dns_record_db: DNSRecordDB, dns_record_cf: DNSRecordCloudflare, client: httpx.AsyncClient, ): response_futures = [] if dns_record_db.to_delete and dns_record_cf is None: logger.warning( f'DNS Record in DB is marked for deletion but does not exist' f' (record: {dns_record_db})') elif dns_record_db.to_delete: if BaseDNSRecord(**dns_record_db.dict()) != BaseDNSRecord( **dns_record_cf.dict()): logger.warning( 'DNS record in cloudflare does not match DNS record to be deleted, ' 'it might have been manually changed') logger.info(f'Delete: {dns_record_cf}') response_futures.append( client.delete( f'zones/{dns_record_cf.zone_id}/dns_records/{dns_record_cf.id}', auth=DomainAuth(dns_record_cf.domain), )) elif dns_record_cf is None: # create logger.info(f'Create: {dns_record_db}') dns_record_cf_upload = BaseDNSRecord(**dns_record_db.dict()) response_futures.append( client.post( f'zones/{dns_record_cf_upload.zone_id}/dns_records', json=dns_record_cf_upload.dict(), auth=DomainAuth(dns_record_db.domain), )) elif BaseDNSRecord(**dns_record_db.dict()) == BaseDNSRecord( **dns_record_cf.dict()): # already matches exactly, skip logger.debug(f'Name: "{dns_record_db.name}" is up to date') elif BaseDNSRecord(**dns_record_db.dict()) != BaseDNSRecord( **dns_record_cf.dict()): # name already exists but record doesn't match, update logger.info(f'Update: {dns_record_db}') dns_record_cf_upload = BaseDNSRecord(**dns_record_db.dict()) response_futures.append( client.put( f'zones/{dns_record_cf_upload.zone_id}/dns_records/{dns_record_cf.id}', json=dns_record_cf_upload.dict(), auth=DomainAuth(dns_record_db.domain), )) for response_future in asyncio.as_completed(response_futures): try: response = await response_future response.raise_for_status() except httpx.RequestError as exc: logger.info( f'An error occurred while requesting {exc.request.method!r}' f' {exc.request.url!r}.') except httpx.HTTPStatusError as exc: logger.warning( f'Error response {exc.response.status_code}: {exc.response.read()},' f' while doing {exc.request.method!r} {exc.request.url!r} with:' f' {exc.request.read()!r}')