Skip to content
This repository was archived by the owner on Jun 7, 2026. It is now read-only.

Commit 0483e30

Browse files
committed
Deployment removal and activation
1 parent 7947140 commit 0483e30

11 files changed

Lines changed: 336 additions & 68 deletions

File tree

sql/20250609211200_deployments.sql

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,19 @@ $$ LANGUAGE plpgsql;
2828

2929
CREATE TABLE deployment
3030
(
31-
id varchar(28) PRIMARY KEY,
32-
project_id text NOT NULL REFERENCES project (id) ON DELETE CASCADE,
33-
revision jsonb,
34-
status varchar(255) NOT NULL,
35-
user_id text references user_ (id),
36-
created_at timestamp(3) default CURRENT_TIMESTAMP NOT NULL
31+
id varchar(28) PRIMARY KEY,
32+
project_id text NOT NULL REFERENCES project (id) ON DELETE CASCADE,
33+
revision jsonb,
34+
status varchar(255) NOT NULL,
35+
active bool NOT NULL DEFAULT FALSE,
36+
user_id text references user_ (id),
37+
created_at timestamp(3) default CURRENT_TIMESTAMP NOT NULL
3738
);
3839

3940
CREATE OR REPLACE TRIGGER deployment_set_id
4041
BEFORE INSERT
4142
ON deployment
4243
FOR EACH ROW
43-
EXECUTE FUNCTION set_random_id(28);
44+
EXECUTE FUNCTION set_random_id(28);
45+
46+
CREATE UNIQUE INDEX single_active_deployment ON deployment (project_id, active) WHERE active;

src/api/v1/projects.cc

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -370,11 +370,7 @@ namespace api::v1 {
370370

371371
co_await global::storage->invalidateProject(project);
372372

373-
Json::Value root;
374-
root["message"] = "Project deleted successfully";
375-
const auto resp = HttpResponse::newHttpJsonResponse(root);
376-
resp->setStatusCode(k200OK);
377-
callback(resp);
373+
callback(simpleResponse("Project deleted successfully"));
378374
}
379375

380376
Task<> ProjectsController::redeployProject(const HttpRequestPtr req, const std::function<void(const HttpResponsePtr &)> callback,
@@ -470,8 +466,29 @@ namespace api::v1 {
470466
Task<> ProjectsController::getDeployments(const HttpRequestPtr req, const std::function<void(const HttpResponsePtr &)> callback,
471467
const std::string id) const {
472468
const auto project = co_await BaseProjectController::getUserProject(req, id);
473-
const auto deployments = co_await global::database->getDeployments(project.getValueOfId(), getTableQueryParams(req).page);
469+
auto deployments = co_await global::database->getDeployments(project.getValueOfId(), getTableQueryParams(req).page);
474470

475471
callback(jsonResponse(deployments));
476472
}
473+
474+
Task<> ProjectsController::deleteDeployment(const HttpRequestPtr req, const std::function<void(const HttpResponsePtr &)> callback,
475+
const std::string id) const {
476+
const auto deployment(co_await global::database->getDeployment(id));
477+
if (!deployment) {
478+
throw ApiException(Error::ErrBadRequest, "not_found");
479+
}
480+
const auto project(co_await BaseProjectController::getUserProject(req, deployment->getValueOfProjectId()));
481+
482+
if (const auto error = co_await global::database->deleteDeployment(id); error != Error::Ok) {
483+
logger.error("Failed to delete deployment {} in database", id);
484+
throw ApiException(Error::ErrInternal, "internal");
485+
}
486+
487+
if (deployment->getValueOfActive()) {
488+
logger.debug("Invalidating project after active deployment was removed");
489+
co_await global::storage->invalidateProject(project);
490+
}
491+
492+
callback(simpleResponse("Deployment deleted successfully"));
493+
}
477494
}

src/api/v1/projects.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ namespace api::v1 {
3636
ADD_METHOD_TO(ProjectsController::getRecipes, "/api/v1/dev/projects/{1:id}/content/recipes", drogon::Get, "AuthFilter");
3737
ADD_METHOD_TO(ProjectsController::getVersions, "/api/v1/dev/projects/{1:id}/versions", drogon::Get, "AuthFilter");
3838
ADD_METHOD_TO(ProjectsController::getDeployments, "/api/v1/dev/projects/{1:id}/deployments", drogon::Get, "AuthFilter");
39+
// TODO Deployment controller
40+
ADD_METHOD_TO(ProjectsController::deleteDeployment, "/api/v1/dev/deployments/{1:id}", drogon::Delete, "AuthFilter");
3941
// Dev content
4042
METHOD_LIST_END
4143
// clang-format on
@@ -82,6 +84,9 @@ namespace api::v1 {
8284
drogon::Task<> getDeployments(drogon::HttpRequestPtr req, std::function<void(const drogon::HttpResponsePtr &)> callback,
8385
std::string id) const;
8486

87+
drogon::Task<> deleteDeployment(drogon::HttpRequestPtr req, std::function<void(const drogon::HttpResponsePtr &)> callback,
88+
std::string id) const;
89+
8590
private:
8691
nlohmann::json processPlatforms(const nlohmann::json &metadata) const;
8792

@@ -93,6 +98,6 @@ namespace api::v1 {
9398
std::function<void(const drogon::HttpResponsePtr &)> callback,
9499
bool checkExisting) const;
95100

96-
void enqueueDeploy(const Project &project, const std::string userId) const;
101+
void enqueueDeploy(const Project &project, std::string userId) const;
97102
};
98103
}

0 commit comments

Comments
 (0)