front_ponto_eletronico/routes/record.py
2025-04-16 19:48:09 -03:00

134 lines
4.7 KiB
Python

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required
from flasgger.utils import swag_from
from models.record import Record, db
from utils import logged_user_id, format_date
from datetime import datetime
record_bp = Blueprint('record', __name__, url_prefix='/records')
@record_bp.route('/', methods=['POST'])
@jwt_required()
@swag_from('../docs/records/create.yml')
def create_record():
data = request.get_json()
# Validate required fields
required_fields = ['user_id', 'camera_id', 'space_id', 'schedule_id',
'shift_id', 'service_instance_id', 'image_path']
for field in required_fields:
if field not in data:
return jsonify({'error': f'Missing required field: {field}'}), 400
# Create new record
record = Record(
user_id=data['user_id'],
camera_id=data['camera_id'],
space_id=data['space_id'],
schedule_id=data['schedule_id'],
shift_id=data['shift_id'],
service_instance_id=data['service_instance_id'],
image_path=data['image_path'],
record_count=data.get('record_count', 0)
)
db.session.add(record)
db.session.commit()
return jsonify({'message': 'Record created successfully', 'record': record.to_dict()}), 201
@record_bp.route('/', methods=['GET'])
@jwt_required()
@swag_from('../docs/records/list.yml')
def list_records():
# Get query parameters for filtering
user_id = request.args.get('user_id', type=int)
camera_id = request.args.get('camera_id', type=int)
space_id = request.args.get('space_id', type=int)
shift_id = request.args.get('shift_id', type=int)
start_date = request.args.get('start_date')
end_date = request.args.get('end_date')
# Build query
query = Record.query.filter(Record.deleted_at.is_(None))
if user_id:
query = query.filter(Record.user_id == user_id)
if camera_id:
query = query.filter(Record.camera_id == camera_id)
if space_id:
query = query.filter(Record.space_id == space_id)
if shift_id:
query = query.filter(Record.shift_id == shift_id)
if start_date:
query = query.filter(Record.created_at >= datetime.strptime(start_date, '%Y-%m-%d'))
if end_date:
query = query.filter(Record.created_at <= datetime.strptime(end_date, '%Y-%m-%d'))
records = query.all()
return jsonify([record.to_dict() for record in records]), 200
@record_bp.route('/<int:record_id>', methods=['GET'])
@jwt_required()
@swag_from('../docs/records/get.yml')
def get_record(record_id):
record = Record.query.get_or_404(record_id)
return jsonify(record.to_dict()), 200
@record_bp.route('/<int:record_id>', methods=['PUT'])
@jwt_required()
@swag_from('../docs/records/update.yml')
def update_record(record_id):
record = Record.query.get_or_404(record_id)
data = request.get_json()
# Update fields if provided
if 'image_path' in data:
record.image_path = data['image_path']
if 'record_count' in data:
record.record_count = data['record_count']
record.updated_at = datetime.now()
db.session.commit()
return jsonify({'message': 'Record updated successfully', 'record': record.to_dict()}), 200
@record_bp.route('/<int:record_id>', methods=['DELETE'])
@jwt_required()
@swag_from('../docs/records/delete.yml')
def delete_record(record_id):
record = Record.query.get_or_404(record_id)
record.deleted_at = datetime.now()
db.session.commit()
return jsonify({'message': 'Record deleted successfully'}), 200
@record_bp.route('/statistics', methods=['GET'])
@jwt_required()
@swag_from('../docs/records/statistics.yml')
def get_statistics():
# Get query parameters
user_id = request.args.get('user_id', type=int)
start_date = request.args.get('start_date')
end_date = request.args.get('end_date')
# Build base query
query = Record.query.filter(Record.deleted_at.is_(None))
if user_id:
query = query.filter(Record.user_id == user_id)
if start_date:
query = query.filter(Record.created_at >= datetime.strptime(start_date, '%Y-%m-%d'))
if end_date:
query = query.filter(Record.created_at <= datetime.strptime(end_date, '%Y-%m-%d'))
# Calculate statistics
total_records = query.count()
total_count = db.session.query(db.func.sum(Record.record_count)).scalar() or 0
statistics = {
'total_records': total_records,
'total_count': total_count,
'average_count_per_record': round(total_count / total_records if total_records > 0 else 0, 2)
}
return jsonify(statistics), 200