crud_moderator.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from typing import List, Optional
  2. from app.schemas import ModeratorCreate, ModeratorUpdate
  3. from app.db.client import fetch_one, fetch_all, RowObject, db_execute_commit
  4. from app.core.cache import cache_service
  5. from datetime import datetime
  6. import json
  7. def moderator_cache_key(mod_id: int): return f"moderator:{mod_id}"
  8. def moderators_list_cache_key(skip: int, limit: int, creator_id: Optional[int]):
  9. return f"moderators:list:{skip}:{limit}:{creator_id}"
  10. def get_moderator(db, moderator_id: int):
  11. # Cache Aside: Read
  12. cache_key = moderator_cache_key(moderator_id)
  13. cached = cache_service.get_cache(cache_key)
  14. if cached:
  15. return RowObject(cached)
  16. rs = db.execute("SELECT * FROM moderators WHERE id = ?", [moderator_id])
  17. mod = fetch_one(rs)
  18. if mod:
  19. cache_service.set_cache(cache_key, mod.__dict__, expire=3600)
  20. return mod
  21. def get_moderators(db, skip: int = 0, limit: int = 100, creator_id: Optional[int] = None):
  22. # Cache Aside: List
  23. # Only cache if creator_id is None or provided, but with short TTL because list changes
  24. cache_key = moderators_list_cache_key(skip, limit, creator_id)
  25. cached_list = cache_service.get_cache(cache_key)
  26. if cached_list:
  27. return [RowObject(item) for item in cached_list]
  28. params = []
  29. query = "SELECT * FROM moderators"
  30. if creator_id:
  31. query += " WHERE creator_id = ?"
  32. params.append(creator_id)
  33. query += " LIMIT ? OFFSET ?"
  34. params.extend([limit, skip])
  35. rs = db.execute(query, params)
  36. mods = fetch_all(rs)
  37. # Cache Write
  38. if mods:
  39. # Serialize list of RowObjects to list of dicts
  40. mods_data = [m.__dict__ for m in mods]
  41. cache_service.set_cache(cache_key, mods_data, expire=300) # Increased TTL to 5 minutes
  42. return mods
  43. def create_moderator(db, moderator: ModeratorCreate, creator_id: int):
  44. data = moderator.model_dump()
  45. data['creator_id'] = creator_id
  46. data['created_at'] = datetime.now()
  47. columns = list(data.keys())
  48. placeholders = ["?"] * len(columns)
  49. values = list(data.values())
  50. query = f"""
  51. INSERT INTO moderators ({', '.join(columns)})
  52. VALUES ({', '.join(placeholders)})
  53. RETURNING *
  54. """
  55. rs = db_execute_commit(db, query, values)
  56. new_mod = fetch_one(rs)
  57. if new_mod:
  58. # Update specific cache
  59. cache_service.set_cache(moderator_cache_key(new_mod.id), new_mod.__dict__, expire=3600)
  60. # Invalidate list cache
  61. cache_service.delete_keys_pattern("moderators:list:*")
  62. return new_mod
  63. def delete_moderator(db, moderator_id: int):
  64. # First get it to return it (matching old behavior)
  65. mod = get_moderator(db, moderator_id) # This might use cache, which is fine
  66. if mod:
  67. db_execute_commit(db, "DELETE FROM moderators WHERE id = ?", [moderator_id])
  68. # Invalidate specific and list cache
  69. cache_service.delete_cache(moderator_cache_key(moderator_id))
  70. cache_service.delete_keys_pattern("moderators:list:*")
  71. return mod