From 1b7a37c4e1fc3a80e149581222a7a3673a9128e4 Mon Sep 17 00:00:00 2001 From: Swapnil Date: Tue, 30 Jan 2024 20:35:02 +0530 Subject: [PATCH] db-service: Updated table schema & exposed new APIs --- database/main.py | 62 +++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/database/main.py b/database/main.py index deef244..d55ee95 100644 --- a/database/main.py +++ b/database/main.py @@ -1,6 +1,7 @@ from flask import Flask, jsonify, request from flask_sqlalchemy import SQLAlchemy from datetime import datetime +import uuid app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tokens.db' # Use SQLite for simplicity @@ -8,11 +9,13 @@ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class Token(db.Model): - id = db.Column(db.Integer, primary_key=True) + id = db.Column(db.String(36), primary_key=True, default=str(uuid.uuid4())) + email = db.Column(db.String(255), nullable=False) access_token = db.Column(db.String(255), nullable=False) refresh_token = db.Column(db.String(255), nullable=False) expiration_seconds = db.Column(db.Integer, nullable=False) - is_logged_in = db.Column(db.Boolean, default=True) + readwise_api_key = db.Column(db.String(255)) + active = db.Column(db.Boolean, default=True) timestamp = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): @@ -26,46 +29,51 @@ with app.app_context(): @app.route('/token', methods=['POST']) def create_token(): data = request.get_json() + email = data.get('email') access_token = data.get('access_token') refresh_token = data.get('refresh_token') expiration_seconds = data.get('expiration_seconds') - if not access_token or not refresh_token or not expiration_seconds: + if not email or access_token or not refresh_token or not expiration_seconds: return 'Missing required fields', 400 - new_token = Token(access_token=access_token, refresh_token=refresh_token, expiration_seconds=expiration_seconds) + # unique email when active is true + existing_token = Token.query.filter_by(email=email, active=True).first() + if existing_token: + return jsonify({'error': 'An active token with this email already exists'}), 400 + + new_token = Token(email=email, access_token=access_token, refresh_token=refresh_token, expiration_seconds=expiration_seconds) db.session.add(new_token) db.session.commit() - return ('', 204) + return jsonify({'id': new_token.id}), 201 -# API to get the latest token entry -@app.route('/token/latest', methods=['GET']) -def get_latest_token(): - latest_token = Token.query.order_by(Token.timestamp.desc()).first() - - if latest_token: - token_info = { - 'id': latest_token.id, - 'access_token': latest_token.access_token, - 'refresh_token': latest_token.refresh_token, - 'expiration_seconds': latest_token.expiration_seconds, - 'is_logged_in': latest_token.is_logged_in, - 'timestamp': int(latest_token.timestamp.timestamp()) - } - return jsonify({'token': token_info}), 200 - else: - return '', 204 +# API to get the token based on the id +@app.route('/token/', methods=['GET']) +def get_token_by_id(id): + token = Token.query.get_or_404(id) + token_info = { + 'id': token.id, + 'email': token.email, + 'access_token': token.access_token, + 'refresh_token': token.refresh_token, + 'expiration_seconds': token.expiration_seconds, + 'readwise_api_key': token.readwise_api_key, + 'active': token.active, + 'timestamp': int(token.timestamp.timestamp()) + } + return jsonify({'token': token_info}), 200 # API to update the token based on the id @app.route('/token/', methods=['PUT']) -def update_token(id): +def update_token_by_id(id): token = Token.query.get_or_404(id) data = request.get_json() - token.access_token = data.get('access_token') or token.access_token - token.refresh_token = data.get('refresh_token') or token.refresh_token - token.expiration_seconds = data.get('expiration_seconds') or token.expiration_seconds - token.is_logged_in = data.get('is_logged_in') + token.access_token = data.get('access_token', token.access_token) + token.refresh_token = data.get('refresh_token', token.refresh_token) + token.expiration_seconds = data.get('expiration_seconds', token.expiration_seconds) + token.active = data.get('active', token.active) + token.readwise_api_key = data.get('readwise_api_key', token.readwise_api_key) db.session.commit() return '', 204