File size: 3,633 Bytes
f2533f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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}}
        )