Add version history for shared environments

This commit is contained in:
Peter Stockings
2025-11-30 19:50:29 +11:00
parent b1fc0ae2f5
commit a7dfc28a8b
2 changed files with 184 additions and 1 deletions

View File

@@ -415,3 +415,85 @@ def unlink_function(env_id):
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
@shared_env.route('/<int:env_id>/history', methods=['GET'])
@login_required
def history(env_id):
"""Get version history for a shared environment"""
try:
# Verify ownership
existing = db.execute(
'SELECT id, name FROM shared_environments WHERE id=%s AND user_id=%s',
[env_id, current_user.id],
one=True
)
if not existing:
return jsonify({'status': 'error', 'message': 'Shared environment not found'}), 404
# Fetch all versions
versions = db.execute('''
SELECT version_number, environment, versioned_at
FROM shared_environment_versions
WHERE shared_env_id = %s
ORDER BY version_number DESC
''', [env_id])
# Convert datetime objects to ISO format strings
for version in versions or []:
version['versioned_at'] = version['versioned_at'].isoformat() if version.get('versioned_at') else None
return jsonify({
'status': 'success',
'env_name': existing['name'],
'versions': versions if versions else []
})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
@shared_env.route('/<int:env_id>/restore', methods=['POST'])
@login_required
def restore(env_id):
"""Restore a shared environment to a previous version"""
try:
version_number = request.json.get('version_number')
if not version_number:
return jsonify({'status': 'error', 'message': 'Version number is required'}), 400
# Verify ownership
existing = db.execute(
'SELECT id, name FROM shared_environments WHERE id=%s AND user_id=%s',
[env_id, current_user.id],
one=True
)
if not existing:
return jsonify({'status': 'error', 'message': 'Shared environment not found'}), 404
# Fetch the selected version's environment data
version_data = db.execute(
'SELECT environment FROM shared_environment_versions WHERE shared_env_id=%s AND version_number=%s',
[env_id, version_number],
one=True
)
if not version_data:
return jsonify({'status': 'error', 'message': 'Version not found'}), 404
# Update the shared environment with the old version's data
# This will trigger the versioning function to create a new version
db.execute(
'UPDATE shared_environments SET environment=%s, updated_at=NOW() WHERE id=%s',
[json.dumps(version_data['environment']), env_id],
commit=True
)
return jsonify({
'status': 'success',
'message': f'Restored to version {version_number}'
})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500