aboutsummaryrefslogtreecommitdiff
path: root/api/util/log.py
diff options
context:
space:
mode:
Diffstat (limited to 'api/util/log.py')
-rw-r--r--api/util/log.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/api/util/log.py b/api/util/log.py
new file mode 100644
index 0000000..58a56f9
--- /dev/null
+++ b/api/util/log.py
@@ -0,0 +1,84 @@
+import requests
+import datetime
+from ua_parser import user_agent_parser
+
+from database import SessionLocal
+import config
+from models import Link, Log
+
+"""
+Create a new log whenever a link is visited
+"""
+
+
+def ip_to_location(ip):
+ if not config.IP_TO_LOCATION:
+ return "-, -", "-"
+
+ url = f"https://api.ip2location.io/?key={config.API_KEY}&ip={ip}"
+ response = requests.get(url)
+ data = response.json()
+
+ if response.status_code != 200:
+ config.LOG.error(
+ "Error with IP2Location API. Perhaps the API is down."
+ )
+ return "-, -", "-"
+
+ if "error" in data:
+ config.LOG.error(
+ "Error with IP2Location API. Likely wrong API key or insufficient"
+ " funds."
+ )
+ return "-, -", "-"
+
+ location = ""
+ # Sometimes a certain name may not be present, so always check
+ if "city_name" in data:
+ location += data["city_name"]
+
+ if "region_name" in data:
+ location += f', {data["region_name"]}'
+
+ if "country_name" in data:
+ location += f', {data["country_name"]}'
+
+ isp = data["as"]
+ return location, isp
+
+
+def log(link, ip, user_agent):
+ db = SessionLocal()
+
+ # Get the redirect link and owner of the link
+ redirect_link, owner = (
+ db.query(Link.redirect_link, Link.owner)
+ .filter(Link.link == link)
+ .first()
+ )
+
+ # Get the location and ISP of the user
+ location, isp = ip_to_location(ip)
+
+ ua_string = user_agent_parser.Parse(user_agent)
+ browser = ua_string["user_agent"]["family"]
+ os = f'{ua_string["os"]["family"]} {ua_string["os"]["major"]}'
+
+ # Create the log and commit it to the database
+ new_log = Log(
+ owner=owner,
+ link=link,
+ timestamp=datetime.datetime.utcnow(),
+ ip=ip,
+ location=location,
+ browser=browser,
+ os=os,
+ user_agent=user_agent,
+ isp=isp,
+ )
+ db.add(new_log)
+ db.commit()
+ db.close()
+
+ # Return the redirect link in order to properly redirect the user
+ return redirect_link