FixNameFile
Some checks failed
K8S Fission Deployment / Deployment fission functions (push) Failing after 21s
Some checks failed
K8S Fission Deployment / Deployment fission functions (push) Failing after 21s
This commit is contained in:
37
apps/ailbl-admin_phone-delete.py
Normal file
37
apps/ailbl-admin_phone-delete.py
Normal file
@@ -0,0 +1,37 @@
|
||||
import crud
|
||||
from flask import jsonify, request
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
```fission
|
||||
{
|
||||
"name": "phonenumbers-admin-delete",
|
||||
"http_triggers": {
|
||||
"phonenumbers-admin-delete-http": {
|
||||
"url": "/ailbl/admin/users/{UserId}/phones/{UserPhoneId}",
|
||||
"methods": ["DELETE"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
"""
|
||||
try:
|
||||
if request.method == "DELETE":
|
||||
return make_delete_request()
|
||||
else:
|
||||
return {"error": "Method not allow"}, 405
|
||||
except Exception as ex:
|
||||
return jsonify({"error": str(ex)}), 500
|
||||
|
||||
|
||||
def make_delete_request():
|
||||
try:
|
||||
user_id = request.headers.get("X-User")
|
||||
if not user_id:
|
||||
return jsonify({"error": "user_id is required"}), 400
|
||||
|
||||
response, status = crud
|
||||
return jsonify(response), status
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
@@ -2,26 +2,22 @@ import crud
|
||||
from flask import jsonify, request
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
```fission
|
||||
{
|
||||
"name": "phonenumbers-admin-get-insert-delete",
|
||||
"name": "phonenumbers-admin-get-insert",
|
||||
"http_triggers": {
|
||||
"phonenumbers-admin-get-insert-delete-http": {
|
||||
"phonenumbers-admin-get-insert-http": {
|
||||
"url": "/ailbl/admin/users/{UserId}/phones",
|
||||
"methods": [ "POST", "DELETE", "GET"]
|
||||
"methods": [ "POST", "GET"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
"""
|
||||
try:
|
||||
if request.method == "DELETE":
|
||||
return make_delete_request()
|
||||
elif request.method == "POST":
|
||||
if request.method == "POST":
|
||||
return make_insert_request()
|
||||
elif request.method == "GET":
|
||||
return make_get_request()
|
||||
@@ -50,16 +46,3 @@ def make_get_request():
|
||||
return crud
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
|
||||
def make_delete_request():
|
||||
try:
|
||||
user_id = request.headers.get("X-User")
|
||||
if not user_id:
|
||||
return jsonify({"error": "user_id is required"}), 400
|
||||
|
||||
response, status = crud
|
||||
return jsonify(response), status
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@@ -5,26 +5,22 @@ from helpers import CORS_HEADERS
|
||||
from validators import validate_phone_number
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
```fission
|
||||
{
|
||||
"name": "phonenumbers-users-get-insert-delete",
|
||||
"name": "phonenumbers-users-get-insert",
|
||||
"http_triggers": {
|
||||
"phonenumbers-users-get-insert-delete-http": {
|
||||
"phonenumbers-users-get-insert-http": {
|
||||
"url": "/ailbl/users/phones",
|
||||
"methods": ["POST", "DELETE", "GET"]
|
||||
"methods": ["POST", "GET"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
"""
|
||||
try:
|
||||
if request.method == "DELETE":
|
||||
return make_delete_request()
|
||||
elif request.method == "POST":
|
||||
if request.method == "POST":
|
||||
return make_insert_request()
|
||||
elif request.method == "GET":
|
||||
return make_get_request()
|
||||
@@ -49,31 +45,12 @@ def make_insert_request():
|
||||
if not validate_phone_number(phone_number):
|
||||
return jsonify({"error": "Invalid phone number"}), 400, CORS_HEADERS
|
||||
|
||||
if crud.exists_phone(phone_number, user_id):
|
||||
return jsonify({"error": "Phone is exists"}), 404
|
||||
|
||||
response, status = crud.create_phone(user_id, data)
|
||||
|
||||
return jsonify(response), status, CORS_HEADERS
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
|
||||
|
||||
|
||||
def make_delete_request():
|
||||
try:
|
||||
user_id = request.headers.get("X-User") # Lay user_id tu header X-User
|
||||
if not user_id:
|
||||
return jsonify({"error": "user_id is required"}), 400
|
||||
|
||||
phone_id = request.header.get("X-Fission-Params-UserPhoneId")
|
||||
if not phone_id:
|
||||
return jsonify({"error": "phone_id is required"}), 400
|
||||
|
||||
# Kiem tra so dien thoai co ton tai trong db khong ?
|
||||
if not crud.exists_phone(user_id, phone_id):
|
||||
return jsonify({"error": "Phone not found"}), 404
|
||||
|
||||
response, status = crud
|
||||
return jsonify(response), status
|
||||
return jsonify(response)
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@@ -85,7 +62,9 @@ def make_get_request():
|
||||
return jsonify({"error": "user_id is required"}), 400, CORS_HEADERS
|
||||
|
||||
# Lấy tham số filter và phân trang từ request
|
||||
paging = PhonePage.from_request_queries() # Sử dụng default_factory để lấy filter và paging
|
||||
# Sử dụng default_factory để lấy filter và paging
|
||||
paging = PhonePage.from_request_queries()
|
||||
print(paging)
|
||||
|
||||
response = crud.filter_phone(user_id, paging)
|
||||
return jsonify(response), 200, CORS_HEADERS
|
||||
47
apps/ailbl-user_phone_delete.py
Normal file
47
apps/ailbl-user_phone_delete.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import crud
|
||||
from flask import jsonify, request
|
||||
from filters import PhonePage
|
||||
from helpers import CORS_HEADERS
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
```fission
|
||||
{
|
||||
"name": "phonenumbers-users-delete",
|
||||
"http_triggers": {
|
||||
"phonenumbers-users-delete-http": {
|
||||
"url": "/ailbl/users/phones/{UserPhoneId}",
|
||||
"methods": ["DELETE"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
"""
|
||||
try:
|
||||
if request.method == "DELETE":
|
||||
return make_delete_request()
|
||||
else:
|
||||
return {"error": "Method not allow"}, 405
|
||||
except Exception as ex:
|
||||
return jsonify({"error": str(ex)}), 500
|
||||
|
||||
|
||||
def make_delete_request():
|
||||
try:
|
||||
user_id = request.headers.get("X-User") # Lay user_id tu header X-User
|
||||
if not user_id:
|
||||
return jsonify({"error": "user_id is required"}), 400
|
||||
|
||||
phone_id = request.headers.get("X-Fission-Params-UserPhoneId")
|
||||
if not phone_id:
|
||||
return jsonify({"error": "phone_id is required"}), 400
|
||||
|
||||
# Kiem tra so dien thoai co ton tai trong db khong ?
|
||||
if not crud.exists_phone(phone_id, user_id):
|
||||
return jsonify({"error": "Phone not found"}), 404
|
||||
|
||||
response, status = crud.delete_phone(phone_id, user_id)
|
||||
return jsonify(response), status
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
67
apps/crud.py
67
apps/crud.py
@@ -1,11 +1,10 @@
|
||||
import io
|
||||
|
||||
from filters import PhonePage
|
||||
from flask import jsonify, request
|
||||
from helpers import init_db_connection, CORS_HEADERS
|
||||
from PIL import Image
|
||||
|
||||
|
||||
# Create&Update function to upload or update user avatar S3/Minio
|
||||
def create_phone(user_id: str, data):
|
||||
try:
|
||||
conn = init_db_connection()
|
||||
@@ -13,27 +12,36 @@ def create_phone(user_id: str, data):
|
||||
|
||||
# Câu truy vấn SQL để thêm số điện thoại vào bảng UserPhone
|
||||
query = """
|
||||
INSERT INTO UserPhone (user_id, PhoneNumber, Prefix, Created, Modified)
|
||||
VALUES (%s, %s, %s, NOW(), NOW())
|
||||
INSERT INTO ailbl_user_phone (user_id, phone_number, prefix, area_code, created, modified)
|
||||
VALUES (%s, %s, %s,%s, NOW(), NOW())
|
||||
"""
|
||||
# Lấy các trường từ data
|
||||
phone_number = data.get("phone_number")
|
||||
prefix = data.get("prefix", None) # Nếu không có prefix, có thể để null
|
||||
|
||||
# Nếu không có prefix, có thể để null
|
||||
prefix = data.get("prefix", None)
|
||||
area_code = data.get("area_code")
|
||||
# Thực thi câu truy vấn SQL
|
||||
cursor.execute(query, (user_id, phone_number, prefix))
|
||||
cursor.execute(query, (user_id, phone_number, prefix, area_code))
|
||||
conn.commit() # Lưu thay đổi vào cơ sở dữ liệu
|
||||
|
||||
result = cursor.fetchall(),
|
||||
return {
|
||||
"user_id": user_id,
|
||||
"phone_number": phone_number,
|
||||
"prefix": prefix,
|
||||
"area": area_code,
|
||||
"status": "added"
|
||||
}, 200, CORS_HEADERS
|
||||
|
||||
return result, 200, CORS_HEADERS
|
||||
# result = cursor.fetchall()
|
||||
# return {"message": "Phone created successfully"}, 200, CORS_HEADERS
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}, 500
|
||||
return {"error": str(e)}, 500, CORS_HEADERS
|
||||
|
||||
|
||||
|
||||
def filter_phone(user_id: str, paging): # Read function to get user avatar from S3/Minio
|
||||
def filter_phone(user_id: str, paging):
|
||||
conn = None # Khởi tạo conn với giá trị None
|
||||
cursor = None
|
||||
try:
|
||||
conn = init_db_connection()
|
||||
cursor = conn.cursor()
|
||||
@@ -95,6 +103,20 @@ def filter_phone(user_id: str, paging): # Read function to get user avatar from
|
||||
cursor.execute(sql, values) # Thuc Thi Cau Truy Van
|
||||
phones = cursor.fetchall()
|
||||
|
||||
# Chuyển kết quả thành danh sách các đối tượng với tên trường rõ ràng
|
||||
phone_list = []
|
||||
for phone in phones:
|
||||
phone_dict = {
|
||||
"id": phone[0],
|
||||
"user_id": phone[1],
|
||||
"phone_number": phone[2],
|
||||
"prefix": phone[3],
|
||||
"area_code": phone[4],
|
||||
"created": phone[5],
|
||||
"modified": phone[6]
|
||||
}
|
||||
phone_list.append(phone_dict)
|
||||
|
||||
return phones, 200, CORS_HEADERS
|
||||
|
||||
except Exception as e:
|
||||
@@ -104,7 +126,6 @@ def filter_phone(user_id: str, paging): # Read function to get user avatar from
|
||||
conn.close()
|
||||
|
||||
|
||||
# Delete Function to delete user avatar from S3/Minio
|
||||
def delete_phone(phone_id: str, user_id: str) -> dict:
|
||||
try:
|
||||
conn = init_db_connection()
|
||||
@@ -119,22 +140,32 @@ def delete_phone(phone_id: str, user_id: str) -> dict:
|
||||
return {"error": str(e)}, 500
|
||||
|
||||
|
||||
def exists_phone( phone_id:str, user_id:str):
|
||||
def exists_phone(user_id: str, phone_number: str = None, phone_id: str = None):
|
||||
try:
|
||||
conn = init_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
if phone_number: # Nếu là `POST`, kiểm tra sự tồn tại của phone_number
|
||||
cursor.execute("""
|
||||
SELECT 1
|
||||
FROM ailbl_user_phone
|
||||
WHERE id = %s AND user_id = %s;
|
||||
WHERE user_id = %s AND phone_number = %s
|
||||
""", (user_id, phone_number))
|
||||
|
||||
elif phone_id: # Nếu là `DELETE`, kiểm tra sự tồn tại của phone_id
|
||||
cursor.execute("""
|
||||
SELECT 1
|
||||
FROM ailbl_user_phone
|
||||
WHERE id = %s AND user_id = %s
|
||||
""", (phone_id, user_id))
|
||||
|
||||
row = cursor.fetchone() # Co ket qua thi tra ve du lieu 1 dong
|
||||
return row is not None # Nếu có dòng dữ liệu, trả về True (tồn tại số điện thoại), nếu không, trả về False
|
||||
# Nếu có dòng dữ liệu, trả về True (tồn tại số điện thoại), nếu không, trả về False
|
||||
return row is not None
|
||||
except Exception as e:
|
||||
return False
|
||||
finally:
|
||||
if cursor:
|
||||
cursor.close()
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
conn.close() # Đảm bảo đóng kết nối sau khi xong
|
||||
|
||||
@@ -6,7 +6,7 @@ from helpers import str_to_bool
|
||||
|
||||
@dataclasses.dataclass
|
||||
class PhoneFilter:
|
||||
phone_numbers: Optional[str] = None
|
||||
phone_number: Optional[str] = None
|
||||
prefix: Optional[str] = None
|
||||
created_from: Optional[str] = None
|
||||
created_to: Optional[str] = None
|
||||
|
||||
@@ -10,6 +10,9 @@ from psycopg2.extras import LoggingConnection
|
||||
CORS_HEADERS = {
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
SECRET_NAME = "fission-ailbl-user-phone-env"
|
||||
CONFIG_NAME = "fission-eom-notification-config"
|
||||
K8S_NAMESPACE = "default"
|
||||
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
@@ -95,6 +98,7 @@ def check_port_open(ip: str, port: int, timeout: int = 30):
|
||||
current_app.logger.err(f"Check port open error: {err}")
|
||||
return False
|
||||
|
||||
|
||||
def str_to_bool(value: str | None) -> typing.Optional[bool]:
|
||||
if value is None:
|
||||
return None
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Flask==3.1.0
|
||||
phonenumbers==8.12.17
|
||||
requests==2.25.1
|
||||
# psycopg2-binary==2.9.10
|
||||
# pydantic==2.11.3
|
||||
# minio==7.2.5
|
||||
# Pillow==10.4.0
|
||||
# boto3==1.35.70
|
||||
psycopg2-binary==2.9.10
|
||||
pydantic==2.11.3
|
||||
minio==7.2.5
|
||||
Pillow==10.4.0
|
||||
boto3==1.35.70
|
||||
@@ -7,5 +7,5 @@ def validate_phone_number(phone_number: str) -> bool:
|
||||
try:
|
||||
parsed_number = phonenumbers.parse(phone_number) # Phân tích số điện thoại
|
||||
return phonenumbers.is_valid_number(parsed_number) # Kiểm tra tính hợp lệ của số
|
||||
except NumberParseException:
|
||||
except phonenumbers.phonenumberutil.NumberParseException:
|
||||
return False # Trả về False nếu số không hợp lệ
|
||||
|
||||
Reference in New Issue
Block a user