Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 69 additions & 27 deletions src/components/NewDeploymentModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,10 @@

<div class="credentials-form">
<div class="form-field">
<label for="dbName">Database Name</label>
<label for="dbName">
Database Name
<span v-if="form.database.mode === 'existing'" class="required">*</span>
</label>
<input
id="dbName"
v-model="form.database.dbName"
Expand All @@ -745,14 +748,21 @@

<div class="form-row">
<div class="form-field">
<label for="dbUser">Username</label>
<label for="dbUser">
Username
<span v-if="form.database.mode === 'existing'" class="required">*</span>
</label>
<input id="dbUser" v-model="form.database.dbUser" type="text" placeholder="app" />
</div>

<div class="form-field">
<label for="dbPassword">
Password
<span v-if="form.database.mode === 'create'" class="required">*</span>
<span
v-if="form.database.mode === 'create' || form.database.mode === 'existing'"
class="required"
>*</span
>
</label>
<input
id="dbPassword"
Expand Down Expand Up @@ -837,13 +847,15 @@
</div>
<div class="preview-item">
<span class="preview-label">Database</span>
<code class="preview-value">{{
form.database.dbName || (form.name ? form.name.replace(/-/g, "_") : "app_db")
}}</code>
<code class="preview-value">{{ form.database.dbName || "—" }}</code>
</div>
<div class="preview-item">
<span class="preview-label">User</span>
<code class="preview-value">{{ form.database.dbUser || "app" }}</code>
<code class="preview-value">{{ form.database.dbUser || "—" }}</code>
</div>
<div class="preview-item">
<span class="preview-label">Password</span>
<code class="preview-value">{{ form.database.dbPassword ? "••••••••" : "—" }}</code>
</div>
<div class="preview-hint">
<i class="pi pi-info-circle" />
Expand Down Expand Up @@ -1652,8 +1664,15 @@ const canProceed = computed(() => {
if (deploymentMode.value === "easy") {
if (currentStep.value === 2) {
if (form.database.type !== "none") {
if (form.database.mode === "existing" && !form.database.existingContainer) {
return false;
if (form.database.mode === "existing") {
if (
!form.database.existingContainer ||
!form.database.dbName.trim() ||
!form.database.dbUser.trim() ||
!form.database.dbPassword.trim()
) {
return false;
}
}
if (form.database.mode === "external") {
if (!form.database.externalHost.trim() || !form.database.externalPort.trim()) {
Expand Down Expand Up @@ -2367,25 +2386,48 @@ const handleCreate = async () => {
}
}

const mapDbToPayload = (db: DatabaseFormConfig) => ({
alias: db.alias,
type: db.type,
mode: db.mode,
service: db.service || undefined,
existing_container: db.mode === "existing" ? db.existingContainer : undefined,
external_host: db.mode === "external" ? db.externalHost : undefined,
external_port:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When the mode is 'existing', the externalPort might be provided as a string depending on input handling. However, 'existing' database connections typically rely on internal network naming or the existing_container field rather than an external port. If the backend specifically requires a port for existing containers, ensure it defaults safely.

Suggested change
external_port:
external_port:
(db.mode === "existing" || db.mode === "external") && db.externalPort
? parseInt(db.externalPort.toString())
: undefined,

(db.mode === "existing" || db.mode === "external") && db.externalPort ? parseInt(db.externalPort) : undefined,
database_name: db.dbName || undefined,
username: db.dbUser || undefined,
password: db.mode === "existing" || db.mode === "external" ? db.dbPassword || undefined : undefined,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The mapping logic should also include db.dbPassword for the 'create' mode if the backend requires it, or ensure it is consistently handled. Currently, it only sends password for 'existing' or 'external'. If 'create' generates a password on the backend, this is fine, but if the user provides it during 'create', it will be dropped.

Suggested change
password: db.mode === "existing" || db.mode === "external" ? db.dbPassword || undefined : undefined,
password: db.dbPassword || undefined,

env_prefix: db.envPrefix || db.alias,
});

const databases: Record<string, any>[] = [];

if (form.database.mode === "existing" && form.database.existingContainer && form.database.type !== "none") {
databases.push(
mapDbToPayload({
id: "primary",
alias: "primary",
type: form.database.type,
mode: "existing",
service: "",
existingContainer: form.database.existingContainer,
externalHost: "",
externalPort: form.database.externalPort,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Passing form.database.externalPort to the mapper when mode is 'existing' might be unnecessary or confusing if that field isn't visible/relevant for existing container connections in the UI. Consider if this should be explicitly set or if the UI ensures it's cleared.

Suggested change
externalPort: form.database.externalPort,
externalPort: form.database.mode === "external" ? form.database.externalPort : "",

dbName: form.database.dbName,
dbUser: form.database.dbUser,
dbPassword: form.database.dbPassword,
envPrefix: "",
}),
);
}

if (advancedOptions.multiDatabase && additionalDatabases.value.length > 0) {
const databases = additionalDatabases.value
.filter((db) => db.type !== "none")
.map((db) => ({
alias: db.alias,
type: db.type,
mode: db.mode,
service: db.service || undefined,
existing_container: db.mode === "existing" ? db.existingContainer : undefined,
external_host: db.mode === "external" ? db.externalHost : undefined,
external_port: db.mode === "external" && db.externalPort ? parseInt(db.externalPort) : undefined,
database_name: db.dbName || undefined,
username: db.dbUser || undefined,
env_prefix: db.envPrefix || db.alias,
}));

if (databases.length > 0) {
payload.databases = databases;
}
additionalDatabases.value.filter((db) => db.type !== "none").forEach((db) => databases.push(mapDbToPayload(db)));
}

if (databases.length > 0) {
payload.databases = databases;
}

if (finalDomain) {
Expand Down
Loading