blog.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from fastapi import APIRouter, Depends, HTTPException
  2. from typing import List, Optional
  3. from pydantic import BaseModel
  4. from datetime import datetime
  5. import db
  6. import mysql.connector
  7. router = APIRouter(prefix="/blog", tags=["blog"])
  8. class PostBase(BaseModel):
  9. slug: str
  10. title_en: str
  11. title_me: Optional[str] = None
  12. title_ru: Optional[str] = None
  13. title_ua: Optional[str] = None
  14. excerpt_en: Optional[str] = None
  15. excerpt_me: Optional[str] = None
  16. excerpt_ru: Optional[str] = None
  17. excerpt_ua: Optional[str] = None
  18. content_en: str
  19. content_me: Optional[str] = None
  20. content_ru: Optional[str] = None
  21. content_ua: Optional[str] = None
  22. category: Optional[str] = None
  23. image_url: Optional[str] = None
  24. is_published: bool = False
  25. class PostCreate(PostBase):
  26. pass
  27. class PostUpdate(PostBase):
  28. pass
  29. class Post(PostBase):
  30. id: int
  31. created_at: datetime
  32. updated_at: datetime
  33. class Config:
  34. from_attributes = True
  35. @router.get("/", response_model=List[Post])
  36. async def get_posts(published_only: bool = True):
  37. query = "SELECT * FROM posts"
  38. if published_only:
  39. query += " WHERE is_published = TRUE"
  40. query += " ORDER BY created_at DESC"
  41. return db.execute_query(query)
  42. @router.get("/{id_or_slug}", response_model=Post)
  43. async def get_post(id_or_slug: str):
  44. # Try by slug first
  45. res = db.execute_query("SELECT * FROM posts WHERE slug = %s", (id_or_slug,))
  46. if res: return res[0]
  47. # If not found, try by ID if it looks like an int
  48. if id_or_slug.isdigit():
  49. res = db.execute_query("SELECT * FROM posts WHERE id = %s", (int(id_or_slug),))
  50. if res: return res[0]
  51. raise HTTPException(status_code=404, detail="Post not found")
  52. @router.post("/", response_model=Post)
  53. async def create_post(post: PostCreate):
  54. query = """
  55. INSERT INTO posts (
  56. slug, title_en, title_me, title_ru, title_ua,
  57. excerpt_en, excerpt_me, excerpt_ru, excerpt_ua,
  58. content_en, content_me, content_ru, content_ua,
  59. category, image_url, is_published
  60. ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
  61. """
  62. values = (
  63. post.slug, post.title_en, post.title_me, post.title_ru, post.title_ua,
  64. post.excerpt_en, post.excerpt_me, post.excerpt_ru, post.excerpt_ua,
  65. post.content_en, post.content_me, post.content_ru, post.content_ua,
  66. post.category, post.image_url, post.is_published
  67. )
  68. try:
  69. new_id = db.execute_commit(query, values)
  70. res = db.execute_query("SELECT * FROM posts WHERE id = %s", (new_id,))
  71. return res[0]
  72. except mysql.connector.Error as err:
  73. raise HTTPException(status_code=400, detail=str(err))
  74. @router.put("/{post_id}", response_model=Post)
  75. async def update_post(post_id: int, post: PostUpdate):
  76. query = """
  77. UPDATE posts SET
  78. slug=%s, title_en=%s, title_me=%s, title_ru=%s, title_ua=%s,
  79. excerpt_en=%s, excerpt_me=%s, excerpt_ru=%s, excerpt_ua=%s,
  80. content_en=%s, content_me=%s, content_ru=%s, content_ua=%s,
  81. category=%s, image_url=%s, is_published=%s
  82. WHERE id = %s
  83. """
  84. values = (
  85. post.slug, post.title_en, post.title_me, post.title_ru, post.title_ua,
  86. post.excerpt_en, post.excerpt_me, post.excerpt_ru, post.excerpt_ua,
  87. post.content_en, post.content_me, post.content_ru, post.content_ua,
  88. post.category, post.image_url, post.is_published, post_id
  89. )
  90. db.execute_commit(query, values)
  91. res = db.execute_query("SELECT * FROM posts WHERE id = %s", (post_id,))
  92. if not res:
  93. raise HTTPException(status_code=404, detail="Post not found")
  94. return res[0]
  95. @router.delete("/{post_id}")
  96. async def delete_post(post_id: int):
  97. # We don't easily get rowcount from execute_commit as I wrote it,
  98. # but we can check existence first or modify execute_commit.
  99. # For now, let's just execute it.
  100. db.execute_commit("DELETE FROM posts WHERE id = %s", (post_id,))
  101. return {"message": "Post deleted successfully"}