Skip to content

Commit

Permalink
Add new Job to send email reminder
Browse files Browse the repository at this point in the history
  • Loading branch information
arief-hidayat committed Nov 11, 2012
1 parent 869bc7a commit 1e6ccd9
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 8 deletions.
20 changes: 19 additions & 1 deletion grails-app/conf/BootStrap.groovy
Expand Up @@ -85,7 +85,7 @@ class BootStrap {
User volunteerUser = new User(
firstName: 'Volunteer',
lastName: 'Tester',
email: 'volunteer@example.com',
email: 'mr.arief.hidayat@gmail.com', // test email reminder. must use valid address.
username: 'guest',
password: 'test123',
enabled: true,
Expand Down Expand Up @@ -118,8 +118,25 @@ class BootStrap {
secUser: volunteerUser2,
secRole: volunteerRole
).save(failOnError: true)
testSendMail()
}
}
def mailService
def testSendMail() {

try {
mailService.sendMail {
to "mr.arief.hidayat@gmail.com"
from "imms.noreply@gmail.com"
subject "[Enlist Reminder] Get Ready!"
body "testing"
}
} catch(Exception e) {
e.printStackTrace()
while(e.cause != null) e = e.cause
log.error("Failed to send email. ${e.message}")
}
}
def buildTestDataPointTxn() {
for(User user : User.list()) {
(1..5).each { int count ->
Expand All @@ -130,6 +147,7 @@ class BootStrap {
txn.save(failOnError: true, validate: false)
user.currPoints = (user.currPoints ?:0) + txn.amount
}

user.save(validate: false)
}
}
Expand Down
23 changes: 17 additions & 6 deletions grails-app/conf/Config.groovy
Expand Up @@ -62,16 +62,24 @@ grails.hibernate.cache.queries = false
environments {
development {
grails.logging.jul.usebridge = true
grails.mail.default.from="enlistappg48@gmail.com"
grails {
mail {
host = "smtp.gmail.com"
port = 465
username = "enlistappg48@gmail.com"
password = "Grails48Hack"
props = ["mail.smtp.auth":"true",
"mail.smtp.socketFactory.port":"465",
"mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
"mail.smtp.socketFactory.fallback":"false"]
// port = 465
// props = ["mail.smtp.auth":"true",
// "mail.smtp.socketFactory.port":"465",
// "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
// "mail.smtp.socketFactory.fallback":"false"]

port = 587
props = [
"mail.smtp.auth":"true",
"mail.smtp.socketFactory.port":"587",
"mail.smtp.starttls.enable": "true",
"mail.smtp.socketFactory.fallback":"false"]
}
}
}
Expand Down Expand Up @@ -125,13 +133,16 @@ rule {
batch {
// run every 6 hours?
ActivityPointJob = "0 0 0/6 * * ?"
ActivityReminderJob = "0 0 1/6 * * ?"
}

environments {
// override this
development {
rule.activity.allowRegistrationAfterEndDate = true
// run every 5 minutes?
batch.ActivityPointJob = "0 0/5 * * * ?"
// batch.ActivityPointJob = "0 0/5 * * * ?"
// batch.ActivityReminderJob = "0 2/5 * * * ?"
batch.ActivityReminderJob = "0 1/3 * * * ?"
}
}
Expand Up @@ -78,7 +78,6 @@ class ActivityController extends AbstractBaseController {
}
@Secured(['ROLE_VOLUNTEER'])
def changeReminder() {
println "change reminder ${params}"
Date reminderAt = null
if(StringUtils.equals('on',params["remindMe"]) &&
params["reminderDate_date"] && params["reminderDate_time"]) {
Expand Down
1 change: 1 addition & 0 deletions grails-app/domain/enlist/grails/ActivitySignUp.groovy
Expand Up @@ -61,6 +61,7 @@ class ActivitySignUp implements Serializable {
version false
user index : 'userActivityIdx'
activity index : 'userActivityIdx'
reminderAt index : 'userActivityIdx_1'
}
static constraints = {
reminderAt nullable : true
Expand Down
26 changes: 26 additions & 0 deletions grails-app/jobs/enlist/grails/ActivityReminderJob.groovy
@@ -0,0 +1,26 @@
package enlist.grails

import org.codehaus.groovy.grails.commons.ConfigurationHolder
import enlist.grails.util.DateParser


class ActivityReminderJob {
static triggers = {
cron name: 'ActivityReminder', cronExpression: ConfigurationHolder.config.batch.ActivityReminderJob
}

static final String BATCH_JOB_NAME = "activityReminder"
static final String LAST_ACT_END = "lastActivityReminderDate"

def activityService
def execute() {
println "run ActivityReminderJob"
BatchJobParameter batchJobParameter = BatchJobParameter.get( BATCH_JOB_NAME, LAST_ACT_END )
Date lastActReminderDate = activityService.batchSendEmailReminder(batchJobParameter)
if(lastActReminderDate) {
if(!batchJobParameter) batchJobParameter = new BatchJobParameter(batchName: BATCH_JOB_NAME, parameterName: LAST_ACT_END)
batchJobParameter.value = DateParser.printDateTimeDefault(lastActReminderDate)
batchJobParameter.save(failOnError: true, flush: true, validate: false)
}
}
}
45 changes: 45 additions & 0 deletions grails-app/services/enlist/grails/ActivityService.groovy
Expand Up @@ -55,4 +55,49 @@ class ActivityService {
}
return activity.points
}

def mailService
@Transactional
Date batchSendEmailReminder(BatchJobParameter batchJobParameter) {
Date lastReminder = batchJobParameter ? DateParser.parseDateTimeDefault(batchJobParameter.value) : null
def signUpList = ActivitySignUp.createCriteria().list {
isNotNull("reminderAt")
lte("reminderAt", new Date())
if(lastReminder) gt("reminderAt", lastReminder)
order "reminderAt", "asc"
}
def userSignUpMap = [:]
Status active = Status.findWhere(status: 'Active')
for(ActivitySignUp signUp : signUpList) {
if(!StringUtils.isBlank(signUp.user?.email) && signUp.user?.status.id == active.id) {
String email =signUp.user.email.toLowerCase()
def activities = userSignUpMap.get(email) ?: []
activities << signUp.activity
userSignUpMap.put(email,activities)
}
if(lastReminder == null || lastReminder.time < signUp.reminderAt.time) lastReminder = signUp.reminderAt
}
userSignUpMap.each { String email, def activities ->
sendEmailReminderForMultipleEvents(email, activities)
}
lastReminder
}
void sendEmailReminderForMultipleEvents(String userEmail, def activities) {
log.debug("send email to ${userEmail}")
String content = "Upcoming event's activities:\n"
activities.each { Activity it ->
content += " ** '${it.title}' @ ${it.location} will start at: ${it.startDate}"
}
try {
mailService.sendMail {
to userEmail
subject "[Enlist Reminder] Get Ready!"
body content
}
} catch(Exception e) {
e.printStackTrace()
while(e.cause != null) e = e.cause
log.error("Failed to send email. ${e.message}")
}
}
}
26 changes: 26 additions & 0 deletions test/unit/enlist/grails/ActivityReminderJobSpec.groovy
@@ -0,0 +1,26 @@
package enlist.grails

import static org.junit.Assert.*

import grails.test.mixin.*
import grails.test.mixin.support.*
import org.junit.*

/**
* See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions
*/
@TestMixin(GrailsUnitTestMixin)
class ActivityReminderJobSpec {

void setUp() {
// Setup logic here
}

void tearDown() {
// Tear down logic here
}

void testSomething() {
fail "Implement me"
}
}

0 comments on commit 1e6ccd9

Please sign in to comment.