Coverage for src/app/repositories/support_message_postgres_repository.py: 100%
44 statements
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-03 00:42 +0200
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-03 00:42 +0200
1import psycopg2
2from entities.support_message_entity import SupportMessageEntity
4class SupportMessagePostgresRepository:
5 def __init__(self, db_config: dict):
6 '''
7 Initializes the repository with the given database configuration.
8 Args:
9 db_config (dict): A dictionary containing the PostgreSQL database configuration parameters.
10 '''
11 self.__db_config = db_config
13 def __connect(self):
14 '''
15 Creates and returns a new connection to the PostgreSQL database.
16 Returns:
17 psycopg2.extensions.connection: A connection object to interact with the PostgreSQL database.
18 '''
19 return psycopg2.connect(**self.__db_config)
21 def get_support_message(self, support_message: SupportMessageEntity) -> SupportMessageEntity:
22 '''
23 Retrieves a support message from the PostgreSQL database by its entity.
24 Args:
25 support_message (SupportMessageEntity): The support message entity containing the ID to retrieve.
26 Returns:
27 SupportMessageEntity: The retrieved support message, or None if not found.
28 Raises:
29 psycopg2.Error: If an error occurs while retrieving the support message from the PostgreSQL database.
30 '''
31 query = "SELECT * FROM Support WHERE id = %s;"
32 with self.__connect() as conn:
33 with conn.cursor() as cursor:
34 cursor.execute(query, (support_message.get_id(),))
35 result = cursor.fetchone()
36 if result:
37 return SupportMessageEntity(
38 id=result[0],
39 user_id=result[1],
40 description=result[2],
41 status=result[3],
42 subject=result[4],
43 created_at=result[5]
44 )
45 else:
46 raise ValueError(f"No support messages found for support message ID {support_message.get_id()}.")
48 def get_support_messages(self) -> list[SupportMessageEntity]:
49 '''
50 Retrieves all support messages from the PostgreSQL database, including user emails.
51 Returns:
52 list[SupportMessageEntity]: A list of all retrieved support messages with user emails.
53 Raises:
54 psycopg2.Error: If an error occurs while retrieving the support messages from the PostgreSQL database.
55 '''
57 query = """
58 SELECT s.id, s.user_id, u.email, s.description, s.status, s.subject, s.created_at
59 FROM Support s
60 LEFT JOIN Users u ON s.user_id = u.id;
61 """
62 with self.__connect() as conn:
63 with conn.cursor() as cursor:
64 cursor.execute(query)
65 results = cursor.fetchall()
66 return [
67 SupportMessageEntity(
68 id=row[0],
69 user_id=row[1],
70 user_email=row[2],
71 description=row[3],
72 status=row[4],
73 subject=row[5],
74 created_at=row[6]
75 )
76 for row in results
77 ]
80 def save_support_message(self, support_message: SupportMessageEntity) -> int:
81 '''
82 Saves a support message in the PostgreSQL database.
83 Args:
84 SupportMessageEntity (SupportMessageEntity): The support message entity to save.
85 Returns:
86 int: The ID of the saved support message.
87 Raises:
88 psycopg2.Error: If an error occurs while saving the support message in the PostgreSQL database.
89 '''
91 query = """
92 INSERT INTO Support (user_id, description, status, subject, created_at)
93 VALUES (%s, %s, %s::boolean, %s, %s)
94 RETURNING id;
95 """
96 with self.__connect() as conn:
97 with conn.cursor() as cursor:
98 cursor.execute(query, (support_message.get_user_id(), support_message.get_description(), support_message.get_status(), support_message.get_subject(), support_message.get_created_at() ))
99 conn.commit()
100 return cursor.fetchone()[0]
102 def delete_support_message(self, support_message : SupportMessageEntity)-> bool:
103 '''
104 Deletes a support message from the PostgreSQL database by its ID.
105 Args:
106 support_message (SupportMessageEntity): The support message entity to delete.
107 Returns:
108 bool: True if the support message was successfully deleted, False otherwise.
109 Raises:
110 psycopg2.Error: If an error occurs while deleting the support message from the PostgreSQL database.
111 '''
112 query = "DELETE FROM Support WHERE id = %s;"
113 with self.__connect() as conn:
114 with conn.cursor() as cursor:
115 cursor.execute(query, (support_message.get_id(),))
116 conn.commit()
117 return cursor.rowcount > 0
120 def mark_done_support_messages(self, support_message_model: SupportMessageEntity)-> int:
121 '''
122 Marks a support message as done in the PostgreSQL database.
123 Args:
124 support_message_model (SupportMessageEntity): The support message entity to mark as done.
125 Returns:
126 int: The ID of the marked support message.
127 Raises:
128 psycopg2.Error: If an error occurs while marking the support message as done in the PostgreSQL database.
129 '''
131 query = """
132 UPDATE Support
133 SET status = %s::boolean
134 WHERE id = %s
135 RETURNING id;
136 """
137 with self.__connect() as conn:
138 with conn.cursor() as cursor:
139 cursor.execute(query, (support_message_model.get_status(), support_message_model.get_id()))
140 conn.commit()
141 return cursor.fetchone()[0]