Separate services - app, db, and job #1

Open
swapnil wants to merge 36 commits from swapnil/inoreader2readwise:main into main
Showing only changes of commit 706ff9d90f - Show all commits

View File

@ -22,6 +22,18 @@ class Token(db.Model):
def __repr__(self): def __repr__(self):
return f'<Token {self.id}>' return f'<Token {self.id}>'
# This table stores email-wise last annotation timestamp
# only one entry per email
class AnnotationLastUpdate(db.Model):
id = db.Column(db.String(36), primary_key=True, default=str(uuid.uuid4()))
email = db.Column(db.String(255), nullable=False)
last_update_time = db.Column(db.DateTime, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow)
def __repr__(self):
return f'<AnnotationLastUpdate {self.id}>'
# Create an application context # Create an application context
with app.app_context(): with app.app_context():
db.create_all() db.create_all()
@ -115,7 +127,7 @@ def update_token_by_id(id):
# deactivate token # deactivate token
@app.route('/token/<id>/deactivate', methods=['POST']) @app.route('/token/<id>/deactivate', methods=['POST'])
def deactivate_token(id): def deactivate_token_by_id(id):
token = Token.query.get_or_404(id) token = Token.query.get_or_404(id)
token.active = False token.active = False
db.session.commit() db.session.commit()
@ -139,5 +151,50 @@ def get_all_tokens():
} for token in tokens] } for token in tokens]
return jsonify({'tokens': tokens_info}), 200 return jsonify({'tokens': tokens_info}), 200
# API to create or update the last annotation timestamp
@app.route('/annotation_last_update', methods=['POST'])
def create_or_update_annotation_last_update():
data = request.get_json()
email = data.get('email')
last_update_time = data.get('last_update_time')
required_fields = ['email', 'last_update_time']
missing_fields = [field for field in required_fields if not data.get(field)]
if missing_fields:
return jsonify({'error': f'Missing required fields: {", ".join(missing_fields)}'}), 400
existing_annotation_last_update = AnnotationLastUpdate.query.filter_by(email=email).first()
if existing_annotation_last_update:
existing_annotation_last_update.last_update_time = last_update_time
existing_annotation_last_update.updated_at = datetime.utcnow()
db.session.commit()
return '', 204
else:
new_annotation_last_update = AnnotationLastUpdate(
email=email,
last_update_time=last_update_time
)
db.session.add(new_annotation_last_update)
db.session.commit()
return '', 204
# API to get the last annotation timestamp based on the email
@app.route('/annotation_last_update/<email>', methods=['GET'])
def get_annotation_last_update_by_email(email):
if not email:
return jsonify({'error': 'Missing email query parameter'}), 400
annotation_last_update = AnnotationLastUpdate.query.filter_by(email=email).first()
if not annotation_last_update:
return '', 204
annotation_last_update_info = {
'id': annotation_last_update.id,
'email': annotation_last_update.email,
'last_update_time': int(annotation_last_update.last_update_time.timestamp()),
'created_at': int(annotation_last_update.created_at.timestamp()),
'updated_at': int(annotation_last_update.updated_at.timestamp())
}
return jsonify(annotation_last_update_info), 200
if __name__ == '__main__': if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True) app.run(host='0.0.0.0', port=5000, debug=True)