|
|
from datetime import datetime, timezone
|
|
|
from werkzeug.security import generate_password_hash, check_password_hash
|
|
|
from config.database import get_db
|
|
|
from bson import ObjectId
|
|
|
|
|
|
class User:
|
|
|
def __init__(self, username=None, email=None, password=None, preferences=None):
|
|
|
self.username = username
|
|
|
self.email = email
|
|
|
self.password_hash = generate_password_hash(password) if password else None
|
|
|
self.preferences = preferences or {"genres": [], "types": []}
|
|
|
self.created_at = datetime.now(timezone.utc)
|
|
|
self.last_login = None
|
|
|
|
|
|
def save(self):
|
|
|
db = get_db()
|
|
|
user_data = {
|
|
|
"username": self.username,
|
|
|
"email": self.email,
|
|
|
"password_hash": self.password_hash,
|
|
|
"preferences": self.preferences,
|
|
|
"created_at": self.created_at,
|
|
|
"last_login": self.last_login
|
|
|
}
|
|
|
result = db.users.insert_one(user_data)
|
|
|
return str(result.inserted_id)
|
|
|
|
|
|
@staticmethod
|
|
|
def find_by_email(email):
|
|
|
db = get_db()
|
|
|
user_data = db.users.find_one({"email": email})
|
|
|
if user_data:
|
|
|
user = User()
|
|
|
user._id = user_data["_id"]
|
|
|
user.username = user_data["username"]
|
|
|
user.email = user_data["email"]
|
|
|
user.password_hash = user_data["password_hash"]
|
|
|
user.preferences = user_data.get("preferences", {"genres": [], "types": []})
|
|
|
user.created_at = user_data["created_at"]
|
|
|
user.last_login = user_data.get("last_login")
|
|
|
return user
|
|
|
return None
|
|
|
|
|
|
@staticmethod
|
|
|
def find_by_username(username):
|
|
|
db = get_db()
|
|
|
user_data = db.users.find_one({"username": username})
|
|
|
if user_data:
|
|
|
user = User()
|
|
|
user._id = user_data["_id"]
|
|
|
user.username = user_data["username"]
|
|
|
user.email = user_data["email"]
|
|
|
user.password_hash = user_data["password_hash"]
|
|
|
user.preferences = user_data.get("preferences", {"genres": [], "types": []})
|
|
|
user.created_at = user_data["created_at"]
|
|
|
user.last_login = user_data.get("last_login")
|
|
|
return user
|
|
|
return None
|
|
|
|
|
|
@staticmethod
|
|
|
def find_by_id(user_id):
|
|
|
db = get_db()
|
|
|
try:
|
|
|
user_data = db.users.find_one({"_id": ObjectId(user_id)})
|
|
|
if user_data:
|
|
|
user = User()
|
|
|
user._id = user_data["_id"]
|
|
|
user.username = user_data["username"]
|
|
|
user.email = user_data["email"]
|
|
|
user.password_hash = user_data["password_hash"]
|
|
|
user.preferences = user_data.get("preferences", {"genres": [], "types": []})
|
|
|
user.created_at = user_data["created_at"]
|
|
|
user.last_login = user_data.get("last_login")
|
|
|
return user
|
|
|
except:
|
|
|
pass
|
|
|
return None
|
|
|
|
|
|
def check_password(self, password):
|
|
|
return check_password_hash(self.password_hash, password)
|
|
|
|
|
|
def update_last_login(self):
|
|
|
db = get_db()
|
|
|
self.last_login = datetime.now(timezone.utc)
|
|
|
db.users.update_one(
|
|
|
{"_id": self._id},
|
|
|
{"$set": {"last_login": self.last_login}}
|
|
|
)
|
|
|
|
|
|
def update_preferences(self, preferences):
|
|
|
db = get_db()
|
|
|
self.preferences = preferences
|
|
|
db.users.update_one(
|
|
|
{"_id": self._id},
|
|
|
{"$set": {"preferences": preferences}}
|
|
|
)
|
|
|
|