
    ,`oh<                        d dl Z d dlmZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZmZ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mZ d dlmZ d dlmZmZ d dl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, d dl-m.Z.  e j^                  e0      Z1	 	 	 d2dede!de2dee2   de3de3de$defdZ4dede!de2de$dee   f
dZ5d3dede2de6deeef   fd Z7	 	 	 d4ded!e de$de6d"e6d#e6deeef   fd$Z8dede2d!e"de$def
d%Z9ded&e2defd'Z:g fded(e3d)ee2   ddfd*Z;d5ded+e2defd,Z<ded-e2dee3   fd.Z=ded-e2dee2   fd/Z>ded-e2dee3   fd0Z?defd1Z@y)6    N)datetime)DictListOptionalUnion)HTTPExceptionstatus)and_funcor_)IntegrityError)Session
joinedload)Query)
Permission)Roleroles_permissions_map)UserPermissions)PermissionSchema
RoleSchema)RoleCreateRequestSchemaRoleListFilterSchemaRoleUpdateRequestSchema)Users)settings)API_PREFIXES)generate_unique_slug)QueryPaginator)
RoleSeederdbfiltersfieldssort_bypageper_pagecurrent_userreturnc           
        K   ddg}| j                  t              }|r]t        | |j                         d{   }	|j                  dk(  r/	 |j                  t        j                  j                  |	            }|rt|j                  d      }
|
D ]^  }||vr0t        t        j                  d| dd	j                  |       
      |j                  t        t        t        |                  }` |j                   rr	 |j                  t#        t        j$                  j'                  d|j                    d      t        j(                  j'                  d|j                    d                  }g }|r\|D ]W  }	 |j+                  dd      }t        t        |      }|j-                  d      r|j/                         }|j1                  |       Y |r |j2                  | }|dz
  |z  }t5        |t6        dj                  t9        t;        j<                               t>        j@                  g      ||      }|jC                         }||d<   |S 7 #  t        t        j                  d| d
      xY ww)ax  
    List roles with pagination, filtering, and sorting.

    Args:
    db: Database session
    filters: Filter parameters
    fields: Additional related fields to include
    sort_by: List of fields to sort by (prefix with - for descending order)
    page: Page number for pagination
    per_page: Items per page
    current_user: Current authenticated user information
    permissions
created_byr    user_idNF,z!Cannot fetch unidentified field 'z'. Allowed fields are z, status_codedetail%- &Cannot sort with unidentified column ''   )queryschemaurloffsetlimitallowed_fields)"r7   r   get_user_role_idsr,   show_all_rolesfilteridnotin_splitr   r	   HTTP_422_UNPROCESSABLE_ENTITYjoinoptionsr   getattrsearchr   labelilikeslugreplace
startswithdescappendorder_byr   r   strr   api_base_urlr   ROLE_PERMISSIONpaginate)r    r!   r"   r#   r$   r%   r&   allowed_joinsdb_queryself_role_ids	sql_joinsj
sort_queryscol
sort_orderr:   	paginatorresults                      h/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/role_permission/services/role_service.py
list_rolesr`      sP    , #L1Mxx~H):b,J^J^)_#_!!U*Mtww~~m'DEHLL%	 	FA%# & D D>qcAWX\XaXaboXpWqr   ''
743C(DEH	F ~~%??

  1W^^$4A!67		!GNN#31 56
 J 	AiiR($T3/
<<$!+!2J!!*-	 $8$$j1Qh("FGGS..01<3O3OPQI !F,FMq $`F# & D DCA3aH s*   6I4ID?I49AIBI4!I11I4c                   K   | j                  t              j                  t        j                  dk(        }t	        | |j
                         d{   }d|vrMt        | |j
                         d{   }|j                  t        j                  j                  |            }|j                  r	 |j                  t        t        j                  j                  d|j                   d      t        j                  j                  d|j                   d      t        j                  j                  d|j                   d                  }g }t        |      dkD  rm|j!                  d      }|D ]W  }		 |	j#                  dd	      }
t%        t        |
      }|	j'                  d      r|j)                         }|j+                  |       Y |r |j4                  | }|j7                         D cg c]  }t9        j:                  |       }}|S 7 7 # t,        $ r  t/        t0        j2                  d
|	 d      w xY wc c}w w)z!
    Permissions Master List
    Tr+   Nsuper_adminr1   r   r-   r2   r3   r4   r5   r.   )r7   r   r?   	is_activeget_user_role_slugsr,   get_user_permission_idsr@   in_rG   r   modulerI   	operationoperation_labellenrB   rK   rF   rL   rM   rN   	Exceptionr   r	   rC   rO   allr   model_validate)r    r!   r#   r&   rU   	user_roleuser_permissionsrY   sort_by_listrZ   r[   r\   permresultss                 r_   list_permissionsrs   t   s     xx
#**:+?+?4+GHH)R9M9MNNII%!8BH\H\!]]??:==#4#45E#FG~~%??!!''!GNN+;1(=>$$**Qw~~.>a+@A**001W^^4DA1FG
 J
7|a}}S) 	AiiR($Z5
<<$!+!2J!!*-	 $8$$j1AIP..t4PGPNM O]4  # & D DCA3aH  QsJ   AI	H"I	5H6DI	9AH%I	2II	I	)II	rJ   
return_rawc                 >  K   | j                  t              j                  t        j                  t        j
                        |j	                         k(        j                         }|r|r|S t        j                  |      S t        t        j                  d      w)z"
    Fetch a role by its slug
    zNo such role foundr.   )r7   r   r?   r   lowerrJ   firstr   rm   r   r	   HTTP_404_NOT_FOUND)r    rJ   rt   roles       r_   fetch_role_by_slugrz      sv      88D>  DII!6$**,!FGMMODK((..
--# s   BBpayload
is_seedinguse_provided_slugc                 x  K   	 t        |d      r|j                  r|r| j                  t              j	                  t        j                  |j                  k(        j                         }|rg|r<t        j                  d|j                   d       |r|S t        j                  |      S t        t        j                  d|j                   d      |j                  }nt        | t        |j                        }t        |j                  ||j                  xs dt!        j"                         |rdn|j$                  	      }| j'                  |       | j)                          | j+                  |       t-        j.                         j1                  |j2                  D 	cg c]  }	|j$                  |	d
 c}	      }
| j5                  |
       | j)                          | j+                  |       |j6                  rBt9        |j6                        dkD  r*t;        | |j$                  |j6                         d{    |r|S t        j                  |      S c c}	w 7 "# t<        $ r t        t        j                  d      t>        $ r,}t        t        j                  dtA        |             d}~ww xY ww)a  
    Create a new role (synchronous version)

    This function is used for seeding data during app startup.

    Args:
        db: Database session
        payload: Role creation data
        current_user: User performing the action
        return_raw: Whether to return the raw DB model or schema
        is_seeding: Whether this is being called during initial seeding
        use_provided_slug: Whether to use the slug provided in payload instead of generating
    rJ   zRole with slug z" already exists, skipping creationz already existsr.   )r    instance
slug_labelFN)rH   rJ   
is_default
created_atcreated_by_idrole_idpermission_idr   r    r   user_idsz#Attempting to create duplicate rolezCannot create role: )!hasattrrJ   r7   r   r?   rw   loggerinfor   rm   r   r	   HTTP_400_BAD_REQUESTr   rH   r   r   nowr@   addcommitrefreshr   insertvaluesr)   executeusersrj   assign_role_to_usersr   rk   rP   )r    r{   r&   rt   r|   r}   existing	role_slugnew_rolepidpermission_map_statementes               r_   create_roler      s*    *,m7F#9Jxx~,,TYY',,-FGMMOHKK/',,?a bc'18Zz7P7PQY7ZZ'$*$?$?/ZaZfZfYggvHw   I,Tgmm\I--))2U||~",$,//
 	x
		


8#8#?#?#A#H#HGNGZGZ[s;[$
  	

+,
		


8==S/!3&"hkkGMMZZZO((22 \ [  s(C(CLqrr m(C(CNbcfghcibjLkllmsm   J:BI J:I *J:+C7I "I8BI :I;I J:I J:I ,J7'J22J77J:c                   K   t        | |d       d{   }|j                  rt        t        j                  d      g |_        | j                          t        j                         j                  |j
                  D cg c]  }|j                  |d c}      }| j                  |       | j                          | j                  |       |j                  rBt        |j                        dkD  r*t        | |j                  |j                         d{    	 |j                   |j                   |_        |j                  |j                  |_        | j                          | j                  |       t#        j$                  |      S 7 |c c}w 7 }# t&        $ r,}t        t        j(                  d	t+        |             d}~ww xY ww)
z
    Update a role
    T)r    rJ   rt   Nz*Default role cannot be modified or deletedr.   r   r   r   zCannot update role: )rz   r   r   r	   rC   r)   r   r   r   r   r@   r   r   r   rj   r   rH   r   rm   rk   r   rP   )r    rJ   r{   r&   ry   r   r   r   s           r_   update_roler      sz     $rFFD<<?
 	

 DIIK4;;=DD?F?R?RSTWWs	3S  JJ'(IIKJJt}}W]]+a/"b$''GMMRRRm==$ DJ)%00DO
		


4((..= G 	T 	S  m(C(CNbcfghcibjLkllmsT   GFA-GFBGFG A/F GG	G#'G

GGslugsc                 `  K   	 | j                  t              j                  t        j                  dk(        j	                         D cg c]  }|j
                   }}|j                  d      D cg c]  }|j                          }}|D ]  }| j                  t              j                  t        j
                  |k(        j                         }|st        t        j                  d| d      | j                  t              j                  t        j                  |j                  k(        j                         }||v rt        t        j                  d      |st        t        j                   d       | j                  t              j                  t        j
                  j#                  |            j%                  d	       | j'                          d
diS c c}w c c}w # t        $ r  t(        $ r,}	t        t        j                  dt+        |	             d}	~	ww xY ww)z%
    Remove a role entry by slug
    Tr-   zRole with slug 'z' not found.r.   zCannot delete default role.zThe role is assigned to user.F)synchronize_sessiondeletedzCannot delete role: N)r7   r   r?   r   rl   rJ   rB   striprw   r   r	   rx   r   r   r@   r   HTTP_412_PRECONDITION_FAILEDrf   deleter   rk   rP   )
r    r   xdefault_role_slugsrZ   	to_deleterJ   ry   user_permissionr   s
             r_   remove_roler   $  s    m.0hhtn.C.CDOOW[D[.\.`.`.bcaffcc(-C(891QWWY9	9 	D88D>((d):;AACD#0I0ITdeidjjvRwxx hh7>>?V?VZ^ZaZa?abhhjO))#0K0KTqrr # & C CLk 	 	diimmI67>>SX>Y
		4  + d9(   m(C(CNbcfghcibjLkllmsO   H.AG- 	G#G- 1G(CG- "B G- "H.#
G- -H+?'H&&H++H.r   r   c                   K   | j                  t              j                  t        j                  |k(        j	                         }|s0|st        d| d       yt        t        j                  d|       g }|D ]  }| j                  t              j                  t        j                  |k(        j	                         }|sI| j                  t              j                  t        j                  |j                  k(  t        j                  |j                  k(        j	                         }|r|j                  t        |j                  |j                                	 |r"| j                  |       | j                          yy# t         $ r,}t        t        j                  dt#        |             d}~ww xY ww)z
    Assign roles to users (synchronous version)

    Args:
        db: Database session
        role_id: ID of the role to assign
        user_ids: List of user IDs to assign the role to
    zWarning: Role with ID z# not found, but no users to assign.NzNo such role found with id: r.   )r,   r   zCannot assign role: )r7   r   r?   r@   rw   printr   r	   r   r   r,   r   r   rN   bulk_save_objectsr   rk   rP   )	r    r   r   r   user_permission_recordsr,   user_recordrole_already_assignedr   s	            r_   r   r   E  s     xx~$$TWW%78>>@H*7)3VWX"77B^_f^g@h  ! ihhuo,,U]]g-EFLLN HH_%V'';>>9''8;;6 UW 	 %#**?;>>[c[f[f+gh!i$m"  !89IIK #  m(C(CNbcfghcibjLkllms0   D.G12G$#F	 G		F>'F99F>>Gkeysc                   K   | j                  t              j                  t        j                  dk(  t        j                  dk(        j                         }|sdddS | j                  t              j                  t        j                  dk(        j                         D cg c]  }|j                   }}|sdddS 	 t        j                  |D cg c]  }||j                  d c}      }| j                  |       | j                          d	diS c c}w c c}w # t        $ r}dt        |      dcY d
}~S d
}~ww xY ww)z 
    Reset role permissions
    Tinvoice_view_costFzPermission not found)reseterrorownerzNo default roles foundr   r   N)r7   r   r?   rc   rh   rw   r   rJ   rl   r@   r   r   r   r   rk   rP   )r    r   
permissionr   default_role_idsr   r   r   s           r_   run_map_role_permissionsr   t  s    
 	##J$8$8D$@*BVBVZmBmnttv  )?@@&(hhtn&;&;DII<P&Q&U&U&WXXX)ABB	1#8#?#?Qabg:==Ab$
  	

+,
		 Y c  1Q001sT   B"E$D7	ED  D*+D  ED   	E)D<6E7E<EEr,   c                 p  K   | j                  t              j                  t        j                  |k(        j	                         }|sg S | j                  t
              j                  t
        j                  |j                  k(        j                         }|D cg c]  }|j                   c}S c c}w w)zGet user's role IDs)	r7   r   r?   r,   rw   r   r@   rl   r   )r    r,   userro   ups        r_   r=   r=     s     88E?!!%--7":;AACD	xx0778O8OSWSZSZ8Z[__a!122BJJ222s   BB6B1.B6c                 6  K   t        | |       d{   }|sg S | j                  t              j                  t        j                  j                  |            j                         }|D cg c]  }t        |d      s|j                   c}S 7 ~c c}w w)zGet user's role slugsr+   NrJ   )	r=   r7   r   r?   r@   rf   rl   r   rJ   )r    r,   role_idsrolesry   s        r_   rd   rd     st     &"g>>H	HHTN!!$''++h"78<<>E"'A$74+@DIIAA ?
 Bs(   BBAB/BBBBc                   K   | j                  t              j                  t        j                  |k(        j	                         }|sg S | j                  t
              j                  t
        j                  |j                  k(  t
        j                  dk7        j                         }|D cg c]  }|j                   }}t        | |       d{   }| j                  t              j                  t        j                  j                  j                  |            j                         }|D cg c]  }|j                   }	}t        t        ||	z               }
|
S c c}w 7 c c}w w)zGet user's permission IDsNr+   )r7   r   r?   r,   rw   r   r@   r   rl   r=   r   cr   rf   listset)r    r,   r   direct_permissionsr   direct_permission_idsr   role_permissionsrprole_permission_idsall_permission_idss              r_   re   re     s(    88E?!!%--7":;AACD	 	!	''4772O4Q4QUY4Y	Z	  9KK"R--KK&"g>>Hxx 56==>S>U>U>]>]>a>abj>klppr6FG2++GGc"7:M"MNO L> Hs1   B+E.-E" E.E'A!E.4E)!E.)E.c                 :   t         j                  }|D ]s  }| j                  t              j	                  t        j
                  |d   k(        j                         }|rLt        |d   |d   |d         }| j                  |       u | j                          ddiS )zQ
    Seed default templates: welcome user, verify user, and forgot password.
    keynamer   )rJ   rH   r   messagez!Default data seeded successfully.)	r   r   r7   r   r?   rJ   rw   r   r   )r    r   ry   existsr   s        r_   seed_default_rolesr     s     E 
HHTN!!$))tE{":;AAC 	 %[6l-H
 FF8
 IIK:;;    )r6   
   N)F)FFF)N)Aloggingr   typingr   r   r   r   fastapir   r	   
sqlalchemyr
   r   r   sqlalchemy.excr   sqlalchemy.ormr   r   sqlalchemy.orm.queryr   0src.apps.role_permission.models.permission_modelr   *src.apps.role_permission.models.role_modelr   r   5src.apps.role_permission.models.user_permission_modelr   'src.apps.role_permission.schemas.commonr   r   )src.apps.role_permission.schemas.requestsr   r   r   src.apps.user.models.user_modelr   src.core.configr   src.utils.constantsr   src.utils.helpers.functionsr   src.utils.helpers.paginationr   src.utils.template_seederr   	getLogger__name__r   rP   intr`   rs   boolrz   r   r   r   r   r   r=   rd   re   r    r   r_   <module>r      s     . . ) & & ) . & G R Q P 
 2 $ , < 7 0			8	$ SS!S S #Y	S
 S S S 
Sl....9<.LQ.	
.b   RWXbdhXhRi & #AmAm$Am Am 	Am
 Am Am :tAmH)m)m
)m %)m 	)m
 )mXm' m# m$ mB QS ,m7 ,mS ,mDI ,mW[ ,m^1w 1c 1T 183 3# 3$s) 3B' BC BDI Bg  S	 2<7 <r   