11from flask import Flask , jsonify , request
22from flask_jwt_extended import JWTManager , jwt_required , get_jwt_identity
33from dotenv import load_dotenv
4- from file_store import read , write
54import os
5+ import logging
6+ import sys
7+
8+ # Add src directory to Python path so imports work in both direct execution and module execution
9+ if os .path .dirname (__file__ ) not in sys .path :
10+ sys .path .insert (0 , os .path .dirname (__file__ ))
11+
12+ from data_store import read , write
13+
14+ # Configure logging
15+ logging .basicConfig (level = logging .INFO , format = '%(asctime)s - %(levelname)s - %(message)s' )
16+ logger = logging .getLogger (__name__ )
617
718load_dotenv ()
819
1324
1425@jwt .invalid_token_loader
1526def invalid_token_callback (error_string ):
27+ logger .warning (f"Invalid token provided: { error_string } " )
1628 return jsonify ({'status' : 'error' , 'message' : 'Invalid token' }), 422
1729
1830@jwt .expired_token_loader
1931def expired_token_callback (jwt_header , jwt_payload ):
32+ logger .warning ("Expired token used" )
2033 return jsonify ({'status' : 'error' , 'message' : 'Token expired' }), 422
2134
2235@jwt .unauthorized_loader
2336def unauthorized_callback (error_string ):
37+ logger .warning (f"Unauthorized access: { error_string } " )
2438 return jsonify ({'status' : 'error' , 'message' : 'Missing or invalid token' }), 422
2539
2640@app .route ('/api/sync' , methods = ['GET' , 'PUT' , 'POST' ])
@@ -30,28 +44,74 @@ def sync():
3044 users = os .environ ['JWT_USERS' ].split (',' )
3145
3246 if user_id not in users :
47+ logger .warning (f"Unauthorized access attempt by user: { user_id } " )
3348 return jsonify ({'status' : 'error' , 'message' : 'Unauthorized!' }), 401
3449
3550 if request .method == 'GET' :
36- return read (user_id )
51+ data , status = read (user_id )
52+ if status == 200 :
53+ return jsonify (data ), 200
54+ else :
55+ return jsonify ({'status' : 'error' , 'message' : data }), status
3756
3857 if request .method == 'POST' :
58+ logger .info (f"User { user_id } testing sync endpoint" )
3959 return 'test ok'
4060
4161 if request .method == 'PUT' :
62+ logger .info (f"User { user_id } writing sync data" )
4263 data = request .get_json ()
43- return write (data , user_id )
64+ status_msg , status = write (data , user_id )
65+ if status == 200 :
66+ return status_msg , 200
67+ else :
68+ return jsonify ({'status' : 'error' , 'message' : status_msg }), status
4469
4570 return jsonify ({'status' : 'error' , 'message' : 'Unsupported method!' }), 405
4671
4772@app .route ('/test' , methods = ['GET' ])
4873def test ():
74+ logger .info ("Test endpoint accessed" )
4975 return 'ok'
5076
5177
5278if __name__ == '__main__' :
53- port = os .environ ['PORT' ]
54- host = os .environ ['HOST' ]
79+ port = int (os .environ .get ('PORT' , 5000 ))
80+ host = os .environ .get ('HOST' , '127.0.0.1' )
81+
82+ logger .info ("=== Electerm Sync Server Starting ===" )
83+ logger .info (f"Server will run at: http://{ host } :{ port } " )
84+ logger .info (f"API endpoint: http://{ host } :{ port } /api/sync" )
85+ logger .info (f"Test endpoint: http://{ host } :{ port } /test" )
86+
87+ # Show JWT configuration
88+ jwt_secret = os .environ .get ('JWT_SECRET' , '' )
89+ jwt_users = os .environ .get ('JWT_USERS' , '' )
90+
91+ if jwt_secret :
92+ logger .info ("JWT_SECRET configured (check your .env file)" )
93+ else :
94+ logger .warning ("JWT_SECRET not configured in environment variables" )
95+
96+ if jwt_users :
97+ users_list = jwt_users .split (',' )
98+ logger .info (f"Authorized users: { ', ' .join (users_list )} " )
99+ logger .info (f"Use one of these as JWT_USER_NAME in Electerm: { users_list [0 ]} " )
100+ else :
101+ logger .warning ("No JWT_USERS configured in environment variables" )
102+
103+ # Show data store location
104+ from data_store import db_path
105+ logger .info (f"Data store location: { db_path } " )
106+
107+ logger .info ("=== Configuration for Electerm ===" )
108+ logger .info (f"Server URL: http://{ host } :{ port } " )
109+ logger .info ("Set these values in Electerm sync settings:" )
110+ logger .info ("- Custom sync server URL: http://{host}:{port}" )
111+ logger .info ("- JWT_SECRET: check your .env file" )
112+ logger .info ("- JWT_USER_NAME: (see authorized users above)" )
113+ logger .info ("=== Server Ready ===" )
114+
55115 app .run (
56116 host = host ,
57117 port = port ,
0 commit comments