fix: Improve active elections endpoint with timezone buffer and debug endpoint

This commit is contained in:
Alexis Bruneteau 2025-11-07 02:55:39 +01:00
parent b8fa1a4b95
commit becdf3bdee
2 changed files with 69 additions and 29 deletions

View File

@ -11,18 +11,51 @@ from ..models import Voter
router = APIRouter(prefix="/api/elections", tags=["elections"])
@router.get("/active", response_model=list[schemas.ElectionResponse])
def get_active_elections(db: Session = Depends(get_db)):
"""Récupérer toutes les élections actives en cours (limité aux vraies élections actives)"""
@router.get("/debug/all")
def debug_all_elections(db: Session = Depends(get_db)):
"""DEBUG: Return all elections with dates for troubleshooting"""
from datetime import datetime
from .. import models
now = datetime.utcnow()
all_elections = db.query(models.Election).all()
return {
"current_time": now.isoformat(),
"elections": [
{
"id": e.id,
"name": e.name,
"is_active": e.is_active,
"start_date": e.start_date.isoformat() if e.start_date else None,
"end_date": e.end_date.isoformat() if e.end_date else None,
"should_be_active": (
e.start_date <= now <= e.end_date and e.is_active
if e.start_date and e.end_date
else False
),
}
for e in all_elections
],
}
@router.get("/active", response_model=list[schemas.ElectionResponse])
def get_active_elections(db: Session = Depends(get_db)):
"""Récupérer toutes les élections actives en cours"""
from datetime import datetime, timedelta
from .. import models
now = datetime.utcnow()
# Allow 1 hour buffer for timezone issues
start_buffer = now - timedelta(hours=1)
end_buffer = now + timedelta(hours=1)
active = db.query(models.Election).filter(
(models.Election.start_date <= now) &
(models.Election.end_date >= now) &
(models.Election.is_active == True) # Vérifier que is_active=1
).order_by(models.Election.id.asc()).limit(10).all() # Limiter à 10 max
(models.Election.start_date <= end_buffer) &
(models.Election.end_date >= start_buffer) &
(models.Election.is_active == True)
).order_by(models.Election.id.asc()).all()
return active

View File

@ -1,32 +1,39 @@
-- ================================================================
-- Create ONE active election for demo (current date/time)
-- Ensure at least ONE active election exists for demo
-- ================================================================
-- Insert active election (now + 24 hours)
INSERT INTO elections (name, description, start_date, end_date, elgamal_p, elgamal_g, is_active, results_published)
VALUES (
'Election Présidentielle 2025 - Demo',
'Démonstration du système de vote en ligne avec blockchain',
NOW(),
DATE_ADD(NOW(), INTERVAL 24 HOUR),
-- Check if election 1 exists and update it to be active (from init.sql)
UPDATE elections
SET
is_active = TRUE,
start_date = DATE_SUB(NOW(), INTERVAL 1 HOUR),
end_date = DATE_ADD(NOW(), INTERVAL 7 DAY)
WHERE id = 1;
-- If no active elections exist, create one
INSERT IGNORE INTO elections (id, name, description, start_date, end_date, elgamal_p, elgamal_g, is_active, results_published)
SELECT
1,
'Election Présidentielle 2025',
'Vote pour la présidence',
DATE_SUB(NOW(), INTERVAL 1 HOUR),
DATE_ADD(NOW(), INTERVAL 7 DAY),
23,
5,
TRUE,
FALSE
);
WHERE NOT EXISTS (SELECT 1 FROM elections WHERE id = 1);
-- Get the election ID (should be 11 if 10 past elections exist)
SET @election_id = LAST_INSERT_ID();
-- Insert 3 candidates for the demo election
INSERT INTO candidates (election_id, name, description, `order`)
-- Ensure election 1 has candidates (from init.sql)
INSERT IGNORE INTO candidates (id, election_id, name, description, `order`)
VALUES
(@election_id, 'Alice Dupont', 'Candidate A - Progressive', 1),
(@election_id, 'Bob Martin', 'Candidate B - Centrist', 2),
(@election_id, 'Claire Laurent', 'Candidate C - Conservative', 3);
(1, 1, 'Alice Dupont', 'Candidate pour le changement', 1),
(2, 1, 'Bob Martin', 'Candidate pour la stabilité', 2),
(3, 1, 'Charlie Leclerc', 'Candidate pour l''innovation', 3),
(4, 1, 'Diana Fontaine', 'Candidate pour l''environnement', 4);
-- Confirmation
SELECT CONCAT('Active election created: ID=', @election_id) as status;
SELECT 'Active elections configured' as status;
SELECT COUNT(*) as total_elections FROM elections;
SELECT * FROM elections WHERE id = @election_id;
SELECT * FROM candidates WHERE election_id = @election_id;
SELECT COUNT(*) as active_elections FROM elections WHERE is_active = TRUE;
SELECT id, name, is_active, start_date, end_date FROM elections LIMIT 5;