fix: Reorder election routes to fix blockchain endpoint routing
Moved specific routes (/blockchain, /debug/all, /active, /completed, /upcoming)
BEFORE generic routes (/{election_id}, /{election_id}/results, etc) so that
specific paths are matched first and don't get caught by the {election_id}
path parameter matcher.
Also removed duplicate /completed and /upcoming route definitions.
Routes now in correct order:
1. Specific paths: /debug/all, /active, /blockchain
2. Specific subpaths: /{id}/blockchain-verify, /{id}/candidates, /{id}/results
3. Generic: /{id}
This commit is contained in:
parent
1fd71e71e1
commit
9f5aee8b93
@ -71,168 +71,6 @@ def get_active_elections(db: Session = Depends(get_db)):
|
||||
return active
|
||||
|
||||
|
||||
@router.get("/completed")
|
||||
def get_completed_elections(db: Session = Depends(get_db)):
|
||||
"""Récupérer tous les votes passés/terminés"""
|
||||
|
||||
from datetime import datetime
|
||||
elections = db.query(services.models.Election).filter(
|
||||
services.models.Election.end_date < datetime.utcnow(),
|
||||
services.models.Election.results_published == True
|
||||
).all()
|
||||
|
||||
return elections
|
||||
|
||||
|
||||
@router.get("/upcoming")
|
||||
def get_upcoming_elections(db: Session = Depends(get_db)):
|
||||
"""Récupérer tous les votes à venir"""
|
||||
|
||||
from datetime import datetime
|
||||
elections = db.query(services.models.Election).filter(
|
||||
services.models.Election.start_date > datetime.utcnow()
|
||||
).all()
|
||||
|
||||
return elections
|
||||
|
||||
|
||||
@router.get("/active/results")
|
||||
def get_active_election_results(db: Session = Depends(get_db)):
|
||||
"""Récupérer les résultats de l'élection active"""
|
||||
|
||||
election = services.ElectionService.get_active_election(db)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="No active election"
|
||||
)
|
||||
|
||||
results = services.VoteService.get_election_results(db, election.id)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
@router.get("/{election_id}/candidates")
|
||||
def get_election_candidates(election_id: int, db: Session = Depends(get_db)):
|
||||
"""Récupérer les candidats d'une élection"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
return election.candidates
|
||||
|
||||
|
||||
@router.get("/{election_id}", response_model=schemas.ElectionResponse)
|
||||
def get_election(election_id: int, db: Session = Depends(get_db)):
|
||||
"""Récupérer une élection par son ID"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
return election
|
||||
|
||||
|
||||
@router.get("/{election_id}/results", response_model=schemas.ElectionResultResponse)
|
||||
def get_election_results(
|
||||
election_id: int,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Récupérer les résultats d'une élection.
|
||||
Disponible après la fermeture du scrutin.
|
||||
"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
if not election.results_published:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail="Results not yet published"
|
||||
)
|
||||
|
||||
results = services.VoteService.get_election_results(db, election_id)
|
||||
|
||||
return schemas.ElectionResultResponse(
|
||||
election_id=election.id,
|
||||
election_name=election.name,
|
||||
total_votes=sum(r.vote_count for r in results),
|
||||
results=results
|
||||
)
|
||||
|
||||
|
||||
@router.post("/{election_id}/publish-results")
|
||||
def publish_results(
|
||||
election_id: int,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Publier les résultats d'une élection (admin only).
|
||||
À utiliser après la fermeture du scrutin.
|
||||
"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
# Marquer les résultats comme publiés
|
||||
election.results_published = True
|
||||
db.commit()
|
||||
|
||||
return {
|
||||
"message": "Results published successfully",
|
||||
"election_id": election.id,
|
||||
"election_name": election.name
|
||||
}
|
||||
|
||||
|
||||
@router.get("/completed", response_model=list[schemas.ElectionResponse])
|
||||
def get_completed_elections(db: Session = Depends(get_db)):
|
||||
"""Récupérer toutes les élections terminées (archives)"""
|
||||
from datetime import datetime
|
||||
from .. import models
|
||||
|
||||
completed = db.query(models.Election).filter(
|
||||
models.Election.end_date < datetime.utcnow(),
|
||||
models.Election.results_published == True
|
||||
).all()
|
||||
|
||||
return completed
|
||||
|
||||
|
||||
@router.get("/upcoming", response_model=list[schemas.ElectionResponse])
|
||||
def get_upcoming_elections(db: Session = Depends(get_db)):
|
||||
"""Récupérer toutes les élections futures"""
|
||||
from datetime import datetime
|
||||
from .. import models
|
||||
|
||||
upcoming = db.query(models.Election).filter(
|
||||
models.Election.start_date > datetime.utcnow()
|
||||
).all()
|
||||
|
||||
return upcoming
|
||||
|
||||
|
||||
@router.get("/blockchain")
|
||||
def get_elections_blockchain():
|
||||
"""
|
||||
@ -273,4 +111,115 @@ def verify_election_blockchain(election_id: int, db: Session = Depends(get_db)):
|
||||
"warning": "Election blockchain verification failed - possible tampering"
|
||||
}
|
||||
|
||||
return verification
|
||||
return verification
|
||||
|
||||
|
||||
# Routes with path parameters must come AFTER specific routes
|
||||
@router.get("/active/results")
|
||||
def get_active_election_results(db: Session = Depends(get_db)):
|
||||
"""Récupérer les résultats de l'élection active"""
|
||||
|
||||
election = services.ElectionService.get_active_election(db)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="No active election"
|
||||
)
|
||||
|
||||
results = services.VoteService.get_election_results(db, election.id)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
@router.get("/{election_id}/candidates")
|
||||
def get_election_candidates(election_id: int, db: Session = Depends(get_db)):
|
||||
"""Récupérer les candidats d'une élection"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
return election.candidates
|
||||
|
||||
|
||||
@router.get("/{election_id}/results", response_model=schemas.ElectionResultResponse)
|
||||
def get_election_results(
|
||||
election_id: int,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Récupérer les résultats d'une élection.
|
||||
Disponible après la fermeture du scrutin.
|
||||
"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
if not election.results_published:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail="Results not yet published"
|
||||
)
|
||||
|
||||
results = services.VoteService.get_election_results(db, election_id)
|
||||
|
||||
return schemas.ElectionResultResponse(
|
||||
election_id=election.id,
|
||||
election_name=election.name,
|
||||
total_votes=sum(r.vote_count for r in results),
|
||||
results=results
|
||||
)
|
||||
|
||||
|
||||
@router.post("/{election_id}/publish-results")
|
||||
def publish_results(
|
||||
election_id: int,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Publier les résultats d'une élection (admin only).
|
||||
À utiliser après la fermeture du scrutin.
|
||||
"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
# Marquer les résultats comme publiés
|
||||
election.results_published = True
|
||||
db.commit()
|
||||
|
||||
return {
|
||||
"message": "Results published successfully",
|
||||
"election_id": election.id,
|
||||
"election_name": election.name
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{election_id}", response_model=schemas.ElectionResponse)
|
||||
def get_election(election_id: int, db: Session = Depends(get_db)):
|
||||
"""Récupérer une élection par son ID"""
|
||||
|
||||
election = services.ElectionService.get_election(db, election_id)
|
||||
|
||||
if not election:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Election not found"
|
||||
)
|
||||
|
||||
return election
|
||||
Loading…
x
Reference in New Issue
Block a user