This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
# app/repositories/queries/__init__.py
|
||||
"""
|
||||
HealthSync AI 쿼리 패키지
|
||||
모든 SQL 쿼리를 한 곳에서 관리합니다.
|
||||
"""
|
||||
from .base_queries import BaseQueries
|
||||
from .health_queries import HealthQueries
|
||||
from .user_queries import UserQueries
|
||||
from .chat_queries import ChatQueries
|
||||
from .mission_queries import MissionQueries
|
||||
from .similar_mission_queries import SimilarMissionQueries
|
||||
|
||||
__all__ = [
|
||||
"BaseQueries",
|
||||
"HealthQueries",
|
||||
"UserQueries",
|
||||
"ChatQueries",
|
||||
"MissionQueries",
|
||||
"SimilarMissionQueries"
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# app/repositories/queries/base_queries.py
|
||||
"""
|
||||
HealthSync AI 기본 시스템 쿼리 모음
|
||||
"""
|
||||
|
||||
|
||||
class BaseQueries:
|
||||
"""기본 시스템 쿼리"""
|
||||
|
||||
# 데이터베이스 연결 테스트
|
||||
CONNECTION_TEST = "SELECT 1"
|
||||
|
||||
DATABASE_VERSION = "SELECT version()"
|
||||
|
||||
CURRENT_DATABASE = "SELECT current_database()"
|
||||
|
||||
CURRENT_USER = "SELECT current_user"
|
||||
|
||||
# 테이블 목록 조회
|
||||
LIST_TABLES = """
|
||||
SELECT table_name,
|
||||
table_schema,
|
||||
table_type
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
|
||||
ORDER BY table_schema, table_name LIMIT 20 \
|
||||
"""
|
||||
|
||||
# 테이블 컬럼 정보 조회
|
||||
GET_TABLE_COLUMNS = """
|
||||
SELECT column_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = :table_name
|
||||
ORDER BY ordinal_position \
|
||||
"""
|
||||
|
||||
# 테이블 데이터 조회 (동적 쿼리 - 주의해서 사용)
|
||||
@staticmethod
|
||||
def get_table_data_query(table_name: str, limit: int = 5) -> str:
|
||||
"""테이블 데이터 조회 쿼리 생성 (SQL 인젝션 방지를 위한 검증 필요)"""
|
||||
# 테이블 이름 검증
|
||||
if not table_name.replace('_', '').replace('-', '').isalnum():
|
||||
raise ValueError("잘못된 테이블 이름입니다.")
|
||||
|
||||
return f"SELECT * FROM {table_name} LIMIT {limit}"
|
||||
@@ -0,0 +1,45 @@
|
||||
# app/repositories/queries/chat_queries.py
|
||||
"""
|
||||
HealthSync AI 채팅 관련 쿼리 모음
|
||||
"""
|
||||
|
||||
|
||||
class ChatQueries:
|
||||
"""채팅 메시지 관련 쿼리"""
|
||||
|
||||
# 채팅 메시지 저장 및 ID 반환 (RETURNING 사용)
|
||||
INSERT_CHAT_MESSAGE_WITH_RETURN = """
|
||||
INSERT INTO intelligence_service.chat_message
|
||||
(member_serial_number, message_type, message_content, response_content, created_at)
|
||||
VALUES (:member_serial_number, :message_type, :message_content, :response_content, :created_at)
|
||||
RETURNING message_id
|
||||
"""
|
||||
|
||||
# 일반 채팅 메시지 저장
|
||||
INSERT_CHAT_MESSAGE = """
|
||||
INSERT INTO intelligence_service.chat_message
|
||||
(member_serial_number, message_type, message_content, response_content, created_at)
|
||||
VALUES (:member_serial_number, :message_type, :message_content, :response_content, :created_at)
|
||||
"""
|
||||
|
||||
# 채팅 메시지 응답 내용 업데이트
|
||||
UPDATE_CHAT_MESSAGE_RESPONSE = """
|
||||
UPDATE intelligence_service.chat_message
|
||||
SET response_content = :response_content,
|
||||
created_at = :updated_at
|
||||
WHERE message_id = :message_id
|
||||
"""
|
||||
|
||||
# 사용자별 채팅 이력 조회 (전체, 시간 역순)
|
||||
GET_CHAT_HISTORY_BY_USER = """
|
||||
SELECT
|
||||
cm.message_id,
|
||||
cm.member_serial_number,
|
||||
cm.message_type,
|
||||
cm.message_content,
|
||||
cm.response_content,
|
||||
cm.created_at
|
||||
FROM intelligence_service.chat_message cm
|
||||
WHERE cm.member_serial_number = :user_id
|
||||
ORDER BY cm.created_at DESC
|
||||
"""
|
||||
@@ -0,0 +1,47 @@
|
||||
# app/repositories/queries/health_queries.py
|
||||
"""
|
||||
HealthSync AI 건강 관련 쿼리 모음
|
||||
"""
|
||||
|
||||
|
||||
class HealthQueries:
|
||||
"""건강 데이터 관련 쿼리"""
|
||||
|
||||
# 최신 건강검진 데이터 조회
|
||||
GET_LATEST_HEALTH_CHECKUP = """
|
||||
SELECT
|
||||
hc.checkup_id,
|
||||
hc.member_serial_number,
|
||||
hc.reference_year,
|
||||
hc.age,
|
||||
hc.height,
|
||||
hc.weight,
|
||||
hc.bmi,
|
||||
hc.waist_circumference,
|
||||
hc.visual_acuity_left,
|
||||
hc.visual_acuity_right,
|
||||
hc.hearing_left,
|
||||
hc.hearing_right,
|
||||
hc.systolic_bp,
|
||||
hc.diastolic_bp,
|
||||
hc.fasting_glucose,
|
||||
hc.total_cholesterol,
|
||||
hc.triglyceride,
|
||||
hc.hdl_cholesterol,
|
||||
hc.ldl_cholesterol,
|
||||
hc.hemoglobin,
|
||||
hc.urine_protein,
|
||||
hc.serum_creatinine,
|
||||
hc.ast,
|
||||
hc.alt,
|
||||
hc.gamma_gtp,
|
||||
hc.smoking_status,
|
||||
hc.drinking_status,
|
||||
hc.processed_at,
|
||||
hc.created_at
|
||||
FROM health_service.health_checkup hc
|
||||
INNER JOIN user_service.user u ON hc.member_serial_number = u.member_serial_number
|
||||
WHERE u.member_serial_number = :user_id
|
||||
ORDER BY hc.reference_year DESC, hc.created_at DESC
|
||||
LIMIT 1
|
||||
"""
|
||||
@@ -0,0 +1,37 @@
|
||||
# app/repositories/queries/mission_queries.py
|
||||
"""
|
||||
HealthSync AI 미션 관련 쿼리 모음
|
||||
"""
|
||||
|
||||
|
||||
class MissionQueries:
|
||||
"""미션 관련 쿼리"""
|
||||
|
||||
# 사용자 미션 정보 조회
|
||||
GET_USER_MISSION_BY_ID = """
|
||||
SELECT
|
||||
umg.mission_id,
|
||||
umg.member_serial_number,
|
||||
umg.mission_name,
|
||||
umg.mission_description,
|
||||
umg.daily_target_count,
|
||||
umg.is_active,
|
||||
umg.performance_date,
|
||||
umg.created_at
|
||||
FROM goal_service.user_mission_goal umg
|
||||
WHERE umg.mission_id = :mission_id
|
||||
"""
|
||||
|
||||
# 사용자별 활성 미션 목록 조회
|
||||
GET_ACTIVE_MISSIONS_BY_USER = """
|
||||
SELECT
|
||||
umg.mission_id,
|
||||
umg.mission_name,
|
||||
umg.mission_description,
|
||||
umg.daily_target_count,
|
||||
umg.performance_date
|
||||
FROM goal_service.user_mission_goal umg
|
||||
WHERE umg.member_serial_number = :user_id
|
||||
AND umg.is_active = true
|
||||
ORDER BY umg.created_at DESC
|
||||
"""
|
||||
@@ -0,0 +1,156 @@
|
||||
# app/repositories/queries/similar_mission_queries.py
|
||||
"""
|
||||
HealthSync AI 유사 사용자 미션 관련 쿼리 모음 (건강 데이터 포함)
|
||||
"""
|
||||
|
||||
|
||||
class SimilarMissionQueries:
|
||||
"""유사 사용자 미션 관련 쿼리 (건강 데이터 강화)"""
|
||||
|
||||
# 최근 24시간 내 미션 완료 이력 조회 (건강 데이터 포함)
|
||||
GET_RECENT_MISSION_COMPLETIONS = """
|
||||
SELECT
|
||||
mch.member_serial_number,
|
||||
u.name,
|
||||
u.occupation,
|
||||
u.birth_date,
|
||||
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
|
||||
umg.mission_name,
|
||||
umg.mission_description,
|
||||
mch.daily_completed_count,
|
||||
mch.completion_date,
|
||||
mch.created_at,
|
||||
-- 건강 데이터 추가
|
||||
hc.height,
|
||||
hc.weight,
|
||||
hc.bmi,
|
||||
hc.waist_circumference,
|
||||
hc.systolic_bp,
|
||||
hc.diastolic_bp,
|
||||
hc.fasting_glucose,
|
||||
hc.total_cholesterol,
|
||||
hc.hdl_cholesterol,
|
||||
hc.ldl_cholesterol,
|
||||
hc.triglyceride,
|
||||
hc.ast,
|
||||
hc.alt,
|
||||
hc.gamma_gtp,
|
||||
hc.serum_creatinine,
|
||||
hc.hemoglobin,
|
||||
hc.smoking_status,
|
||||
hc.drinking_status
|
||||
FROM goal_service.mission_completion_history mch
|
||||
INNER JOIN user_service.user u ON mch.member_serial_number = u.member_serial_number
|
||||
INNER JOIN goal_service.user_mission_goal umg ON mch.mission_id = umg.mission_id
|
||||
LEFT JOIN health_service.health_checkup hc ON u.member_serial_number = hc.member_serial_number
|
||||
WHERE mch.member_serial_number = ANY(:user_ids)
|
||||
AND mch.completion_date >= CURRENT_DATE - INTERVAL '1 day'
|
||||
AND mch.daily_completed_count >= mch.daily_target_count
|
||||
AND (hc.reference_year IS NULL OR hc.reference_year = (
|
||||
SELECT MAX(reference_year)
|
||||
FROM health_service.health_checkup
|
||||
WHERE member_serial_number = u.member_serial_number
|
||||
))
|
||||
ORDER BY mch.created_at DESC
|
||||
LIMIT 20
|
||||
"""
|
||||
|
||||
# 사용자 건강 정보 조회 (벡터 생성용)
|
||||
GET_USER_HEALTH_FOR_VECTOR = """
|
||||
SELECT
|
||||
u.member_serial_number,
|
||||
u.name,
|
||||
u.occupation,
|
||||
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
|
||||
u.updated_at,
|
||||
hc.height,
|
||||
hc.weight,
|
||||
hc.bmi,
|
||||
hc.waist_circumference,
|
||||
hc.systolic_bp,
|
||||
hc.diastolic_bp,
|
||||
hc.fasting_glucose,
|
||||
hc.total_cholesterol,
|
||||
hc.hdl_cholesterol,
|
||||
hc.ldl_cholesterol,
|
||||
hc.triglyceride,
|
||||
hc.ast,
|
||||
hc.alt,
|
||||
hc.gamma_gtp,
|
||||
hc.serum_creatinine,
|
||||
hc.hemoglobin,
|
||||
hc.smoking_status,
|
||||
hc.drinking_status
|
||||
FROM user_service.user u
|
||||
LEFT JOIN health_service.health_checkup hc ON u.member_serial_number = hc.member_serial_number
|
||||
WHERE u.member_serial_number = :user_id
|
||||
AND (hc.reference_year IS NULL OR hc.reference_year = (
|
||||
SELECT MAX(reference_year)
|
||||
FROM health_service.health_checkup
|
||||
WHERE member_serial_number = u.member_serial_number
|
||||
))
|
||||
"""
|
||||
|
||||
# 직업 코드별 이름 조회
|
||||
GET_OCCUPATION_NAME = """
|
||||
SELECT
|
||||
occupation_code,
|
||||
occupation_name,
|
||||
category
|
||||
FROM user_service.occupation_type
|
||||
WHERE occupation_code = :occupation_code
|
||||
"""
|
||||
|
||||
# 사용자 기본 정보 조회 (여러 사용자)
|
||||
GET_USERS_BASIC_INFO = """
|
||||
SELECT
|
||||
u.member_serial_number,
|
||||
u.name,
|
||||
u.occupation,
|
||||
ot.occupation_name,
|
||||
EXTRACT(YEAR FROM AGE(u.birth_date)) as age
|
||||
FROM user_service.user u
|
||||
LEFT JOIN user_service.occupation_type ot ON u.occupation = ot.occupation_code
|
||||
WHERE u.member_serial_number = ANY(:user_ids)
|
||||
"""
|
||||
|
||||
# 벡터 처리를 위한 모든 사용자 데이터 조회
|
||||
GET_ALL_USERS_FOR_VECTOR = """
|
||||
SELECT
|
||||
u.member_serial_number,
|
||||
u.name,
|
||||
u.occupation,
|
||||
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
|
||||
u.updated_at,
|
||||
hc.height,
|
||||
hc.weight,
|
||||
hc.bmi,
|
||||
hc.waist_circumference,
|
||||
hc.systolic_bp,
|
||||
hc.diastolic_bp,
|
||||
hc.fasting_glucose,
|
||||
hc.total_cholesterol,
|
||||
hc.hdl_cholesterol,
|
||||
hc.ldl_cholesterol,
|
||||
hc.triglyceride,
|
||||
hc.ast,
|
||||
hc.alt,
|
||||
hc.gamma_gtp,
|
||||
hc.serum_creatinine,
|
||||
hc.hemoglobin,
|
||||
hc.visual_acuity_left,
|
||||
hc.visual_acuity_right,
|
||||
hc.hearing_left,
|
||||
hc.hearing_right,
|
||||
hc.urine_protein,
|
||||
hc.smoking_status,
|
||||
hc.drinking_status
|
||||
FROM user_service.user u
|
||||
LEFT JOIN health_service.health_checkup hc ON u.member_serial_number = hc.member_serial_number
|
||||
WHERE hc.reference_year IS NULL OR hc.reference_year = (
|
||||
SELECT MAX(reference_year)
|
||||
FROM health_service.health_checkup
|
||||
WHERE member_serial_number = u.member_serial_number
|
||||
)
|
||||
ORDER BY u.member_serial_number
|
||||
"""
|
||||
@@ -0,0 +1,71 @@
|
||||
# app/repositories/queries/user_queries.py
|
||||
"""
|
||||
HealthSync AI 사용자 관련 쿼리 모음
|
||||
"""
|
||||
|
||||
|
||||
class UserQueries:
|
||||
"""사용자 관련 쿼리"""
|
||||
|
||||
# 사용자 기본 정보 조회
|
||||
GET_USER_BASIC_INFO = """
|
||||
SELECT
|
||||
u.member_serial_number,
|
||||
u.google_id,
|
||||
u.name,
|
||||
u.birth_date,
|
||||
u.occupation,
|
||||
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
|
||||
u.created_at,
|
||||
u.updated_at,
|
||||
u.last_login_at
|
||||
FROM user_service.user u
|
||||
WHERE u.member_serial_number = :user_id
|
||||
"""
|
||||
|
||||
# 사용자 존재 여부 확인
|
||||
CHECK_USER_EXISTS = """
|
||||
SELECT COUNT(*) as user_count
|
||||
FROM user_service.user
|
||||
WHERE member_serial_number = :user_id
|
||||
"""
|
||||
|
||||
# Google ID로 사용자 조회
|
||||
GET_USER_BY_GOOGLE_ID = """
|
||||
SELECT
|
||||
u.member_serial_number,
|
||||
u.google_id,
|
||||
u.name,
|
||||
u.birth_date,
|
||||
u.occupation,
|
||||
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
|
||||
u.created_at,
|
||||
u.updated_at,
|
||||
u.last_login_at
|
||||
FROM user_service.user u
|
||||
WHERE u.google_id = :google_id
|
||||
"""
|
||||
|
||||
# 사용자 생성
|
||||
INSERT_USER = """
|
||||
INSERT INTO user_service.user
|
||||
(google_id, name, birth_date, occupation, created_at, updated_at)
|
||||
VALUES (:google_id, :name, :birth_date, :occupation, :created_at, :updated_at)
|
||||
"""
|
||||
|
||||
# 사용자 정보 업데이트
|
||||
UPDATE_USER_INFO = """
|
||||
UPDATE user_service.user
|
||||
SET name = :name,
|
||||
birth_date = :birth_date,
|
||||
occupation = :occupation,
|
||||
updated_at = :updated_at
|
||||
WHERE member_serial_number = :member_serial_number
|
||||
"""
|
||||
|
||||
# 최근 로그인 시간 업데이트
|
||||
UPDATE_LAST_LOGIN = """
|
||||
UPDATE user_service.user
|
||||
SET last_login_at = :last_login_at
|
||||
WHERE member_serial_number = :member_serial_number
|
||||
"""
|
||||
Reference in New Issue
Block a user