Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a934db8ac | |||
| ac7302b1dd | |||
| ac5ee3bb27 | |||
| a9084202e3 | |||
| be9f2a4c0c | |||
| 53fe09351f |
@@ -1 +1 @@
|
||||
v1.4.4
|
||||
v1.4.7
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "aniworld-web",
|
||||
"version": "1.4.4",
|
||||
"version": "1.4.7",
|
||||
"description": "Aniworld Anime Download Manager - Web Frontend",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Authentication API endpoints for Aniworld."""
|
||||
from typing import Optional
|
||||
|
||||
import structlog
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from fastapi import status as http_status
|
||||
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
|
||||
@@ -16,6 +17,8 @@ from src.server.models.config import AppConfig
|
||||
from src.server.services.auth_service import AuthError, LockedOutError, auth_service
|
||||
from src.server.services.config_service import get_config_service
|
||||
|
||||
logger = structlog.get_logger(__name__)
|
||||
|
||||
# NOTE: import dependencies (optional_auth, security) lazily inside handlers
|
||||
# to avoid importing heavyweight modules (e.g. sqlalchemy) at import time.
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ class SetupRedirectMiddleware(BaseHTTPMiddleware):
|
||||
# Paths that should always be accessible, even without setup
|
||||
EXEMPT_PATHS = {
|
||||
"/setup", # Setup page itself
|
||||
"/setup/unresolved", # Unresolved folders page (after setup)
|
||||
"/loading", # Loading page (initialization progress)
|
||||
"/login", # Login page (needs to be accessible after setup)
|
||||
"/queue", # Queue page (for initial load)
|
||||
|
||||
@@ -165,7 +165,7 @@ async def _cleanup_legacy_key_files() -> int:
|
||||
db_folders: set[str] = {series.folder for series in all_series if series.folder}
|
||||
|
||||
for folder_name in db_folders:
|
||||
folder_path = settings.anime_directory / folder_name
|
||||
folder_path = Path(settings.anime_directory) / folder_name
|
||||
key_file = folder_path / "key"
|
||||
|
||||
if not key_file.exists():
|
||||
|
||||
@@ -378,6 +378,18 @@ class SetupService:
|
||||
)
|
||||
continue
|
||||
|
||||
# Also check if a series with this key already exists (different folder, same anime)
|
||||
existing_by_key = await AnimeSeriesService.get_by_key(db, resolved_key)
|
||||
if existing_by_key:
|
||||
logger.debug(
|
||||
"Series with key already exists, skipping",
|
||||
folder=folder_name,
|
||||
key=resolved_key,
|
||||
existing_folder=existing_by_key.folder
|
||||
)
|
||||
skipped_existing += 1
|
||||
continue
|
||||
|
||||
# Check filesystem properties
|
||||
props = cls._get_series_properties(folder)
|
||||
|
||||
|
||||
@@ -481,8 +481,10 @@
|
||||
async function checkUnresolvedAndProceed() {
|
||||
try {
|
||||
const token = localStorage.getItem('auth_token');
|
||||
console.log('Checking unresolved folders, token exists:', !!token);
|
||||
if (!token) {
|
||||
// No token, go to login
|
||||
console.log('No auth token found, showing completion');
|
||||
document.getElementById('completionMessage').style.display = 'block';
|
||||
return;
|
||||
}
|
||||
@@ -490,20 +492,30 @@
|
||||
const res = await fetch('/api/setup/unresolved', {
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
});
|
||||
console.log('Unresolved API response status:', res.status);
|
||||
|
||||
if (res.ok) {
|
||||
const unresolved = await res.json();
|
||||
console.log('Unresolved folders:', unresolved);
|
||||
if (unresolved && unresolved.length > 0) {
|
||||
// Has unresolved folders - redirect to unresolved page
|
||||
console.log('Redirecting to /setup/unresolved');
|
||||
window.location.href = '/setup/unresolved';
|
||||
return;
|
||||
}
|
||||
} else if (res.status === 401) {
|
||||
// Token invalid, clear it
|
||||
localStorage.removeItem('auth_token');
|
||||
console.log('Token invalid, showing completion');
|
||||
document.getElementById('completionMessage').style.display = 'block';
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Error checking unresolved folders:', e);
|
||||
}
|
||||
|
||||
// No unresolved folders or error - show completion message
|
||||
console.log('No unresolved folders or error, showing completion');
|
||||
document.getElementById('completionMessage').style.display = 'block';
|
||||
}
|
||||
|
||||
|
||||
@@ -167,10 +167,16 @@ class TestSetupServiceRun:
|
||||
mock_get_db = MagicMock()
|
||||
mock_get_db.__aenter__.return_value = mock_db
|
||||
mock_get_db.__aexit__.return_value = None
|
||||
mock_series_app = AsyncMock()
|
||||
mock_series_app.search.return_value = []
|
||||
|
||||
with patch(
|
||||
'src.server.services.setup_service.settings'
|
||||
) as mock_settings, \
|
||||
patch(
|
||||
'src.server.services.setup_service.get_series_app',
|
||||
return_value=mock_series_app
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.get_db_session',
|
||||
return_value=mock_get_db
|
||||
@@ -179,6 +185,10 @@ class TestSetupServiceRun:
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_folder',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_key',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.UnresolvedFolderService.get_by_folder_name',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
@@ -258,10 +268,16 @@ class TestSetupServiceRun:
|
||||
mock_get_db = MagicMock()
|
||||
mock_get_db.__aenter__.return_value = mock_db
|
||||
mock_get_db.__aexit__.return_value = None
|
||||
mock_series_app = AsyncMock()
|
||||
mock_series_app.search.return_value = []
|
||||
|
||||
with patch(
|
||||
'src.server.services.setup_service.settings'
|
||||
) as mock_settings, \
|
||||
patch(
|
||||
'src.server.services.setup_service.get_series_app',
|
||||
return_value=mock_series_app
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.get_db_session',
|
||||
return_value=mock_get_db
|
||||
@@ -270,6 +286,10 @@ class TestSetupServiceRun:
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_folder',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_key',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.UnresolvedFolderService.get_by_folder_name',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
@@ -323,6 +343,10 @@ class TestSetupServiceRun:
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_folder',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_key',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.UnresolvedFolderService.get_by_folder_name',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
@@ -401,6 +425,10 @@ class TestSetupServiceRun:
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_folder',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.AnimeSeriesService.get_by_key',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
), \
|
||||
patch(
|
||||
'src.server.services.setup_service.UnresolvedFolderService.get_by_folder_name',
|
||||
new_callable=AsyncMock, return_value=None
|
||||
|
||||
Reference in New Issue
Block a user