diff options
author | Griffin Smith <grfn@gws.fyi> | 2021-04-03T17·44-0400 |
---|---|---|
committer | glittershark <grfn@gws.fyi> | 2021-04-04T14·17+0000 |
commit | 8d3ab61e7c136610ae1dc002226559e8c6b21fcb (patch) | |
tree | 31e41b2ad44b2e8abe26e4677c61a4046bdd008a /web/panettone/src/model.lisp | |
parent | 349b98ccc841587aadc6a2de5684f093cd72d628 (diff) |
feat(panettone): Send email notifications for comments r/2427
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 <sternenseemann@systemli.org> Reviewed-by: tazjin <mail@tazj.in>
Diffstat (limited to 'web/panettone/src/model.lisp')
-rw-r--r-- | web/panettone/src/model.lisp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/web/panettone/src/model.lisp b/web/panettone/src/model.lisp index d43478d45b3f..648b9a5677a1 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) + ) |