Merge pull request #12671 from overleaf/em-git-bridge-delete-project

Add endpoint to delete project data in git bridge

GitOrigin-RevId: bdc9701284255166bf4a122dad5fd89ced0c0ca2
This commit is contained in:
Eric Mc Sween
2023-04-24 10:39:45 -04:00
committed by Copybot
parent afd1195902
commit c539e960e7
9 changed files with 136 additions and 11 deletions
@@ -677,6 +677,20 @@ public class Bridge {
);
}
/**
* Delete a project's data
*/
public void deleteProject(String projectName) {
Log.info("[{}] deleting project", projectName);
dbStore.deleteProject(projectName);
try {
repoStore.remove(projectName);
} catch (IOException e) {
Log.warn("Failed to delete repository for project {}: {}", projectName, e);
}
swapStore.remove(projectName);
}
/* PRIVATE */
/**
@@ -41,4 +41,8 @@ public interface DBStore {
*/
void setLastAccessedTime(String projectName, Timestamp time);
/**
* Delete the metadata associated with the given project.
*/
void deleteProject(String projectName);
}
@@ -72,4 +72,7 @@ public class NoopDbStore implements DBStore {
public String getSwapCompression(String projectName) {
return null;
}
@Override
public void deleteProject(String projectName) {}
}
@@ -112,12 +112,12 @@ public class SqliteDBStore implements DBStore {
@Override
public void swap(String projectName, String compressionMethod) {
update(new UpdateSwap(projectName, compressionMethod));
update(new UpdateSwap(projectName, compressionMethod));
}
@Override
public void restore(String projectName) {
update(new UpdateRestore(projectName));
update(new UpdateRestore(projectName));
}
@Override
@@ -125,6 +125,12 @@ public class SqliteDBStore implements DBStore {
return query(new GetSwapCompression(projectName));
}
@Override
public void deleteProject(String projectName) {
update(new DeleteAllFilesInProjectSQLUpdate(projectName));
update(new DeleteProjectSQLUpdate(projectName));
}
private Connection openConnectionTo(File dbFile) {
File parentDir = dbFile.getParentFile();
if (!parentDir.exists() && !parentDir.mkdirs()) {
@@ -0,0 +1,24 @@
package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.delete;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate;
public class DeleteAllFilesInProjectSQLUpdate implements SQLUpdate {
private final String projectName;
public DeleteAllFilesInProjectSQLUpdate(String projectName) {
this.projectName = projectName;
}
@Override
public String getSQL() {
return "DELETE FROM `url_index_store` WHERE `project_name` = ?";
}
@Override
public void addParametersToStatement(PreparedStatement statement) throws SQLException {
statement.setString(1, projectName);
}
}
@@ -0,0 +1,24 @@
package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.delete;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate;
public class DeleteProjectSQLUpdate implements SQLUpdate {
private final String projectName;
public DeleteProjectSQLUpdate(String projectName) {
this.projectName = projectName;
}
@Override
public String getSQL() {
return "DELETE FROM `projects` WHERE `name` = ?";
}
@Override
public void addParametersToStatement(PreparedStatement statement) throws SQLException {
statement.setString(1, projectName);
}
}
@@ -148,6 +148,7 @@ public class GitBridgeServer {
HandlerCollection handlers = new HandlerList();
handlers.addHandler(initResourceHandler());
handlers.addHandler(new PostbackHandler(bridge));
handlers.addHandler(new ProjectDeletionHandler(bridge));
handlers.addHandler(new DefaultHandler());
api.setHandler(handlers);
@@ -0,0 +1,39 @@
package uk.ac.ic.wlgitbridge.server;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.Request;
import uk.ac.ic.wlgitbridge.bridge.Bridge;
public class ProjectDeletionHandler extends AbstractHandler {
private final Bridge bridge;
private final Pattern routePattern = Pattern.compile("^/projects/([0-9a-f]{24})$");
public ProjectDeletionHandler(Bridge bridge) {
this.bridge = bridge;
}
@Override
public void handle(
String target,
Request baseRequest,
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String method = baseRequest.getMethod();
Matcher matcher = routePattern.matcher(target);
if (method.equals("DELETE") && target != null && matcher.matches()) {
String projectName = matcher.group(1);
response.setContentType("text/plain");
response.setStatus(204);
this.bridge.deleteProject(projectName);
baseRequest.setHandled(true);
}
}
}