EmailDone2
Some checks failed
K8S Fission Deployment / Deployment fission functions (push) Failing after 20s

This commit is contained in:
QuangMinh_123
2025-12-08 04:17:46 +00:00
parent 590492fffa
commit ca8801ff2c
4 changed files with 32 additions and 23 deletions

View File

@@ -10,7 +10,7 @@ from schemas import UserEmailRequest
@dataclasses.dataclass # Filter user bao nhieu email @dataclasses.dataclass # Filter user bao nhieu email
class EmailFilter: class EmailFilter: # Tao ra class EmailFilter => Dung cls de khoi tao EmailFilter thanh doi tuong roi
ids: typing.Optional[typing.List[str]] = None ids: typing.Optional[typing.List[str]] = None
email: typing.Optional[str] = None email: typing.Optional[str] = None
provider: typing.Optional[str] = None provider: typing.Optional[str] = None
@@ -21,10 +21,11 @@ class EmailFilter:
keywords: typing.Optional[str] = None keywords: typing.Optional[str] = None
primary: typing.Optional[bool] = None primary: typing.Optional[bool] = None
# Tao method tu class do(Chinh la phuong thuc cua EmailFilter), cls chinh ra ham khoi tao
@classmethod @classmethod
def from_request_queries(cls) -> "EmailFilter": def from_request_queries(cls) -> "EmailFilter":
return cls( return cls(
ids=request.args.getlist("filter[ids]"), ids=request.args.getlist("filter[ids]"), # Dung object request doc du lieu client gui len roi nhet vao cac file nay
email=request.args.get("filter[email]"), email=request.args.get("filter[email]"),
provider=request.args.get("filter[provider]"), provider=request.args.get("filter[provider]"),
created_from=request.args.get("filter[created_from]"), created_from=request.args.get("filter[created_from]"),
@@ -43,7 +44,7 @@ class Page:
asc: bool = False asc: bool = False
@classmethod @classmethod
def from_request_queries(cls) -> "Page": def from_request_queries(cls) -> "Page": # => Doi Tuong Page
return Page( return Page(
page=int(request.args.get("page", 0)), page=int(request.args.get("page", 0)),
size=int(request.args.get("size", 10)), size=int(request.args.get("size", 10)),
@@ -58,7 +59,7 @@ class EmailPage(Page):
default_factory=EmailFilter.from_request_queries) default_factory=EmailFilter.from_request_queries)
@classmethod @classmethod
def from_request_queries(cls) -> "EmailPage": def from_request_queries(cls) -> "EmailPage": # => Doi tuong EmailPage
base = Page.from_request_queries() base = Page.from_request_queries()
return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby")) return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby"))
@@ -134,7 +135,7 @@ def filter_emails():
try: try:
conn = init_db_connection() conn = init_db_connection()
with conn.cursor() as cursor: with conn.cursor() as cursor:
records = __filter_email(cursor, paging, user_id) records = __filter_email(cursor, paging, user_id) # Goi
return jsonify( return jsonify(
records, records,

View File

@@ -43,25 +43,28 @@ class Page:
asc: bool = False asc: bool = False
@classmethod @classmethod
def from_request_queries(cls) -> "Page": def from_request_queries(cls) -> "Page": # Phan Trang Email
return Page( return Page(
page=int(request.args.get("page", 0)), page=int(request.args.get("page", 0)), # Neu Client khong truyen Page maic dinh la page 0 (trang 1) va size 10(10 phan tu)
size=int(request.args.get("size", 10)), size=int(request.args.get("size", 10)),
asc=request.args.get("asc", type=str_to_bool) or False asc=request.args.get("asc", type=str_to_bool) or False
) )
@dataclasses.dataclass @dataclasses.dataclass
class EmailPage(Page): class EmailPage(Page): # Ke thua Page
sortby: typing.Optional[str] = None sortby: typing.Optional[str] = None
filter: EmailFilter = dataclasses.field( filter: EmailFilter = dataclasses.field(
default_factory=EmailFilter.from_request_queries) default_factory=EmailFilter.from_request_queries) # Dung qua object field filter theo dang composition
# Khi tạo EmailPage mà không truyền sẵn filter, Python sẽ tự gọi EmailFilter.from_request_queries()
# Nếu khi tạo object mà field này không được truyền vào, thì hãy gọi HÀM NÀY để tạo giá trị mặc định cho field đó
# = dataclasses.field(...) → cấu hình thêm: => Dùng default_factory để tự tạo giá trị nếu bạn không truyền.
@classmethod @classmethod
def from_request_queries(cls) -> "EmailPage": def from_request_queries(cls) -> "EmailPage":
base = Page.from_request_queries() base = Page.from_request_queries() # lấy page, size, asc từ URL
return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby")) return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby"))
# ở đây không truyền filter -> default_factory được kích hoạt
def main(): def main():
""" """
@@ -126,7 +129,8 @@ def user_insert_email():
def user_filter_emails(): def user_filter_emails():
paging = EmailPage.from_request_queries() paging = EmailPage.from_request_queries() #paging là object EmailPage
user_id = request.headers.get( user_id = request.headers.get(
"X-UserId") # X-Fission lay tren path "X-UserId") # X-Fission lay tren path
if not user_id: if not user_id:
@@ -149,11 +153,12 @@ def user_filter_emails():
conn.close() conn.close()
def __filter_email(cursor, paging: EmailPage, user_id: str): def __filter_email(cursor, paging: EmailPage, user_id: str): #Tất cả đều là đọc field trong object EmailFilter đặt trong field filter của EmailPage.
conditions = ["user_id = %(user_id)s"] # Truyen vao 3 tham so cursor, class EmailPage(Page+Filter), user_id kratos de check xem bao nhieu mail
values = {"user_id": user_id} conditions = ["user_id = %(user_id)s"] # = SQL Where
if paging.filter.ids: values = {"user_id": user_id} # user_id Kratos truyen vao
conditions.append("id = ANY(%(ids)s)") if paging.filter.ids: #paging.filter là object EmailFilter bên trong paging
conditions.append("id = ANY(%(ids)s)") # addpend them value vao conditions
values["ids"] = paging.filter.ids values["ids"] = paging.filter.ids
if paging.filter.email: if paging.filter.email:
conditions.append("LOWER(email) LIKE %(email)s") conditions.append("LOWER(email) LIKE %(email)s")
@@ -177,25 +182,27 @@ def __filter_email(cursor, paging: EmailPage, user_id: str):
conditions.append( conditions.append(
"(LOWER(email) LIKE %(keywords)s OR LOWER(provider) LIKE %(keywords)s)") "(LOWER(email) LIKE %(keywords)s OR LOWER(provider) LIKE %(keywords)s)")
values["keywords"] = f"%{paging.filter.keywords.lower()}%" values["keywords"] = f"%{paging.filter.keywords.lower()}%"
where_clause = " AND ".join(conditions) # conditions la 1 list cac doan dieu kien where
if where_clause: where_clause = " AND ".join(conditions)
if where_clause: # neu conditions co gia tri thi them WHERE neu khong thi khong them Where => Tránh thêm "WHERE " khi conditions rỗng
where_clause = "WHERE " + where_clause where_clause = "WHERE " + where_clause
order_clause = "" order_clause = ""
if paging.sortby: if paging.sortby: # neu paging.sortby ton tai
direction = "ASC" if paging.asc else "DESC" direction = "ASC" if paging.asc else "DESC"
order_clause = f"ORDER BY {paging.sortby} {direction}" order_clause = f"ORDER BY {paging.sortby} {direction}"
sql = f""" sql = f"""
SELECT *, COUNT(*) OVER() AS total SELECT *, COUNT(*) OVER() AS total
FROM ailbl_user_email FROM ailbl_user_email
{where_clause} {where_clause}
{order_clause} {order_clause}
LIMIT %(limit)s OFFSET %(offset)s LIMIT %(limit)s OFFSET %(offset)s
""" """
values["limit"] = paging.size values["limit"] = paging.size
values["offset"] = paging.page * paging.size values["offset"] = paging.page * paging.size
cursor.execute(sql, values) cursor.execute(sql, values)
return db_rows_to_array(cursor, cursor.fetchall()) return db_rows_to_array(cursor, cursor.fetchall())

View File

@@ -125,6 +125,7 @@ def check_port_open(ip: str, port: int, timeout: int = 30):
return False return False
kratos_config = Configuration( kratos_config = Configuration(
host=get_secret(KRATOS_ADMIN_ENDPOINT_CONFIG_KEY)) host=get_secret(KRATOS_ADMIN_ENDPOINT_CONFIG_KEY))