aboutsummaryrefslogtreecommitdiff
path: root/app/func/newlink.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/func/newlink.py')
-rw-r--r--app/func/newlink.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/func/newlink.py b/app/func/newlink.py
new file mode 100644
index 0000000..6fa1340
--- /dev/null
+++ b/app/func/newlink.py
@@ -0,0 +1,38 @@
+import validators
+import random
+import string
+import datetime
+import sqlalchemy
+from sqlalchemy import exc
+
+from db import engine
+
+"""
+Generate and return a new randomized link that is connected to the user
+Links are composed of 5 uppercase ASCII characters + numbers
+"""
+def generate_link(request, owner):
+ content_type = request.headers.get('Content-Type')
+ if content_type == 'application/json':
+ try:
+ redirect_link = request.json['redirect_link']
+ except KeyError:
+ return 'Redirect link not provided', 400
+
+ if not validators.url(redirect_link):
+ return 'Redirect link is malformed. Please try again', 400
+ else:
+ return 'Content-Type not supported', 400
+
+ with engine.begin() as conn:
+ choices = string.ascii_uppercase + '1234567890'
+ while True:
+ try:
+ link = ''.join(random.choices(choices, k=5))
+ conn.execute(sqlalchemy.text('INSERT INTO links(owner, link, redirect_link, expire_date) VALUES (:owner, :link, :redirect_link, :expire_date)'), [{'owner': owner, 'link': link, 'redirect_link': redirect_link, 'expire_date': (datetime.datetime.now() + datetime.timedelta(days=7)).strftime('%d/%m/%Y')}])
+ conn.commit()
+ break
+ except exc.IntegrityError:
+ continue
+
+ return link, 200