lnbits-legend/lnbits/core/views/admin_api.py

124 lines
3.5 KiB
Python
Raw Normal View History

import os
import time
2022-03-07 05:03:32 +00:00
from http import HTTPStatus
from shutil import make_archive
from subprocess import Popen
from typing import Optional
from urllib.parse import urlparse
2022-03-12 14:18:09 +00:00
from fastapi import Body, Depends
from fastapi.responses import FileResponse
2022-03-12 14:18:09 +00:00
from starlette.exceptions import HTTPException
2022-03-07 05:03:32 +00:00
from lnbits.core.crud import get_wallet
from lnbits.core.models import User
from lnbits.core.services import update_cached_settings, update_wallet_balance
from lnbits.decorators import check_admin, check_super_user
2022-10-03 16:36:14 +02:00
from lnbits.server import server_restart
from lnbits.settings import AdminSettings, EditableSettings, settings
2022-03-12 14:18:09 +00:00
from .. import core_app
from ..crud import delete_admin_settings, get_admin_settings, update_admin_settings
2022-10-03 16:36:14 +02:00
@core_app.get("/admin/api/v1/settings/")
async def api_get_settings(
user: User = Depends(check_admin),
) -> Optional[AdminSettings]:
admin_settings = await get_admin_settings(user.super_user)
return admin_settings
@core_app.put(
"/admin/api/v1/settings/",
status_code=HTTPStatus.OK,
)
2023-05-04 17:22:24 +02:00
async def api_update_settings(
data: EditableSettings, user: User = Depends(check_admin)
):
await update_admin_settings(data)
2023-05-04 17:22:24 +02:00
admin_settings = await get_admin_settings(user.super_user)
assert admin_settings, "Updated admin settings not found."
update_cached_settings(admin_settings.dict())
return {"status": "Success"}
@core_app.delete(
"/admin/api/v1/settings/",
status_code=HTTPStatus.OK,
dependencies=[Depends(check_super_user)],
)
async def api_delete_settings() -> None:
await delete_admin_settings()
server_restart.set()
@core_app.get(
"/admin/api/v1/restart/",
status_code=HTTPStatus.OK,
dependencies=[Depends(check_super_user)],
2022-10-12 13:08:59 +02:00
)
async def api_restart_server() -> dict[str, str]:
2022-10-03 16:36:14 +02:00
server_restart.set()
return {"status": "Success"}
2022-03-12 14:18:09 +00:00
2022-03-07 05:03:32 +00:00
@core_app.put(
"/admin/api/v1/topup/",
status_code=HTTPStatus.OK,
dependencies=[Depends(check_super_user)],
2022-10-12 13:08:59 +02:00
)
async def api_topup_balance(
2022-10-12 13:08:59 +02:00
id: str = Body(...), amount: int = Body(...)
) -> dict[str, str]:
2022-03-07 05:03:32 +00:00
try:
2022-10-12 13:08:59 +02:00
await get_wallet(id)
2022-03-07 05:03:32 +00:00
except:
2022-03-12 14:18:09 +00:00
raise HTTPException(
2022-10-05 09:19:07 +02:00
status_code=HTTPStatus.FORBIDDEN, detail="wallet does not exist."
2022-07-05 16:25:02 +01:00
)
2022-03-22 11:42:28 +00:00
2022-10-12 13:08:59 +02:00
await update_wallet_balance(wallet_id=id, amount=int(amount))
2022-07-05 16:25:02 +01:00
2022-03-12 14:18:09 +00:00
return {"status": "Success"}
@core_app.get(
"/admin/api/v1/backup/",
status_code=HTTPStatus.OK,
dependencies=[Depends(check_super_user)],
response_class=FileResponse,
)
async def api_download_backup() -> FileResponse:
last_filename = "lnbits-backup"
filename = f"lnbits-backup-{int(time.time())}.zip"
db_url = settings.lnbits_database_url
pg_backup_filename = f"{settings.lnbits_data_folder}/lnbits-database.dmp"
is_pg = db_url and db_url.startswith("postgres://")
if is_pg:
p = urlparse(db_url)
command = (
f"pg_dump --host={p.hostname} "
f'--dbname={p.path.replace("/", "")} '
f"--username={p.username} "
f"--no-password "
f"--format=c "
f"--file={pg_backup_filename}"
)
proc = Popen(
command, shell=True, env={**os.environ, "PGPASSWORD": p.password or ""}
)
proc.wait()
make_archive(last_filename, "zip", settings.lnbits_data_folder)
# cleanup pg_dump file
if is_pg:
proc = Popen(f"rm {pg_backup_filename}", shell=True)
proc.wait()
return FileResponse(
path=f"{last_filename}.zip", filename=filename, media_type="application/zip"
)