134 lines
3.4 KiB
Python
134 lines
3.4 KiB
Python
from typing import TypedDict
|
|
from src.internals.database.database import cached_count, cached_query
|
|
|
|
|
|
class TDShare(TypedDict):
|
|
id: int
|
|
name: str
|
|
description: str
|
|
uploader: int
|
|
added: str
|
|
|
|
|
|
def get_share(share_id: int, reload=False) -> TDShare:
|
|
key = f"share:{share_id}"
|
|
params = dict(share_id=share_id)
|
|
query = """
|
|
SELECT
|
|
id,
|
|
name,
|
|
description,
|
|
uploader,
|
|
added
|
|
FROM
|
|
shares
|
|
WHERE
|
|
id = %(share_id)s
|
|
"""
|
|
return cached_query(query, key, params, reload=reload, single=True)
|
|
|
|
|
|
def get_shares(offset: int, limit: int = 50, reload=False) -> list[TDShare]:
|
|
key = f"all_shares:{limit}:{offset}:"
|
|
params = dict(offset=offset, limit=limit)
|
|
query = """
|
|
SELECT
|
|
id,
|
|
name,
|
|
description,
|
|
uploader,
|
|
added
|
|
FROM
|
|
shares
|
|
ORDER BY
|
|
id DESC
|
|
OFFSET %(offset)s
|
|
LIMIT %(limit)s
|
|
"""
|
|
return cached_query(query, key, params, reload=reload, lock_enabled=True)
|
|
|
|
|
|
def get_all_shares_count(reload: bool = False) -> int:
|
|
return cached_count("SELECT COUNT(*) FROM shares", "all_shares_count", lock_enabled=True)
|
|
|
|
|
|
def get_artist_shares(artist_id, service, reload=False) -> list[TDShare]:
|
|
key = f"artist_shares:{service}:{artist_id}"
|
|
params = dict(artist_id=artist_id, service=service)
|
|
query = """
|
|
SELECT
|
|
shares.id,
|
|
shares.name,
|
|
shares.description,
|
|
shares.uploader,
|
|
shares.added
|
|
FROM
|
|
shares
|
|
INNER JOIN
|
|
lookup_share_relationships AS lsr
|
|
ON
|
|
shares.id = lsr.share_id
|
|
WHERE
|
|
lsr.user_id = %(artist_id)s AND lsr.service = %(service)s
|
|
ORDER BY
|
|
shares.id DESC
|
|
"""
|
|
# todo CONSTRAINT lookup_share_relationships_pkey PRIMARY KEY (share_id, service, user_id) should be user_id, service, share_id or we have other index
|
|
return cached_query(query, key, params, reload=reload)
|
|
|
|
|
|
def get_artist_share_count(service: str, artist_id: str, reload=False):
|
|
return 0 # disabled for now while feature is off
|
|
key = f"artist_share_count:{service}:{artist_id}"
|
|
query = """
|
|
SELECT COUNT(*)
|
|
FROM lookup_share_relationships lsr
|
|
WHERE lsr.user_id = %s AND lsr.service = %s
|
|
"""
|
|
return cached_count(query, key, (service, artist_id), reload)
|
|
|
|
|
|
class TDShareFile(TypedDict):
|
|
share_id: int
|
|
upload_url: str
|
|
upload_id: str
|
|
file_id: int
|
|
filename: str
|
|
id: int
|
|
hash: str
|
|
mtime: str
|
|
ctime: str
|
|
mime: str
|
|
ext: str
|
|
added: str
|
|
|
|
|
|
def get_files_for_share(share_id: int, reload=False) -> list[TDShareFile]:
|
|
key = f"share_files:{share_id}"
|
|
query = """
|
|
SELECT
|
|
fsr.share_id,
|
|
fsr.upload_url,
|
|
fsr.upload_id,
|
|
fsr.file_id,
|
|
fsr.filename,
|
|
files.id,
|
|
files.hash,
|
|
files.mtime,
|
|
files.ctime,
|
|
files.mime,
|
|
files.ext,
|
|
files.added
|
|
FROM
|
|
file_share_relationships AS fsr
|
|
LEFT JOIN
|
|
files
|
|
ON
|
|
fsr.file_id = files.id
|
|
WHERE
|
|
share_id = %s
|
|
ORDER
|
|
frs.file_id DESC
|
|
"""
|
|
return cached_query(query, key, (share_id,), reload=reload)
|