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
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
email: typing.Optional[str] = None
provider: typing.Optional[str] = None
@@ -21,10 +21,11 @@ class EmailFilter:
keywords: typing.Optional[str] = None
primary: typing.Optional[bool] = None
# Tao method tu class do(Chinh la phuong thuc cua EmailFilter), cls chinh ra ham khoi tao
@classmethod
def from_request_queries(cls) -> "EmailFilter":
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]"),
provider=request.args.get("filter[provider]"),
created_from=request.args.get("filter[created_from]"),
@@ -43,7 +44,7 @@ class Page:
asc: bool = False
@classmethod
def from_request_queries(cls) -> "Page":
def from_request_queries(cls) -> "Page": # => Doi Tuong Page
return Page(
page=int(request.args.get("page", 0)),
size=int(request.args.get("size", 10)),
@@ -58,7 +59,7 @@ class EmailPage(Page):
default_factory=EmailFilter.from_request_queries)
@classmethod
def from_request_queries(cls) -> "EmailPage":
def from_request_queries(cls) -> "EmailPage": # => Doi tuong EmailPage
base = Page.from_request_queries()
return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby"))
@@ -134,7 +135,7 @@ def filter_emails():
try:
conn = init_db_connection()
with conn.cursor() as cursor:
records = __filter_email(cursor, paging, user_id)
records = __filter_email(cursor, paging, user_id) # Goi
return jsonify(
records,

View File

@@ -43,25 +43,28 @@ class Page:
asc: bool = False
@classmethod
def from_request_queries(cls) -> "Page":
def from_request_queries(cls) -> "Page": # Phan Trang Email
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)),
asc=request.args.get("asc", type=str_to_bool) or False
)
@dataclasses.dataclass
class EmailPage(Page):
class EmailPage(Page): # Ke thua Page
sortby: typing.Optional[str] = None
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
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"))
# ở đây không truyền filter -> default_factory được kích hoạt
def main():
"""
@@ -126,7 +129,8 @@ def user_insert_email():
def user_filter_emails():
paging = EmailPage.from_request_queries()
paging = EmailPage.from_request_queries() #paging là object EmailPage
user_id = request.headers.get(
"X-UserId") # X-Fission lay tren path
if not user_id:
@@ -149,11 +153,12 @@ def user_filter_emails():
conn.close()
def __filter_email(cursor, paging: EmailPage, user_id: str):
conditions = ["user_id = %(user_id)s"]
values = {"user_id": user_id}
if paging.filter.ids:
conditions.append("id = ANY(%(ids)s)")
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.
# Truyen vao 3 tham so cursor, class EmailPage(Page+Filter), user_id kratos de check xem bao nhieu mail
conditions = ["user_id = %(user_id)s"] # = SQL Where
values = {"user_id": user_id} # user_id Kratos truyen vao
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
if paging.filter.email:
conditions.append("LOWER(email) LIKE %(email)s")
@@ -177,25 +182,27 @@ def __filter_email(cursor, paging: EmailPage, user_id: str):
conditions.append(
"(LOWER(email) LIKE %(keywords)s OR LOWER(provider) LIKE %(keywords)s)")
values["keywords"] = f"%{paging.filter.keywords.lower()}%"
where_clause = " AND ".join(conditions)
if where_clause:
# conditions la 1 list cac doan dieu kien where
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
order_clause = ""
if paging.sortby:
if paging.sortby: # neu paging.sortby ton tai
direction = "ASC" if paging.asc else "DESC"
order_clause = f"ORDER BY {paging.sortby} {direction}"
sql = f"""
SELECT *, COUNT(*) OVER() AS total
FROM ailbl_user_email
{where_clause}
{where_clause}
{order_clause}
LIMIT %(limit)s OFFSET %(offset)s
"""
values["limit"] = paging.size
values["offset"] = paging.page * paging.size
cursor.execute(sql, values)
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
kratos_config = Configuration(
host=get_secret(KRATOS_ADMIN_ENDPOINT_CONFIG_KEY))