ORA / app /services /profile.py
Abdalkaderdev's picture
Initial ORA deployment
5e0532d
from pydantic import BaseModel, Field
from typing import List, Optional
from enum import Enum
import sqlite3
import json
class TonePreference(str, Enum):
PASTORAL = "pastoral"
SCHOLARLY = "scholarly"
GENTLE = "gentle"
DIRECT = "direct"
class SpiritualGoal(str, Enum):
PRAYER = "prayer"
STUDY = "study"
HEALING = "healing"
LEADERSHIP = "leadership"
DISCERNMENT = "discernment"
class UserProfile(BaseModel):
user_id: str
denomination: Optional[str] = None
bible_translations: List[str] = Field(default=["NIV", "ESV"])
tone_preference: TonePreference = TonePreference.PASTORAL
spiritual_goals: List[SpiritualGoal] = []
class Config:
json_schema_extra = {
"example": {
"user_id": "usr_123",
"denomination": "non-denominational",
"bible_translations": ["NIV"],
"tone_preference": "gentle",
"spiritual_goals": ["prayer", "healing"]
}
}
class ProfileService:
def __init__(self, db_path: str = "memory.db"):
self.db_path = db_path
self._init_db()
def _init_db(self):
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS user_profiles (
user_id TEXT PRIMARY KEY,
denomination TEXT,
bible_translations TEXT,
tone_preference TEXT,
spiritual_goals TEXT
)
''')
conn.commit()
conn.close()
async def get_profile(self, user_id: str) -> UserProfile:
conn = sqlite3.connect(self.db_path)
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute('SELECT * FROM user_profiles WHERE user_id = ?', (user_id,))
row = cursor.fetchone()
conn.close()
if row:
return UserProfile(
user_id=row['user_id'],
denomination=row['denomination'],
bible_translations=json.loads(row['bible_translations']) if row['bible_translations'] else ["NIV"],
tone_preference=row['tone_preference'] or TonePreference.PASTORAL,
spiritual_goals=json.loads(row['spiritual_goals']) if row['spiritual_goals'] else []
)
# Return default profile if none exists
return UserProfile(user_id=user_id)
async def update_profile(self, user_id: str, data: dict) -> UserProfile:
# Get current profile to merge (or default)
current = await self.get_profile(user_id)
# Merge data and validate to ensure Enums are correctly parsed
merged_data = current.model_dump()
merged_data.update(data)
updated_model = UserProfile(**merged_data)
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
INSERT OR REPLACE INTO user_profiles (user_id, denomination, bible_translations, tone_preference, spiritual_goals)
VALUES (?, ?, ?, ?, ?)
''', (
updated_model.user_id,
updated_model.denomination,
json.dumps(updated_model.bible_translations),
updated_model.tone_preference.value,
json.dumps([g.value for g in updated_model.spiritual_goals])
))
conn.commit()
conn.close()
return updated_model
profile_service = ProfileService()