mongodb wrapper for managing News objects

This commit is contained in:
TrisNol
2023-06-16 18:50:19 +02:00
parent 5b96bb7e3e
commit 6e31bc62bd
7 changed files with 189 additions and 0 deletions

View File

@ -0,0 +1,13 @@
from dataclasses import asdict, dataclass
@dataclass
class News:
id: str
title: str
date: str
text: str
source_url: str
def dict(self):
return asdict(self)

View File

@ -678,6 +678,99 @@
"custom_search_data = tagesschau.custom_search(\"Haltern am See\")\n",
"custom_search_data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from utils.mongodb.mongo import MongoConnector\n",
"\n",
"connector = MongoConnector(\n",
" hostname=\"localhost\",\n",
" database=\"transparenzregister\",\n",
" username=\"root\",\n",
" password=\"pR0R0v2e2\",\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[News(id='id', title='title', date='date', text='text'),\n",
" News(id='abc', title='Hallo Welt', date='heute', text='what does the fox say')]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from utils.mongodb.mongo import MongoNewsService\n",
"\n",
"service = MongoNewsService(connector)\n",
"service.get_all()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'id': 'abc', 'title': 'Hallo Welt', 'date': 'heute', 'text': 'what does the fox say'}\n"
]
},
{
"data": {
"text/plain": [
"<pymongo.results.InsertOneResult at 0x1bfd0773be0>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from models.News import News\n",
"\n",
"service.insert(\n",
" News(\n",
" \"abc\", \"Hallo Welt\", \"heute\", \"what does the fox say\", \"https://localhost:8080\"\n",
" )\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"News(id='abc', title='Hallo Welt', date='heute', text='what does the fox say')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"service.get_by_id(\"abc\")"
]
}
],
"metadata": {

View File

@ -0,0 +1 @@
pymongo

View File

@ -0,0 +1,17 @@
from abc import ABC
from models.News import News
class NewsServiceInterface(ABC):
def get_all(self) -> list[News]:
raise NotImplementedError
def get_by_id(self, id: str) -> News | None:
raise NotImplementedError
def insert(self, news: News):
raise NotImplementedError
def insert_many(self, news: list[News]):
raise NotImplementedError

View File

View File

@ -0,0 +1,65 @@
import pymongo
from models.News import News
from utils.NewsServiceInterface import NewsServiceInterface
class MongoConnector:
def __init__(
self,
hostname,
database: str,
port: int = 27017,
username: str | None = None,
password: str | None = None,
):
self.client = self.connect(hostname, port, username, password)
databases = self.client.list_database_names()
if database not in databases:
print(f"Database {database} will be created")
self.database = self.client[database]
def connect(self, hostname, port, username, password) -> pymongo.MongoClient:
if username is not None and password is not None:
connection_string = f"mongodb://{username}:{password}@{hostname}:{port}"
else:
connection_string = f"mongodb://{hostname}:{port}"
return pymongo.MongoClient(connection_string)
class MongoNewsService(NewsServiceInterface):
def __init__(self, connector: MongoConnector):
self.collection = connector.database["news"]
def get_all(self) -> list[News]:
result = self.collection.find()
return [MongoEntryTransformer.transform_outgoing(elem) for elem in result]
def get_by_id(self, id: str) -> News | None:
result = list(self.collection.find({"_id": id}))
if len(result) == 1:
return MongoEntryTransformer.transform_outgoing(list(result)[0])
return None
def insert(self, news: News):
return self.collection.insert_one(MongoEntryTransformer.transform_ingoing(news))
class MongoEntryTransformer:
@staticmethod
def transform_ingoing(news: News) -> dict:
transport_object = news.dict()
print(transport_object)
transport_object["_id"] = news.id
del transport_object["id"]
return transport_object
@staticmethod
def transform_outgoing(data: dict) -> News:
return News(
id=data["_id"],
title=data["title"],
date=data["date"],
text=data["text"],
source_url=data["source_url"],
)