mirror of
https://github.com/lnbits/lnbits.git
synced 2025-10-09 20:12:34 +02:00
feat: basic filter
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from lnbits.core.db import db
|
from lnbits.core.db import db
|
||||||
from lnbits.core.models import AuditEntry
|
from lnbits.core.models import AuditEntry, AuditFilters
|
||||||
from lnbits.db import Connection
|
from lnbits.db import Connection, Filters, Page
|
||||||
|
|
||||||
|
|
||||||
async def create_audit_entry(
|
async def create_audit_entry(
|
||||||
@@ -10,3 +10,16 @@ async def create_audit_entry(
|
|||||||
conn: Optional[Connection] = None,
|
conn: Optional[Connection] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
await (conn or db).insert("audit", entry)
|
await (conn or db).insert("audit", entry)
|
||||||
|
|
||||||
|
|
||||||
|
async def get_audit_entries(
|
||||||
|
filters: Optional[Filters[AuditFilters]] = None,
|
||||||
|
conn: Optional[Connection] = None,
|
||||||
|
) -> Page[AuditEntry]:
|
||||||
|
return await (conn or db).fetch_page(
|
||||||
|
"SELECT * from audit",
|
||||||
|
[],
|
||||||
|
{},
|
||||||
|
filters=filters,
|
||||||
|
model=AuditEntry,
|
||||||
|
)
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
from .audit import AuditEntry
|
from .audit import AuditEntry, AuditFilters
|
||||||
from .lnurl import CreateLnurl, CreateLnurlAuth, PayLnurlWData
|
from .lnurl import CreateLnurl, CreateLnurlAuth, PayLnurlWData
|
||||||
from .misc import (
|
from .misc import (
|
||||||
BalanceDelta,
|
BalanceDelta,
|
||||||
@@ -44,6 +44,7 @@ from .webpush import CreateWebPushSubscription, WebPushSubscription
|
|||||||
__all__ = [
|
__all__ = [
|
||||||
# audit
|
# audit
|
||||||
"AuditEntry",
|
"AuditEntry",
|
||||||
|
"AuditFilters",
|
||||||
# lnurl
|
# lnurl
|
||||||
"CreateLnurl",
|
"CreateLnurl",
|
||||||
"CreateLnurlAuth",
|
"CreateLnurlAuth",
|
||||||
|
@@ -5,6 +5,7 @@ from typing import Optional
|
|||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
from lnbits.db import FilterModel
|
||||||
from lnbits.settings import settings
|
from lnbits.settings import settings
|
||||||
|
|
||||||
|
|
||||||
@@ -23,8 +24,27 @@ class AuditEntry(BaseModel):
|
|||||||
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||||
|
|
||||||
def __init__(self, **data):
|
def __init__(self, **data):
|
||||||
super.__init__(**data)
|
super().__init__(**data)
|
||||||
if settings.lnbits_audit_retention_days > 0:
|
retention_days = max(0, settings.lnbits_audit_retention_days) or 365
|
||||||
self.delete_at = self.created_at + timedelta(
|
self.delete_at = self.created_at + timedelta(days=retention_days)
|
||||||
days=settings.lnbits_audit_retention_days
|
|
||||||
)
|
|
||||||
|
class AuditFilters(FilterModel):
|
||||||
|
__search_fields__ = [
|
||||||
|
"ip_address",
|
||||||
|
"user_id",
|
||||||
|
"path",
|
||||||
|
"route_path",
|
||||||
|
"request_method",
|
||||||
|
"response_code",
|
||||||
|
]
|
||||||
|
__sort_fields__ = [
|
||||||
|
"duration",
|
||||||
|
]
|
||||||
|
|
||||||
|
ip_address: Optional[str] = None
|
||||||
|
user_id: Optional[str] = None
|
||||||
|
path: Optional[str] = None
|
||||||
|
route_path: Optional[str] = None
|
||||||
|
request_method: Optional[str] = None
|
||||||
|
response_code: Optional[str] = None
|
||||||
|
@@ -527,7 +527,9 @@ class AuditSettings(LNbitsSettings):
|
|||||||
|
|
||||||
# List of HTTP methods to be included. Empty lists means all.
|
# List of HTTP methods to be included. Empty lists means all.
|
||||||
# Options (case-sensitive): GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
|
# Options (case-sensitive): GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
|
||||||
lnbits_audit_http_methods: list[str] = Field(default=[])
|
lnbits_audit_http_methods: list[str] = Field(
|
||||||
|
default=["POST", "PUT", "PATCH", "DELETE"]
|
||||||
|
)
|
||||||
|
|
||||||
# List of HTTP codes to be included (regex match). Empty lists means all.
|
# List of HTTP codes to be included (regex match). Empty lists means all.
|
||||||
lnbits_audit_http_response_codes: list[str] = Field(default=[])
|
lnbits_audit_http_response_codes: list[str] = Field(default=[])
|
||||||
|
Reference in New Issue
Block a user