
    YFi:               	       (   d dl Z d dlmZ d dlmZmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ  e j2                  e      Z e
d
e      Z e
de      Z e
de      Z e
de      Z G d deeeeef         Z y)    N)datetime)	AnyDictGenericListOptionalTupleTypeTypeVarUnion)jsonable_encoder)	BaseModel)IntegrityErrorNoResultFound)Session)DBSortTypes)Base	ModelType)boundCreateSchemaTypeUpdateSchemaTypeDetailSchemaTypec                   t   e Zd Z	 d&dee   dee   defdZdede	de
eeef      fd	Zdedede
e   fd
Zdedede
eeef      fdZdede
e   fdZdej&                  fdededededede
ee      fdZdedee   de
ee      fdZ	 d'dedede
e   deee   ef   fdZdedede
eeef      fdZdddededeeeee	f   f   dedef
dZ	 d&dededeeeee	f   f   dede
eeef      f
d Zded!edeeeee	f   f   de
e   fd"Zdedede
e   fd#Z dedede
eeef      fd$Z!dede
eeef      fd%Z"y)(BaseRepositoryFmodelschemause_soft_deletec                 .    || _         || _        || _        y)ar  Repository object with default methods to Create, Read, Update,
        Delete (CRUD).

        Parameters:
        - db: SQLAlchemy Session
        - model: Database Model (A SQLAlchemy model class)
        - schema: DTO / Data Transfer Object (A Pydantic model (schema) class)
        - use_soft_delete: If set to true, model will exclude soft deleted records
        N)r   r   r   )selfr   r   r   s       R/var/www/html/BankruptcyAI-uat/bankruptcy-ai/src/modules/_lib/repositories/base.py__init__zBaseRepository.__init__   s     
.    db_idreturnc                    	 |j                  | j                        }| j                  r4|j                  | j                  j                  j                  d             }|j                  | j                  j                  |k(        j                         }|sd}d |fS | j                  j                  |      dfS # t        $ r.}t        |      }t        j                  |       d |fcY d }~S d }~ww xY wNNo such resource foundzResource details)queryr   r   filter
deleted_atis_idfirstr   model_validate	Exceptionstrloggererror)r   r#   r$   r)   resultmsges          r    getzBaseRepository.get+   s    	HHTZZ(E##TZZ%:%:%>%>t%DE\\$**--3"67==?F.c{"KK..v68JKK 	a&CLL#;	s$   BB8 B8 8	C/#C*$C/*C/c                 $   |j                  | j                        j                  | j                  j                  |k(        }| j                  r4|j                  | j                  j
                  j                  d             }|j                         S N)r)   r   r*   r-   r   r+   r,   r.   )r   r#   r$   r)   s       r    get_rawzBaseRepository.get_raw:   sd    $++DJJMMS,@ALL!6!6!:!:4!@AE{{}r"   name_inc                .   	 |j                  | j                        }| j                  r4|j                  | j                  j                  j                  d             }|j                  | j                  j                  |k(        j                         }|sd}d |fS | j                  j                  |      dfS # t        $ r d}t        j                  |       d |fcY S t        $ r.}t        |      }t        j                  |       d |fcY d }~S d }~ww xY wr'   )r)   r   r   r*   r+   r,   namer.   r   r/   r   r2   r3   r0   r1   )r   r#   r;   r)   r4   r5   r6   s          r    get_by_namezBaseRepository.get_by_name@   s    	HHTZZ(E##TZZ%:%:%>%>t%DE\\$**//W"<=CCEF.c{"KK..v68JKK 	*CLL#; 	a&CLL#;	s*   BB8 B8 8$DD&#D	DDc                      |j                  | j                        j                  di |}| j                  r4|j	                  | j                  j
                  j                  d             }|j                         S N )r)   r   	filter_byr   r*   r+   r,   r.   )r   r#   filtersr)   s       r    get_onezBaseRepository.get_oneU   s\    .$..99LL!6!6!:!:4!@AE{{}r"    skiplimitsort_by	sort_typec                    d }|r;t        | j                  |      }|r#|t        j                  k(  r|j	                         } |j                  | j                        j                  di |}| j                  r4|j                  | j                  j                  j                  d             }|j                  |      j                  |      j                  |      j                         }	|	S r@   )getattrr   r   
DESCENDINGdescr)   rB   r   r*   r+   r,   order_byoffsetrG   all)
r   r#   rF   rG   rH   rI   rC   
sort_queryr)   r4   s
             r    get_manyzBaseRepository.get_many[   s     
 W5Ji;+A+AA'__.
.$..99LL!6!6!:!:4!@AE
+2248>>uEIIKr"   ids_inc                 <   |j                  | j                        j                  | j                  j                  j	                  |            }| j
                  r4|j                  | j                  j                  j                  d             }|j                         S r9   )	r)   r   r*   r-   in_r   r+   r,   rP   )r   r#   rS   r)   s       r    
get_ids_inzBaseRepository.get_ids_ino   sj    $++DJJMM,=,=f,EFLL!6!6!:!:4!@AEyy{r"   Nc                 t   |j                  | j                        j                  |      j                  |      }| j                  r4|j                  | j                  j                  j                  d             }|j                         }|D cg c]  }| j                  j                  |       c}dfS c c}w )NzResource List)r)   r   rO   rG   r   r*   r+   r,   rP   r   r/   )r   r#   rF   rG   r)   resultsitems          r    	get_multizBaseRepository.get_multiu   s     $++D177>LL!6!6!:!:4!@AE))+=DET**40EVVEs   "B5obj_inc                h   	 t        |      } | j                  di |}|j                  |       |j                          |j	                  |       |dfS # t
        $ r d}t        j                  |       d |fcY S t        $ r.}t        |      }t        j                  |       d |fcY d }~S d }~ww xY w)NzResource createdz'Attempting to create duplicate resourcerA   )
r   r   addcommitrefreshr   r2   r3   r0   r1   )r   r#   r[   obj_in_datar4   r5   r6   s          r    createzBaseRepository.create~   s    	*62KTZZ.+.FFF6NIIKJJv.// 	;CLL#; 	a&CLL#;	s$   AA $B1;B1#B,&B1,B1)
return_rawr4   rb   c                   	 t        |      }t	        |t
              r|j                  d      n|}|D ]  }||v st        ||||           |j                  |       |j                          |j                  |       |r|S | j                  j                  |      S # t        $ r |j                  j                         }Y w xY w)NT)exclude_unset)r   r0   __dict__copy
isinstancer   
model_dumpsetattrr]   r^   r_   r   r/   )r   r#   r4   r[   rb   obj_dataupdate_datafields           r    updatezBaseRepository.update   s    	.'/H
 &), D1 	
  	;E#{5'9:	; 	v
		


6M{{))&11  	.++-H	.s   B #CC	object_idpayloadc                     	 |j                  | j                        j                  | j                  j                  |k(        j	                         }| j                  |||      S # t
        $ r Y y w xY w)Nr4   r[   rb   )r)   r   r*   r-   r.   r0   rm   )r   r#   rn   ro   rb   r4   s         r    update_by_idzBaseRepository.update_by_id   se    	XXdjj)00)1KLRRTF {{&Z{PP  		   AA% %	A10A1
name_in_dbc                     	 |j                  | j                        j                  | j                  j                  |k(        j	                         }| j                  ||d      S # t
        $ r Y y w xY w)NTrq   )r)   r   r*   r=   r.   r0   rm   )r   r#   rt   r[   r4   s        r    update_by_namezBaseRepository.update_by_name   se    	XXdjj)00J1NOUUWF {{&D{II  		rs   c                     |j                  | j                        j                  |      }|r<|j                  |       |j	                          | j
                  j                  |      S y r9   )r)   r   r7   deleter^   r   r/   r   r#   r$   r4   s       r    removezBaseRepository.remove   sO    $**%))#.IIfIIK;;--f55r"   c                    t        | j                  d      sdddS |j                  | j                        j                  |      }|r<t	        j
                  t        j                        |_        |j                          ddiS ddiS )Nr+   FzFModel does not support soft delete. 'deleted_at' column was not found.)deletedmessager|   T)	hasattrr   r)   r7   r   nowutcr+   r^   ry   s       r    soft_deletezBaseRepository.soft_delete   sv    tzz<0 c  $**%))#. (X\\ :FIIKt$$5!!r"   c                 R   	  |j                  | j                        j                  di |j                         }|t	        d      |j                  |       |j                          | j                  j                  |      dfS # t        $ r}d t        |      fcY d }~S d }~ww xY w)Nr(   zDeleted successfullyrA   )
r)   r   rB   r.   r0   rx   r^   r   r/   r1   )r   r#   paramsr4   r6   s        r    remove_by_paramzBaseRepository.remove_by_param   s    	 3RXXdjj)33=f=CCEF~ 899IIfIIK;;--f57MMM 	 Q<	 s   BB 	B&B!B&!B&)F)r   N)#__name__
__module____qualname__r
   r   r   boolr!   r   r   r   r	   r1   r7   intr:   r>   rD   r   	ASCENDINGr   rR   rV   rZ   r   ra   r   r   r   rm   rr   rv   rz   r   r   rA   r"   r    r   r      s    !&	/I/ %&/ 	/&g C HU;KS;P5Q,R '  0C '*	%(#-.	/*' )1D  $..  	
   
$y/	"(W d3i HT)_<U  BFWW!$W19#W	t$%s*	+W&6	%	3'	(2 !22 	2
 &S#X672 2 
2@ !QQ Q 'c3h78	Q
 Q 
%()34	5QJJ J &S#X67	J
 
)	J s x8H/I "g "C "HT#t)_4M "  	%(#-.	/ r"   r   )!loggingr   typingr   r   r   r   r   r	   r
   r   r   fastapi.encodersr   pydanticr   sqlalchemy.excr   r   sqlalchemy.ormr   src.utils.enumsr   src.database.baser   	getLoggerr   r2   r   r   r   r   r   rA   r"   r    <module>r      s      R R R -  8 " ' "			8	$Kt,	-Y? -Y? -Y? R I')9;KKLR r"   