api impl
This commit is contained in:
1
api/__init__.py
Normal file
1
api/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
#api/__init__.py
|
||||
42
api/auth.py
Normal file
42
api/auth.py
Normal file
@@ -0,0 +1,42 @@
|
||||
#api/auth.py
|
||||
from flask import Blueprint, session, redirect, url_for, jsonify
|
||||
from authlib.integrations.flask_client import OAuth
|
||||
import env_provider
|
||||
auth_bp = Blueprint('auth', __name__, url_prefix='/api')
|
||||
|
||||
oauth = OAuth()
|
||||
keycloak = oauth.register(
|
||||
'keycloak',
|
||||
client_id=env_provider.CLIENT_ID,
|
||||
client_secret=env_provider.CLIENT_SECRET,
|
||||
server_metadata_url="https://login.hangman-lab.top/auth/realms/Hangman-Lab/.well-known/openid-configuration",
|
||||
client_kwargs={"scope": "openid email profile"},
|
||||
)
|
||||
|
||||
@auth_bp.route('/login', methods=['GET'])
|
||||
def login():
|
||||
redirect_uri = url_for("auth.authorize", _external=True)
|
||||
return keycloak.authorize_redirect(redirect_uri)
|
||||
|
||||
@auth_bp.route('/authorize', methods=['GET'])
|
||||
def authorize():
|
||||
try:
|
||||
token = keycloak.authorize_access_token()
|
||||
user_info = keycloak.parse_id_token(token)
|
||||
session['user'] = user_info
|
||||
return jsonify({"message": "login successful", "user": user_info})
|
||||
except Exception as e:
|
||||
return jsonify({"error": "Authorization failed"}), 401
|
||||
@auth_bp.route('/logout', methods=['GET'])
|
||||
def logout():
|
||||
session.pop('user', None)
|
||||
logout_url = "https://login.hangman-lab.top/auth/realms/Hangman-Lab/protocol/openid-connect/logout"
|
||||
return redirect(logout_url)
|
||||
|
||||
@auth_bp.route("/user", methods=["GET"])
|
||||
def user():
|
||||
u = session.get('user')
|
||||
if not u:
|
||||
return jsonify({"username": "guest", "role": "guest"})
|
||||
return jsonify(u)
|
||||
|
||||
51
api/markdown.py
Normal file
51
api/markdown.py
Normal file
@@ -0,0 +1,51 @@
|
||||
#api/markdown.py
|
||||
from flask import Blueprint, request, jsonify
|
||||
from db import get_db
|
||||
from db.models.Markdown import Markdown
|
||||
|
||||
markdown_bp = Blueprint('markdown', __name__, url_prefix='/api/markdown')
|
||||
|
||||
@markdown_bp.route('/<int:markdown_id>', methods=['GET'])
|
||||
def get_markdown(markdown_id):
|
||||
with get_db() as db:
|
||||
markdown = db.query(Markdown).get(markdown_id)
|
||||
if markdown is None:
|
||||
return jsonify({"error": "file not found"}), 404
|
||||
return jsonify(markdown.to_dict())
|
||||
|
||||
@markdown_bp.route('/', methods=['POST'])
|
||||
def create_markdown():
|
||||
data = request.json
|
||||
title = data.get('title')
|
||||
content = data.get('content')
|
||||
path = data.get('path')
|
||||
if not title or not content:
|
||||
return jsonify({"error": "missing required fields"}), 400
|
||||
new_markdown = Markdown(title=title, content=content, path=path)
|
||||
with get_db() as db:
|
||||
db.add(new_markdown)
|
||||
db.commit()
|
||||
return jsonify(new_markdown.to_dict()), 201
|
||||
|
||||
@markdown_bp.route('/<int:markdown_id>', methods=['PUT'])
|
||||
def update_markdown(markdown_id):
|
||||
with get_db() as db:
|
||||
markdown = db.query(Markdown).get(markdown_id)
|
||||
if markdown is None:
|
||||
return jsonify({"error": "file not found"}), 404
|
||||
data = request.json
|
||||
markdown.title = data.get('title')
|
||||
markdown.content = data.get('content')
|
||||
markdown.path = data.get('path')
|
||||
db.commit()
|
||||
return jsonify(markdown.to_dict()), 200
|
||||
|
||||
@markdown_bp.route('/<int:markdown_id>', methods=['DELETE'])
|
||||
def delete_markdown(markdown_id):
|
||||
with get_db() as db:
|
||||
markdown = db.query(Markdown).get(markdown_id)
|
||||
if markdown is None:
|
||||
return jsonify({"error": "file not found"}), 404
|
||||
db.delete(markdown)
|
||||
db.commit()
|
||||
return jsonify({"message": "deleted"}), 200
|
||||
Reference in New Issue
Block a user