diff --git a/apps/ailbl-admin_email-insert-get-filter.py b/apps/ailbl-admin_email-insert-get-filter.py index e92504f..966685d 100644 --- a/apps/ailbl-admin_email-insert-get-filter.py +++ b/apps/ailbl-admin_email-insert-get-filter.py @@ -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, diff --git a/apps/ailbl-admin_email_update_delete.py b/apps/ailbl-admin_email_delete.py similarity index 100% rename from apps/ailbl-admin_email_update_delete.py rename to apps/ailbl-admin_email_delete.py diff --git a/apps/ailbl-users_email_insert-get.py b/apps/ailbl-users_email_insert-get.py index e7b784a..9b5c4d8 100644 --- a/apps/ailbl-users_email_insert-get.py +++ b/apps/ailbl-users_email_insert-get.py @@ -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()) diff --git a/apps/helpers.py b/apps/helpers.py index 2147272..2801ba0 100644 --- a/apps/helpers.py +++ b/apps/helpers.py @@ -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))