From 8d3ab61e7c136610ae1dc002226559e8c6b21fcb Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Sat, 3 Apr 2021 13:44:25 -0400 Subject: feat(panettone): Send email notifications for comments When a user posts a comment on an issue, send email notifications (respecting the enable-email-notifications setting) to the author of that issue and all the other users who have commented on that issue. Since the oauth & gmail API stuff that the relay does is slow, this happens in a background thread. Change-Id: Ic00c265deab1030d9ba64c29c9f56314dd179141 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2805 Tested-by: BuildkiteCI Reviewed-by: sterni Reviewed-by: tazjin --- web/panettone/src/model.lisp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'web/panettone/src/model.lisp') diff --git a/web/panettone/src/model.lisp b/web/panettone/src/model.lisp index d43478d45b..648b9a5677 100644 --- a/web/panettone/src/model.lisp +++ b/web/panettone/src/model.lisp @@ -10,6 +10,20 @@ "Initialize the global postgresql connection for Panettone" (postmodern:connect-toplevel database user password host :port port)) +(defun make-thread + (function &rest args) + "Make a new thread as per `BORDEAUX-THREADS:MAKE-THREAD' but with its own, new +database connection." + (let ((spec `(,(or (uiop:getenvp "PGDATABASE") "panettone") + ,(or (uiop:getenvp "PGUSER") "panettone") + ,(or (uiop:getenvp "PGPASSWORD") "password") + ,(or (uiop:getenvp "PGHOST") "localhost") + :port ,(or (integer-env "PGPORT") 5432)))) + (apply #'bt:make-thread + (lambda () + (postmodern:call-with-connection spec function)) + args))) + ;;; ;;; Schema ;;; @@ -356,10 +370,20 @@ ISSUE-ID, which should be a plist of initforms, and return an instance of (error 'issue-not-found :id issue-id)) (insert-dao (apply #'make-instance 'issue-comment :issue-id issue-id attrs))) +(defun issue-commenter-dns (issue-id) + "Returns a list of all the dns of users who have commented on ISSUE-ID" + (query (:select 'author-dn :distinct + :from 'issue-comments + :where (:= 'issue-id issue-id)) + :column)) + (comment (connect-postgres) (ddl/init) (make-instance 'issue :subject "test") (create-issue :subject "test" :author-dn "cn=glittershark,ou=users,dc=tvl,dc=fyi") + + (issue-commenter-dns 1) + ) -- cgit 1.4.1