From 0e8c345cab9b26491d60f70039a3811f69e42725 Mon Sep 17 00:00:00 2001 From: pasindur2 Date: Mon, 31 Oct 2022 10:41:05 +0530 Subject: [PATCH 1/2] Email sender feature for sprints --- .DS_Store | Bin 0 -> 6148 bytes build.gradle.kts | 1 + src/.DS_Store | Bin 0 -> 6148 bytes src/main/.DS_Store | Bin 0 -> 6148 bytes src/main/kotlin/com/example/Application.kt | 12 +++- .../kotlin/com/example/plugins/Routing.kt | 7 ++- .../com/example/routes/mailSender/EmailDto.kt | 21 +++++++ .../example/routes/mailSender/MailClient.kt | 7 +++ .../routes/mailSender/SmtpMailClient.kt | 27 +++++++++ .../example/routes/sprints/sprintRouter.kt | 52 ++++++++++++++++-- src/main/resources/.DS_Store | Bin 0 -> 6148 bytes src/main/resources/migrations/.DS_Store | Bin 0 -> 6148 bytes 12 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 .DS_Store create mode 100644 src/.DS_Store create mode 100644 src/main/.DS_Store create mode 100644 src/main/kotlin/com/example/routes/mailSender/EmailDto.kt create mode 100644 src/main/kotlin/com/example/routes/mailSender/MailClient.kt create mode 100644 src/main/kotlin/com/example/routes/mailSender/SmtpMailClient.kt create mode 100644 src/main/resources/.DS_Store create mode 100644 src/main/resources/migrations/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6da268bdba862dd2887601509faa271d3da7f2fb GIT binary patch literal 6148 zcmeHKF-`+P475p#lW0<=+%NEhRTN&p2Ov2*q(}t%t9Tbr%ZzOzq6-oY4H`?{+4Xt6 zx+%_QGxN>+cxSdUvjI-D4=!`#bNb9~Dnj(Av9l*T+Vgnazs$0)2gn_41n&+0jlVk_ zqQ(LRUv1BlU!m)j6qN!}Knh3!DIf)YqX2p~ZMaR;Dg~r~6gVru??ZzVd*PHApAIZB z0sxl?hhZPH1h6px?1fVzA}~)XFsWW6h9@2IR(ZW}N=&+W+>APPv)6>;aXaEI(#?CK zRw*C_E)`hhamD_B5C38Qza;4-1*E{gQoxtnhwTQhRK0cfa_qGY{s?EzC!B_TP_RTh k21Yx^f$ex5NtxHU$Maq|B?cYwpabV4u3`M`g7D#EfOgRk)$PGpaPQV2S&>%r5BKkQx-ySzvsH0W%E!l7ES!;KH zv9ktX>-*^w7y&HlPOLmk%$N_j;tOYdpMH*)!|itQBJHgMp3+B5_H$d10#ZNMM4T9irw zDe%t}uwk>?toc%Twm!X{*Y{cVb)%DUIm54?049DEf6&9YUwlE +} \ No newline at end of file diff --git a/src/main/kotlin/com/example/routes/mailSender/SmtpMailClient.kt b/src/main/kotlin/com/example/routes/mailSender/SmtpMailClient.kt new file mode 100644 index 0000000..1a7b40b --- /dev/null +++ b/src/main/kotlin/com/example/routes/mailSender/SmtpMailClient.kt @@ -0,0 +1,27 @@ +package com.example.routes.mailSender + +import org.simplejavamail.api.mailer.Mailer +import org.simplejavamail.email.EmailBuilder +import org.simplejavamail.mailer.MailerBuilder +import java.util.concurrent.CompletableFuture + + +class SmtpMailClient( + private val host: String, + private val port: Int, + private val username: String, + private val password: String, +) : MailClient { + + private val mailer: Mailer = MailerBuilder.withSMTPServer(host, port, username, password).buildMailer() + + override fun sendEmail(emailDto: EmailDto): CompletableFuture { + val email = EmailBuilder.startingBlank() + .from(username) + .to(emailDto.emailAddresses) + .withSubject(emailDto.subject) + .withHTMLText(emailDto.htmlBody) + .buildEmail() + return mailer.sendMail(email) + } +} diff --git a/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt b/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt index d649dc2..c2d5f1b 100644 --- a/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt +++ b/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt @@ -1,11 +1,15 @@ package com.example.routes.sprints import com.example.plugins.UserPrinciple +import com.example.routes.mailSender.EmailDto +import com.example.routes.mailSender.SmtpMailClient +import com.example.routes.tasks.DevTaskDetails +import com.example.routes.tasks.QuizAnswerPayload +import com.example.routes.tasks.toDto import com.wehuddle.db.enums.IssueState +import com.wehuddle.db.enums.TaskType import com.wehuddle.db.enums.UserRole -import com.wehuddle.db.tables.Issue -import com.wehuddle.db.tables.Sprint -import com.wehuddle.db.tables.SprintIssue +import com.wehuddle.db.tables.* import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.auth.authenticate @@ -19,8 +23,10 @@ import org.jooq.DSLContext private val SPRINT = Sprint.SPRINT private val ISSUE = Issue.ISSUE +private val PROFILE = Profile.PROFILE +private val ISSUE_ASSIGNMENT = IssueAssignment.ISSUE_ASSIGNMENT -fun Route.sprints(context: DSLContext) { +fun Route.sprints(context: DSLContext, mailClient: SmtpMailClient) { authenticate { route("/sprints") { post { @@ -54,6 +60,44 @@ fun Route.sprints(context: DSLContext) { } route("/{sprintId}") { + route("/send-reminder") { + post { + val userPrinciple = call.principal()!! + if (userPrinciple.profile.role != UserRole.HUDDLE_AGENT) { + call.respond(HttpStatusCode.Forbidden) + return@post + } + +// val answerList = context.fetch( +// ANSWER.where(ANSWER.TASKID.eq(taskId).and(ANSWER.PROFILEID.eq(profile.profileId))) +// ).toList().map { answerRecord -> +// when (existingTask.type) { +// TaskType.DEV -> answerRecord.toDto() +// TaskType.QUIZ -> answerRecord.toDto() +// else -> throw Exception() +// } +// } + + val sprint = call.receive() +// val emailAddresses = listOf() + val emailAddresses = context + .select(PROFILE.EMAIL) + .from(PROFILE) + .join(ISSUE_ASSIGNMENT) + .on(PROFILE.ID.eq(ISSUE_ASSIGNMENT.PROFILE_ID)) + .join(SPRINT) + .on(ISSUE.ID.eq(sprint.id)) + .fetch + + +// val emailAddresses = listOf("pasindur2@gmail.com", "pasindur2pj@gmail.com", "pasindur2pj2@gmail.com" ) +// emailAddresses.forEach(){ email -> +// val emailToSend = EmailDto(sprint.title, email, sprint.description, OffsetDateTime.now()) +// mailClient.sendEmail(emailToSend) +// } + } + } + get { val sprintId = UUID.fromString(call.parameters["sprintId"]!!) val existingSprint = context.fetchOne( diff --git a/src/main/resources/.DS_Store b/src/main/resources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b1ea27f26ce3918826e777f505cab72016243956 GIT binary patch literal 6148 zcmeHKJ5EC}5S)b+5i}_&eFbh{Md1WofKMcZ6nGMW{#7|wj>hb#AbLp`nrK#9kG*i$`Hl84p0#ZNH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Wed, 2 Nov 2022 19:35:58 +0530 Subject: [PATCH 2/2] Minor changes --- .../example/routes/sprints/sprintRouter.kt | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt b/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt index c2d5f1b..2d705e1 100644 --- a/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt +++ b/src/main/kotlin/com/example/routes/sprints/sprintRouter.kt @@ -1,5 +1,6 @@ package com.example.routes.sprints +import aws.smithy.kotlin.runtime.http.response.dumpResponse import com.example.plugins.UserPrinciple import com.example.routes.mailSender.EmailDto import com.example.routes.mailSender.SmtpMailClient @@ -25,6 +26,7 @@ private val SPRINT = Sprint.SPRINT private val ISSUE = Issue.ISSUE private val PROFILE = Profile.PROFILE private val ISSUE_ASSIGNMENT = IssueAssignment.ISSUE_ASSIGNMENT +private val SPRINT_ISSUE = SprintIssue.SPRINT_ISSUE fun Route.sprints(context: DSLContext, mailClient: SmtpMailClient) { authenticate { @@ -68,33 +70,21 @@ fun Route.sprints(context: DSLContext, mailClient: SmtpMailClient) { return@post } -// val answerList = context.fetch( -// ANSWER.where(ANSWER.TASKID.eq(taskId).and(ANSWER.PROFILEID.eq(profile.profileId))) -// ).toList().map { answerRecord -> -// when (existingTask.type) { -// TaskType.DEV -> answerRecord.toDto() -// TaskType.QUIZ -> answerRecord.toDto() -// else -> throw Exception() -// } -// } - val sprint = call.receive() -// val emailAddresses = listOf() val emailAddresses = context .select(PROFILE.EMAIL) .from(PROFILE) .join(ISSUE_ASSIGNMENT) .on(PROFILE.ID.eq(ISSUE_ASSIGNMENT.PROFILE_ID)) - .join(SPRINT) - .on(ISSUE.ID.eq(sprint.id)) - .fetch - - -// val emailAddresses = listOf("pasindur2@gmail.com", "pasindur2pj@gmail.com", "pasindur2pj2@gmail.com" ) -// emailAddresses.forEach(){ email -> -// val emailToSend = EmailDto(sprint.title, email, sprint.description, OffsetDateTime.now()) -// mailClient.sendEmail(emailToSend) -// } + .join(SPRINT_ISSUE) + .on(SPRINT_ISSUE.SPRINT_ID.eq(sprint.id)) + .fetch(PROFILE.EMAIL) + .toList() + println(emailAddresses) + emailAddresses.forEach(){ email -> + val emailToSend = EmailDto(sprint.title, email, sprint.description, OffsetDateTime.now()) + mailClient.sendEmail(emailToSend) + } } }