diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx b/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx
index 769283e81d..77d8697b80 100644
--- a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx
+++ b/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx
@@ -11,7 +11,7 @@ const statusBadgeVariants = cva(
enabled: "text-successA-11 bg-successA-3",
disabled: "text-warningA-11 bg-warningA-3",
live: "text-feature-11 bg-feature-4",
- rolledBack: "text-warningA-11 bg-warningA-2",
+ rolledBack: "text-warningA-11 bg-warningA-4",
},
},
defaultVariants: {
diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments-list.tsx b/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments-list.tsx
index baeb499a5d..76a87a8b36 100644
--- a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments-list.tsx
+++ b/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments-list.tsx
@@ -46,7 +46,7 @@ export const DeploymentsList = () => {
} | null>(null);
const isCompactView = useIsMobile({ breakpoint: COMPACT_BREAKPOINT });
- const { liveDeployment, deployments } = useDeployments();
+ const { liveDeployment, deployments, project } = useDeployments();
const columns: Column<{
deployment: Deployment;
@@ -60,7 +60,7 @@ export const DeploymentsList = () => {
headerClassName: "pl-[18px]",
render: ({ deployment, environment }) => {
const isLive = liveDeployment?.id === deployment.id;
- const isRolledBack = deployment.isRolledBack;
+ const isRolledBack = deployment.id === project?.rolledBackDeploymentId;
const isSelected = deployment.id === selectedDeployment?.deployment.id;
const iconContainer = (
{
},
},
];
- }, [selectedDeployment?.deployment.id, isCompactView, liveDeployment]);
+ }, [selectedDeployment?.deployment.id, isCompactView, liveDeployment, project]);
return (
{
onRowClick={setSelectedDeployment}
selectedItem={selectedDeployment}
keyExtractor={(deployment) => deployment.id}
- rowClassName={(deployment) => getRowClassName(deployment, selectedDeployment?.deployment.id)}
+ rowClassName={(deployment) =>
+ getRowClassName(
+ deployment,
+ selectedDeployment?.deployment.id ?? null,
+ project?.rolledBackDeploymentId ?? null,
+ )
+ }
emptyState={
diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/utils/get-row-class.ts b/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/utils/get-row-class.ts
index 1faf3f5e66..99497c2c68 100644
--- a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/utils/get-row-class.ts
+++ b/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/utils/get-row-class.ts
@@ -46,13 +46,15 @@ export const ROLLED_BACK_STYLES = {
focusRing: "focus:ring-warning-7",
};
-export const getRowClassName = (deployment: Deployment, selectedDeploymentId?: string) => {
+export const getRowClassName = (
+ deployment: Deployment,
+ selectedDeploymentId: string | null,
+ rolledBackDeploymentId: string | null,
+) => {
const isFailed = deployment.status === "failed";
- const style = isFailed
- ? FAILED_STATUS_STYLES
- : deployment.isRolledBack
- ? ROLLED_BACK_STYLES
- : STATUS_STYLES;
+ const isRolledBack = deployment.id === rolledBackDeploymentId;
+
+ const style = isFailed ? FAILED_STATUS_STYLES : isRolledBack ? ROLLED_BACK_STYLES : STATUS_STYLES;
const isSelected =
typeof selectedDeploymentId !== "undefined" && deployment.id === selectedDeploymentId;
diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-deployments.ts b/apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-deployments.ts
index 2510c5b1d2..413823ea21 100644
--- a/apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-deployments.ts
+++ b/apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-deployments.ts
@@ -113,6 +113,7 @@ export const useDeployments = () => {
);
return {
+ project,
deployments,
liveDeployment,
};
diff --git a/apps/dashboard/app/(app)/projects/_components/create-project/create-project-dialog.tsx b/apps/dashboard/app/(app)/projects/_components/create-project/create-project-dialog.tsx
index 8efa472b85..d9b8174f95 100644
--- a/apps/dashboard/app/(app)/projects/_components/create-project/create-project-dialog.tsx
+++ b/apps/dashboard/app/(app)/projects/_components/create-project/create-project-dialog.tsx
@@ -40,6 +40,7 @@ export const CreateProjectDialog = () => {
slug: values.slug,
gitRepositoryUrl: values.gitRepositoryUrl || null,
liveDeploymentId: null,
+ rolledBackDeploymentId: null,
updatedAt: null,
id: "will-be-replace-by-server",
author: "will-be-replace-by-server",
diff --git a/apps/dashboard/lib/collections/deploy/deployments.ts b/apps/dashboard/lib/collections/deploy/deployments.ts
index 36e34feeeb..5bc7498674 100644
--- a/apps/dashboard/lib/collections/deploy/deployments.ts
+++ b/apps/dashboard/lib/collections/deploy/deployments.ts
@@ -31,7 +31,6 @@ const schema = z.object({
cpus: z.number().min(1).max(16),
memory: z.number().min(1).max(1024),
}),
- isRolledBack: z.boolean(),
// Deployment status
status: z.enum(["pending", "building", "deploying", "network", "ready", "failed"]),
createdAt: z.number(),
diff --git a/apps/dashboard/lib/collections/deploy/projects.ts b/apps/dashboard/lib/collections/deploy/projects.ts
index 8ff351c45d..1f0023d0a8 100644
--- a/apps/dashboard/lib/collections/deploy/projects.ts
+++ b/apps/dashboard/lib/collections/deploy/projects.ts
@@ -11,6 +11,7 @@ const schema = z.object({
gitRepositoryUrl: z.string().nullable(),
updatedAt: z.number().int().nullable(),
liveDeploymentId: z.string().nullable(),
+ rolledBackDeploymentId: z.string().nullable(),
// Flattened deployment fields for UI
commitTitle: z.string(),
branch: z.string(),
@@ -43,6 +44,7 @@ export const projects = createCollection(
queryClient,
queryKey: ["projects"],
retry: 3,
+ refetchInterval: 5000,
queryFn: async () => {
return await trpcClient.deploy.project.list.query();
},
diff --git a/apps/dashboard/lib/trpc/routers/deploy/deployment/list.ts b/apps/dashboard/lib/trpc/routers/deploy/deployment/list.ts
index 0e07f01a05..12ffe8657e 100644
--- a/apps/dashboard/lib/trpc/routers/deploy/deployment/list.ts
+++ b/apps/dashboard/lib/trpc/routers/deploy/deployment/list.ts
@@ -27,7 +27,6 @@ export const listDeployments = t.procedure
gitCommitTimestamp: true,
runtimeConfig: true,
status: true,
- isRolledBack: true,
createdAt: true,
},
limit: 500,
diff --git a/apps/dashboard/lib/trpc/routers/deploy/project/list.ts b/apps/dashboard/lib/trpc/routers/deploy/project/list.ts
index b465ba1eed..f45ed07c58 100644
--- a/apps/dashboard/lib/trpc/routers/deploy/project/list.ts
+++ b/apps/dashboard/lib/trpc/routers/deploy/project/list.ts
@@ -11,6 +11,7 @@ type ProjectRow = {
updated_at: number | null;
git_repository_url: string | null;
live_deployment_id: string | null;
+ rolled_back_deployment_id: string | null;
git_commit_message: string | null;
git_branch: string | null;
git_commit_author_name: string | null;
@@ -32,6 +33,7 @@ export const listProjects = t.procedure
${projects.updatedAt},
${projects.gitRepositoryUrl},
${projects.liveDeploymentId},
+ ${projects.rolledBackDeploymentId},
${deployments.gitCommitMessage},
${deployments.gitBranch},
${deployments.gitCommitAuthorName},
@@ -57,6 +59,7 @@ export const listProjects = t.procedure
updatedAt: row.updated_at,
gitRepositoryUrl: row.git_repository_url,
liveDeploymentId: row.live_deployment_id,
+ rolledBackDeploymentId: row.rolled_back_deployment_id,
commitTitle: row.git_commit_message ?? "[DUMMY] Initial commit",
branch: row.git_branch ?? "main",
author: row.git_commit_author_name ?? "[DUMMY] Unknown Author",
diff --git a/go/apps/ctrl/services/deployment/deploy_workflow.go b/go/apps/ctrl/services/deployment/deploy_workflow.go
index ce9116d81b..9a5cf02cc7 100644
--- a/go/apps/ctrl/services/deployment/deploy_workflow.go
+++ b/go/apps/ctrl/services/deployment/deploy_workflow.go
@@ -393,36 +393,30 @@ func (w *DeployWorkflow) Run(ctx hydra.WorkflowContext, req *DeployRequest) erro
}
// Update deployment status to ready
- _, err = hydra.Step(ctx, "update-deployment-ready", func(stepCtx context.Context) (*DeploymentResult, error) {
- w.logger.Info("updating deployment status to ready", "deployment_id", req.DeploymentID)
- completionTime := time.Now().UnixMilli()
- activeErr := db.Query.UpdateDeploymentStatus(stepCtx, w.db.RW(), db.UpdateDeploymentStatusParams{
+ err = hydra.StepVoid(ctx, "update-deployment-ready", func(stepCtx context.Context) error {
+ return db.Query.UpdateDeploymentStatus(stepCtx, w.db.RW(), db.UpdateDeploymentStatusParams{
ID: req.DeploymentID,
Status: db.DeploymentsStatusReady,
- UpdatedAt: sql.NullInt64{Valid: true, Int64: completionTime},
+ UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
})
- if activeErr != nil {
- return nil, fmt.Errorf("failed to update deployment %s status to ready: %w", req.DeploymentID, activeErr)
- }
- w.logger.Info("deployment status updated to ready", "deployment_id", req.DeploymentID)
+ })
+ if err != nil {
+ return err
+ }
- // TODO: This section will be removed in the future in favor of "Promote to Production"
- err = db.Query.UpdateProjectLiveDeploymentId(stepCtx, w.db.RW(), db.UpdateProjectLiveDeploymentIdParams{
- ID: req.ProjectID,
- LiveDeploymentID: sql.NullString{Valid: true, String: req.DeploymentID},
- UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
+ if !project.RolledBackDeploymentID.Valid {
+ // only update this if the deployment is not rolled back
+ err = hydra.StepVoid(ctx, "update-project-deployment-pointers", func(stepCtx context.Context) error {
+ return db.Query.UpdateProjectDeployments(stepCtx, w.db.RW(), db.UpdateProjectDeploymentsParams{
+ ID: req.ProjectID,
+ LiveDeploymentID: sql.NullString{Valid: true, String: req.DeploymentID},
+ RolledBackDeploymentID: sql.NullString{Valid: false, String: ""},
+ UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
+ })
})
if err != nil {
- return nil, fmt.Errorf("failed to update project %s active deployment ID to %s: %w", req.ProjectID, req.DeploymentID, err)
+ return err
}
-
- return &DeploymentResult{
- DeploymentID: req.DeploymentID,
- Status: "ready",
- }, nil
- })
- if err != nil {
- return err
}
/*
diff --git a/go/apps/ctrl/services/deployment/rollback.go b/go/apps/ctrl/services/deployment/rollback.go
index 79a9f50227..b1cc6cb17f 100644
--- a/go/apps/ctrl/services/deployment/rollback.go
+++ b/go/apps/ctrl/services/deployment/rollback.go
@@ -166,45 +166,20 @@ func (s *Service) Rollback(ctx context.Context, req *connect.Request[ctrlv1.Roll
}
}
- err = db.Query.UpdateProjectLiveDeploymentId(ctx, s.db.RW(), db.UpdateProjectLiveDeploymentIdParams{
- ID: project.ID,
- LiveDeploymentID: sql.NullString{Valid: true, String: targetDeployment.ID},
- UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
+ err = db.Query.UpdateProjectDeployments(ctx, s.db.RW(), db.UpdateProjectDeploymentsParams{
+ ID: project.ID,
+ LiveDeploymentID: sql.NullString{Valid: true, String: targetDeployment.ID},
+ RolledBackDeploymentID: sql.NullString{Valid: true, String: sourceDeployment.ID},
+ UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
})
if err != nil {
- s.logger.Error("failed to update project active deployment ID",
+ s.logger.Error("failed to update project deployments",
"project_id", project.ID,
"error", err.Error(),
)
return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to update project's live deployment id: %w", err))
}
- err = db.Query.UpdateDeploymentRollback(ctx, s.db.RW(), db.UpdateDeploymentRollbackParams{
- ID: sourceDeployment.ID,
- IsRolledBack: false,
- UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
- })
- if err != nil {
- s.logger.Error("failed to update deployment rollback status",
- "deployment_id", sourceDeployment.ID,
- "error", err.Error(),
- )
- return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to update deployment: %w", err))
- }
-
- err = db.Query.UpdateDeploymentRollback(ctx, s.db.RW(), db.UpdateDeploymentRollbackParams{
- ID: targetDeployment.ID,
- IsRolledBack: true,
- UpdatedAt: sql.NullInt64{Valid: true, Int64: time.Now().UnixMilli()},
- })
- if err != nil {
- s.logger.Error("failed to update deployment rollback status",
- "deployment_id", targetDeployment.ID,
- "error", err.Error(),
- )
- return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to update deployment: %w", err))
- }
-
res := &ctrlv1.RollbackResponse{
Domains: make([]string, len(domainChanges)),
}
diff --git a/go/pkg/db/deployment_update_rollback.sql_generated.go b/go/pkg/db/deployment_update_rollback.sql_generated.go
deleted file mode 100644
index c5f992e077..0000000000
--- a/go/pkg/db/deployment_update_rollback.sql_generated.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Code generated by sqlc. DO NOT EDIT.
-// versions:
-// sqlc v1.29.0
-// source: deployment_update_rollback.sql
-
-package db
-
-import (
- "context"
- "database/sql"
-)
-
-const updateDeploymentRollback = `-- name: UpdateDeploymentRollback :exec
-UPDATE deployments
-SET is_rolled_back = ?, updated_at = ?
-WHERE id = ?
-`
-
-type UpdateDeploymentRollbackParams struct {
- IsRolledBack bool `db:"is_rolled_back"`
- UpdatedAt sql.NullInt64 `db:"updated_at"`
- ID string `db:"id"`
-}
-
-// UpdateDeploymentRollback
-//
-// UPDATE deployments
-// SET is_rolled_back = ?, updated_at = ?
-// WHERE id = ?
-func (q *Queries) UpdateDeploymentRollback(ctx context.Context, db DBTX, arg UpdateDeploymentRollbackParams) error {
- _, err := db.ExecContext(ctx, updateDeploymentRollback, arg.IsRolledBack, arg.UpdatedAt, arg.ID)
- return err
-}
diff --git a/go/pkg/db/models_generated.go b/go/pkg/db/models_generated.go
index 5b25ddeef2..ced74268a4 100644
--- a/go/pkg/db/models_generated.go
+++ b/go/pkg/db/models_generated.go
@@ -571,7 +571,6 @@ type Deployment struct {
WorkspaceID string `db:"workspace_id"`
ProjectID string `db:"project_id"`
EnvironmentID string `db:"environment_id"`
- IsRolledBack bool `db:"is_rolled_back"`
GitCommitSha sql.NullString `db:"git_commit_sha"`
GitBranch sql.NullString `db:"git_branch"`
GitCommitMessage sql.NullString `db:"git_commit_message"`
@@ -715,16 +714,17 @@ type Permission struct {
}
type Project struct {
- ID string `db:"id"`
- WorkspaceID string `db:"workspace_id"`
- Name string `db:"name"`
- Slug string `db:"slug"`
- GitRepositoryUrl sql.NullString `db:"git_repository_url"`
- LiveDeploymentID sql.NullString `db:"live_deployment_id"`
- DefaultBranch sql.NullString `db:"default_branch"`
- DeleteProtection sql.NullBool `db:"delete_protection"`
- CreatedAt int64 `db:"created_at"`
- UpdatedAt sql.NullInt64 `db:"updated_at"`
+ ID string `db:"id"`
+ WorkspaceID string `db:"workspace_id"`
+ Name string `db:"name"`
+ Slug string `db:"slug"`
+ GitRepositoryUrl sql.NullString `db:"git_repository_url"`
+ LiveDeploymentID sql.NullString `db:"live_deployment_id"`
+ RolledBackDeploymentID sql.NullString `db:"rolled_back_deployment_id"`
+ DefaultBranch sql.NullString `db:"default_branch"`
+ DeleteProtection sql.NullBool `db:"delete_protection"`
+ CreatedAt int64 `db:"created_at"`
+ UpdatedAt sql.NullInt64 `db:"updated_at"`
}
type Quotum struct {
diff --git a/go/pkg/db/project_find_by_id.sql_generated.go b/go/pkg/db/project_find_by_id.sql_generated.go
index a53ee21b17..dd00aea217 100644
--- a/go/pkg/db/project_find_by_id.sql_generated.go
+++ b/go/pkg/db/project_find_by_id.sql_generated.go
@@ -20,6 +20,7 @@ SELECT
default_branch,
delete_protection,
live_deployment_id,
+ rolled_back_deployment_id,
created_at,
updated_at
FROM projects
@@ -27,16 +28,17 @@ WHERE id = ?
`
type FindProjectByIdRow struct {
- ID string `db:"id"`
- WorkspaceID string `db:"workspace_id"`
- Name string `db:"name"`
- Slug string `db:"slug"`
- GitRepositoryUrl sql.NullString `db:"git_repository_url"`
- DefaultBranch sql.NullString `db:"default_branch"`
- DeleteProtection sql.NullBool `db:"delete_protection"`
- LiveDeploymentID sql.NullString `db:"live_deployment_id"`
- CreatedAt int64 `db:"created_at"`
- UpdatedAt sql.NullInt64 `db:"updated_at"`
+ ID string `db:"id"`
+ WorkspaceID string `db:"workspace_id"`
+ Name string `db:"name"`
+ Slug string `db:"slug"`
+ GitRepositoryUrl sql.NullString `db:"git_repository_url"`
+ DefaultBranch sql.NullString `db:"default_branch"`
+ DeleteProtection sql.NullBool `db:"delete_protection"`
+ LiveDeploymentID sql.NullString `db:"live_deployment_id"`
+ RolledBackDeploymentID sql.NullString `db:"rolled_back_deployment_id"`
+ CreatedAt int64 `db:"created_at"`
+ UpdatedAt sql.NullInt64 `db:"updated_at"`
}
// FindProjectById
@@ -50,6 +52,7 @@ type FindProjectByIdRow struct {
// default_branch,
// delete_protection,
// live_deployment_id,
+// rolled_back_deployment_id,
// created_at,
// updated_at
// FROM projects
@@ -66,6 +69,7 @@ func (q *Queries) FindProjectById(ctx context.Context, db DBTX, id string) (Find
&i.DefaultBranch,
&i.DeleteProtection,
&i.LiveDeploymentID,
+ &i.RolledBackDeploymentID,
&i.CreatedAt,
&i.UpdatedAt,
)
diff --git a/go/pkg/db/project_update_deployments.sql_generated.go b/go/pkg/db/project_update_deployments.sql_generated.go
new file mode 100644
index 0000000000..bb566944ee
--- /dev/null
+++ b/go/pkg/db/project_update_deployments.sql_generated.go
@@ -0,0 +1,45 @@
+// Code generated by sqlc. DO NOT EDIT.
+// versions:
+// sqlc v1.29.0
+// source: project_update_deployments.sql
+
+package db
+
+import (
+ "context"
+ "database/sql"
+)
+
+const updateProjectDeployments = `-- name: UpdateProjectDeployments :exec
+UPDATE projects
+SET
+ live_deployment_id = ?,
+ rolled_back_deployment_id = ?,
+ updated_at = ?
+WHERE id = ?
+`
+
+type UpdateProjectDeploymentsParams struct {
+ LiveDeploymentID sql.NullString `db:"live_deployment_id"`
+ RolledBackDeploymentID sql.NullString `db:"rolled_back_deployment_id"`
+ UpdatedAt sql.NullInt64 `db:"updated_at"`
+ ID string `db:"id"`
+}
+
+// UpdateProjectDeployments
+//
+// UPDATE projects
+// SET
+// live_deployment_id = ?,
+// rolled_back_deployment_id = ?,
+// updated_at = ?
+// WHERE id = ?
+func (q *Queries) UpdateProjectDeployments(ctx context.Context, db DBTX, arg UpdateProjectDeploymentsParams) error {
+ _, err := db.ExecContext(ctx, updateProjectDeployments,
+ arg.LiveDeploymentID,
+ arg.RolledBackDeploymentID,
+ arg.UpdatedAt,
+ arg.ID,
+ )
+ return err
+}
diff --git a/go/pkg/db/project_update_live_deployment_id.sql_generated.go b/go/pkg/db/project_update_live_deployment_id.sql_generated.go
deleted file mode 100644
index e68c491f75..0000000000
--- a/go/pkg/db/project_update_live_deployment_id.sql_generated.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Code generated by sqlc. DO NOT EDIT.
-// versions:
-// sqlc v1.29.0
-// source: project_update_live_deployment_id.sql
-
-package db
-
-import (
- "context"
- "database/sql"
-)
-
-const updateProjectLiveDeploymentId = `-- name: UpdateProjectLiveDeploymentId :exec
-UPDATE projects
-SET live_deployment_id = ?, updated_at = ?
-WHERE id = ?
-`
-
-type UpdateProjectLiveDeploymentIdParams struct {
- LiveDeploymentID sql.NullString `db:"live_deployment_id"`
- UpdatedAt sql.NullInt64 `db:"updated_at"`
- ID string `db:"id"`
-}
-
-// UpdateProjectLiveDeploymentId
-//
-// UPDATE projects
-// SET live_deployment_id = ?, updated_at = ?
-// WHERE id = ?
-func (q *Queries) UpdateProjectLiveDeploymentId(ctx context.Context, db DBTX, arg UpdateProjectLiveDeploymentIdParams) error {
- _, err := db.ExecContext(ctx, updateProjectLiveDeploymentId, arg.LiveDeploymentID, arg.UpdatedAt, arg.ID)
- return err
-}
diff --git a/go/pkg/db/querier_generated.go b/go/pkg/db/querier_generated.go
index 0b917bfd16..1f6af13fb1 100644
--- a/go/pkg/db/querier_generated.go
+++ b/go/pkg/db/querier_generated.go
@@ -597,6 +597,7 @@ type Querier interface {
// default_branch,
// delete_protection,
// live_deployment_id,
+ // rolled_back_deployment_id,
// created_at,
// updated_at
// FROM projects
@@ -1612,12 +1613,6 @@ type Querier interface {
// SET openapi_spec = ?, updated_at = ?
// WHERE id = ?
UpdateDeploymentOpenapiSpec(ctx context.Context, db DBTX, arg UpdateDeploymentOpenapiSpecParams) error
- //UpdateDeploymentRollback
- //
- // UPDATE deployments
- // SET is_rolled_back = ?, updated_at = ?
- // WHERE id = ?
- UpdateDeploymentRollback(ctx context.Context, db DBTX, arg UpdateDeploymentRollbackParams) error
//UpdateDeploymentStatus
//
// UPDATE deployments
@@ -1700,12 +1695,15 @@ type Querier interface {
//
// UPDATE `key_auth` SET store_encrypted_keys = ? WHERE id = ?
UpdateKeyringKeyEncryption(ctx context.Context, db DBTX, arg UpdateKeyringKeyEncryptionParams) error
- //UpdateProjectLiveDeploymentId
+ //UpdateProjectDeployments
//
// UPDATE projects
- // SET live_deployment_id = ?, updated_at = ?
+ // SET
+ // live_deployment_id = ?,
+ // rolled_back_deployment_id = ?,
+ // updated_at = ?
// WHERE id = ?
- UpdateProjectLiveDeploymentId(ctx context.Context, db DBTX, arg UpdateProjectLiveDeploymentIdParams) error
+ UpdateProjectDeployments(ctx context.Context, db DBTX, arg UpdateProjectDeploymentsParams) error
//UpdateRatelimit
//
// UPDATE `ratelimits`
diff --git a/go/pkg/db/queries/deployment_update_rollback.sql b/go/pkg/db/queries/deployment_update_rollback.sql
deleted file mode 100644
index 1c3b08445d..0000000000
--- a/go/pkg/db/queries/deployment_update_rollback.sql
+++ /dev/null
@@ -1,4 +0,0 @@
--- name: UpdateDeploymentRollback :exec
-UPDATE deployments
-SET is_rolled_back = ?, updated_at = ?
-WHERE id = ?;
diff --git a/go/pkg/db/queries/project_find_by_id.sql b/go/pkg/db/queries/project_find_by_id.sql
index 0321dc9836..4d157da891 100644
--- a/go/pkg/db/queries/project_find_by_id.sql
+++ b/go/pkg/db/queries/project_find_by_id.sql
@@ -8,6 +8,7 @@ SELECT
default_branch,
delete_protection,
live_deployment_id,
+ rolled_back_deployment_id,
created_at,
updated_at
FROM projects
diff --git a/go/pkg/db/queries/project_update_deployments.sql b/go/pkg/db/queries/project_update_deployments.sql
new file mode 100644
index 0000000000..0d9432144f
--- /dev/null
+++ b/go/pkg/db/queries/project_update_deployments.sql
@@ -0,0 +1,7 @@
+-- name: UpdateProjectDeployments :exec
+UPDATE projects
+SET
+ live_deployment_id = sqlc.arg(live_deployment_id),
+ rolled_back_deployment_id = sqlc.arg(rolled_back_deployment_id),
+ updated_at = sqlc.arg(updated_at)
+WHERE id = sqlc.arg(id);
diff --git a/go/pkg/db/queries/project_update_live_deployment_id.sql b/go/pkg/db/queries/project_update_live_deployment_id.sql
deleted file mode 100644
index 45d8c52dc3..0000000000
--- a/go/pkg/db/queries/project_update_live_deployment_id.sql
+++ /dev/null
@@ -1,4 +0,0 @@
--- name: UpdateProjectLiveDeploymentId :exec
-UPDATE projects
-SET live_deployment_id = ?, updated_at = ?
-WHERE id = ?;
diff --git a/go/pkg/db/schema.sql b/go/pkg/db/schema.sql
index 4baaf8e81f..1815769695 100644
--- a/go/pkg/db/schema.sql
+++ b/go/pkg/db/schema.sql
@@ -314,6 +314,7 @@ CREATE TABLE `projects` (
`slug` varchar(256) NOT NULL,
`git_repository_url` varchar(500),
`live_deployment_id` varchar(256),
+ `rolled_back_deployment_id` varchar(256),
`default_branch` varchar(256) DEFAULT 'main',
`delete_protection` boolean DEFAULT false,
`created_at` bigint NOT NULL,
@@ -327,7 +328,6 @@ CREATE TABLE `deployments` (
`workspace_id` varchar(256) NOT NULL,
`project_id` varchar(256) NOT NULL,
`environment_id` varchar(256) NOT NULL,
- `is_rolled_back` boolean NOT NULL DEFAULT false,
`git_commit_sha` varchar(40),
`git_branch` varchar(256),
`git_commit_message` text,
diff --git a/internal/db/src/schema/deployments.ts b/internal/db/src/schema/deployments.ts
index 9f14b43d8c..b532a77960 100644
--- a/internal/db/src/schema/deployments.ts
+++ b/internal/db/src/schema/deployments.ts
@@ -1,14 +1,5 @@
import { relations } from "drizzle-orm";
-import {
- bigint,
- boolean,
- index,
- json,
- mysqlEnum,
- mysqlTable,
- text,
- varchar,
-} from "drizzle-orm/mysql-core";
+import { bigint, index, json, mysqlEnum, mysqlTable, text, varchar } from "drizzle-orm/mysql-core";
import { deploymentSteps } from "./deployment_steps";
import { environments } from "./environments";
import { projects } from "./projects";
@@ -25,8 +16,6 @@ export const deployments = mysqlTable(
// Environment configuration (production, preview, etc.)
environmentId: varchar("environment_id", { length: 256 }).notNull(),
- isRolledBack: boolean("is_rolled_back").notNull().default(false),
-
// Git information
gitCommitSha: varchar("git_commit_sha", { length: 40 }),
gitBranch: varchar("git_branch", { length: 256 }),
diff --git a/internal/db/src/schema/projects.ts b/internal/db/src/schema/projects.ts
index 91fd36a846..48ae8d366d 100644
--- a/internal/db/src/schema/projects.ts
+++ b/internal/db/src/schema/projects.ts
@@ -19,6 +19,9 @@ export const projects = mysqlTable(
// this is likely temporary but we need a way to point to the current prod deployment.
// in the future I think we want to have a special deployment per environment, but for now this is fine
liveDeploymentId: varchar("live_deployment_id", { length: 256 }),
+ rolledBackDeploymentId: varchar("rolled_back_deployment_id", {
+ length: 256,
+ }),
defaultBranch: varchar("default_branch", { length: 256 }).default("main"),
...deleteProtection,