Skip to content

Commit 3717ef9

Browse files
authored
Merge pull request #11 from wizpanda/stored-file-deletion
Added job to delete files which are marked for deletion in every 2 hr.
2 parents 0371d09 + 8f07168 commit 3717ef9

File tree

6 files changed

+103
-2
lines changed

6 files changed

+103
-2
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ classes/
1212
.project
1313
.settings
1414
.classpath
15+
out/

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ dependencies {
2727
compile "org.grails:grails-core"
2828
compile group: "org.apache.jclouds", name: "jclouds-core", version: "1.9.2"
2929
compile group: "org.apache.jclouds", name: "jclouds-allblobstore", version: "1.9.2"
30+
compile 'org.grails.plugins:quartz:2.0.13'
3031
console "org.grails:grails-console"
3132
profile "org.grails.profiles:plugin"
3233
provided "org.grails:grails-plugin-services"

grails-app/domain/com/wizpanda/file/StoredFile.groovy

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.jclouds.blobstore.domain.Blob
66

77
class StoredFile {
88

9-
boolean markedForDeletion
9+
Date markedForDeletion
1010

1111
String originalName
1212
String name
@@ -20,8 +20,12 @@ class StoredFile {
2020
Holders.getApplicationContext()['fileUploadService']
2121
}
2222

23+
static constraints = {
24+
markedForDeletion nullable: true
25+
}
26+
2327
StoredFileBlob getBlob() {
24-
Blob blob = getFileUploadService().getStorageApi(this.groupName).getBlob(this)
28+
Blob blob = getFileUploadService().getStorageApi(this.groupName).getBlob(this)
2529

2630
return new StoredFileBlob(blob)
2731
}
@@ -33,4 +37,10 @@ class StoredFile {
3337
void cloneFile(String newGroupName) {
3438
fileUploadService?.cloneFile(this, newGroupName)
3539
}
40+
41+
void markForDeletion() {
42+
this.markedForDeletion = new Date()
43+
this.save(failOnError: true)
44+
}
45+
3646
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.wizpanda.file
2+
3+
/**
4+
* Job to delete marked stored files from S3.
5+
*
6+
* @author Ankit Kumar Singh
7+
* @since 1.0.3
8+
*/
9+
class DeleteMarkedFileJob {
10+
11+
FileDeletionService fileDeletionService
12+
13+
static triggers = {
14+
simple repeatInterval: 1000l * 60 * 60 * 2 // execute job once in 2 hour
15+
}
16+
17+
def execute() {
18+
fileDeletionService.deleteMarkedFiles()
19+
}
20+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.wizpanda.file
2+
3+
4+
import grails.gorm.transactions.Transactional
5+
import groovy.time.TimeCategory
6+
7+
/**
8+
* Service class to perform delete operations on file which are marked for deletion.
9+
*
10+
* @author Ankit Kumar Singh
11+
* @since 1.0.3
12+
*/
13+
@Transactional
14+
class FileDeletionService {
15+
16+
private static final int MAX = 100
17+
18+
FileUploadService fileUploadService
19+
20+
/**
21+
* Method to delete stored files in every 2 hr.
22+
*/
23+
void deleteMarkedFiles() {
24+
Date dateForDeletion
25+
26+
use(TimeCategory) {
27+
dateForDeletion = new Date() - 2.hours
28+
}
29+
30+
List<StoredFile> storedFileList = StoredFile.createCriteria().list {
31+
isNotNull("markedForDeletion")
32+
le("markedForDeletion", dateForDeletion)
33+
34+
maxResult(MAX)
35+
}
36+
37+
storedFileList.each { StoredFile storedFile ->
38+
try {
39+
fileUploadService.delete(storedFile)
40+
log.debug "$storedFile deleted from S3"
41+
storedFile.delete(flush: true)
42+
} catch (Exception e) {
43+
log.debug "File deletion failed due to $e"
44+
}
45+
}
46+
47+
if (storedFileList.size() == MAX) {
48+
deleteMarkedFiles()
49+
}
50+
}
51+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.wizpanda.file
2+
3+
import grails.testing.services.ServiceUnitTest
4+
import spock.lang.Specification
5+
6+
class FileDeletionServiceSpec extends Specification implements ServiceUnitTest<FileDeletionService>{
7+
8+
def setup() {
9+
}
10+
11+
def cleanup() {
12+
}
13+
14+
void "test something"() {
15+
expect:"fix me"
16+
true == false
17+
}
18+
}

0 commit comments

Comments
 (0)