lin_ / line_db.py
Zelyanoth's picture
jk
aa1cf8a
import os
from supabase import create_client, Client
from pandas import json_normalize
import pandas
import io
from PIL import Image
class DatabaseManager:
def __init__(self,url,key):
# Supabase connection string format
# postgresql://postgres:[password]@[host]:[port]/[database]
self.supabase: Client = create_client(url, key)
def create_user(self, email, password):
response = self.supabase.auth.sign_up(
{
"email": email,
"password": password,
}
)
if response.user.aud == "authenticated" : # type: ignore
return True,"Un mail a été envoyé a votre address mail",response
def fetch_source_table(self,filter) :
response = (
self.supabase.table("Source")
.select("*")
.eq("user_id", filter)
.execute()
)
return response.data
def fetch_account_table(self,filter) :
response = (
self.supabase.table("Social_network")
.select("*")
.eq("id_utilisateur", filter)
.execute()
)
return response.data
def fetch_schedule_table_acc(self,filter) :
response = (
self.supabase
.table("Scheduling")
.select("*, Social_network(id_utilisateur, social_network)")
.execute()
)
print(response.data,flush=True)
df = json_normalize(response.data)
print(df,flush=True)
# Renomme les colonnes pour simplifier
if not df.empty :
df.rename(columns={
"Social_network.id_utilisateur": "user_id",
"Social_network.social_network": "social_network"
}, inplace=True)
# Filtre les lignes pour l'utilisateur donné
df_user = df[df["user_id"] == filter].reset_index(drop=True)
return df_user
return None
def delete_from_table(self,Source,values) :
response = (
self.supabase.table(Source)
.delete()
.in_("id", values)
.execute()
)
def authenticate_user(self, email, password):
try:
response = self.supabase.auth.sign_in_with_password(
{
"email": email,
"password": password,
}
)
if response.user.aud == "authenticated" and response.user.email_confirmed_at is not None : # type: ignore
return True,"Logged in successfully",response
elif response.user.aud == "authenticated" : # type: ignore
return False,"Compte non confirmé",response
else :
return False,"Compte non existant",response
except Exception as e:
# Handle authentication errors
if "Invalid login credentials" in str(e):
return False, "Invalid email or password", None
else:
return False, f"Authentication error: {str(e)}", None
def add_token_network(self,token,social_network,account_name,uids,data):
response = (
self.supabase.table("Social_network")
.insert({"social_network": social_network,"account_name" :account_name, "id_utilisateur":uids,"token": token,
"sub" : data["sub"],"given_name" : data["given_name"],"family_name" : data["family_name"],"picture" : data["picture"] })
.execute()
)
def add_post(self,id_social,content,ids,img: Image.Image = None,tg : bool =False) :
if img :
buffer = io.BytesIO()
img.save(buffer, format="JPEG")
img = buffer.getvalue()
response = (
self.supabase.table("Post_content")
.insert({"id_social": id_social,"Text_content" :content ,"is_published" : tg,"sched" : ids,"image_content_url" : img})
.execute())
def update_post(self,ids,idd):
response = (
self.supabase.table("Post_content")
.update({"is_published": True})
.eq("sched", idd)
.eq("id_social", ids)
.execute()
)
def fetching_post(self,uids,idd,active :bool = False) :
response = (
self.supabase.table("Post_content")
.select("*")
.eq("id_social", uids)
.eq("is_published", active)
.eq("sched", idd)
.execute()
)
data = response.data # liste de dicts, chaque dict contient clé 'Social_network'
df = json_normalize(data)
return df
def fetching_user_identif(self,uids,rs) :
response = (
self.supabase.table("Social_network")
.select("*")
.eq("id_utilisateur", uids)
.eq("account_name", rs)
.execute()
)
return response
def get_id_social(self,user_id: str, reseau: str):
resp = (
self.supabase
.table("Social_network")
.select("id")
.eq("id_utilisateur", user_id)
.eq("account_name", reseau)
.execute()
)
return resp.data[0]["id"]
def create_scheduling_for_user(self,user_id: str, reseau: str, schedule_time: str,adj):
id_social = self.get_id_social(user_id, reseau)
resp = (
self.supabase
.table("Scheduling")
.insert({
"id_social": id_social,
"schedule_time": schedule_time,
"adjusted_time": adj,
})
.execute()
)
print("Scheduling inséré avec succès.")
def fetch_schedule_table(self) :
response = (
self.supabase
.table("Scheduling")
.select("*, Social_network(id_utilisateur, account_name)")
.execute()
)
# 2️⃣ On normalise/la platifie la structure JSON en DataFrame
data = response.data # liste de dicts, chaque dict contient clé 'Social_network'
df = json_normalize(data)
df = df.rename(columns={"Social_network.id_utilisateur": "user_id"})
df = df.rename(columns={"Social_network.account_name": "social_network"})
# 4️⃣ On peut réordonner ou filtrer les colonnes si besoin
# par exemple : id, id_social, user_id, schedule_time, created_at
cols = ["id", "id_social", "user_id", "schedule_time","social_network","adjusted_time","created_at"]
df = df[[c for c in cols if c in df.columns]]
return df