
    Ti "                         d dl Z d dlZd dlZd dlmZmZmZmZ d dlZddl	m
Z
 ddlmZmZ ej                  j                  e
d      Z G d d      Z e       Zy)	    N)ListDictAnyOptional   )USER_DATA_DIR)MigrationManagerCURRENT_VERSIONzlocalmanus.dbc                   f   e Zd Zd Zd Zd ZdedefdZdee	ee
f      fdZd#ded
edededee   f
dZdededefdZdedee	ee
f      fdZdedee	ee
f      fdZd#dededefdZdedee	ee
f      fdZdefdZdedefdZd#dededededef
dZdee	ee
f      fd Zdefd!Zdefd"Zy	)$DatabaseServicec                 x    t         | _        | j                          t               | _        | j                          y N)DB_PATHdb_path_ensure_db_directoryr	   _migration_manager_init_dbselfs    M/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/services/db_service.py__init__zDatabaseService.__init__   s)    !!#"2"4    c                     t        j                  t         j                  j                  | j                        d       y)z$Ensure the database directory existsT)exist_okN)osmakedirspathdirnamer   r   s    r   r   z$DatabaseService._ensure_db_directory   s!    
BGGOODLL1DAr   c                    t        j                  | j                        5 }|j                  d       |j                  d      }|j	                         }t        d|dt               |3|j                  d       | j                  j                  |dt               nE|d   t        k  r9t        d|d   d	t               | j                  j                  ||d   t               ddd       y# 1 sw Y   yxY w)
z/Initialize the database with the current schemaz
                CREATE TABLE IF NOT EXISTS db_version (
                    version INTEGER PRIMARY KEY
                )
            zSELECT version FROM db_versionzlocal db versionzlatest versionNz+INSERT INTO db_version (version) VALUES (0)r   zMigrating database from versionto)	sqlite3connectr   executefetchoneprintr
   r   migrate)r   conncursorcurrent_versions       r   r   zDatabaseService._init_db   s    __T\\* 	[dLL   \\"BCF$oo/O$o7GY&JK''//aI #o579KTSbc''//oa6H/Z)	[ 	[ 	[s   B?C((C1idnamec                   K   t        j                  | j                        4 d{   }|j                  d||f       d{    |j	                          d{    ddd      d{    y7 I7 /7 7 # 1 d{  7  sw Y   yxY ww)zCreate a new canvasNz[
                INSERT INTO canvases (id, name)
                VALUES (?, ?)
            	aiosqliter"   r   r#   commitr   r*   r+   dbs       r   create_canvaszDatabaseService.create_canvas.   s     $$T\\2 	 	b**  d   ))+	 	 	 	 	 	 	h   $BA0BA8A2A8A4A8B*A6+B2A84A86B8B
>B?B
Breturnc                 ~  K   t        j                  | j                        4 d{   }t        j                  |_        |j                  d       d{   }|j                          d{   }|D cg c]  }t        |       c}cddd      d{    S 7 t7 H7 2c c}w 7 # 1 d{  7  sw Y   yxY ww)zGet all canvasesNz
                SELECT id, name, description, thumbnail, created_at, updated_at
                FROM canvases
                ORDER BY updated_at DESC
            	r.   r"   r   r!   Rowrow_factoryr#   fetchalldictr   r1   r(   rowsrows        r   list_canvaseszDatabaseService.list_canvases7   s     $$T\\2 	/ 	/b$[[BN:: '  F
  **D)-.#DI.	/ 	/ 	/
 +.	/ 	/ 	/ 	/z   $B=BB=*B(BB(,B-B(5B!B(	B=B&B=B(B(!B(&B=(B:.B1/B:6B=Nmodelprovider	canvas_idtitlec           	      $  K   t        j                  | j                        4 d{   }|j                  d|||||f       d{    |j	                          d{    ddd      d{    y7 L7 /7 7 # 1 d{  7  sw Y   yxY ww)zSave a new chat sessionNz
                INSERT INTO chat_sessions (id, model, provider, canvas_id, title)
                VALUES (?, ?, ?, ?, ?)
            r-   )r   r*   r@   rA   rB   rC   r1   s          r   create_chat_sessionz#DatabaseService.create_chat_sessionC   s     $$T\\2 	 	b**  eXy%8: : : ))+	 	 	: 	 	 	 	h   $BA3BA;A5A;A7A;"B-A9.B5A;7A;9B;BBB	B
session_idrolemessagec                    K   t        j                  | j                        4 d{   }|j                  d|||f       d{    |j	                          d{    ddd      d{    y7 J7 /7 7 # 1 d{  7  sw Y   yxY ww)zSave a chat messageNzt
                INSERT INTO chat_messages (session_id, role, message)
                VALUES (?, ?, ?)
            r-   )r   rG   rH   rI   r1   s        r   create_messagezDatabaseService.create_messageL   s     $$T\\2 	 	b**  dG,. . . ))+	 	 	. 	 	 	 	h   $BA1BA9A3A9A5A9 B+A7,B3A95A97B9B?B BBc                   K   t        j                  | j                        4 d{   }t        j                  |_        |j                  d|f       d{   }|j                          d{   }g }|D ]=  }t        |      }|d   s	 t        j                  |d         }|j                  |       ? |cddd      d{    S 7 7 u7 _#  Y ]xY w7 # 1 d{  7  sw Y   yxY ww)zGet chat history for a sessionNz
                SELECT role, message, id
                FROM chat_messages
                WHERE session_id = ?
                ORDER BY id ASC
            rI   )r.   r"   r   r!   r7   r8   r#   r9   r:   jsonloadsappend)	r   rG   r1   r(   r<   messagesr=   row_dictmsgs	            r   get_chat_historyz DatabaseService.get_chat_historyU   s     $$T\\2 	 	b$[[BN:: '
    F  **DH 9I&"jj))<= , )	 	 	  +%	 	 	 	s   $C.C
C.,CCC.C/C)C5C8C.CC.CCCCC.C+C" C+'C.c                   K   t        j                  | j                        4 d{   }t        j                  |_        |r|j                  d|f       d{   }n|j                  d       d{   }|j                          d{   }|D cg c]  }t        |       c}cddd      d{    S 7 7 b7 J7 4c c}w 7 # 1 d{  7  sw Y   yxY ww)zList all chat sessionsNz
                    SELECT id, title, model, provider, created_at, updated_at
                    FROM chat_sessions
                    WHERE canvas_id = ?
                    ORDER BY updated_at DESC
                z
                    SELECT id, title, model, provider, created_at, updated_at
                    FROM chat_sessions
                    ORDER BY updated_at DESC
                r6   )r   rB   r1   r(   r<   r=   s         r   list_sessionszDatabaseService.list_sessionsm   s     $$T\\2 	/ 	/b$[[BN!zz +
  \ # #  "zz +   
  **D)-.#DI.!	/ 	/ 	/#
 +.!	/ 	/ 	/ 	/s   $CB9C.CB;C2B=3C
B?CC%C'C3C4C;C=C?CCCCCCCdata	thumbnailc                    K   t        j                  | j                        4 d{   }|j                  d|||f       d{    |j	                          d{    ddd      d{    y7 J7 /7 7 # 1 d{  7  sw Y   yxY ww)zSave canvas dataNz
                UPDATE canvases 
                SET data = ?, thumbnail = ?, updated_at = STRFTIME('%Y-%m-%dT%H:%M:%fZ', 'now')
                WHERE id = ?
            r-   )r   r*   rW   rX   r1   s        r   save_canvas_dataz DatabaseService.save_canvas_data   s     $$T\\2 	 	b**  	2&	( ( (
 ))+	 	 	(
 	 	 	 	rL   c                   K   t        j                  | j                        4 d{   }t        j                  |_        |j                  d|f       d{   }|j                          d{   }| j                  |       d{   }|r7|d   rt        j                  |d         ni |d   |dcddd      d{    S 	 ddd      d{    y7 7 7 l7 U7 7 # 1 d{  7  sw Y   yxY ww)zGet canvas dataNzj
                SELECT data, name
                FROM canvases
                WHERE id = ?
            rW   r+   )rW   r+   sessions)r.   r"   r   r!   r7   r8   r#   r$   rV   rN   rO   )r   r*   r1   r(   r=   r\   s         r   get_canvas_datazDatabaseService.get_canvas_data   s     $$T\\2 	 	b$[[BN:: ' 	 F
 ))C!//33H7:6{DJJs6{3K (	 	 	" #	 	 	
 *3	 	 	 	 	s   $C8CC8,C#CC#.C/C#C+C#3C8?C C8C#C8C!C8C#C#C#C8!C8#C5)C,*C51C8c                   K   t        j                  | j                        4 d{   }|j                  d|f       d{    |j	                          d{    ddd      d{    y7 H7 /7 7 # 1 d{  7  sw Y   yxY ww)zDelete canvas and related dataNz!DELETE FROM canvases WHERE id = ?r-   r   r*   r1   s      r   delete_canvaszDatabaseService.delete_canvas   sw     $$T\\2 	 	b**@2%HHH))+	 	 	H	 	 	 	h   $BA/BA7A1A7A3A7B)A5*B1A73A75B7B	=B >B	Bc                   K   t        j                  | j                        4 d{   }|j                  d||f       d{    |j	                          d{    ddd      d{    y7 I7 /7 7 # 1 d{  7  sw Y   yxY ww)zRename canvasNz)UPDATE canvases SET name = ? WHERE id = ?r-   r0   s       r   rename_canvaszDatabaseService.rename_canvas   sz     $$T\\2 	 	b**H4QS*UUU))+	 	 	U	 	 	 	r3   api_jsondescriptioninputsoutputsc           	      $  K   t        j                  | j                        4 d{   }|j                  d|||||f       d{    |j	                          d{    ddd      d{    y7 L7 /7 7 # 1 d{  7  sw Y   yxY ww)zCreate a new comfy workflowNz
                INSERT INTO comfy_workflows (name, api_json, description, inputs, outputs)
                VALUES (?, ?, ?, ?, ?)
            r-   )r   r+   rd   re   rf   rg   r1   s          r   create_comfy_workflowz%DatabaseService.create_comfy_workflow   s     $$T\\2 	 	b**  +vw?A A A ))+	 	 	A 	 	 	 	rF   c                 ~  K   t        j                  | j                        4 d{   }t        j                  |_        |j                  d       d{   }|j                          d{   }|D cg c]  }t        |       c}cddd      d{    S 7 t7 H7 2c c}w 7 # 1 d{  7  sw Y   yxY ww)zList all comfy workflowsNz]SELECT id, name, description, api_json, inputs, outputs FROM comfy_workflows ORDER BY id DESCr6   r;   s        r   list_comfy_workflowsz$DatabaseService.list_comfy_workflows   s     $$T\\2 	/ 	/b$[[BN::  'F  G  GF**D)-.#DI.		/ 	/ 	/ G*.		/ 	/ 	/ 	/r?   c                   K   t        j                  | j                        4 d{   }|j                  d|f       d{    |j	                          d{    ddd      d{    y7 H7 /7 7 # 1 d{  7  sw Y   yxY ww)zDelete a comfy workflowNz(DELETE FROM comfy_workflows WHERE id = ?r-   r_   s      r   delete_comfy_workflowz%DatabaseService.delete_comfy_workflow   sw     $$T\\2 	 	b**G"OOO))+	 	 	O	 	 	 	ra   c                    K   t        j                  | j                        4 d{   }t        j                  |_        |j                  d|f       d{   }|j                          d{   }ddd      d{    	 t        d   t              r|d   }|S t        j                  |d         }|S 7 7 c7 M7 ?# 1 d{  7  sw Y   OxY w# t        j                  $ r}t        d|       d}~ww xY ww)zGet comfy workflow dictNz1SELECT api_json FROM comfy_workflows WHERE id = ?rd   z,Stored workflow api_json is not valid JSON: )r.   r"   r   r!   r7   r8   r#   r$   
isinstancer:   rN   rO   JSONDecodeError
ValueError)r   r*   r1   r(   r=   workflow_jsonexcs          r   get_comfy_workflowz"DatabaseService.get_comfy_workflow   s    $$T\\2 	* 	*b$[[BN::CbU F ))C	* 	*	S c*ot4 J 
 !  ZZJ0 
 ! 	* *	* 	* 	* 	* ## 	SKC5QRR	Ss   $C>B8C>,C B:C .B</C 3C>>B>?C>C C>C 7C>:C <C >C> CC	CC>C;(C66C;;C>r   )__name__
__module____qualname__r   r   r   strr2   r   r   r   r>   r   rE   rK   rT   rV   rZ   r]   r`   rc   ri   rk   intrm   rt    r   r   r   r      s   B[0c  
/T$sCx.%9 
/C  s WZ cklocp s #   d38n9M 0/S /T$sCx.5I /( C C  c3h0H *c c   s QT ^a lo /Dc3h,@ /c S3 Sr   r   )r!   rN   r   typingr   r   r   r   r.   config_servicer   migrations.managerr	   r
   r   joinr   r   
db_servicerz   r   r   <module>r      sJ      	 , ,  ) A
'',,}o
6HS HSV 
r   