Skip to content
Snippets Groups Projects
files.py 3.27 KiB
Newer Older
Luna Mendes's avatar
Luna Mendes committed
import os
Ave O's avatar
Ave O committed
import logging

Luna Mendes's avatar
Luna Mendes committed
from sanic import Blueprint
from sanic import response

Luna Mendes's avatar
Luna Mendes committed
from ..common import purge_cf, FileNameType
Luna Mendes's avatar
Luna Mendes committed
from ..common_auth import token_check
Ave O's avatar
Ave O committed
from ..errors import NotFound
Luna Mendes's avatar
Luna Mendes committed

bp = Blueprint('files')
Ave O's avatar
Ave O committed
log = logging.getLogger(__name__)
async def domain_list(request):
    """Returns a dictionary with domain IDs mapped to domain names"""
    domain_info = await request.app.db.fetch("""
        SELECT domain_id, domain
        FROM domains
    """)
    return dict(domain_info)


Luna Mendes's avatar
Luna Mendes committed
@bp.get('/api/list')
async def list_handler(request):
Ave O's avatar
Ave O committed
    """Get list of files."""
    user_id = await token_check(request)
    domains = await domain_list(request)
Ave O's avatar
Ave O committed

    user_files = await request.app.db.fetch("""
Ave O's avatar
Ave O committed
    SELECT file_id, filename, file_size, fspath, domain
Ave O's avatar
Ave O committed
    FROM files
    WHERE uploader = $1
    AND deleted = false
Ave O's avatar
Ave O committed
    ORDER BY file_id DESC
Ave O's avatar
Ave O committed
    """, user_id)

    user_shortens = await request.app.db.fetch("""
Ave O's avatar
Ave O committed
    SELECT shorten_id, filename, redirto, domain
    FROM shortens
    WHERE uploader = $1
    AND deleted = false
    ORDER BY shorten_id DESC
    """, user_id)

Ave O's avatar
Ave O committed
    filenames = dict([(ufile["filename"],
                       {"snowflake": ufile["file_id"],
                        "shortname": ufile["filename"],
Ave O's avatar
Ave O committed
                        "size": ufile["file_size"],
                        "url": f"https://{domains[ufile['domain']]}/i/"
                        f"{os.path.basename(ufile['fspath'])}"}
                       ) for ufile in user_files])

    shortens = dict([(ushorten["filename"],
                      {"snowflake": ushorten["shorten_id"],
                       "shortname": ushorten["filename"],
                       "redirto": ushorten["redirto"],
Ave O's avatar
Ave O committed
                       "url": f"https://{domains[ushorten['domain']]}/s/"
                       f"{ushorten['filename']}"}
                      ) for ushorten in user_shortens])
Ave O's avatar
Ave O committed

    return response.json({
        'success': True,
        'files': filenames,
Ave O's avatar
Ave O committed
    })
Ave O's avatar
Ave O committed
@bp.delete('/api/delete')
Luna Mendes's avatar
Luna Mendes committed
async def delete_handler(request):
    """Invalidate a file."""
Ave O's avatar
Ave O committed
    # TODO: Reduce code repetition between this and /api/shortendelete
Luna Mendes's avatar
Luna Mendes committed
    user_id = await token_check(request)
    file_name = str(request.json['filename'])

Ave O's avatar
Ave O committed
    exec_out = await request.app.db.execute("""
    UPDATE files
    SET deleted = true
    WHERE uploader = $1
    AND filename = $2
    AND deleted = false
Ave O's avatar
Ave O committed
    """, user_id, file_name)
Ave O's avatar
Ave O committed
    if exec_out == "UPDATE 0":
Ave O's avatar
Ave O committed
        raise NotFound('You have no files with this name.')

Luna Mendes's avatar
Luna Mendes committed
    await purge_cf(request.app, file_name, FileNameType.FILE)
Luna Mendes's avatar
Luna Mendes committed

    return response.json({
        'success': True
    })
Ave O's avatar
Ave O committed


@bp.delete('/api/shortendelete')
async def shortendelete_handler(request):
    """Invalidate a shorten."""
    user_id = await token_check(request)
    file_name = str(request.json['filename'])

    exec_out = await request.app.db.execute("""
    UPDATE shortens
    SET deleted = true
    WHERE uploader = $1
    AND filename = $2
    AND deleted = false
    """, user_id, file_name)

    # By doing this, we're cutting down DB calls by half
    # and it still checks for user
    if exec_out == "UPDATE 0":
        raise NotFound('You have no shortens with this name.')

Luna Mendes's avatar
Luna Mendes committed
    await purge_cf(request.app, file_name, FileNameType.SHORTEN)
Ave O's avatar
Ave O committed

    return response.json({
        'success': True
    })