feat : initial commit
HealthSync Intelligence CI / build-and-push (push) Has been cancelled

This commit is contained in:
hyerimmy
2025-06-20 05:28:30 +00:00
commit 910bd902b1
72 changed files with 6758 additions and 0 deletions
+20
View File
@@ -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"
]
+45
View File
@@ -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}"
+45
View File
@@ -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
"""
+71
View File
@@ -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
"""