update payment plan settings

This commit is contained in:
2025-06-24 14:35:34 +02:00
parent 4678022c7b
commit a9a61c98f5
3 changed files with 92 additions and 28 deletions

View File

@@ -1118,7 +1118,7 @@ def save_instance():
rooms_count=0, rooms_count=0,
conversations_count=0, conversations_count=0,
data_size=0.0, data_size=0.0,
payment_plan='Basic', payment_plan=data.get('payment_plan', 'Basic'),
main_url=f"https://{data['domains'][0]}" if data['domains'] else f"http://localhost:{data['port']}", main_url=f"https://{data['domains'][0]}" if data['domains'] else f"http://localhost:{data['port']}",
status=data['status'], status=data['status'],
portainer_stack_id=data['stack_id'], portainer_stack_id=data['stack_id'],

View File

@@ -593,6 +593,9 @@ async function startLaunch(data) {
// Save instance data // Save instance data
await updateStep(10, 'Saving Instance Data', 'Storing instance information...'); await updateStep(10, 'Saving Instance Data', 'Storing instance information...');
try { try {
// Get the launch data from sessionStorage to access pricing tier info
const launchData = JSON.parse(sessionStorage.getItem('instanceLaunchData') || '{}');
const instanceData = { const instanceData = {
name: data.instanceName, name: data.instanceName,
port: data.port, port: data.port,
@@ -603,7 +606,8 @@ async function startLaunch(data) {
repository: data.repository, repository: data.repository,
branch: data.branch, branch: data.branch,
deployed_version: dockerComposeResult.latest_tag || dockerComposeResult.commit_hash || 'unknown', deployed_version: dockerComposeResult.latest_tag || dockerComposeResult.commit_hash || 'unknown',
deployed_branch: data.branch deployed_branch: data.branch,
payment_plan: launchData.pricingTier?.name || 'Basic' // Use the selected pricing tier name
}; };
console.log('Saving instance data:', instanceData); console.log('Saving instance data:', instanceData);
const saveResult = await saveInstanceData(instanceData); const saveResult = await saveInstanceData(instanceData);
@@ -2046,28 +2050,45 @@ async function saveInstanceData(instanceData) {
if (existingInstance) { if (existingInstance) {
console.log('Instance already exists:', instanceData.port); console.log('Instance already exists:', instanceData.port);
// Update existing instance with new data
const updateResponse = await fetch('/api/admin/save-instance', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
},
body: JSON.stringify({
name: instanceData.port,
port: instanceData.port,
domains: instanceData.domains,
stack_id: instanceData.stack_id || '',
stack_name: instanceData.stack_name,
status: instanceData.status,
repository: instanceData.repository,
branch: instanceData.branch,
deployed_version: instanceData.deployed_version,
deployed_branch: instanceData.deployed_branch,
payment_plan: instanceData.payment_plan || 'Basic'
})
});
if (!updateResponse.ok) {
const errorText = await updateResponse.text();
console.error('Error updating instance:', errorText);
throw new Error(`Failed to update instance data: ${updateResponse.status} ${updateResponse.statusText}`);
}
const updateResult = await updateResponse.json();
console.log('Instance updated:', updateResult);
return { return {
success: true, success: true,
data: { data: updateResult.data
name: instanceData.port,
company: 'loading...',
rooms_count: 0,
conversations_count: 0,
data_size: 0.0,
payment_plan: 'Basic',
main_url: `https://${instanceData.domains[0]}`,
status: 'inactive',
port: instanceData.port,
stack_id: instanceData.stack_id || '', // Use empty string if null
stack_name: instanceData.stack_name,
repository: instanceData.repository,
branch: instanceData.branch
}
}; };
} }
// If instance doesn't exist, create it // If instance doesn't exist, create it
const response = await fetch('/instances/add', { const response = await fetch('/api/admin/save-instance', {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@@ -2075,18 +2096,16 @@ async function saveInstanceData(instanceData) {
}, },
body: JSON.stringify({ body: JSON.stringify({
name: instanceData.port, name: instanceData.port,
company: 'loading...',
rooms_count: 0,
conversations_count: 0,
data_size: 0.0,
payment_plan: 'Basic',
main_url: `https://${instanceData.domains[0]}`,
status: 'inactive',
port: instanceData.port, port: instanceData.port,
stack_id: instanceData.stack_id || '', // Use empty string if null domains: instanceData.domains,
stack_id: instanceData.stack_id || '',
stack_name: instanceData.stack_name, stack_name: instanceData.stack_name,
status: instanceData.status,
repository: instanceData.repository, repository: instanceData.repository,
branch: instanceData.branch branch: instanceData.branch,
deployed_version: instanceData.deployed_version,
deployed_branch: instanceData.deployed_branch,
payment_plan: instanceData.payment_plan || 'Basic'
}) })
}); });

View File

@@ -192,7 +192,7 @@
<td>{{ instance.rooms_count }}</td> <td>{{ instance.rooms_count }}</td>
<td>{{ instance.conversations_count }}</td> <td>{{ instance.conversations_count }}</td>
<td>{{ "%.1f"|format(instance.data_size) }} GB</td> <td>{{ "%.1f"|format(instance.data_size) }} GB</td>
<td>{{ instance.payment_plan }}</td> <td id="payment-plan-{{ instance.id }}">{{ instance.payment_plan }}</td>
<td> <td>
<a href="{{ instance.main_url }}" <a href="{{ instance.main_url }}"
target="_blank" target="_blank"
@@ -2490,5 +2490,50 @@ function validateStep6() {
return true; return true;
} }
document.addEventListener('DOMContentLoaded', function() {
// For each instance row, fetch the payment plan from the instance API
document.querySelectorAll('[data-instance-id]').forEach(function(badge) {
const instanceId = badge.getAttribute('data-instance-id');
const token = badge.getAttribute('data-token');
const row = badge.closest('tr');
const urlCell = row.querySelector('td:nth-child(7) a');
const paymentPlanCell = document.getElementById('payment-plan-' + instanceId);
if (!urlCell || !token || !paymentPlanCell) return;
const instanceUrl = urlCell.getAttribute('href');
// Get management token
fetch(instanceUrl.replace(/\/$/, '') + '/api/admin/management-token', {
method: 'POST',
headers: {
'X-API-Key': token,
'Accept': 'application/json'
}
})
.then(res => res.json())
.then(data => {
if (!data.token) throw new Error('No management token');
// Fetch version info (which includes pricing_tier_name)
return fetch(instanceUrl.replace(/\/$/, '') + '/api/admin/version-info', {
headers: {
'Authorization': 'Bearer ' + data.token,
'Accept': 'application/json'
}
});
})
.then(res => res.json())
.then(data => {
if (data.pricing_tier_name) {
paymentPlanCell.textContent = data.pricing_tier_name;
} else {
paymentPlanCell.textContent = 'Unknown';
}
})
.catch(err => {
paymentPlanCell.textContent = 'Unknown';
});
});
});
</script> </script>
{% endblock %} {% endblock %}