EmailDone2
Some checks failed
K8S Fission Deployment / Deployment fission functions (push) Failing after 20s
Some checks failed
K8S Fission Deployment / Deployment fission functions (push) Failing after 20s
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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")
|
||||
@@ -178,12 +183,13 @@ def __filter_email(cursor, paging: EmailPage, user_id: str):
|
||||
"(LOWER(email) LIKE %(keywords)s OR LOWER(provider) LIKE %(keywords)s)")
|
||||
values["keywords"] = f"%{paging.filter.keywords.lower()}%"
|
||||
|
||||
# conditions la 1 list cac doan dieu kien where
|
||||
where_clause = " AND ".join(conditions)
|
||||
if where_clause:
|
||||
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}"
|
||||
|
||||
@@ -197,5 +203,6 @@ def __filter_email(cursor, paging: EmailPage, user_id: str):
|
||||
values["limit"] = paging.size
|
||||
values["offset"] = paging.page * paging.size
|
||||
|
||||
|
||||
cursor.execute(sql, values)
|
||||
return db_rows_to_array(cursor, cursor.fetchall())
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user