Remove obsolete endpoints (#89)
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
Remove endpoints api/login/token and api/login/profile --------- Co-authored-by: Thomas Peetz <thomas.peetz@cimt-ag.de> Reviewed-on: #89
This commit was merged in pull request #89.
This commit is contained in:
@@ -3,20 +3,25 @@ add router for different parts (like comics, tysc, media)
|
||||
"""
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from src.apis.version1.admin import token
|
||||
from src.apis.version1.comics import artist, comic, issue
|
||||
from src.apis.version1.media import mediaactor, mediaactorfile, mediafile
|
||||
from src.apis.version1.admin import mailaccount
|
||||
from src.apis.version1.comics import artist, comic, issue, worktype, volume, storyarc
|
||||
from src.apis.version1.media import mediaactor, mediaactorfile, mediafile, mediavideo, mediaarticle
|
||||
from src.apis.version1.tysc import card, cardset, fieldposition, player, rooster, sport, team, vendor
|
||||
from src.core.security import get_current_user_from_token
|
||||
|
||||
from src.apis.version1.user import profile
|
||||
from src.apis.version1.user import assignment, permission, profile, token
|
||||
from src.apis.version1.bookshelf import article
|
||||
|
||||
api_router = APIRouter(prefix="/api")
|
||||
api_router.include_router(comic.router, prefix="/comics", tags=["comics"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(artist.router, prefix="/comics", tags=["comics"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(issue.router, prefix="/comics", tags=["comics"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(worktype.router, prefix="/comics", tags=["comics"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(volume.router, prefix="/comics", tags=["comics"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(storyarc.router, prefix="/comics", tags=["comics"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(mediafile.router, prefix="/media", tags=["media"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(mediavideo.router, prefix="/media", tags=["media"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(mediaarticle.router, prefix="/media", tags=["media"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(mediaactor.router, prefix="/media", tags=["media"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(mediaactorfile.router, prefix="/media", tags=["media"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(sport.router, prefix="/tysc", tags=["tysc"], dependencies=[Depends(get_current_user_from_token)])
|
||||
@@ -28,5 +33,8 @@ api_router.include_router(vendor.router, prefix="/tysc", tags=["tysc"], dependen
|
||||
api_router.include_router(cardset.router, prefix="/tysc", tags=["tysc"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(card.router, prefix="/tysc", tags=["tysc"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(article.router, prefix="/bookshelf", tags=["bookshelf"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(token.router, prefix="/login", tags=["login"])
|
||||
api_router.include_router(profile.router, prefix="/user", tags=["user"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(token.router, prefix="/user", tags=["user"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(permission.router, prefix="/user", tags=["user"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(assignment.router, prefix="/user", tags=["user"], dependencies=[Depends(get_current_user_from_token)])
|
||||
api_router.include_router(mailaccount.router, prefix="/admin", tags=["admin"], dependencies=[Depends(get_current_user_from_token)])
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
from datetime import timedelta
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response, status
|
||||
from fastapi.security import OAuth2PasswordRequestForm
|
||||
from pydantic import BaseModel
|
||||
from typing import Annotated
|
||||
from src.core.config import settings
|
||||
from src.core.log_conf import logger
|
||||
@@ -11,16 +10,12 @@ from src.core.security import (
|
||||
authenticate_user_by_username,
|
||||
create_access_token,
|
||||
)
|
||||
from src.schema.admin import Token
|
||||
from src.schema.admin.login import LoginRequest
|
||||
from src.schema.admin.token import Token
|
||||
from src.webapps.auth.forms import LoginForm
|
||||
|
||||
login_router = APIRouter()
|
||||
|
||||
|
||||
class LoginRequest(BaseModel):
|
||||
email: str | None = None
|
||||
password: str | None = None
|
||||
|
||||
|
||||
@login_router.post(
|
||||
"/login",
|
||||
tags=["login"],
|
||||
@@ -47,9 +42,8 @@ def login(request: LoginRequest) -> Token:
|
||||
|
||||
|
||||
@login_router.post("/token", tags=["login"], summary="Login for access token")
|
||||
async def login_for_access_token(
|
||||
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
|
||||
) -> Token:
|
||||
#async def login_for_access_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]) -> Token:
|
||||
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()) -> Token:
|
||||
user = authenticate_user_by_username(form_data.username, form_data.password)
|
||||
if not user:
|
||||
raise HTTPException(status_code=400, detail="Incorrect username or password")
|
||||
@@ -59,3 +53,19 @@ async def login_for_access_token(
|
||||
expires_delta=access_token_expires,
|
||||
)
|
||||
return Token(access_token=access_token, token_type="bearer")
|
||||
|
||||
def login_for_token_cookie(response: Response, form_data: LoginForm = Depends()):
|
||||
user = authenticate_user_by_email(str(form_data.username), str(form_data.password))
|
||||
if not user:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Incorrect username or password",
|
||||
)
|
||||
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||||
access_token = create_access_token(
|
||||
data={"sub": user.email}, expires_delta=access_token_expires
|
||||
)
|
||||
response.set_cookie(
|
||||
key="access_token", value=f"Bearer {access_token}", httponly=True
|
||||
)
|
||||
return {"access_token": access_token, "token_type": "bearer"}
|
||||
|
||||
@@ -4,7 +4,7 @@ from fastapi import APIRouter
|
||||
|
||||
from src.db.models.admin import MailAccount
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.admin import MailAccountResponse, to_response
|
||||
from src.schema.admin.mailaccount import MailAccountResponse, to_response
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
from datetime import timedelta
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import APIRouter, Body, HTTPException, status, Depends, Response
|
||||
from fastapi.security import OAuth2PasswordRequestForm
|
||||
|
||||
from src.core.config import settings
|
||||
from src.core.log_conf import logger
|
||||
from src.core.security import create_access_token, authenticate_user_by_email, authenticate_user_by_username, get_current_active_user
|
||||
from src.db.models.admin import Profile
|
||||
from src.schema.admin import Token, ProfileModel
|
||||
from src.webapps.auth.forms import LoginForm
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.post("/token")
|
||||
def login_for_access_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]) -> Token:
|
||||
user = authenticate_user_by_username(form_data.username, form_data.password)
|
||||
logger.info(f"Request /token: login with {form_data.username}")
|
||||
if not user:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Incorrect username or password",
|
||||
headers={"WWW-Authenticate": "Bearer"},
|
||||
)
|
||||
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||||
access_token = create_access_token(
|
||||
data={"sub": user.email, "scope": " ".join(form_data.scopes)}, expires_delta=access_token_expires
|
||||
)
|
||||
return Token(access_token=access_token, token_type="bearer")
|
||||
|
||||
|
||||
# @router.post("/token-cookie", response_model=Token)
|
||||
def login_for_token_cookie(response: Response, form_data: LoginForm = Depends()):
|
||||
user = authenticate_user_by_email(form_data.username, form_data.password) # type: ignore
|
||||
if not user:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Incorrect username or password",
|
||||
)
|
||||
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||||
access_token = create_access_token(
|
||||
data={"sub": user.email}, expires_delta=access_token_expires
|
||||
)
|
||||
response.set_cookie(
|
||||
key="access_token", value=f"Bearer {access_token}", httponly=True
|
||||
)
|
||||
return {"access_token": access_token, "token_type": "bearer"}
|
||||
|
||||
|
||||
@router.get("/profile", response_model=ProfileModel)
|
||||
async def read_profile(current_user: Annotated[Profile, Depends(get_current_active_user)]):
|
||||
return current_user
|
||||
@@ -3,17 +3,17 @@ from typing import List
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.comic import Issue
|
||||
from src.db.repository.comics.comic import get_issue_details
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.comics.issue_details import IssueDetailsResponse
|
||||
from src.schema.comics.issue import IssueResponse, to_response
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/issues", response_model=List[IssueDetailsResponse])
|
||||
def get_issues(db: SessionDep) -> List[IssueDetailsResponse]:
|
||||
results: List[IssueDetailsResponse] = []
|
||||
@router.get("/issues", response_model=List[IssueResponse])
|
||||
def get_issues(db: SessionDep) -> List[IssueResponse]:
|
||||
results: List[IssueResponse] = []
|
||||
issues = db.query(Issue).all()
|
||||
for issue in issues:
|
||||
results.append(get_issue_details(issue))
|
||||
response = to_response(issue)
|
||||
results.append(response)
|
||||
return results
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.comic import StoryArc
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.comics.storyarc import StoryArcResponse, to_response
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/storyarcs", response_model=List[StoryArcResponse])
|
||||
def get_issues(db: SessionDep) -> List[StoryArcResponse]:
|
||||
results: List[StoryArcResponse] = []
|
||||
storyarcs = db.query(StoryArc).all()
|
||||
for storyarc in storyarcs:
|
||||
response = to_response(storyarc)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -0,0 +1,18 @@
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.comic import Volume
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.comics.volume import VolumeResponse, to_response
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/volumes", response_model=List[VolumeResponse])
|
||||
def get_issues(db: SessionDep) -> List[VolumeResponse]:
|
||||
results: List[VolumeResponse] = []
|
||||
worktypes = db.query(Volume).all()
|
||||
for worktype in worktypes:
|
||||
response = to_response(worktype)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -0,0 +1,19 @@
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.comic import WorkType
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.comics.worktype import WorktypeResponse, to_response
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/worktypes", response_model=List[WorktypeResponse])
|
||||
def get_issues(db: SessionDep) -> List[WorktypeResponse]:
|
||||
results: List[WorktypeResponse] = []
|
||||
worktypes = db.query(WorkType).all()
|
||||
for worktype in worktypes:
|
||||
response = to_response(worktype)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -1,6 +1,6 @@
|
||||
from fastapi import APIRouter, status
|
||||
|
||||
from src.schema.admin import HealthCheck
|
||||
from src.schema.admin.healthcheck import HealthCheck
|
||||
|
||||
health_router = APIRouter()
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.media import MediaArticle
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.media.article import MediaArticleResponse, to_response
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/articles", response_model=List[MediaArticleResponse])
|
||||
def get_all_files(
|
||||
db: SessionDep, review: bool = False, download: bool = False
|
||||
) -> List[MediaArticleResponse]:
|
||||
"""
|
||||
Get all MediaVideos.
|
||||
"""
|
||||
results: List[MediaArticleResponse] = []
|
||||
articles: List[MediaArticle]
|
||||
articles = db.query(MediaArticle).all()
|
||||
for article in articles:
|
||||
response = to_response(article)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -0,0 +1,31 @@
|
||||
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.media import MediaVideo
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.media.video import MediaVideoResponse, to_response
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/videos", response_model=List[MediaVideoResponse])
|
||||
def get_all_files(
|
||||
db: SessionDep, review: bool = False, download: bool = False
|
||||
) -> List[MediaVideoResponse]:
|
||||
"""
|
||||
Get all MediaVideos.
|
||||
"""
|
||||
results: List[MediaVideoResponse] = []
|
||||
files: List[MediaVideo]
|
||||
if review:
|
||||
files = db.query(MediaVideo).filter(MediaVideo.review.is_(True)).all()
|
||||
elif download:
|
||||
files = db.query(MediaVideo).filter(MediaVideo.should_download.is_(True)).all()
|
||||
else:
|
||||
files = db.query(MediaVideo).all()
|
||||
for mediafile in files:
|
||||
response = to_response(mediafile)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -0,0 +1,20 @@
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.admin import Assignment
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.user.assignment import AssignmentResponse, to_response
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/assignments", response_model=List[AssignmentResponse])
|
||||
def get_all_profiles(db: SessionDep) -> List[AssignmentResponse]:
|
||||
results: List[AssignmentResponse] = []
|
||||
profiles = db.query(Assignment).all()
|
||||
for profile in profiles:
|
||||
response = to_response(profile)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -0,0 +1,19 @@
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.admin import Permission
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.user.permission import PermissionResponse, to_response
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/permissions", response_model=List[PermissionResponse])
|
||||
def get_all_profiles(db: SessionDep) -> List[PermissionResponse]:
|
||||
results: List[PermissionResponse] = []
|
||||
permissions = db.query(Permission).all()
|
||||
for permission in permissions:
|
||||
response = to_response(permission)
|
||||
results.append(response)
|
||||
return results
|
||||
@@ -3,6 +3,7 @@ from fastapi import APIRouter, HTTPException, status
|
||||
from sqlalchemy import select
|
||||
from src.core.log_conf import logger
|
||||
|
||||
from src.core.security import CurrentUser
|
||||
from src.db.models.admin import Profile
|
||||
from src.db.repository.user import create_new_profile, get_profile_details
|
||||
from src.db.session import SessionDep
|
||||
@@ -11,8 +12,13 @@ from src.schema.user.profile import ProfileResponse, ProfileModel
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/profile", response_model=ProfileModel)
|
||||
async def read_profile(current_user: CurrentUser):
|
||||
return current_user
|
||||
|
||||
@router.get("/profiles", response_model=List[ProfileResponse])
|
||||
def get_all_profiles(db: SessionDep) -> List[ProfileResponse]: # type: ignore
|
||||
def get_all_profiles(db: SessionDep) -> List[ProfileResponse]:
|
||||
results: List[ProfileResponse] = []
|
||||
profiles = db.scalars(select(Profile)).all()
|
||||
for profile in profiles:
|
||||
@@ -21,7 +27,7 @@ def get_all_profiles(db: SessionDep) -> List[ProfileResponse]: # type: ignore
|
||||
return results
|
||||
|
||||
@router.get("/profiles/{profile_id}", response_model=ProfileResponse)
|
||||
def get_profile(profile_id: str, db: SessionDep) -> ProfileResponse: # type: ignore
|
||||
def get_profile(profile_id: str, db: SessionDep) -> ProfileResponse:
|
||||
profile = db.get(Profile, profile_id)
|
||||
if not profile:
|
||||
raise HTTPException(status_code=404, detail="MediaActor could not be found")
|
||||
@@ -37,8 +43,8 @@ def delete_profile(profile_id: str, db: SessionDep): # type: ignore
|
||||
delete_profile(profile_id=profile_id, db=db)
|
||||
|
||||
@router.post("/profiles", status_code=status.HTTP_201_CREATED)
|
||||
def add_profile(new_profile: ProfileModel, db: SessionDep) -> ProfileResponse: # type: ignore
|
||||
logger.info(f"add profile {new_profile.user_name}")
|
||||
def add_profile(new_profile: ProfileModel, db: SessionDep) -> ProfileResponse:
|
||||
logger.info(f"add profile {new_profile.username}")
|
||||
try:
|
||||
profile: Profile = create_new_profile(new_profile, db)
|
||||
except:
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.db.models.admin import Token
|
||||
from src.db.session import SessionDep
|
||||
from src.schema.user.token import TokenResponse, to_response
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/tokens", response_model=List[TokenResponse])
|
||||
def get_all_profiles(db: SessionDep) -> List[TokenResponse]:
|
||||
results: List[TokenResponse] = []
|
||||
tokens = db.query(Token).all()
|
||||
for token in tokens:
|
||||
response = to_response(token)
|
||||
results.append(response)
|
||||
return results
|
||||
Reference in New Issue
Block a user