diff --git a/app.py b/app.py index eff025e..731705d 100644 --- a/app.py +++ b/app.py @@ -1,11 +1,13 @@ from flask import Flask from flask_cors import CORS from routes.search import search_bp +from routes.credentials import credentials_bp def create_app(): app = Flask(__name__) CORS(app) app.register_blueprint(search_bp, url_prefix='/api') + app.register_blueprint(credentials_bp, url_prefix='/api/credentials') return app if __name__ == '__main__': diff --git a/routes/__pycache__/credentials.cpython-312.pyc b/routes/__pycache__/credentials.cpython-312.pyc new file mode 100644 index 0000000..865eabf Binary files /dev/null and b/routes/__pycache__/credentials.cpython-312.pyc differ diff --git a/routes/credentials.py b/routes/credentials.py new file mode 100644 index 0000000..1b24ffd --- /dev/null +++ b/routes/credentials.py @@ -0,0 +1,65 @@ +from flask import Blueprint, request, jsonify +from routes.utils.credentials import ( + get_credential, + list_credentials, + create_credential, + delete_credential, + edit_credential +) + +credentials_bp = Blueprint('credentials', __name__) + +@credentials_bp.route('/', methods=['GET']) +def handle_list_credentials(service): + try: + return jsonify(list_credentials(service)) + except ValueError as e: + return jsonify({"error": str(e)}), 400 + except Exception as e: + return jsonify({"error": str(e)}), 500 + +@credentials_bp.route('//', methods=['GET', 'POST', 'PUT', 'DELETE']) +def handle_single_credential(service, name): + try: + if request.method == 'GET': + return jsonify(get_credential(service, name)) + + elif request.method == 'POST': + data = request.get_json() + create_credential(service, name, data) + return jsonify({"message": "Credential created successfully"}), 201 + + elif request.method == 'PUT': + data = request.get_json() + edit_credential(service, name, data) + return jsonify({"message": "Credential updated successfully"}) + + elif request.method == 'DELETE': + delete_credential(service, name) + return jsonify({"message": "Credential deleted successfully"}) + + except (ValueError, FileNotFoundError, FileExistsError) as e: + status_code = 400 + if isinstance(e, FileNotFoundError): + status_code = 404 + elif isinstance(e, FileExistsError): + status_code = 409 + return jsonify({"error": str(e)}), status_code + except Exception as e: + return jsonify({"error": str(e)}), 500 + +@credentials_bp.route('/all/', methods=['GET']) +def handle_all_credentials(service): + try: + credentials = [] + for name in list_credentials(service): + credentials.append({ + "name": name, + "data": get_credential(service, name) + }) + return jsonify(credentials) + except (ValueError, FileNotFoundError) as e: + status_code = 400 if isinstance(e, ValueError) else 404 + return jsonify({"error": str(e)}), status_code + except Exception as e: + return jsonify({"error": str(e)}), 500 \ No newline at end of file diff --git a/routes/utils/__pycache__/credentials.cpython-312.pyc b/routes/utils/__pycache__/credentials.cpython-312.pyc new file mode 100644 index 0000000..c8ba950 Binary files /dev/null and b/routes/utils/__pycache__/credentials.cpython-312.pyc differ diff --git a/routes/utils/credentials.py b/routes/utils/credentials.py index 6350c3c..c2567ac 100644 --- a/routes/utils/credentials.py +++ b/routes/utils/credentials.py @@ -2,23 +2,54 @@ import json from pathlib import Path import shutil -def get_credentials(): +def get_credential(service, name): """ - Retrieves all existing credential names for Spotify and Deezer. + Retrieves existing credential contents by name. + Args: + service (str): 'spotify' or 'deezer' + name (str): Custom name of the credential to retrieve + Returns: - dict: A dictionary with 'spotify' and 'deezer' keys containing lists of credential names. + dict: Credential data as dictionary + + Raises: + FileNotFoundError: If the credential doesn't exist + ValueError: For invalid service name """ - creds = {'spotify': [], 'deezer': []} - base_dir = Path('./creds') + if service not in ['spotify', 'deezer']: + raise ValueError("Service must be 'spotify' or 'deezer'") - for service in ['spotify', 'deezer']: - service_dir = base_dir / service - if service_dir.exists() and service_dir.is_dir(): - # Get all directory names under the service directory - creds[service] = [entry.name for entry in service_dir.iterdir() if entry.is_dir()] + creds_dir = Path('./creds') / service / name + file_path = creds_dir / 'credentials.json' - return creds + if not file_path.exists(): + raise FileNotFoundError(f"Credential '{name}' not found for {service}") + + with open(file_path, 'r') as f: + return json.load(f) + +def list_credentials(service): + """ + Lists all available credential names for a service + + Args: + service (str): 'spotify' or 'deezer' + + Returns: + list: Array of credential names + + Raises: + ValueError: For invalid service name + """ + if service not in ['spotify', 'deezer']: + raise ValueError("Service must be 'spotify' or 'deezer'") + + service_dir = Path('./creds') / service + if not service_dir.exists(): + return [] + + return [d.name for d in service_dir.iterdir() if d.is_dir()] def create_credential(service, name, data):