fix: address code review - use timezone-aware datetime, full ip hash

Agent-Logs-Url: https://github.com/velocitatem/cvfs/sessions/fb35fb9a-a89e-4df0-9584-109f7151509c

Co-authored-by: velocitatem <60182044+velocitatem@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-04-04 06:02:24 +00:00
committed by GitHub
parent 7435a0f1bf
commit ad91369371
2 changed files with 7 additions and 6 deletions

View File

@@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
import hashlib import hashlib
from datetime import datetime from datetime import datetime, timezone
from fastapi import APIRouter, Depends, HTTPException, Request from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import Response from fastapi.responses import Response
@@ -28,10 +28,10 @@ router = APIRouter(prefix="/public", tags=["public"])
async def _log_view(session: AsyncSession, asset: PublicAsset, request: Request) -> None: async def _log_view(session: AsyncSession, asset: PublicAsset, request: Request) -> None:
ip = request.headers.get("x-forwarded-for", request.client.host if request.client else "") ip = request.headers.get("x-forwarded-for", request.client.host if request.client else "")
ip_hash = hashlib.sha256(ip.split(",")[0].strip().encode()).hexdigest()[:16] if ip else None ip_hash = hashlib.sha256(ip.split(",")[0].strip().encode()).hexdigest() if ip else None
view = PublicAssetView( view = PublicAssetView(
public_asset_id=asset.id, public_asset_id=asset.id,
viewed_at=datetime.utcnow(), viewed_at=datetime.now(timezone.utc),
user_agent=request.headers.get("user-agent", "")[:512] or None, user_agent=request.headers.get("user-agent", "")[:512] or None,
ip_hash=ip_hash, ip_hash=ip_hash,
) )
@@ -116,7 +116,8 @@ async def get_public_pdf(slug: str, request: Request, session: AsyncSession = De
version = (await session.execute(stmt)).scalars().one_or_none() version = (await session.execute(stmt)).scalars().one_or_none()
docx_bytes = storage_client.download_bytes(key=asset.artifact_key) docx_bytes = storage_client.download_bytes(key=asset.artifact_key)
patched = generate_patched_docx(docx_bytes, (version.structured_blocks or []) if version else []) blocks = version.structured_blocks or [] if version else []
patched = generate_patched_docx(docx_bytes, blocks)
pdf_bytes = docx_bytes_to_pdf(patched) pdf_bytes = docx_bytes_to_pdf(patched)
return Response( return Response(

View File

@@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
import enum import enum
from datetime import datetime from datetime import datetime, timezone
from sqlalchemy import Boolean, DateTime, Enum, ForeignKey, String, Text from sqlalchemy import Boolean, DateTime, Enum, ForeignKey, String, Text
from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.dialects.postgresql import JSONB
@@ -151,7 +151,7 @@ class PublicAssetView(Base, IdentifierMixin):
ForeignKey("public_assets.id", ondelete="CASCADE"), index=True ForeignKey("public_assets.id", ondelete="CASCADE"), index=True
) )
viewed_at: Mapped[datetime] = mapped_column( viewed_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=datetime.utcnow, index=True DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), index=True
) )
user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True) user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True)
ip_hash: Mapped[str | None] = mapped_column(String(64), nullable=True) ip_hash: Mapped[str | None] = mapped_column(String(64), nullable=True)