
    ]i                        d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ d Zded	ed
edz  fdZdeded
edz  fdZdeded
edz  fdZdeded
edz  fdZ	 	 d'dededed
eee   ef   fdZ	 	 d'dedee   deded
eee   ef   f
dZded
efdZdeded
efdZd Zdededed
edz  fdZdeded
ee   fdZdeded
efdZdededed ed
ef
d!Zded"ed
efd#Z d(deded$e!d
dfd%Z"dededed
e!fd&Z#y))uH   User repository — all DB queries for users and their SPBU assignments.    )funcselect)AsyncSession)selectinload)RoleRolePermissionUserSpbuAssignment)Userc                  n    t        t        j                        j                  t        j                        S N)r   r
   assignmentsr	   role     B/var/www/html/spbu.com/backend/app/repositories/user_repository.py_assignment_optionsr      s%    (()667I7N7NOOr   dbemailreturnNc                    K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d                   d{   }|j                         S 7 w)zFetch a user by email address.N)executer   r
   wherer   
deleted_atis_scalar_one_or_none)r   r   results      r   get_by_emailr      s[     ::t4::.0C0CD0IJ F $$&&   A A9"A7#A9usernamec                    K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d                   d{   }|j                         S 7 w)zFetch a user by username.N)r   r   r
   r   r   r   r   r   )r   r   r   s      r   get_by_usernamer!      s[     ::t4==H4doo6I6I$6OP F $$&&r   user_idc                 $  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t                            d{   }|j                         S 7 w)zDFetch a user by primary key, eagerly loading their SPBU assignments.N)
r   r   r
   r   idr   r   optionsr   r   r   r"   r   s      r   	get_by_idr'      sh     ::t	tww'!4??#6#6t#<	=	$&	' F
 $$&&s   A7B9B:Bc           
         K   ddl m}m} | j                  t	        t
              j                  t
        j                  |k(  t
        j                  j                  d            j                  t        t
        j                        j                  t        t        j                        j                  |j                        t        t        j                                            d{   }|j#                         S 7 w)zKFetch a user with all SPBU assignments, roles, and role permissions loaded.r   )r   r   N)app.models.roler   r   r   r   r
   r   r$   r   r   r%   r   r   r	   r   permissionsspbur   )r   r"   r   r   r   s        r   get_with_permissionsr,   )   s     4::t	tww'!4??#6#6t#<	=	))*22/445BB4CSCST/445

	 	F $$&&	s   C%C>'C<(C>skiplimitc                 r  K   t        t              j                  t        j                  j	                  d            }| j                  t        t        j                               j                  |j                                      d{   }|j                         }| j                  |j                  t                     j                  |      j                  |      j                  t        j                                d{   }t#        |j%                         j'                               |fS 7 7 /w)z7Return a paginated list of all users (superadmin only).N)r   r
   r   r   r   r   r   countselect_fromsubquery
scalar_oner%   r   offsetr.   order_bynamelistscalarsall)r   r-   r.   
base_querycount_qtotalr   s          r   get_allr=   9   s      ##DOO$7$7$=>JJJvdjjl3??
@S@S@UVWWG E::	$&	'		u	$))	 F  $$&'.. Xs%   BD7
D3A:D7D5.D75D7actor_spbu_idsc                   K   t        t              j                  t        t        j                  t        j
                  k(        j                  t        t        j
                  t        j                  k(        j                  t        j                  j                  d      t        j                  j                  d      t        j                  j                  |      t        j                  j                  d            j                         }| j!                  t        t#        j$                               j'                  |j)                                      d{   }|j+                         }| j!                  |j-                  t/                     j1                  |      j3                  |      j5                  t        j6                               d{   }t9        |j;                         j=                               |fS 7 7 /w)zReturn users who share at least one SPBU with the actor, have a schedulable role,
    and are not superadmins. Used for SPBU Admin views (operators/OB only).NFT)r   r
   joinr	   r"   r$   r   role_idr   r   r   is_superadminspbu_idin_can_be_scheduleddistinctr   r   r0   r1   r2   r3   r%   r   r4   r.   r5   r6   r7   r8   r9   )r   r>   r-   r.   r:   r;   r<   r   s           r   get_all_scopedrG   L   s`     	t	 "4"<"<"G	H	dDGG1999	:	OO%""5)&&**>:!!%%d+	

 
  JJvdjjl3??
@S@S@UVWWG E::	$&	'		u	$))	 F  $$&'.. Xs%   EHHA:HH.HHc                    K   t        di |}| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)u8   Create a new user record. Flush only — caller commits.Nr   )r
   addflushr'   r$   )r   kwargsusers      r   createrM   l   sH     >&>DFF4L
((*2tww''' 's!   0AAAAAArL   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uH   Update scalar fields on an existing user. Flush only — caller commits.N)itemssetattrrJ   r'   r$   )r   rL   rK   keyvalues        r   updaterS   t   sR     lln
Uc5! %
((*2tww''' 's!   9A"AA"A A" A"c                  4    t        t        j                        S r   )r   r	   r   r   r   r   _assignment_with_rolerU   |   s    *//00r   rC   c                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(        j                  t                            d{   }|j                         S 7 w)uA   Fetch a specific user–SPBU assignment with role eagerly loaded.N)	r   r   r	   r   r"   rC   r%   rU   r   )r   r"   rC   r   s       r   get_assignmentrW      sp      ::!"	&&'1&&'1

 
&(	) F $$&&s   A+B-B.Bc                   K   | j                  t        t              j                  t        j                  |k(        j                  t                            d{   }t        |j                         j                               S 7 +w)zGReturn all SPBU assignments for a given user with roles eagerly loaded.N)
r   r   r	   r   r"   r%   rU   r7   r8   r9   r&   s      r   get_assignmentsrY      sj      ::!"	!))W4	5	&(	) F
  $$&''s   AB	B,B	assignment_idc                    K   | j                  t        t              j                  t        j                  |k(        j                  t                            d {   }|j                         S 7 wr   )r   r   r	   r   r$   r%   rU   r3   )r   rZ   r   s      r   _get_assignment_by_idr\      s\     ::!"	!$$5	6	&(	) F
 s   AA2A0A2rA   c                    K   t        |||      }| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)uH   Create a new user–SPBU role assignment. Flush only — caller commits.)r"   rC   rA   N)r	   rI   rJ   r\   r$   )r   r"   rC   rA   
assignments        r   create_assignmentr_      sN      $GWgVJFF:
((*&r:==999 9s!   3AAAAAAr^   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    | j                  |       d{    |S 7 7 w)uL   Update fields on an existing SPBU assignment. Flush only — caller commits.N)rO   rP   rJ   refresh)r   r^   rK   rQ   rR   s        r   update_assignmentrb      sX      lln
U
C' %
((*
**Z
     s!   9AAAAAAhardc                    K   ddl m }m} |r| j                  |       d{    n |j                  |j                        |_        | j                          d{    y7 >7 w)u-   Delete a user. Flush only — caller commits.r   )datetimetimezoneN)re   rf   deletenowutcr   rJ   )r   rL   rc   re   rf   s        r   delete_userrj      sK     +iio",,x||4
((* 	 s!   A$A 8A$A"A$"A$c                    K   t        | ||       d{   }|sy| j                  |       d{    | j                          d{    y7 97 7 	w)un   Delete the user–SPBU assignment. Returns True if deleted, False if not found. Flush only — caller commits.NFT)rW   rg   rJ   )r   r"   rC   r^   s       r   delete_assignmentrl      sP     %b'7;;J
))J

((* <  s1   AAAAAAAAA)r   2   )F)$__doc__
sqlalchemyr   r   sqlalchemy.ext.asyncior   sqlalchemy.ormr   r)   r   r   r	   app.models.userr
   r   strr   r!   intr'   r,   tupler7   r=   rG   rM   rS   rU   rW   rY   r\   r_   rb   boolrj   rl   r   r   r   <module>rw      sI   N # / ' D D  P'< ' 't ''l 'c 'dTk '' 's 'td{ ''< '# '$+ '$ //
/ / 4:s?	/, 	//I/ / 	/
 4:s?/@(\ ( ((\ ( (D (1''"'-0'$'	(	("	(	
	(L  I[ ::":-0:;>::"4, d $ 4  s S T r   