Files
VoiceVault/backend/__pycache__/db_queries.cpython-311.pyc

132 lines
29 KiB
Plaintext
Raw Normal View History

2026-02-14 21:46:48 -07:00
<EFBFBD>
2026-02-15 10:33:57 -07:00
<00><00>i<EFBFBD>?<00><00><00>UdZddlZddlmZmZmZmZmZddlm Z ddl
m Z m Z e <09><00>ej d<06><00>pd<07><00><00>Zej d<08><00>pd<07><00><00>Zeres ed <09><00><00>e ee<10><00>Z
e ed
2026-02-15 10:33:57 -07:00
<d ed eeeeffd <0A>Zd ed eeeeffd<0E>Zdeded eeeffd<11>Zded eeeffd<13>Z dMdededededed eeeff d<1B>ZdNdeded eeeffd<1F>Zded ed eeeeffd!<21>Zded efd"<22>Zd#eeefd eeeffd$<24>Z d%ed eeeeffd&<26>Z!d'ed eeeeffd(<28>Z"d#eeefd eeeffd)<29>Z#ded eeeeffd*<2A>Z$dOd%ededed eeeeffd-<2D>Z%dPdeded.eed%eed eeeeff
d/<2F>Z&ded0eeefd eeeeffd1<64>Z'ded#eeefd eeeffd2<64>Z(ded eeeeffd3<64>Z)ded4ed eeeffd5<64>Z*ded eeeeffd6<64>Z+ded#eeefd eeeffd7<64>Z,ded eeeeffd8<64>Z-ded9eeeefd eeeeffd:<3A>Z.dQdededed eeeeffd<<3C>Z/dRd%ed>ededed eeeeff
d?<3F>Z0dSd%ed@ee1ded eeeeffdA<64>Z2d#eeefd eeeffdB<64>Z3dTdeed%eededed eeeeff
dD<EFBFBD>Z4ded eeeffdE<64>Z5defdF<64>Z6defdG<64>Z7defdH<64>Z8defdI<64>Z9defdJ<64>Z:ded0e;fdK<64>Z'defdL<64>Z$dS)Uz9
2026-02-14 21:46:48 -07:00
Supabase data layer aligned with TitanForge/schema.sql.
2026-02-15 10:33:57 -07:00
<EFBFBD>N)<05>Any<6E>Dict<63>List<73>Optional<61>Tuple)<01> load_dotenv)<02>Client<6E> create_client<6E> SUPABASE_URL<52><00>SUPABASE_SERVICE_ROLE_KEYzHMissing SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY environment variables.<2E>supabase<73>response<73>returnc<00>(<00>t|dd<00><00>pgS)N<>data)<01>getattr)rs <20> TitanForge/backend/db_queries.py<70>_rowsrs<00><00> <12>8<EFBFBD>V<EFBFBD>T<EFBFBD> *<2A> *<2A> 0<>b<EFBFBD>0<>c<00>8<00>t|<00><00>}|r|dndS)Nr)r)rrs r<00>_firstrs <00><00> <10><18>?<3F>?<3F>D<EFBFBD><1A> $<24>4<EFBFBD><01>7<EFBFBD>7<EFBFBD><04>$r<00>page<67>limitc<00><><00>td|<00><00>}ttd|<01><00>d<02><00>}|dz
2026-02-14 21:46:48 -07:00
|z}||zdz
}||fS)N<><00>d)<02>max<61>min)rr<00>start<72>ends r<00> _paginater"sL<00><00> <0E>q<EFBFBD>$<24><<3C><<3C>D<EFBFBD> <0F><03>A<EFBFBD>u<EFBFBD> <0A> <0A>s<EFBFBD> #<23> #<23>E<EFBFBD> <11>A<EFBFBD>X<EFBFBD><15> <1E>E<EFBFBD>
2026-02-14 21:46:48 -07:00
<0F>%<25>-<2D>!<21>
<1B>C<EFBFBD> <10>#<23>:<3A>r<00> stored_pathc<00><><00>|pd<01>dd<03><00>}t|<01><00>dks|dr|dstd|<00><00><02><00><00>|d|dfS)z
Convert stored path like 'archives/user/uuid/original/file.mp4'
into ('archives', 'user/uuid/original/file.mp4').
r <00>/r<00>rzInvalid storage path format: )<03>split<69>len<65>
ValueError)r#<00>partss r<00>_parse_bucket_pathr+'sg<00><00>
<19> <1E>B<EFBFBD> %<25> %<25>c<EFBFBD>1<EFBFBD> -<2D> -<2D>E<EFBFBD>
<EFBFBD>5<EFBFBD>z<EFBFBD>z<EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>A<EFBFBD>h<EFBFBD><EFBFBD>e<EFBFBD>A<EFBFBD>h<EFBFBD><EFBFBD><18>F<><1B>F<>F<>G<>G<>G<> <10><11>8<EFBFBD>U<EFBFBD>1<EFBFBD>X<EFBFBD> <1D>r<00>application/octet-streamF<6D>bucket<65> object_path<74>content<6E> content_type<70>upsertc<00><><00>tj<00>|<00><00><00>|||t |<04><00><00><00><00>d<01><02><00>S)zK
Upload bytes to Supabase Storage and return upload response data.
)z content-typer1)r<00>storage<67>from_<6D>upload<61>str<74>lower)r-r.r/r0r1s r<00>upload_storage_objectr82sO<00><00> <11><18><1E><1E>v<EFBFBD>&<26>&<26> <0F><16> <17> <13>)<29>S<EFBFBD><16>[<5B>[<5B>5F<35>5F<35>5H<35>5H<35> I<> I<>
<EFBFBD>
<EFBFBD>r<00><00>post_id<69>
expires_inc<00>N<00>t<00>d<01><00><00>d<02><00><00>d|<00><00><00>dd<05><00><00>d<06><00><00><00><00>}t |<02><00>}|std<07><00><00>t|d<00><00>\}}tj <00>
|<04><00><00> ||<01><00>}t|t<00><00>r}|<06>d <09><00>pf|<06>d
<EFBFBD><00>pQ|<06>d i<00><00><00>d
<EFBFBD><00>p(|<06>d i<00><00><00>d <09><00>}nd }|std <0A><00><00>||||<03>d<0E><00>||d<0F>S)zH
Return a signed URL for the original audio/video archive file.
<20> archive_fileszpath, content_typer:<00>role<6C>original_audiorz,Original audio file not found for this post.<2E>path<74> signedURL<52> signedUrlrNz/Failed to create signed URL for original audio.r0)r:r-r.r0<00>
signed_urlr;)r<00>table<6C>select<63>eqr<00>executerr)r+r3r4<00>create_signed_url<72>
isinstance<EFBFBD>dict<63>get<65> RuntimeError)r:r;r<00>rowr-r.<00>signedrCs r<00>get_original_audio_urlrOFs<><00><00>
<11><0E><0E><EFBFBD>'<27>'<27> <0F><16>$<24> %<25> %<25> <0B><12>I<EFBFBD>w<EFBFBD> <1F> <1F> <0B><12>F<EFBFBD>$<24> %<25> %<25> <0E><15>q<EFBFBD><18><18> <10><17><19><19>  <0A> <11><18>
<1A>
<1A>C<EFBFBD> <0E>I<01><18>G<>H<>H<>H<>,<2C>S<EFBFBD><16>[<5B>9<>9<><17>F<EFBFBD>K<EFBFBD> <15> <1D> #<23> #<23>F<EFBFBD> +<2B> +<2B> =<3D> =<3D>k<EFBFBD>:<3A> V<> V<>F<EFBFBD><12>&<26>$<24><1F><1F><1A> <12>J<EFBFBD>J<EFBFBD>{<7B> #<23> #<23> 7<><15>z<EFBFBD>z<EFBFBD>+<2B>&<26>&<26> 7<><15>z<EFBFBD>z<EFBFBD>&<26>"<22>%<25>%<25>)<29>)<29>+<2B>6<>6<> 7<><16>z<EFBFBD>z<EFBFBD>&<26>"<22>%<25>%<25>)<29>)<29>+<2B>6<>6<> <13>
<EFBFBD><1A>
2026-02-15 01:52:26 -07:00
<EFBFBD> <15>N<01><1A>L<>M<>M<>M<><1B><18>"<22><1B><07><07><0E>/<2F>/<2F> <20> <20>  <06> <06>rr>c<00><00>t<00>d<01><00><00>d<02><00><00>d|<00><00><00>d|<01><00><00>d<05><00><00><00><00>}t |<02><00>S)Nr=<00>*r:r>r)rrDrErFrrGr)r:r>rs r<00>get_archive_file_by_rolerRrsc<00><00><10><0E><0E><EFBFBD>'<27>'<27> <0F><16><03><1B><1B> <0B><12>I<EFBFBD>w<EFBFBD> <1F> <1F> <0B><12>F<EFBFBD>D<EFBFBD> <19> <19> <0E><15>q<EFBFBD><18><18> <10><17><19><19>  <0A> <12>(<28> <1B> <1B>rc<00><><00>t|<00><00>\}}tj<00>|<01><00><00>|<02><00>}t |t tf<02><00>rt |<03><00>Std<01><00><00>)zc
Download object bytes from a stored path like
'archives/user/uuid/original/file.mp4'.
z*Failed to download storage object content.) r+rr3r4<00>downloadrI<00>bytes<65> bytearrayrL)r#r-r.r/s r<00>&download_storage_object_by_stored_pathrW~sl<00><00>
-<2D>[<5B>9<>9<><17>F<EFBFBD>K<EFBFBD><16><1E>$<24>$<24>V<EFBFBD>,<2C>,<2C>5<>5<>k<EFBFBD>B<>B<>G<EFBFBD><11>'<27>E<EFBFBD>9<EFBFBD>-<2D>.<2E>.<2E><1E><14>W<EFBFBD>~<7E>~<7E><1D>
<16>C<>
D<EFBFBD>
D<EFBFBD>Dr<00>payloadc<00><><00>ddg}|D]*}|<00>|<02><00>std|<02>d<04><03><00><00><01>+|d|d|<00>d<05><00>|<00>d<06><00>|<00>d<07><00>d<08>}t<00>d <09><00><00>|<03><00><00><00><00>}t |<04><00>}|std
2026-02-14 21:46:48 -07:00
<EFBFBD><00><00>|S) N<>email<69> password_hash<73>'<27>' is required.<2E> display_name<6D>
2026-02-15 01:52:26 -07:00
avatar_url<EFBFBD>bio)rZr[r^r_r`<00>userszFailed to create user.<2E>rKr)rrD<00>insertrGrrL<00>rX<00>required<65>fieldrr<00>createds r<00> create_userrh<00>s<><00><00><17><1F>)<29>H<EFBFBD><19>8<>8<><05><16>{<7B>{<7B>5<EFBFBD>!<21>!<21> 8<><1C>6<><15>6<>6<>6<>7<>7<> 7<> 8<><19><17>!<21> <20><1F>1<><1F> <0B> <0B>N<EFBFBD>3<>3<><1D>k<EFBFBD>k<EFBFBD>,<2C>/<2F>/<2F><16>{<7B>{<7B>5<EFBFBD>!<21>!<21>  <06> <06>D<EFBFBD><18>~<7E>~<7E>g<EFBFBD>&<26>&<26>-<2D>-<2D>d<EFBFBD>3<>3<>;<3B>;<3B>=<3D>=<3D>H<EFBFBD><14>X<EFBFBD><1E><1E>G<EFBFBD> <12>5<><1A>3<>4<>4<>4<> <12>Nr<00>user_idc<00><><00>tt<00>d<01><00><00>d<02><00><00>d|<00><00><00>d<04><00><00><00><00><00><00>S)NrarQrir<00>rrrDrErFrrG)ris r<00>get_user_by_idrl<00>sU<00><00> <11>(<28>.<2E>.<2E><17>)<29>)<29>0<>0<><13>5<>5<>8<>8<><19>G<EFBFBD>L<>L<>R<>R<>ST<53>U<>U<>]<5D>]<5D>_<>_<> `<60> `<60>`rrZc<00><><00>tt<00>d<01><00><00>d<02><00><00>d|<00><00><00>d<04><00><00><00><00><00><00>S)NrarQrZrrk)rZs r<00>get_user_by_emailrn<00>sT<00><00> <11>(<28>.<2E>.<2E><17>)<29>)<29>0<>0<><13>5<>5<>8<>8<><17>%<25>H<>H<>N<>N<>q<EFBFBD>Q<>Q<>Y<>Y<>[<5B>[<5B> \<5C> \<5C>\rc <00><><00>gd<01>}|D],}|<00>|<02><00>dvrtd|<02>d<04><03><00><00><01>-|d|d|<00>d<07><00>|<00>dd <09><00>|<00>d
d <0B><00>|<00>d <0C><00>|<00>d d<0E><00>|d|<00>d<10><00>|<00>d<11><00>|<00>d<12><00>d<13> }t<00>d<14><00><00>|<03><00><00><00><00>}t |<04><00>}|std<15><00><00>|S)N)ri<00>title<6C>storage_prefix)Nr r\r]rirp<00> description<6F>
visibility<EFBFBD>private<74>status<75>uploaded<65> recorded_date<74>language<67>enrq<00>manifest_sha256<35> bundle_sha256<35> published_at) rirprrrsrurwrxrqrzr{r|<00> audio_postszFailed to create audio post.rbrds r<00>create_audio_postr~<00>sN<00><00>5<>5<>5<>H<EFBFBD><19>8<>8<><05> <12>;<3B>;<3B>u<EFBFBD> <1D> <1D><1A> +<2B> +<2B><1C>6<><15>6<>6<>6<>7<>7<> 7<> ,<2C><1B>9<EFBFBD>%<25><18><17>!<21><1E>{<7B>{<7B>=<3D>1<>1<><1D>k<EFBFBD>k<EFBFBD>,<2C> <09>:<3A>:<3A><19>+<2B>+<2B>h<EFBFBD>
2026-02-14 21:46:48 -07:00
<EFBFBD>3<>3<> <20><1B><1B>_<EFBFBD>5<>5<><1B>K<EFBFBD>K<EFBFBD>
2026-02-15 01:52:26 -07:00
<EFBFBD>D<EFBFBD>1<>1<>!<21>"2<>3<>"<22>;<3B>;<3B>'8<>9<>9<> <20><1B><1B>_<EFBFBD>5<>5<><1F> <0B> <0B>N<EFBFBD>3<>3<> <06> <06>D<EFBFBD><18>~<7E>~<7E>m<EFBFBD>,<2C>,<2C>3<>3<>D<EFBFBD>9<>9<>A<>A<>C<>C<>H<EFBFBD><14>X<EFBFBD><1E><1E>G<EFBFBD> <12>;<3B><1A>9<>:<3A>:<3A>:<3A> <12>Nrc<00><><00>t<00>d<01><00><00>d<02><00><00>d|<00><00><00>d<04><00>}t |<01><00><00><00><00>S)Nr}<00>2*, users(user_id, email, display_name, avatar_url)r:r)rrDrErFrrrG)r:<00>querys r<00>get_audio_post_by_idr<64><00>sV<00><00><10><0E><0E>}<7D>%<25>%<25> <0F><16>D<> E<> E<> <0B><12>I<EFBFBD>w<EFBFBD> <1F> <1F> <0E><15>q<EFBFBD><18><18> 
<EFBFBD> <12>%<25>-<2D>-<2D>/<2F>/<2F> "<22> "<22>"rr<00>c<00>&<00>t|||<00><01><00>S)N)rrri)<01>list_audio_posts)rirrs r<00>list_user_historyr<79><00>s<00><00> <1B><14>U<EFBFBD>G<EFBFBD> D<> D<> D<>Drrsc<00>z<00>t||<01><00>\}}t<00>d<01><00><00>d<02><00>}|r|<06>d|<02><00>}|r|<06>d|<03><00>}|<06>dd<06><07><00><00>||<05><00><00><00><00>}t|<07><00>S)Nr}r<>rsri<00>
created_atT<EFBFBD><01>desc<73> r"rrDrErF<00>order<65>rangerGr)rrrsrir r!r<>rs rr<>r<><00>s<><00><00><1A>4<EFBFBD><15>'<27>'<27>J<EFBFBD>E<EFBFBD>3<EFBFBD> <14>N<EFBFBD>N<EFBFBD>=<3D> )<29> )<29> 0<> 0<>1e<31> f<> f<>E<EFBFBD><11>3<><15><08><08><1C>z<EFBFBD>2<>2<><05><0E>-<2D><15><08><08><19>G<EFBFBD>,<2C>,<2C><05><14>{<7B>{<7B><<3C>d<EFBFBD>{<7B>3<>3<>9<>9<>%<25><13>E<>E<>M<>M<>O<>O<>H<EFBFBD> <10><18>?<3F>?<3F>r<00>updatesc<00>T<00><04>|st|<00><00>Shd<01><01><04>fd<02>|<01><00><00>D<00><00>}|st|<00><00>St<00>d<03><00><00>|<02><00><00>d|<00><00><00><00><00>}t|<03><00>S)N>
rprurxrsrrr|r{rwrqrzc<00>$<00><01>i|] \}}|<01>v<00> ||<02><02> S<00>r<>)<04>.0<EFBFBD>k<>v<>alloweds <20>r<00>
<dictcomp>z%update_audio_post.<locals>.<dictcomp><3E>s$<00><><00> ><3E> ><3E> ><3E>d<EFBFBD>a<EFBFBD><11><11>g<EFBFBD><1C><1C>Q<EFBFBD><01><1C><1C>rr}r:)r<><00>itemsrrD<00>updaterFrGr)r:r<><00>cleanrr<>s @r<00>update_audio_postr<74><00>s<><00><><00> <12>-<2D>#<23>G<EFBFBD>,<2C>,<2C>,<2C> <06> <06> <06>G<EFBFBD> ?<3F> ><3E> ><3E> ><3E>g<EFBFBD>m<EFBFBD>m<EFBFBD>o<EFBFBD>o<EFBFBD> ><3E> ><3E> ><3E>E<EFBFBD> <10>-<2D>#<23>G<EFBFBD>,<2C>,<2C>,<2C> <11><0E><0E>}<7D>%<25>%<25> <0F><16><05><1D><1D> <0B><12>I<EFBFBD>w<EFBFBD> <1F> <1F> <10><17><19><19>  <0A> <12>(<28> <1B> <1B>rc<00><><00>gd<01>}|D]*}|<01>|<03><00>std|<03>d<03><03><00><00><01>+||d|d|<01>d<06><00>|<01>d<07><00>|dd <09>}t<00>d
<EFBFBD><00><00>|<04><00><00><00><00>}t |<05><00>}|std <0B><00><00>|S) N)r>r@<00>sha256r\r]r>r@r0<00>
size_bytesr<EFBFBD>)r:r>r@r0r<>r<>r=zFailed to add archive file.rb)r:rXrerfrrrgs r<00>add_archive_filer<65>s<><00><00>)<29>)<29>)<29>H<EFBFBD><19>8<>8<><05><16>{<7B>{<7B>5<EFBFBD>!<21>!<21> 8<><1C>6<><15>6<>6<>6<>7<>7<> 7<> 8<><1B><17><06><0F><17><06><0F><1F> <0B> <0B>N<EFBFBD>3<>3<><1D>k<EFBFBD>k<EFBFBD>,<2C>/<2F>/<2F><19>(<28>#<23>  <06> <06>D<EFBFBD><18>~<7E>~<7E>o<EFBFBD>.<2E>.<2E>5<>5<>d<EFBFBD>;<3B>;<3B>C<>C<>E<>E<>H<EFBFBD><14>X<EFBFBD><1E><1E>G<EFBFBD> <12>:<3A><1A>8<>9<>9<>9<> <12>Nrc<00><><00>t<00>d<01><00><00>d<02><00><00>d|<00><00><00>dd<05><06><00><00><00><00>}t |<01><00>S)Nr=rQr:r<>Fr<46>)rrDrErFr<>rGr)r:rs r<00>list_archive_filesr<73>sX<00><00><10><0E><0E><EFBFBD>'<27>'<27> <0F><16><03><1B><1B> <0B><12>I<EFBFBD>w<EFBFBD> <1F> <1F> <0E><15>|<7C>%<25><15> (<28> (<28> <10><17><19><19>  <0A> <11><18>?<3F>?<3F>r<00>metadatac<00>d<00>||d<01>}tt<00>d<02><00><00>d<03><00><00>d|<00><00><00>d<04><00><00><00><00><00><00>}|rVt<00>d<02><00><00>d|i<01><00><00>d|<00><00><00><00><00>}n?t<00>d<02><00><00>|<02><00><00><00><00>}t|<04><00>}|std<06><00><00>|S)N)r:r<><00>archive_metadatar:rr<>z"Failed to upsert archive metadata.)
rrrDrErFrrGr<>rcrL)r:r<>r<00>existingrrMs r<00>upsert_archive_metadatar<61>#s<00><00><1E>H<EFBFBD> 5<> 5<>D<EFBFBD><15>h<EFBFBD>n<EFBFBD>n<EFBFBD>%7<>8<>8<>?<3F>?<3F> <09>J<>J<>M<>M<>i<EFBFBD>Y`<60>a<>a<>g<>g<>hi<68>j<>j<>r<>r<>t<>t<>u<>u<>H<EFBFBD><0F>M<01><1B>><3E>><3E>"4<>5<>5<><<3C><<3C>j<EFBFBD>(<28>=S<>T<>T<>W<>W<>Xa<58>cj<63>k<>k<>s<>s<>u<>u<><08><08><1B>><3E>><3E>"4<>5<>5<><<3C><<3C>T<EFBFBD>B<>B<>J<>J<>L<>L<><08>
2026-02-14 21:46:48 -07:00
<10><18>
<1A>
2026-02-15 01:52:26 -07:00
<1A>C<EFBFBD> <0E>A<01><1A>?<3F>@<40>@<40>@<40> <0E>Jrc<00><><00>tt<00>d<01><00><00>d<02><00><00>d|<00><00><00>d<04><00><00><00><00><00><00>S)Nr<4E>rQr:rrk<00>r:s r<00>get_archive_metadatar<61>2sV<00><00> <11>(<28>.<2E>.<2E>!3<>4<>4<>;<3B>;<3B>C<EFBFBD>@<40>@<40>C<>C<>I<EFBFBD>w<EFBFBD>W<>W<>]<5D>]<5D>^_<>`<60>`<60>h<>h<>j<>j<> k<> k<>krc<00>`<00>||<01>dd<02><00>|<01>d<03><00>|<01>d<04><00>|<01>d<05><00>|<01>d<06><00>d<07>}tt<00>d<08><00><00>d <09><00><00>d |<00><00><00>d
2026-02-14 21:46:48 -07:00
<EFBFBD><00><00><00><00><00><00>}|rpt<00>d<08><00><00>d <0B>|<02> <00><00>D<00><00><00><00><00>d |<00><00><00><00><00>}n?t<00>d<08><00><00>
2026-02-15 01:52:26 -07:00
|<02><00><00><00><00>}t|<04><00>}|std <0C><00><00>|S) N<>has_speaker_consentF<74>license<73> consent_notes<65> allowed_use<73> restrictions)r:r<>r<>r<>r<>r<><00>archive_rightsr:rc<00>&<00>i|]\}}|dk<00> ||<02><02>Sr<>r<>)r<>r<>r<>s rr<>z)upsert_archive_rights.<locals>.<dictcomp>Ds#<00><00>E<>E<>E<>d<EFBFBD>a<EFBFBD><11>a<EFBFBD>9<EFBFBD>n<EFBFBD>n<EFBFBD>Q<EFBFBD><01>n<EFBFBD>n<EFBFBD>nrz Failed to upsert archive rights.) rKrrrDrErFrrGr<>r<>rcrL)r:rXrr<>rrMs r<00>upsert_archive_rightsr<73>6sh<00><00><1A>&<26>{<7B>{<7B>+@<40>%<25>H<>H<><1A>;<3B>;<3B>y<EFBFBD>)<29>)<29> <20><1B><1B>_<EFBFBD>5<>5<><1E>{<7B>{<7B>=<3D>1<>1<><1F> <0B> <0B>N<EFBFBD>3<>3<>  <06> <06>D<EFBFBD><16>h<EFBFBD>n<EFBFBD>n<EFBFBD>%5<>6<>6<>=<3D>=<3D>i<EFBFBD>H<>H<>K<>K<>I<EFBFBD>W^<5E>_<>_<>e<>e<>fg<66>h<>h<>p<>p<>r<>r<>s<>s<>H<EFBFBD><0F>K<01> <14>N<EFBFBD>N<EFBFBD>+<2B> ,<2C> ,<2C> <13>V<EFBFBD>E<>E<>d<EFBFBD>j<EFBFBD>j<EFBFBD>l<EFBFBD>l<EFBFBD>E<>E<>E<> F<> F<> <0F>R<EFBFBD> <09>7<EFBFBD> #<23> #<23> <14>W<EFBFBD>Y<EFBFBD>Y<EFBFBD> <11><08><1C>><3E>><3E>"2<>3<>3<>:<3A>:<3A>4<EFBFBD>@<40>@<40>H<>H<>J<>J<><08>
2026-02-14 21:46:48 -07:00
<10><18>
<1A>
2026-02-15 01:52:26 -07:00
<1A>C<EFBFBD> <0E>?<3F><1A>=<3D>><3E>><3E>><3E> <0E>Jrc<00><><00>tt<00>d<01><00><00>d<02><00><00>d|<00><00><00>d<04><00><00><00><00><00><00>S)Nr<4E>rQr:rrkr<>s r<00>get_archive_rightsr<73>QsV<00><00> <11>(<28>.<2E>.<2E>!1<>2<>2<>9<>9<>#<23>><3E>><3E>A<>A<>)<29>W<EFBFBD>U<>U<>[<5B>[<5B>\]<5D>^<5E>^<5E>f<>f<>h<>h<> i<> i<>ir<00>chunksc
2026-02-15 01:21:05 -07:00
<00>"<00>|sgSg}|D]<5D>}|<03>d<01><00>}t|t<00><00>r%dd<03>d<04>|D<00><00><00><00>zdz}|<02>||<03>d<06><00>|<03>d<07><00>|<03>d<08><00>|<03>d <09><00>|d
<EFBFBD><06><00><00><>t
2026-02-15 10:33:57 -07:00
<00>d <0B><00><00>|<02><00><00><00><00>}t|<05><00>S) N<> embedding<6E>[<5B>,c3<00>NK<00>|] }tt|<01><00><00><00>V<00><00>!dS<00>N<>r6<00>float<61>r<>r<>s r<00> <genexpr>z!add_rag_chunks.<locals>.<genexpr>_s.<00><00><00><00>&H<>&H<><11>s<EFBFBD>5<EFBFBD><11>8<EFBFBD>8<EFBFBD>}<7D>}<7D>&H<>&H<>&H<>&H<>&H<>&Hr<00>]<5D> start_sec<65>end_sec<65>text<78>
2026-02-15 01:52:26 -07:00
confidence)r:r<>r<>r<>r<>r<><00>
2026-02-15 01:21:05 -07:00
rag_chunks)
2026-02-15 01:52:26 -07:00
rKrI<00>list<73>join<69>appendrrDrcrGr)r:r<><00>rows<77>cr<63>rs r<00>add_rag_chunksr<73>Ws<00><00> <11><12><11> <09> <0A>D<EFBFBD> <13> 
2026-02-15 01:21:05 -07:00
<EFBFBD> 
<EFBFBD><01><15>E<EFBFBD>E<EFBFBD>+<2B>&<26>&<26> <09> <15>i<EFBFBD><14> &<26> &<26> O<01><1B>c<EFBFBD>h<EFBFBD>h<EFBFBD>&H<>&H<>i<EFBFBD>&H<>&H<>&H<>H<>H<>H<>3<EFBFBD>N<>I<EFBFBD> <0C> <0B> <0B>"<22><1E>U<EFBFBD>U<EFBFBD>;<3B>/<2F>/<2F><1C>5<EFBFBD>5<EFBFBD><19>+<2B>+<2B><19><05><05>f<EFBFBD> <0A> <0A><1F>e<EFBFBD>e<EFBFBD>L<EFBFBD>1<>1<>&<26>  <0E> <0E>
2026-02-14 21:46:48 -07:00
<EFBFBD>
<EFBFBD>
<EFBFBD>
2026-02-15 01:52:26 -07:00
<EFBFBD><18>~<7E>~<7E>l<EFBFBD>+<2B>+<2B>2<>2<>4<EFBFBD>8<>8<>@<40>@<40>B<>B<>H<EFBFBD> <10><18>?<3F>?<3F>r<00><>c<00>><00>t||<02><00>\}}t<00>d<01><00><00>d<02><00><00>d|<00><00><00>dd<05><06><00><00>||<04><00><00><00><00>}t|<05><00>S)Nr<4E>rQr:r<>Fr<46>r<>)r:rrr r!rs r<00>list_rag_chunksr<73>osz<00><00><1A>4<EFBFBD><15>'<27>'<27>J<EFBFBD>E<EFBFBD>3<EFBFBD><10><0E><0E>|<7C>$<24>$<24> <0F><16><03><1B><1B> <0B><12>I<EFBFBD>w<EFBFBD> <1F> <1F> <0E><15>{<7B><15><15> '<27> '<27> <0E><15>u<EFBFBD>c<EFBFBD> <1A> <1A> <10><17><19><19>  <0A> <11><18>?<3F>?<3F>r<00><00>
query_textc<00>n<00>t||<03><00>\}}t<00>d<01><00><00>d<02><00><00>d|<00><00><00>dd|<01>d<05><03><00><00>dd<07><08><00><00>||<05><00><00><00><00>}t|<06><00>S) Nr<4E>z<>chunk_id, post_id, start_sec, end_sec, text, confidence, created_at, audio_posts!inner(post_id, user_id, title, visibility, created_at)zaudio_posts.user_idr<64><00>%r<>Tr<54>)
r"rrDrErF<00>iliker<65>r<>rGr)rir<>rrr r!rs r<00>search_rag_chunksr<73>|s<><00><00><1A>4<EFBFBD><15>'<27>'<27>J<EFBFBD>E<EFBFBD>3<EFBFBD><10><0E><0E>|<7C>$<24>$<24> <0F><16> Q<01>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD>
2026-02-15 01:21:05 -07:00
<0C><12> !<21>7<EFBFBD> +<2B> +<2B> <0E><15>v<EFBFBD>(<28>:<3A>(<28>(<28>(<28> )<29> )<29> <0E><15>|<7C>$<24><15> '<27> '<27> <0E><15>u<EFBFBD>c<EFBFBD> <1A> <1A> <10><17><19><19> <0A> <11><18>?<3F>?<3F>r<00>query_embeddingc <00><00>dd<02>d<03>|D<00><00><00><00>zdz}t<00>d||tt d|<02><00>d<07><00>d<08><03><00><00><00><00>}t |<04><00>S) zK
Vector search via SQL RPC function `match_rag_chunks` (pgvector).
2026-02-15 01:52:26 -07:00
r<>r<>c3<00>NK<00>|] }tt|<01><00><00><00>V<00><00>!dSr<>r<>r<>s rr<>z+search_rag_chunks_vector.<locals>.<genexpr><3E>s.<00><00><00><00> H<> H<>1<EFBFBD><13>U<EFBFBD>1<EFBFBD>X<EFBFBD>X<EFBFBD><1D><1D> H<> H<> H<> H<> H<> Hrr<><00>match_rag_chunksrr)<03> p_user_id<69>p_query_embedding<6E> p_match_count)r<>r<00>rpcrrrGr)rir<>r<00> vector_textrs r<00>search_rag_chunks_vectorr<72><00>s<><00><00><16><03><08><08> H<> H<><0F> H<> H<> H<>H<>H<>H<>3<EFBFBD>N<>K<EFBFBD><17>|<7C>|<7C><1A> <20>!,<2C> <20><13>Q<EFBFBD><05><1D><1D><03>4<>4<>
2026-02-15 01:21:05 -07:00
<EFBFBD>
2026-02-15 01:52:26 -07:00
<EFBFBD><06><06><0E>g<EFBFBD>i<EFBFBD>i<EFBFBD> <0A> <11><18>?<3F>?<3F>rc<00><><00>|<00>d<01><00>std<02><00><00>|<00>d<03><00>|<00>d<04><00>|d|<00>d<05><00>d<06>}t<00>d<07><00><00>|<01><00><00><00><00>}t |<02><00>}|std<08><00><00>|S) N<>actionz'action' is required.r:ri<00>details)r:rir<>r<><00> audit_logzFailed to create audit log.rb)rXrrrMs r<00> add_audit_logr<67><00>s<><00><00> <12>;<3B>;<3B>x<EFBFBD> <20> <20>2<><18>0<>1<>1<>1<><1B>;<3B>;<3B>y<EFBFBD>)<29>)<29><1A>;<3B>;<3B>y<EFBFBD>)<29>)<29><19>(<28>#<23><1A>;<3B>;<3B>y<EFBFBD>)<29>)<29>  <06> <06>D<EFBFBD><18>~<7E>~<7E>k<EFBFBD>*<2A>*<2A>1<>1<>$<24>7<>7<>?<3F>?<3F>A<>A<>H<EFBFBD>
2026-02-14 21:46:48 -07:00
<10><18>
<1A>
2026-02-15 01:52:26 -07:00
<1A>C<EFBFBD> <0E>:<3A><1A>8<>9<>9<>9<> <0E>Jrrc<00>z<00>t||<03><00>\}}t<00>d<01><00><00>d<02><00>}|<00>|<06>d|<00><00>}|<01>|<06>d|<01><00>}|<06>dd<06><07><00><00>||<05><00><00><00><00>}t|<07><00>S)Nr<4E>rQr:rir<>Tr<54>r<>)r:rirrr r!r<>rs r<00>list_audit_logsr<73><00>s<><00><00><1A>4<EFBFBD><15>'<27>'<27>J<EFBFBD>E<EFBFBD>3<EFBFBD> <14>N<EFBFBD>N<EFBFBD>;<3B> '<27> '<27> .<2E> .<2E>s<EFBFBD> 3<> 3<>E<EFBFBD><0E><1A><15><08><08><19>G<EFBFBD>,<2C>,<2C><05><0E><1A><15><08><08><19>G<EFBFBD>,<2C>,<2C><05><14>{<7B>{<7B><<3C>d<EFBFBD>{<7B>3<>3<>9<>9<>%<25><13>E<>E<>M<>M<>O<>O<>H<EFBFBD> <10><18>?<3F>?<3F>rc
2026-02-15 10:33:57 -07:00
<00><><00>t|<00><00>}|siS|t|<00><00>t|<00><00>t|<00><00>t |dd<02><03><00>t |dd<04><05><00>d<06>S)Nri<>)rrr<>)r:rr)<06>post<73>filesr<73><00>rightsr<73>r<>)r<>r<>r<>r<>r<>r<>)r:r<>s r<00>get_post_bundler<65><00>su<00><00> <1F><07> (<28> (<28>D<EFBFBD> <0F><12><11> <09><15>#<23>G<EFBFBD>,<2C>,<2C>(<28><17>1<>1<>$<24>W<EFBFBD>-<2D>-<2D>%<25>g<EFBFBD>A<EFBFBD>T<EFBFBD>B<>B<>B<>$<24>W<EFBFBD>1<EFBFBD>C<EFBFBD>H<>H<>H<>  <06> <06>rc<00><><00>t<00>d<01><00><00><00><00><00>d|<00><00><00><00><00>dS)Nr<4E>r:<00>rrD<00>deleterFrGr<>s r<00>delete_rag_chunksr<73><00>sB<00><00> <0C>N<EFBFBD>N<EFBFBD><<3C> <20> <20>'<27>'<27>)<29>)<29>,<2C>,<2C>Y<EFBFBD><07>@<40>@<40>H<>H<>J<>J<>J<>J<>Jrc<00>x<00>t|<00><00>}|D]U} t|d<00><00>\}}tj<00>|<03><00><00>|g<01><00><00>O#Y<00>SxYwt<00>d<02><00><00><00><00><00>d|<00><00><00> <00><00>dS)Nr@r=r:)
r<EFBFBD>r+rr3r4<00>removerDr<>rFrG)r:r<><00> file_infor-r.s r<00>delete_archive_filesr<73><00>s<><00><00> <1E>w<EFBFBD> '<27> '<27>E<EFBFBD><1A><11><11> <09> <11>"4<>Y<EFBFBD>v<EFBFBD>5F<35>"G<>"G<> <1F>F<EFBFBD>K<EFBFBD> <14> <1C> "<22> "<22>6<EFBFBD> *<2A> *<2A> 1<> 1<>;<3B>-<2D> @<40> @<40> @<40> @<40><> <11> <10>D<EFBFBD><44><EFBFBD><EFBFBD> <0C>N<EFBFBD>N<EFBFBD>?<3F>#<23>#<23>*<2A>*<2A>,<2C>,<2C>/<2F>/<2F> <09>7<EFBFBD>C<>C<>K<>K<>M<>M<>M<>M<>Ms <00>A A!<02>!A%c<00><><00>t<00>d<01><00><00><00><00><00>d|<00><00><00><00><00>dS)Nr<4E>r:r<>r<>s r<00>delete_metadatar<61><00>sC<00><00> <0C>N<EFBFBD>N<EFBFBD>%<25>&<26>&<26>-<2D>-<2D>/<2F>/<2F>2<>2<>9<EFBFBD>g<EFBFBD>F<>F<>N<>N<>P<>P<>P<>P<>Prc<00><><00>t<00>d<01><00><00><00><00><00>d|<00><00><00><00><00>dS)Nr<4E>r:r<>r<>s r<00> delete_rightsr<73><00>sC<00><00> <0C>N<EFBFBD>N<EFBFBD>#<23>$<24>$<24>+<2B>+<2B>-<2D>-<2D>0<>0<><19>G<EFBFBD>D<>D<>L<>L<>N<>N<>N<>N<>Nrc<00><><00>t<00>d<01><00><00><00><00><00>d|<00><00><00><00><00>dS<00>Nr}r:r<>r<>s r<00>delete_audio_postr<74><00>sB<00><00> <0C>N<EFBFBD>N<EFBFBD>=<3D>!<21>!<21>(<28>(<28>*<2A>*<2A>-<2D>-<2D>i<EFBFBD><17>A<>A<>I<>I<>K<>K<>K<>K<>Krc<00><><00>t<00>d<01><00><00>|<01><00><00>d|<00><00><00><00><00>t |<00><00>Sr<>)rrDr<>rFrGr<>)r:r<>s rr<>r<><00>sL<00><00> <0C>N<EFBFBD>N<EFBFBD>=<3D>!<21>!<21>(<28>(<28><17>1<>1<>4<>4<>Y<EFBFBD><07>H<>H<>P<>P<>R<>R<>R<> <1F><07> (<28> (<28>(rc<00><><00>t<00>d<01><00><00>d<02><00><00>d|<00><00><00><00><00><00><00><00>}|jr|jndS)Nr}rQr:)rrDrErF<00>singlerGr)r:<00>results rr<>r<><00>s\<00><00> <15>^<5E>^<5E>M<EFBFBD> *<2A> *<2A> 1<> 1<>#<23> 6<> 6<> 9<> 9<>)<29>W<EFBFBD> M<> M<> T<> T<> V<> V<> ^<5E> ^<5E> `<60> `<60>F<EFBFBD> <20>+<2B> /<2F>6<EFBFBD>;<3B>;<3B>4<EFBFBD>/r)r,F)r9)rr<>)rr<>NN)rr<>)rr<>)r<>)NNrr)<<3C>__doc__<5F>os<6F>typingrrrrr<00>dotenvrrr r
<00>getenv<6E>stripr r rL<00>__annotations__r6rr<00>int<6E>tupler"r+rU<00>boolr8rOrRrWrhrlrnr~r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rJr<>rr<00><module>rs<><00><01><04><04><04>
<EFBFBD> <09> <09> <09>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<><1E><1E><1E><1E><1E><1E>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A> <0B> <0B> <0A> <0A> <0A><19><02> <09>.<2E>)<29>)<29>/<2F>R<EFBFBD>6<>6<>8<>8<> <0C>&<26>R<EFBFBD>Y<EFBFBD>'B<>C<>C<>I<>r<EFBFBD>P<>P<>R<>R<><19><13>c<01>4<>c<01>
2026-02-14 21:46:48 -07:00
<16>,<2C>a<>
b<EFBFBD>
b<EFBFBD>b<> <20>=<3D><1C>/H<>I<>I<><08>&<26>I<>I<>I<>1<>C<EFBFBD>1<>D<EFBFBD><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>0<>1<>1<>1<>1<>%<25>S<EFBFBD>%<25>X<EFBFBD>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD>5<>%<25>%<25>%<25>%<25>
<16>C<EFBFBD><16><03><16><05>c<EFBFBD>3<EFBFBD>h<EFBFBD><0F><16><16><16><16><1E>C<EFBFBD><1E>E<EFBFBD>#<23>s<EFBFBD>(<28>O<EFBFBD><1E><1E><1E><1E>3<><18> <06><06> <0F><06><14><06><13><06><16> <06>
<11> <06> 
2026-02-15 01:52:26 -07:00
<EFBFBD>#<23>s<EFBFBD>(<28>^<5E> <06><06><06><06>()<06>)<06>C<EFBFBD>)<06>S<EFBFBD>)<06>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>)<06>)<06>)<06>)<06>X <1C>c<EFBFBD> <1C><13> <1C><18>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E>9Q<39> <1C> <1C> <1C> <1C> E<01><03> E<01><05> E<01> E<01> E<01> E<01><13><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><13>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD><13><13><13><13>*a<01>C<EFBFBD>a<01>H<EFBFBD>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>$<<3C>a<01>a<01>a<01>a<01>]<01>S<EFBFBD>]<01>X<EFBFBD>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD>%=<3D>]<01>]<01>]<01>]<01> <13>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E><13>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E><13><13><13><13>6#<23>#<23>#<23>(<28>4<EFBFBD><03>S<EFBFBD><08>><3E>*B<>#<23>#<23>#<23>#<23>E<01>E<01>s<EFBFBD>E<01>#<23>E<01>#<23>E<01>t<EFBFBD>D<EFBFBD>QT<51>VY<56>QY<51>N<EFBFBD>G[<5B>E<01>E<01>E<01>E<01>
2026-02-14 21:46:48 -07:00
<1B>
<1B>3<EFBFBD>
<1B>3<EFBFBD>
<1B><18>#<23><1D>
<1B>`h<>il<69>`m<>
<1B>y}<7D>C<02>DG<02>IL<02>DL<02>M<02>zN<02>
<1B>
<1B>
<1B>
2026-02-15 01:21:05 -07:00
<1B><1C>s<EFBFBD><1C>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E><1C><08><14>c<EFBFBD>SV<53>h<EFBFBD><1E>@X<><1C><1C><1C><1C>><13>c<EFBFBD><13>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD><13>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E><13><13><13><13>,<1B><03><1B><04>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>(<<3C><1B><1B><1B><1B> <0F>S<EFBFBD> <0F>C<EFBFBD> <0F>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD> <0F> <0F> <0F> <0F>l<01>#<23>l<01>(<28>4<EFBFBD><03>S<EFBFBD><08>><3E>*B<>l<01>l<01>l<01>l<01><0F>3<EFBFBD><0F><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><0F>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD><0F><0F><0F><0F>6j<01><03>j<01><08><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>(@<40>j<01>j<01>j<01>j<01> <1B>C<EFBFBD><1B><14>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD>)=<3D><1B>$<24>t<EFBFBD>C<EFBFBD>QT<51>H<EFBFBD>~<7E>BV<42><1B><1B><1B><1B>0
2026-02-14 21:46:48 -07:00
<1B>
<1B>S<EFBFBD>
<1B><03>
<1B><03>
<1B>d<EFBFBD>4<EFBFBD>PS<50>UX<55>PX<50>><3E>FZ<46>
<1B>
<1B>
<1B>
2026-02-15 01:21:05 -07:00
<1B><1B><1B>s<EFBFBD><1B><03><1B>3<EFBFBD><1B>3<EFBFBD><1B>X\<5C>]a<>be<62>gj<67>bj<62>]k<>Xl<58><1B><1B><1B><1B>" <1B> <1B>c<EFBFBD> <1B>D<EFBFBD><15>K<EFBFBD> <1B>PS<50> <1B>]a<>bf<62>gj<67>lo<6C>go<67>bp<62>]q<> <1B> <1B> <1B> <1B>$<0F>4<EFBFBD><03>S<EFBFBD><08>><3E><0F>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD><0F><0F><0F><0F>$
2026-02-14 21:46:48 -07:00
<1B>
<1B>X<EFBFBD>c<EFBFBD>]<5D>
<1B>H<EFBFBD>S<EFBFBD>M<EFBFBD>
<1B>X[<5B>
<1B>hk<68>
<1B>vz<76>{<>AD<02>FI<02>AI<02>|J<02>wK<02>
<1B>
<1B>
<1B>
2026-02-15 10:33:57 -07:00
<1B> <06>S<EFBFBD> <06>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E> <06> <06> <06> <06>K<01>s<EFBFBD>K<01>K<01>K<01>K<01>N<01>#<23>N<01>N<01>N<01>N<01>Q<01>S<EFBFBD>Q<01>Q<01>Q<01>Q<01>O<01>3<EFBFBD>O<01>O<01>O<01>O<01>L<01>s<EFBFBD>L<01>L<01>L<01>L<01>)<29>s<EFBFBD>)<29>T<EFBFBD>)<29>)<29>)<29>)<29>0<>#<23>0<>0<>0<>0<>0<>0r