db_router.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. from fastapi import APIRouter
  2. from supabase import create_client, Client
  3. from dotenv import load_dotenv
  4. import os
  5. from datetime import datetime
  6. from random import choice
  7. from openai import OpenAI
  8. from typing import Annotated
  9. from pydantic import Field
  10. client = OpenAI()
  11. load_dotenv()
  12. # supaspace 連線
  13. url: str = os.environ.get('SUPABASE_URL')
  14. key: str = os.environ.get('SUPABASE_KEY')
  15. supabase: Client = create_client(url, key)
  16. dbRouter = APIRouter()
  17. @dbRouter.get("/click")
  18. def add_click_time():
  19. try:
  20. response = supabase.table('click_time').select("*").execute()
  21. click_time = response.data[0]['click_time'] + 1
  22. data, count = supabase.table('click_time') \
  23. .update({'click_time':click_time,'update_time':str(datetime.now())})\
  24. .eq('id', 1)\
  25. .execute()
  26. return {"state":"success","click_time" : click_time}
  27. except Exception as e:
  28. return {"state":str(e)}
  29. @dbRouter.get("/find_brand")
  30. def find_brand(keyword:str = None,language :str = "ch",page_num : int = None,page_amount: int = None,search_name : str = None):
  31. if keyword is None :
  32. query = supabase.table('101_brand').select('*').eq("language", language)
  33. else :
  34. keyword_list = keyword.split(",")
  35. query= supabase.table('101_brand').select('*').eq("language", language)
  36. for keyword_tmp in keyword_list :
  37. query = query.like('tags', f'%{keyword_tmp}%')
  38. if search_name:
  39. query = query.like('name', f'%{search_name}%')
  40. result,_ = query.execute()
  41. count = len(result[1])
  42. if page_num and page_amount :
  43. offset = (page_num - 1) * page_amount
  44. query = query.range(offset, offset + page_amount-1)
  45. try:
  46. data,_ = query.execute()
  47. result = []
  48. for shop in data[1] :
  49. json = {
  50. "type" : shop["type"],
  51. "info" : shop
  52. }
  53. if language != "ch" :
  54. if shop["floor"] == "館外" :
  55. json["info"]["floor"] = "outside"
  56. result.append(json)
  57. return {"state":"success","all_num" : count,"data" : result}
  58. except Exception as e:
  59. return {"state":"fail","message" :str(e)}
  60. @dbRouter.get("/arviews")
  61. def arviews(start:str,end:str,language:str = "ch"):
  62. try :
  63. data, count = supabase.table('101_arviews')\
  64. .select('*')\
  65. .eq('start_loc', start) \
  66. .like('tour_place', f'%{end}%') \
  67. .execute()
  68. result :str
  69. words :str
  70. if len(data[1]) != 0:
  71. if language == "ch" :
  72. result = data[1][0]["url"]
  73. words = data[1][0]["words"]
  74. else:
  75. result = data[1][0]["en_url"]
  76. words = data[1][0]["en_words"]
  77. else :
  78. result = "no this route"
  79. return {"state":"success","url" : result,"words" : words}
  80. except Exception as e:
  81. return {"state":"fail","message" :str(e)}
  82. @dbRouter.get("/static_tickets")
  83. async def static_tickets(is_Chinese : int = None):
  84. try:
  85. data =None
  86. if is_Chinese :
  87. data, count = supabase.table('101_ticket')\
  88. .select('*')\
  89. .in_('id', [1,3,6,7])\
  90. .execute()
  91. else :
  92. data, count = supabase.table('101_ticket')\
  93. .select('*')\
  94. .in_('id', [182,183,180])\
  95. .execute()
  96. result = []
  97. for shop in data[1] :
  98. json = {
  99. "type" : shop["type"],
  100. "info" : shop
  101. }
  102. result.append(json)
  103. return {"state":"success","result" : result}
  104. except Exception as e:
  105. return {"state":"fail","message" :str(e)}
  106. @dbRouter.get("/ad/{type}")
  107. def read_root(type:str,language :str = "ch"):
  108. keyword1 :str
  109. keyword2 :str
  110. if type == "美食伴手禮":
  111. keyword1 = "餐飲"
  112. keyword2 = "伴手禮"
  113. else :
  114. keyword1 = "住宿"
  115. keyword2 = "伴手禮"
  116. data, count = supabase.table('101_brand')\
  117. .select('*')\
  118. .eq("floor","館外")\
  119. .eq("language", language)\
  120. .or_(f"tags.ilike.%{keyword1}%,tags.ilike.%{keyword2}%")\
  121. .execute()
  122. result = data[1]
  123. # 從結果中隨機選擇一筆資料
  124. random_row = choice(result)
  125. if language != "ch" :
  126. if random_row["floor"] == "館外" :
  127. random_row["floor"] = "outside"
  128. #print(random_row)
  129. return {"data": random_row}
  130. @dbRouter.post("/message_not_in_cache")
  131. def message_not_in_cache(question :str ,answer :str,client_id : str = "0" ):
  132. try:
  133. data, count = supabase.table('client_message').select('*').eq("question",question).execute()
  134. if len(data[1]) != 0 :
  135. return {"state": 200 , "message" : "have saved"}
  136. data, count = supabase.table('client_message').insert({"client_id": client_id, "question": question,"answer":answer}).execute()
  137. return {"state": 200 , "message" : "success"}
  138. except Exception as e:
  139. return {"state": 500 , "message" : str(e)}
  140. @dbRouter.post("/video_save_into_cache")
  141. def message_not_in_cache(video_name : Annotated[str, Field(description="檔案請丟進/home/mia/101/static/video_cache/others/資料夾裡")],client_message_id :str = None,question:str = None):
  142. try:
  143. data = []
  144. if client_message_id :
  145. data, count = supabase.table('client_message').select('*').eq("id",client_message_id).execute()
  146. elif question:
  147. data, count = supabase.table('client_message').select('*').eq("question",question).execute()
  148. response = supabase.table('video_cache').insert({"question": data[1]["question"],"answer":data[1]["answer"],"video_url":f"/static/video_cache/others/{video_name}"}).execute()
  149. response = supabase.table('client_message').delete().eq('id', data[1]["id"]).execute()
  150. return {"state": 200 , "message" : "success"}
  151. except Exception as e:
  152. return {"state": 500 , "message" : str(e)}
  153. @dbRouter.post("/video_cache")
  154. def video_cache(client_message :str ):
  155. try:
  156. data, count = supabase.table('video_cache').select('*').eq("question",client_message).execute()
  157. if len(data[1]) == 0 :
  158. return {"state": 500 , "message" : "no data"}
  159. return {"state": 200 , "message" : data[1]}
  160. except Exception as e:
  161. return {"state": 500 , "message" : str(e)}