
    ]i                     v   d Z ddlmZmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZ ddlmZ d	eez  d
efdZ e       Zej5                  de      dd ee	       ee      fdedededed
ef
d       Zej=                  deej>                         ee	       ee      fdededed
efd       Z ej5                  de       ee	       ee      fdededed
efd       Z!ejE                  de       ee	       ee      fdedededed
ef
d       Z#ejI                  de       ee	       ee      fdededed
efd       Z%ejI                  dejL                         ee	       ee      fdededed
dfd       Z'ej5                  d e       ee	       ee      fdededed
efd!       Z(ej=                  d eej>                         ee	       ee      fdedededed
ef
d"       Z)ejI                  d#ejL                         ee	       ee      fded$ededed
df
d%       Z*y)&uI   Users router — endpoints for user management and SPBU role assignments.    )	APIRouterDependsHTTPExceptionstatus)AsyncSession)get_db)get_current_user)User)
UserCreateUserResponse
UserUpdateUserSpbuAssignmentCreateUserSpbuAssignmentResponse)user_serviceereturnc                     t        | t              r$t        t        j                  t        |             S t        t        j                  t        |             S )uE   Convert service-layer ValueError → 404 and PermissionError → 403.status_codedetail)
isinstancePermissionErrorr   r   HTTP_403_FORBIDDENstrHTTP_404_NOT_FOUND)r   s    3/var/www/html/spbu.com/backend/app/routers/users.py_service_errorr      s:    !_%)B)B3q6RRV%>%>s1vNN     )response_model2   skiplimitdbcurrent_userc                    K   t        j                  ||| |       d{   \  }}|D cg c]  }t        j                  |       c}|| |z  dz   |ddS 7 7c c}w w)z%Return a paginated list of all users.N   )totalpageper_page)datameta)r   
list_usersr   model_validate)r"   r#   r$   r%   usersr(   us          r   r-   r-      sh      &00\4OOLE59>?A,,Q/?):N  P?s    AAAAAA)r    r   r+   c                    K   	 t        j                  || |       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)zCreate a new user account.NzUser berhasil dibuatr+   message)r   create_user
ValueErrorr   r   r   r.   )r+   r$   r%   userr   s        r   r4   r4   &   s`      !--b$EE !//5BXYY F(  Q 1   A= ;= A= AAAAz
/{user_id}user_idc                    K   	 t        j                  ||        d{   }dt        j                  |      iS 7 # t        $ r)}t        t        j
                  t        |            d}~ww xY ww)z!Return details for a single user.Nr   r+   )	r   get_userr5   r   r   r   r   r   r.   r8   r$   r%   r6   r   s        r   r:   r:   4   sf     R!**2w77 L//566 8 R(A(A#a&QQRs1   A0; 9; A0; 	A-$A((A--A0c                    K   	 t        j                  || ||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z'Update scalar fields on a user account.NzUser berhasil diupdater2   )r   update_userr5   r   r   r   r.   )r8   r+   r$   r%   r6   r   s         r   r=   r=   B   sb      !--b'4NN !//5BZ[[ O(  Q s1   A > <> A > AAAA c                    K   	 t        j                  || |       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z(Deactivate a user account (soft delete).NzUser berhasil dinonaktifkanr2   )r   deactivate_userr5   r   r   r   r.   r;   s        r   r?   r?   Q   s`      !11"g|LL !//5B_`` M(  Q r7   z/{user_id}/delete)r   Nc                    K   	 t        j                  || |       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)zAPermanently delete a user in dev mode, soft-delete in production.N)r   delete_userr5   r   r   )r8   r$   r%   r   s       r   rA   rA   _   sB      &&r7LAAA(  Q s0   A& $& A& AA  AAz/{user_id}/assignmentsc                 
  K   	 t        j                  ||        d{   }d|D cg c]  }t        j                  |       c}iS 7 )# t        $ r)}t        t        j
                  t        |            d}~ww xY wc c}w w)z2Return all SPBU role assignments for a given user.Nr   r+   )	r   get_assignmentsr5   r   r   r   r   r   r.   )r8   r$   r%   assignmentsr   as         r   rC   rC   l   sz     R(88WEE ;W;a/>>qA;WXX F R(A(A#a&QQRWsB   BA	 AA	 BA>BA	 		A;$A66A;;Bc                   K   	 t        j                  || |j                  |j                  |       d{   }t        j                  |      ddS 7 # t        $ r)}t        t        j                  t        |            d}~ww xY ww)zUAssign a user to an SPBU with a specific role (upserts if assignment already exists).Nr   zAssignment berhasil dibuatr2   )r   assign_to_spbuspbu_idrole_idr5   r   r   HTTP_400_BAD_REQUESTr   r   r.   )r8   r+   r$   r%   
assignmentr   s         r   assign_userrL   z   s{     T'66r7DLLRVR^R^`lmm
 /==jIVrss n T(C(CCPQFSSTs7   B0A AA BA 	B$B  BBz /{user_id}/assignments/{spbu_id}rH   c                    K   	 t        j                  || ||       d{    y7 # t        $ r)}t        t        j
                  t        |            d}~ww xY ww)z-Remove a user's role assignment from an SPBU.Nr   )r   remove_assignmentr5   r   r   r   r   )r8   rH   r$   r%   r   s        r   rN   rN      sN     R,,R'<PPP R(A(A#a&QQRs0   A' %' A' 	A$AAA)+__doc__fastapir   r   r   r   sqlalchemy.ext.asyncior   app.core.databaser   app.dependenciesr	   app.models.userr
   app.schemas.userr   r   r   r   r   app.servicesr   r5   r   r   routergetdictintr-   postHTTP_201_CREATEDr4   r:   patchr=   deleter?   HTTP_204_NO_CONTENTrA   rC   rL   rN    r   r   <module>ra      s   O = = / $ -   w w %Oj?2 O} O 
 Bt$v !12	
 	 	
 
 % R&2I2IJ v !12
Z

Z
Z 
Z 
	
Z K
Z L. v !12
7
7
7 
7 
	
7 /
7 l40 v !12	\\
\ 	\ 	\
 
\ 1\ |D1 v !12
a
a
a 
a 
	
a 2
a "0J0JK v !12	 	 	  	  
		  L	  $T: v !12
Y
Y
Y 
Y 
	
Y ;
Y %dH_H_` v !12	tt
"t 	t 	t
 
t at 1v?Y?YZ v !12	
R
R
R 	
R 	
R
 

R [
Rr   