Skip to content

Commit

Permalink
feat: Allow forum app to use Forum V2 APIs
Browse files Browse the repository at this point in the history
Added a setting FORUM_V2_REGEXS. It contains regex patterns for matching ForumV2 app URLs.
The application will use the ForumV2 APIs if a ForumV1 URL matches any of these regex patterns.
This setting is intended to help route traffic to the appropriate version of the Forum API based on the structure of the URL.
  • Loading branch information
Ali-Salman29 committed Aug 9, 2024
1 parent f7be991 commit b6ba5ea
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,48 @@
if hasattr(settings, "COMMENTS_SERVICE_URL"):
SERVICE_HOST = settings.COMMENTS_SERVICE_URL
else:
SERVICE_HOST = 'http://localhost:4567'
SERVICE_HOST = "http://localhost:4567"

PREFIX = SERVICE_HOST + '/api/v1'
PREFIX = SERVICE_HOST + "/api/v1"

# V2 url support for differential logging
if hasattr(settings, "COMMENTS_SERVICE_V2_URL"):
SERVICE_HOST_V2 = settings.COMMENTS_SERVICE_V2_URL
else:
SERVICE_HOST_V2 = 'http://localhost:8000'
SERVICE_HOST_V2 = "http://localhost:8000"

PREFIX_V2 = SERVICE_HOST_V2 + '/forum/forum_proxy/api/v1'
PREFIX_V2 = SERVICE_HOST_V2 + "/forum/api/v2"
PROXY_PREFIX_V2 = SERVICE_HOST_V2 + "/forum/forum_proxy/api/v1"

"""
FORUM_V2_REGEXS contains regex patterns for matching forum app URLs.
The App will use the Forum V2 APIs if Forum V1 URLS matched with any of the regex.
The dictionary keys represent the HTTP methods and the values are lists of
regex patternsthat correspond to the endpoints for each method.
Example:
FORUM_V2_REGEXS = {
"put": [
"^/threads/([a-zA-Z0-9]+)/votes$",
# Example regex for PUT requests to update votes for a specific thread.
],
"delete": [
"^/threads/([a-zA-Z0-9]+)/votes$",
# Example regex for DELETE requests to remove votes for a specific thread.
],
"post": [
# Add regex patterns for POST requests here.
],
"get": [
# Add regex patterns for GET requests here.
],
}
"""

FORUM_V2_REGEXS = {
"put": [],
"delete": [],
"post": [],
"get": [],
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# pylint: disable=missing-docstring,unused-argument,broad-except
"""" Common utilities for comment client wrapper """


import re
import logging
from uuid import uuid4

import requests
from django.utils.translation import get_language

from .settings import PREFIX, PREFIX_V2, SERVICE_HOST as COMMENTS_SERVICE
from .settings import PREFIX, PREFIX_V2, PROXY_PREFIX_V2, FORUM_V2_REGEXS, SERVICE_HOST as COMMENTS_SERVICE

log = logging.getLogger(__name__)

Expand All @@ -33,6 +33,12 @@ def extract(dic, keys):
def _get_forum_v2_url(url):
return url.replace(PREFIX, PREFIX_V2)

def _get_forum_proxy_v2_url(url):
return url.replace(PREFIX, PROXY_PREFIX_V2)

def should_use_forum_v2_urls(method, url):
path = url.replace(PREFIX, '')
return any([re.match(pattern, path) for pattern in FORUM_V2_REGEXS.get(method, [])])

def perform_request(method, url, data_or_params=None, raw=False,
metric_action=None, metric_tags=None, paged_results=False):
Expand Down Expand Up @@ -66,6 +72,11 @@ def perform_request(method, url, data_or_params=None, raw=False,
data = None
params = data_or_params.copy()
params.update(request_id_dict)

forum_v1_url = url
if should_use_forum_v2_urls(method, url):
url = _get_forum_v2_url(url)

response = requests.request(
method,
url,
Expand All @@ -76,7 +87,19 @@ def perform_request(method, url, data_or_params=None, raw=False,
)

if method == "get":
forum_v2_url = _get_forum_v2_url(url)
forum_v2_url = _get_forum_proxy_v2_url(url)
if url != forum_v1_url:
response_v1 = requests.request(
method,
forum_v1_url,
data=data,
params=params,
headers=headers,
timeout=config.connection_timeout
)
else:
response_v1 = response

response_v2 = requests.request(
method,
forum_v2_url,
Expand All @@ -85,11 +108,11 @@ def perform_request(method, url, data_or_params=None, raw=False,
headers=headers,
timeout=config.connection_timeout,
)
log.info(f"requested forum v1 url: {url}")
log.info(f"requested forum v1 url: {forum_v1_url}")
log.info(f"requested forum v2 url: {forum_v2_url}")
if response_v2.json() != response.json():
if response_v2.json() != response_v1.json():
log.error(
f"Forum v2 difference, for endpoint {url} with params={params}. \
f"Forum v2 difference, for endpoint {forum_v1_url} with params={params}. \
Expected: {response.json()}. Got: {response_v2.json()}."
)

Expand Down

0 comments on commit b6ba5ea

Please sign in to comment.