summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/controllers/comments_controller.py3
-rw-r--r--src/lib/__init__.py1
-rw-r--r--src/lib/blacklist_matcher.py19
-rw-r--r--src/services/callback.py6
-rw-r--r--src/services/comment_creation_callbacks.py27
-rw-r--r--src/services/create_comment_service.py3
6 files changed, 56 insertions, 3 deletions
diff --git a/src/controllers/comments_controller.py b/src/controllers/comments_controller.py
index 20fe3c4..1bbb0f8 100644
--- a/src/controllers/comments_controller.py
+++ b/src/controllers/comments_controller.py
@@ -1,7 +1,4 @@
from flask import Blueprint, request, abort, render_template
-from sqlalchemy import select
-from src.database.models import Blog, Comment
-from src.database import db
from src.services import CreateCommentService
diff --git a/src/lib/__init__.py b/src/lib/__init__.py
new file mode 100644
index 0000000..4c7efe4
--- /dev/null
+++ b/src/lib/__init__.py
@@ -0,0 +1 @@
+from src.lib.blacklist_matcher import contains_forbidden_term
diff --git a/src/lib/blacklist_matcher.py b/src/lib/blacklist_matcher.py
new file mode 100644
index 0000000..0f28953
--- /dev/null
+++ b/src/lib/blacklist_matcher.py
@@ -0,0 +1,19 @@
+import re
+from functools import cache
+from config import user_config
+
+
+def contains_forbidden_term(comment):
+ matcher = build_matcher()
+
+ return matcher.search(comment) is not None
+
+
+@cache
+def build_matcher():
+ regex_string = ''
+
+ for word in user_config['Env']['blacklist']:
+ regex_string += f"{word}|"
+
+ return re.compile(regex_string.removesuffix('|'))
diff --git a/src/services/callback.py b/src/services/callback.py
new file mode 100644
index 0000000..5dc3149
--- /dev/null
+++ b/src/services/callback.py
@@ -0,0 +1,6 @@
+class Callback:
+ def _moderate(self):
+ pass
+
+ def deliver_notification(self):
+ pass
diff --git a/src/services/comment_creation_callbacks.py b/src/services/comment_creation_callbacks.py
new file mode 100644
index 0000000..5f5d024
--- /dev/null
+++ b/src/services/comment_creation_callbacks.py
@@ -0,0 +1,27 @@
+import src.lib as lib
+from config import user_config
+from src.services.callback import Callback
+
+
+class CommentCreationCallbacks(Callback):
+ """
+ Check config for blacklists, moderation behavior and
+ notification delivery.
+ """
+ def __init__(self, comment):
+ self._comment = comment
+
+ def run_callbacks(self):
+ self._moderate()
+ self._deliver_notification()
+
+ return self._comment
+
+ def _moderate(self):
+ if user_config['Env']['moderation'] == 'strict':
+ self._comment.approved = False
+ return
+
+ if lib.contains_forbidden_term(self._comment.content):
+ if user_config['Env']['blacklist_match_action'] == 'reject':
+ self._comment.approved = False
diff --git a/src/services/create_comment_service.py b/src/services/create_comment_service.py
index b995b25..97cf726 100644
--- a/src/services/create_comment_service.py
+++ b/src/services/create_comment_service.py
@@ -1,6 +1,7 @@
from sqlalchemy import select
from src.database.models import Blog, Comment
from src.database import db
+from src.services.comment_creation_callbacks import CommentCreationCallbacks
class CreateCommentService:
@@ -26,6 +27,8 @@ class CreateCommentService:
comment = Comment(blog_id=self._blog_id, content=self._content,
email=self._email, author=self._author,
post=self._post, language='en')
+ comment_callbacks = CommentCreationCallbacks(comment)
+ comment = comment_callbacks.run_callbacks()
db.session.add(comment)
db.session.commit()