
    3g1                     ^   d dl Z d dlZd dlZ G d d      Z G d d      Z G d d      Zedk(  r ed	      Zej                  d
d       ej                  dd       ej                  d
      Z
e
 ed       ej                  d      Ze ed        ee
j                                 ee
j                  e              ee
j                                 eej                                 ee
j!                                 eej!                                 ee
j                                yy)    Nc                       e Zd Zd Zy)Tokenc                      || _         || _        y N)tokenexpiry)selfr   r   s      ,/var/www/html/friend-locator/db_interface.py__init__zToken.__init__   s    
    N)__name__
__module____qualname__r    r   r
   r   r      s    r   r   c                   >    e Zd Zd
dZd Zd Zd Zd Zd Zd Z	d Z
y	)Databasec                 Z   || _         	 t        j                  |d      | _        | j                  j	                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       y # t        $ r t        d      w xY w)	NF)check_same_threada   CREATE TABLE IF NOT EXISTS users(
                         user_id           INTEGER    PRIMARY KEY,
                         name              TEXT       UNIQUE NOT NULL,
                         password          TEXT       NOT NULL
                         );
                         ao  CREATE TABLE IF NOT EXISTS tokens(
                        user_id            INTEGER    REFERENCES users(user_id) ON DELETE CASCADE, 
                        token              TEXT       NOT NULL UNIQUE,
                        token_expiry       INTEGER    NOT NULL,
                        PRIMARY KEY(user_id)
                        );
                         ai  CREATE TABLE IF NOT EXISTS locations(
                        user_id            INTEGER    REFERENCES users(user_id) ON DELETE CASCADE,
                        latitude           REAL       NOT NULL,
                        longitude          REAL       NOT NULL,
                        PRIMARY KEY(user_id)
                        );
                        aY  CREATE TABLE IF NOT EXISTS friends(
                        user_id_1            INTEGER   REFERENCES users(user_id) ON DELETE CASCADE,
                        user_id_2            INTEGER   REFERENCES users(user_id) ON DELETE CASCADE,
                        PRIMARY KEY(user_id_1, user_id_2)
                        );
                        ai  CREATE TABLE IF NOT EXISTS friend_requests(
                        from_user                 INTEGER   REFERENCES users(user_id) ON DELETE CASCADE,
                        to_user                   INTEGER   REFERENCES users(user_id) ON DELETE CASCADE,
                        PRIMARY KEY(from_user, to_user)
                        );
                        zDatabase initialization error.)token_lengthsqlite3connectdbcursorexecute	Exception)r	   database_pathr   r   s       r
   r   zDatabase.__init__   s    ()	>oomuMDGWW^^%FNN   NN   NN   NN   NN    	><==	>s   BB B*c                 t    g }|D ]0  }|j                  | j                  |      j                                2 |S r   )appendget_client_from_idget_name)r	   id_list	name_listids       r
   user_id_list_to_name_listz"Database.user_id_list_to_name_list<   sC    	 	B++B/88:	
 r   c                     | j                   j                         }d}	 |j                  |||f       | j                   j                          | j                  ||      S # t        j                  $ r Y y w xY w)NzT
            INSERT INTO users(name, password)
            values(?, ?)
            )r   r   r   r   IntegrityErrorcommitget_client_from_credentials)r	   usernamepasswordr   querys        r
   create_clientzDatabase.create_clientE   sn    !	NN58X"67 	//(CC	 %% 		s   A A43A4c                     | j                   j                         }d}|j                  |||f       |j                         }|sy |d   }t	        | j                   |      S )Nzs
            SELECT user_id FROM users
            WHERE name     LIKE ?
            AND   password =    ?
        r   r   r   r   fetchoneClient)r	   r)   r*   r   r+   resultuser_ids          r
   r(   z$Database.get_client_from_credentialsV   sZ    !
 	ux24")dggw''r   c                     | j                   j                         }d}|j                  ||f       |j                         }|sy |d   }t	        | j                   |      S )NzQ
            SELECT user_id FROM users
            WHERE name     LIKE ?
        r   r.   )r	   r)   r   r+   r1   r2   s         r
   get_client_from_namezDatabase.get_client_from_namef   sW    ! 	uxk+")dggw''r   c                 .    t        | j                  |      S r   )r0   r   )r	   	client_ids     r
   r   zDatabase.get_client_from_idv   s    dggy))r   c                     | j                   j                         }|j                  d|f       |j                         }|y |d   }t	        | j                   |      S )NzD
            SELECT user_id FROM tokens WHERE token = ?
            r   r.   )r	   r   r   r1   r2   s        r
   get_client_from_tokenzDatabase.get_client_from_tokeny   s\    ! H		
 " >)dggw''r   c                 8    | j                   j                          y r   )r   close)r	   s    r
   r:   zDatabase.close   s    r   N)@   )r   r   r   r   r$   r,   r(   r4   r   r8   r:   r   r   r
   r   r      s,    +>^D"( ( *("r   r   c                       e Zd ZdZdZdZdZdZd Zd Z	e
d        Zd	 Zd
 Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zy)r0                  c                      || _         || _        y r   )r   r2   )r	   r   r2   s      r
   r   zClient.__init__   s    r   c                     | j                   j                         }d}|j                  || j                  | j                  f      j	                         }| j                  |      S )Nz
        SELECT user_id_1 FROM friends
        WHERE user_id_2 = ?
        UNION
        SELECT user_id_2 FROM friends
        WHERE user_id_1 = ?
        r   r   r   r2   fetchall_sql_results_to_listr	   r   r+   resultss       r
   get_friendszClient.get_friends   sR    ! ..t||(DENNP((11r   c                 @    g }| D ]  }|j                  |d           |S )Nr   )r   )rH   listresult_tuples      r
   rF   zClient._sql_results_to_list   s-    # 	)LKKQ(	) r   c                    | j                   |j                   k(  ry| j                  j                         }d}|j                  || j                   |j                   |j                   | j                   f      j	                         }|d   dk\  S )NFz
        SELECT COUNT(*) FROM friends
        WHERE (user_id_1 = ? AND user_id_2 = ?) OR
        (user_id_1 = ? AND user_id_2 = ?)
        r   r=   )r2   r   r   r   r/   r	   friendr   r+   r1   s        r
   is_friends_withzClient.is_friends_with   st    <<6>>)! \\6>>6>>4<<H

(* 	 ayA~r   c                    || j                  |      sy| j                  j                         }d}|j                  || j                  |j                  |j                  | j                  f       | j                  j                          y)NFz
        DELETE FROM FRIENDS
        WHERE (user_id_1 = ? AND user_id_2 = ?) OR
        (user_id_1 = ? AND user_id_2 = ?)
        T)rP   r   r   r   r2   r'   r	   rO   r   r+   s       r
   unfriendzClient.unfriend   sm    >!5!5f!=! 	ullFNNFNNDLLI	 	r   c                     |y| j                   j                         }d}|j                  ||j                  | j                  f       | j                   j	                          y)NFzY
        DELETE FROM friend_requests
        WHERE to_user = ? AND from_user = ?
        Tr   r   r   r2   r'   rR   s       r
   withdraw_friend_requestzClient.withdraw_friend_request   sO    >!
 	uv~~t||<=r   c                 j   ||j                   | j                   k(  r| j                  S | j                  |      r| j                  S | j                  j                         }d}|j                  || j                   |j                   f      }|j                         d   dk(  r| j                  S d}|j                  ||j                   | j                   f      }|j                         d   dk(  rPd}|j                  || j                   |j                   f       | j                  j                          | j                  S d}|j                  || j                   |j                   f       d}|j                  || j                   |j                   f       | j                  j                          | j                  S )Nzv
            SELECT count(*) FROM friend_requests
            WHERE from_user = ? AND
            to_user = ?
        r   r=   zb
            INSERT INTO friend_requests(from_user, to_user)
            values(?, ?)
            zq
            DELETE FROM friend_requests
            WHERE to_user = ? AND
            from_user = ?
            z\
            INSERT INTO friends(user_id_1, user_id_2)
            values(?, ?)
            )r2   FAILURErP   ALREADY_FRIENDSr   r   r   r/   DUPLICATE_REQUESTr'   REQUEST_SENTFRIEND_ADDEDrN   s        r
   send_friend_requestzClient.send_friend_request   sl   >V^^t||;<<''''!
 fnn'EF??Q1$)))

 'EF ??Q1$E
 NN54<<"@AGGNN$$$E NN54<<"@AE NN54<<"@AGGNN$$$r   c                     | j                   j                         }d}|j                  || j                  f       |j	                         }|y|d   }|t        t        j                               kD  S )NzK
            SELECT token_expiry FROM tokens WHERE user_id = ?
            Fr   )r   r   r   r2   r/   inttime)r	   r   r+   r1   r   s        r
   has_valid_tokenzClient.has_valid_token%  sb    ! 	ut||o/">DIIK(((r   c                     | j                   j                         }d}|j                  || j                  f       |j	                         }|y |d   }|d   }t        ||      S )NzZ
            SELECT token, token_expiry FROM tokens
            WHERE user_id = ?
        r   r=   )r   r   r   r2   r/   r   )r	   r   r+   rH   r   r   s         r
   	get_tokenzClient.get_token5  sb    ! 	ut||o/"?
UF##r   c                    | j                   j                         }d}d}|sZt        j                  |      }t	        t        j
                               |z   }	 |j                  || j                  ||f       d}|sZ| j                   j                          t              S # t        j                  $ r t        d       Y Iw xY w)Nzy
                INSERT OR REPLACE INTO tokens(user_id, token, token_expiry)
                values(?, ?, ?)
            FTz&Generated non-unique token. Try again.)r   r   secretstoken_urlsafer_   r`   r   r2   r   r&   printr'   r   )r	   r   
lifetime_sr   r+   valid_token	new_tokenr   s           r
   generate_new_tokenzClient.generate_new_tokenF  s    !
 --l;I%
2Fut||Y&GI"  	Y'' )) >?s   !B! !CCc                     | j                   j                         }d}|j                  || j                  ||f       | j                   j	                          y )Nzq
            INSERT OR REPLACE INTO locations (user_id, latitude, longitude)
            VALUES(?, ?, ?)
        rU   )r	   latlonr   r+   s        r
   set_locationzClient.set_location[  sB    ! 	ut||S#67r   c                     | j                   j                         }d}|j                  || j                  f      j	                         }| j                  |      S )NzQ
        SELECT from_user FROM friend_requests
        WHERE to_user = ?
        rD   )r	   r   r+   r1   s       r
   get_incoming_friend_requestsz#Client.get_incoming_friend_requestsd  sK    !
 7@@B((00r   c                     | j                   j                         }d}|j                  || j                  f      j	                         }| j                  |      S )NzQ
        SELECT to_user FROM friend_requests
        WHERE from_user = ?
        rD   rG   s       r
   get_outgoing_friend_requestsz#Client.get_outgoing_friend_requestsn  sK    !
 ..8AAC((11r   c                     | j                   j                         }d}|j                  || j                  f       |j	                         }|sdS |S )Nza
            SELECT latitude, longitude FROM locations
            WHERE user_id = ?
            )NNr   r   r   r2   r/   rG   s       r
   get_locationzClient.get_locationx  sH    !
 	ut||o///##*|77r   c                     | j                   j                         }d}|j                  || j                  f       |j	                         }|sd S |d   S )NzO
            SELECT name FROM users 
            WHERE user_id = ?
            r   ru   rG   s       r
   r    zClient.get_name  sL    !
 	ut||o///#"t2
2r   c                 2   | j                         }|st        d       nt        |       t        | j                         t        | j                                | j	                         }|t        d       y t        d|d           t        d|d           y )NzNo name.zNo location.zlat: r   zlon: r=   )r    rg   r2   ra   rv   )r	   namelocations      r
   rg   zClient.print  s~    }}*$Kdlld""$%$$&.!E(1+'(E(1+'(r   N)r;   i:	 )r   r   r   rX   r[   rZ   r\   rY   r   rI   staticmethodrF   rP   rS   rV   r]   ra   rc   rk   ro   rq   rs   rv   r    rg   r   r   r
   r0   r0      s|    GLLO2"  $$$8%v) $"(*12
8
3)r   r0   __main__zdatabase.sqlitelogan1r*   logan2zUser1 does not existzUser2 does not exist)r   r`   re   r   r   r0   r   r   r,   r4   user1rg   user2rI   r]   rs   rq   r   r   r
   <module>r      s#      @ @FQ) Q)f z	#	$BXz*Xz*##H-E}$%##H-E}$% 
%


	%
#
#E
*+	%
,
,
./	%
,
,
./	%
,
,
./	%
,
,
./	%


% r   