Nueva funcionalidad

This commit is contained in:
2026-02-19 11:34:03 -06:00
parent f00a32ddb3
commit bcc758953f
14 changed files with 729 additions and 220 deletions

View File

@@ -1,6 +1,6 @@
import uuid
from datetime import datetime, timezone
from sqlalchemy import Column, String, Text, DateTime
from sqlalchemy import Column, String, Text, DateTime, Integer
from sqlalchemy.dialects.postgresql import UUID
from core.database import Base
@@ -17,6 +17,10 @@ class HelpArticle(Base):
content = Column(Text, nullable=False)
updated_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), nullable=False)
last_editor = Column(String(255), nullable=False)
# Library Mode Fields
category = Column(String(255), nullable=True, default="General")
order = Column(Integer, nullable=True, default=0)
def __repr__(self):
return f"<HelpArticle(title='{self.title}', slug='{self.slug}')>"

View File

@@ -1,7 +1,10 @@
import shutil
import os
import uuid
from datetime import datetime
from typing import List, Optional
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Header, status
from fastapi import APIRouter, Depends, HTTPException, Header, status, UploadFile, File
from sqlalchemy.orm import Session
from core.database import get_core_db
from core.config import settings
@@ -61,6 +64,24 @@ def sync_help_article(sync_data: HelpSyncRequest, db: Session = Depends(get_core
return result
@router.post("/upload-image/")
def upload_help_image(file: UploadFile = File(...)):
"""Sube una imagen para usar en los artículos."""
try:
file_ext = os.path.splitext(file.filename)[1]
new_filename = f"{uuid.uuid4()}{file_ext}"
file_location = f"uploads/help/{new_filename}"
# Ensure directory exists
os.makedirs("uploads/help", exist_ok=True)
with open(file_location, "wb+") as buffer:
shutil.copyfileobj(file.file, buffer)
return {"url": f"/api/uploads/help/{new_filename}"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/articles/", response_model=List[HelpArticleInDB])
def list_articles(db: Session = Depends(get_core_db)):
"""Lista todos los artículos de ayuda."""

View File

@@ -8,6 +8,8 @@ class HelpArticleBase(BaseModel):
title: str
content: str
last_editor: str
category: Optional[str] = "General"
order: Optional[int] = 0
class HelpArticleCreate(HelpArticleBase):
pass
@@ -17,6 +19,8 @@ class HelpArticleUpdate(BaseModel):
title: Optional[str] = None
content: Optional[str] = None
last_editor: Optional[str] = None
category: Optional[str] = None
order: Optional[int] = None
class HelpArticleInDB(HelpArticleBase):
uuid: UUID
@@ -32,6 +36,8 @@ class HelpSyncRequest(BaseModel):
client_title: str
client_slug: str
last_editor: str
client_category: Optional[str] = "General"
client_order: Optional[int] = 0
origin_client_uuid: Optional[UUID] = None
class HelpSyncResponse(BaseModel):
@@ -40,4 +46,6 @@ class HelpSyncResponse(BaseModel):
server_content: Optional[str] = None
server_title: Optional[str] = None
server_slug: Optional[str] = None
server_category: Optional[str] = None
server_order: Optional[int] = None
message: str

View File

@@ -80,7 +80,9 @@ class HelpCenterService:
title=sync_data.client_title,
content=sync_data.client_content,
updated_at=client_updated_at,
last_editor=sync_data.last_editor
last_editor=sync_data.last_editor,
category=sync_data.client_category,
order=sync_data.client_order
)
db.add(new_article)
db.commit()
@@ -97,6 +99,8 @@ class HelpCenterService:
db_article.slug = sync_data.client_slug
db_article.updated_at = client_updated_at
db_article.last_editor = sync_data.last_editor
db_article.category = sync_data.client_category
db_article.order = sync_data.client_order
db.commit()
return HelpSyncResponse(status="OK", message="Server updated with client data.")
@@ -108,6 +112,8 @@ class HelpCenterService:
server_content=db_article.content,
server_title=db_article.title,
server_slug=db_article.slug,
server_category=db_article.category,
server_order=db_article.order,
message="Client is outdated. Update required."
)

View File

@@ -214,7 +214,9 @@ def sync_from_hub_task():
title=art_data['title'],
content=art_data['content'],
updated_at=server_updated_at,
last_editor=art_data['last_editor']
last_editor=art_data['last_editor'],
category=art_data.get('category', "General"),
order=art_data.get('order', 0)
)
db.add(new_article)
else:
@@ -224,6 +226,8 @@ def sync_from_hub_task():
local_article.content = art_data['content']
local_article.updated_at = server_updated_at
local_article.last_editor = art_data['last_editor']
local_article.category = art_data.get('category', "General")
local_article.order = art_data.get('order', 0)
db.commit()
logger.info("Polling sync completed successfully.")