
    ]i.                         d Z ddlZddlZddlZddlZddlmZ  ej                  e      Z	dgZ
d Zdededefd	Zd
edededededefdZdedeeef   fdZdeddfdZy)z5Google Drive upload utility menggunakan OAuth2 token.    N)settingsz%https://www.googleapis.com/auth/drivec                     ddl m}  ddlm} ddlm} t        j                  }|j                  |t              }|j                  s|j                  rl|j                  r`|j                   |               t        |d      5 }|j                  |j!                                ddd       t"        j%                  d       nt'        d       |d	d
|      S # 1 sw Y   5xY w)zBBuild Google Drive API service menggunakan OAuth2 token dari file.r   )Request)Credentials)buildwNzGDrive: access token di-refreshzYToken tidak valid dan tidak bisa di-refresh. Jalankan ulang scripts/gdrive_oauth_setup.pydrivev3)credentials)google.auth.transport.requestsr   google.oauth2.credentialsr   googleapiclient.discoveryr   r   GDRIVE_TOKEN_PATHfrom_authorized_user_fileGDRIVE_SCOPESvalidexpiredrefresh_tokenrefreshopenwriteto_jsonloggerinfoRuntimeError)r   r   r   
token_pathcredsfs         2/var/www/html/spbu.com/backend/app/utils/gdrive.py_get_drive_servicer       s    65/++J11*mLE;;==U00MM')$j#&!( 'KK9:? 
 $E22 '&s   ? CC	parent_idfolder_namereturnc                     d| d| d}| j                         j                  |d      j                         }|j                  dg       }|r|d   d   S |d	|gd
}| j                         j	                  |d      j                         }|d   S )z6Ambil folder ID berdasarkan nama, buat jika belum ada.zname='z' and 'zP' in parents and mimeType='application/vnd.google-apps.folder' and trashed=falsez	files(id))qfieldsfilesr   idz"application/vnd.google-apps.folder)namemimeTypeparents)bodyr&   )r'   listexecutegetcreate)servicer!   r"   queryresultsr'   metadatafolders           r   _get_or_create_subfolderr6   '   s      ; 	 
 mmo""U;"?GGIGKK$EQx~ 8;H
 ]]_##$#?GGIF$<    
file_bytesunique_name	spbu_codetipeenvc                 0   ddl m} t               }t        j                  }| d| d| }|}	|j                  d      D ]  }
t        ||	|
      }	 t        j                  |      \  }}|xs d}||	gd} |t        j                  |       |d      }|j                         j                  ||d	      j                         }|d
   }|j                         j                  |ddd      j                          d| d}t        j!                  d||       |S )z
    Upload file ke Google Drive.

    Struktur folder: {root}/{env}/{spbu_code}/{tipe}/
    Nama file: unique_name (sudah diformat oleh save_upload)

    Return: URL web view (https://drive.google.com/file/d/{id}/view)
    r   )MediaIoBaseUpload/application/octet-stream)r)   r+   T)mimetype	resumablezid,webViewLink)r,   
media_bodyr&   r(   anyonereader)typerole)fileIdr,   z https://drive.google.com/file/d/z/viewu   GDrive: uploaded '%s' → %s)googleapiclient.httpr>   r    r   GDRIVE_ROOT_FOLDER_IDsplitr6   	mimetypes
guess_typeioBytesIOr'   r0   r.   permissionsr   r   )r8   r9   r:   r;   r<   r>   r1   root_idfolder_pathcurrent_parentpart	mime_type_file_metadatamediauploadedfile_idurls                     r   gdrive_uploadr\   =   s<    7 "G,,GE9+Qtf-KN!!#&1'>4P ' ''4LIq77I "#M 


:E
 }}%% &  gi	  tnG   1 !  gi,WIU
;C
KK.SAJr7   rZ   c                 v   ddl m} t               }|j                         j	                  | d      j                         }|j	                  dd      }|j                         j                  |       }t        j                         } |||      }d}|s|j                         \  }	}|s|j                         |fS )zDownload file bytes from Google Drive by file ID.

    Returns (content_bytes, mime_type).
    Raises RuntimeError if download fails.
    r   )MediaIoBaseDownloadr*   )rH   r&   r@   rH   F)rI   r^   r    r'   r/   r.   	get_mediarN   rO   
next_chunkgetvalue)
rZ   r^   r1   rW   content_typerequestfh
downloaderdonerV   s
             r   gdrive_fetchrh   v   s     9 "GMMO''wz'JRRTM $$Z1KLLmmo''w'7G	B$R1JD'')4 ;;=,&&r7   file_urlc                 H   	 | j                  d      d   j                  d      d   }t               }|j                         j                  |      j	                          t
        j                  d|       y# t        $ r!}t
        j                  d| |       Y d}~yd}~ww xY w)	z6Hapus file dari Google Drive berdasarkan web view URL.z/d/   r?   r   r_   zGDrive: deleted file_id '%s'u    GDrive: gagal delete '%s' — %sN)	rK   r    r'   deleter.   r   r   	Exceptionwarning)ri   rZ   r1   es       r   gdrive_deleterp      s    H..'*005a8$&g.6682G< H98QGGHs   A4A7 7	B! BB!)__doc__rN   loggingrL   uuidapp.core.configr   	getLogger__name__r   r   r    strr6   bytesr\   tuplerh   rp    r7   r   <module>r{      s    ; 	    $			8	$8930 3 3 ,666 6 	6
 
6 	6r'# '%s
"3 '*	HC 	HD 	Hr7   