added credentials endpoint

This commit is contained in:
cool.gitter.choco
2025-01-25 18:44:02 -06:00
parent 0b666dd2ce
commit 6cce067d0e
5 changed files with 109 additions and 11 deletions

2
app.py
View File

@@ -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__':

Binary file not shown.

65
routes/credentials.py Normal file
View File

@@ -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('/<service>', 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('/<service>/<name>', 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/<service>', 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

Binary file not shown.

View File

@@ -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):