mirror of
https://github.com/Alexander-D-Karpov/akarpov
synced 2024-11-22 19:06:41 +03:00
42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
|
from sqlalchemy.orm import Session
|
||
|
|
||
|
from redirect.db import models
|
||
|
from redirect.util import slug_to_link_id
|
||
|
|
||
|
|
||
|
class LinkNotFoundException(Exception):
|
||
|
def __init__(self, slug: str):
|
||
|
self.slug = slug
|
||
|
|
||
|
|
||
|
def get_link(db: Session, link_id: int):
|
||
|
"""Gets short link metdata by its id.
|
||
|
|
||
|
:param db Open connection to a database
|
||
|
:param link_id id of the link
|
||
|
|
||
|
:return link metadata"""
|
||
|
return db.query(models.Link).filter(models.Link.id == link_id).first()
|
||
|
|
||
|
|
||
|
_get_link_by_slug_cache = {}
|
||
|
|
||
|
|
||
|
def get_link_by_slug(db: Session, slug: str) -> tuple[int, str]:
|
||
|
"""Converts slug to id and gets related link target.
|
||
|
|
||
|
:param db Open connection to a database
|
||
|
:param slug of the link
|
||
|
|
||
|
:raise LinkNotFoundException if link is not found
|
||
|
:return target link id & url"""
|
||
|
if slug in _get_link_by_slug_cache:
|
||
|
return _get_link_by_slug_cache[slug]
|
||
|
|
||
|
link = get_link(db, slug_to_link_id(slug))
|
||
|
if link is None or not link.enabled:
|
||
|
raise LinkNotFoundException(slug)
|
||
|
|
||
|
_get_link_by_slug_cache[slug] = (link.id, link.source)
|
||
|
return link.id, link.source
|