from fastapi import HTTPException from .base_storage import BaseStorage from core.models.office.db import ProfileDB from core.models.office.requests import CreateOrUpdateProfileRequest class ProfileStorage(BaseStorage): def get_by_id(self, id: int): row = self.get_by('profile', id=id) if row is None: raise HTTPException(status_code=404, detail='Profile not found') return ProfileDB(id=row[0], full_name=row[1], phone=row[2], email=row[3]) def create_or_update_profile(self, data: CreateOrUpdateProfileRequest): try: if not data.id: raise KeyError('No id provided') self.get_by_id(data.id) sql = f"update profile set full_name = %s, phone = %s, email = %s where id = %s" self.db.execute(sql, (data.full_name, data.phone, data.email, data.id)) except (HTTPException, KeyError) as _: sql = f"insert into profile (full_name, phone, email) values (%s, %s, %s)" self.db.execute(sql, (data.full_name, data.phone, data.email)) def update_profile(self, data: CreateOrUpdateProfileRequest): self.get_by_id(data.id) sql = f"update profile set full_name = %s, phone = %s, email = %s where id = %s" self.db.execute(sql, (data.full_name, data.phone, data.email, data.id)) def create_profile(self, data: CreateOrUpdateProfileRequest): sql = f"insert into profile (full_name, phone, email) values (%s, %s, %s)" self.db.execute(sql, (data.full_name, data.phone, data.email)) row = self.get_by('profile', email=data.email) return ProfileDB(id=row[0], full_name=row[1], phone=row[2], email=row[3]) def list_all_profiles(self): rows = self.list_by('profile') return [ProfileDB(id=row[0], full_name=row[1], phone=row[2], email=row[3]) for row in rows]