SUSI Skill CMS is a web application to create and edit skills. In this blog post I will be covering how we made the skill deleting feature in Skill CMS from the SUSI Server.
The deletion of skill was to be made in such a way that user can click a button to delete the skill. As soon as they click the delete button the skill is deleted it is removed from the directory of SUSI Skills. But admins have an option to recover the deleted skill before completion of 30 days of deleting the skill.
First we will accept all the request parameters from the GET request.
String model_name = call.get("model", "general"); String group_name = call.get("group", "Knowledge"); String language_name = call.get("language", "en"); String skill_name = call.get("skill", "wikipedia");
In this we get the model name, category, language name, skill name and the commit ID. The above 4 parameters are used to make a file path that is used to find the location of the skill in the Susi Skill Data repository.
if(!DAO.deleted_skill_dir.exists()){
DAO.deleted_skill_dir.mkdirs();
}
We need to move the skill to a directory called deleted_skills_dir. So we check if the directory exists or not. If it not exists then we create a directory for the deleted skills.
if (skill.exists()) { File file = new File(DAO.deleted_skill_dir.getPath()+path); file.getParentFile().mkdirs(); if(skill.renameTo(file)){ Boolean changed = new File(DAO.deleted_skill_dir.getPath()+path).setLastModified(System.currentTimeMillis()); }
This is the part where the real deletion happens. We get the path of the skill and rename that to a new path which is in the directory of deleted skills.
Also here change the last modified time of the skill as the current time. This time is used to check if the skill deleted is older than 30 days or not.
try (Git git = DAO.getGit()) { DAO.pushCommit(git, "Deleted " + skill_name, rights.getIdentity().isEmail() ? rights.getIdentity().getName() : "anonymous@"); json.put("accepted", true); json.put("message", "Deleted " + skill_name); } catch (IOException | GitAPIException e) {
Finally we add the changes to Git. DAO.pushCommit pushes to commit to the Susi Skill Data repository. If the user is logged in we get the email of the user and set that email as the commit author. Else we set the username “anonymous@”.
Then in the caretaker class there is a method deleteOldFiles that checks for all the files whose last modified time was older than 30 days. If there is any file whose last modified time was older than 30 days then it quietly delete the files.
public void deleteOldFiles() { Collection<File> filesToDelete = FileUtils.listFiles(new File(DAO.deleted_skill_dir.getPath()), new (DateTime.now().withTimeAtStartOfDay().minusDays(30).toDate()), TrueFileFilter.TRUE); // include sub dirs for (File file : filesToDelete) { boolean success = FileUtils.deleteQuietly(file); if (!success) { System.out.print("Deleted skill older than 30 days."); } } }
To test this API endpoint, we need to call http://localhost:4000/cms/deleteSkill.txt?model=general&group=Knowledge&language=en&skill=<skill_name>
Resources
JGit Documentation: https://eclipse.org/jgit/documentation/
Commons IO: https://commons.apache.org/proper/commons-io/
JGit User Guide: http://wiki.eclipse.org/JGit/User_Guide
JGit Repository access: http://www.codeaffine.com/2014/09/22/access-git-repository-with-jgit/