More fixes, should work now

This commit is contained in:
Johannes Frohnmeyer 2022-10-22 23:55:55 +02:00
parent 694ddece28
commit 95ec7be10b
Signed by: Johannes
GPG Key ID: E76429612C2929F4
7 changed files with 39 additions and 28 deletions

View File

@ -25,6 +25,7 @@ dependencies {
implementation("com.kohlschutter.junixsocket:junixsocket-core:2.6.0")
implementation("org.jsoup:jsoup:1.15.3")
implementation("net.freeutils:jlhttp:2.6")
implementation("org.commonmark:commonmark:0.20.0")
compileOnly("org.jetbrains:annotations:23.0.0")
}

View File

@ -8,11 +8,15 @@ import io.gitlab.jfronny.gitea.helpdesk.gitea.*;
import io.gitlab.jfronny.gitea.helpdesk.mail.*;
import io.gitlab.jfronny.gitea.helpdesk.web.WebInterface;
import jakarta.mail.MessagingException;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import java.io.FileNotFoundException;
import java.io.IOException;
public record UpdateTask(DBInterface db, MailInterface mail, GiteaInterface gitea, WebInterface web) implements Runnable {
private static final Parser MARKDOWN_PARSER = Parser.builder().build();
private static final HtmlRenderer MARKDOWN_RENDER = HtmlRenderer.builder().build();
private static final String TEMPLATE = Main.getResource("/mail/template.html");
private static final String MAIL_ERROR = Main.getResource("/mail/error.html");
private static final String MAIL_UNEXPECTED = Main.getResource("/mail/unexpected.html");
@ -42,7 +46,6 @@ public record UpdateTask(DBInterface db, MailInterface mail, GiteaInterface gite
ThrowingBiConsumer<String, String, Exception> reply = (content, subject) -> {
String[] previousMessages = subscription.referenceChain().split(" ");
String previousMessageId = previousMessages[previousMessages.length - 1];
//TODO test
mail.reply(addressParts[0] + "+reply+" + subscription.id(), subscription.email(), content, subject, previousMessageId, subscription.referenceChain(), null);
};
GiteaIssue issue;
@ -53,13 +56,13 @@ public record UpdateTask(DBInterface db, MailInterface mail, GiteaInterface gite
db.removeSubscription(subscription.id());
return;
}
if (issue.state.equals("closed")) { //TODO test
if (issue.state.equals("closed")) {
reply.accept(template(MAIL_ISSUE_CLOSED), "Issue closed");
db.removeSubscription(subscription.id());
}
for (GiteaIssueComment comment : gitea.getComments(subscription.repoOwner(), subscription.repo(), subscription.issue())) {
if (comment.id > subscription.issueComment()) {
reply.accept(comment.body, issue.title);
reply.accept(MARKDOWN_RENDER.render(MARKDOWN_PARSER.parse(comment.body)), issue.title);
db.updateSubscriptionIssueComment(subscription.id(), comment.id);
}
}
@ -79,19 +82,20 @@ public record UpdateTask(DBInterface db, MailInterface mail, GiteaInterface gite
String repo = args[2];
checkArgs(owner, repo);
GiteaIssue issue = gitea.createIssue(owner, repo, message.getSubject(), formatBody(message));
String id = db.addSubscription(message.getSender(), owner, repo, issue.id, 0, message.getSender(), true);
String unsubscribeUrl = web.getAddress() + "/unsubscribe?id=" + id; //TODO test
message.reply(addressParts[0] + "+reply+" + owner + "+" + repo + "+" + issue.id + '@' + addressParts[1], template(MAIL_CREATE.formatted(issue.url, unsubscribeUrl)));
String id = db.addSubscription(message.getSender(), owner, repo, issue.id, 0, message.getMessageID(), true);
String unsubscribeUrl = web.getAddress() + "/unsubscribe?id=" + id;
String closeUrl = web.getAddress() + "/close?id=" + id;
message.reply(addressParts[0] + "+reply+" + id + '@' + addressParts[1], template(MAIL_CREATE.formatted(issue.url, unsubscribeUrl, closeUrl)));
}
case "reply" -> {
if (args.length != 2) throw new UnexpectedMailException("Reply classifier only allows one parameter");
Subscription sub = db.getSubscription(args[1]).orElseThrow(() -> new UnexpectedMailException("Reply classifier does not represent an active issue"));
GiteaIssueComment commentId = gitea.addComment(sub.repoOwner(), sub.repo(), sub.issue(), formatBody(message));
db.updateSubscriptionIssueComment(sub.id(), commentId.id);
db.updateSubscriptionReferenceChain(sub.id(), sub.referenceChain() + " " + message.getSender());
db.updateSubscriptionReferenceChain(sub.id(), sub.referenceChain() + " " + message.getMessageID());
}
case "comment" -> {
if (args.length == 4) throw new UnexpectedMailException("Comment classifier requires four parameters");
if (args.length != 4) throw new UnexpectedMailException("Comment classifier requires four parameters");
String owner = args[1];
String repo = args[2];
long issueId = Long.parseLong(args[3]);
@ -102,13 +106,13 @@ public record UpdateTask(DBInterface db, MailInterface mail, GiteaInterface gite
} catch (FileNotFoundException fe) {
throw new UnexpectedMailException("This issue does not exist");
}
gitea.addComment(owner, repo, issueId, formatBody(message));
long issueComment = gitea.addComment(owner, repo, issueId, formatBody(message)).id;
if (issue.state.equals("closed")) {
message.reply(addressParts[0] + "+reply+" + owner + "+" + repo + "+" + issue.id + '@' + addressParts[1], template(MAIL_COMMENT_CLOSED.formatted(issue.url)));
message.reply(mail.getAddress(), template(MAIL_COMMENT_CLOSED.formatted(issue.url)));
} else {
String id = db.addSubscription(message.getSender(), owner, repo, issue.id, 0, message.getSender(), false);
String unsubscribeUrl = web.getAddress() + "/unsubscribe?id=" + id; //TODO test
message.reply(addressParts[0] + "+reply+" + owner + "+" + repo + "+" + issue.id + '@' + addressParts[1], template(MAIL_COMMENT.formatted(issue.url, unsubscribeUrl)));
String id = db.addSubscription(message.getSender(), owner, repo, issue.id, issueComment, message.getMessageID(), false);
String unsubscribeUrl = web.getAddress() + "/unsubscribe?id=" + id;
message.reply(addressParts[0] + "+reply+" + id + '@' + addressParts[1], template(MAIL_COMMENT.formatted(issue.url, unsubscribeUrl)));
}
}
default -> throw new UnexpectedMailException("Did not expect classifier " + args[0]);

View File

@ -21,22 +21,22 @@ public class DBInterface implements AutoCloseable {
try (Connection cx = ds.getConnection()) {
try (Statement st = cx.createStatement()) {
st.executeUpdate("""
CREATE EXTENSION pgcrypto;
CREATE OR REPLACE FUNCTION helpdesk_generate_uid(size INT) RETURNS TEXT AS $$
DECLARE
characters TEXT := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
bytes BYTEA := gen_random_bytes(size);
l INT := length(characters);
i INT := 0;
output TEXT := '';
create extension if not exists pgcrypto;
create or replace function helpdesk_generate_uid(size int) returns text as $$
declare
characters text := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
bytes bytea := gen_random_bytes(size);
l int := length(characters);
i int := 0;
output text := '';
BEGIN
WHILE i < size LOOP
while i < size loop
output := output || substr(characters, get_byte(bytes, i) % l + 1, 1);
i := i + 1;
END LOOP;
RETURN output;
end loop;
return output;
END;
$$ LANGUAGE plpgsql VOLATILE;
$$ language plpgsql volatile;
create table if not exists helpdesk_subscriptions(
id text primary key default helpdesk_generate_uid(20),
email text,

View File

@ -66,7 +66,7 @@ public class MailInterface implements AutoCloseable {
MimeMessage reply = new MimeMessage(smtp);
reply.setFrom(from);
reply.addRecipients(Message.RecipientType.TO, to);
reply.setSubject(subject.startsWith("Re: ") ? subject : "Re: " + subject);
reply.setSubject(subject == null ? "Reply" : subject.startsWith("Re: ") ? subject : "Re: " + subject);
final MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(Jsoup.parse(content).text(), "text/plain");

View File

@ -91,6 +91,10 @@ public class WrappedMessage {
return "Sender Suppressed";
}
public String getMessageID() throws MessagingException {
return message.getMessageID();
}
public void reply(String from, String content) throws MessagingException {
mail.reply(
from,

View File

@ -1,4 +1,5 @@
<h1>Successfully added issue</h1>
<p>You can find your new issue <a href="%s">here</a></p>
<p>If you wish to unsubscribe from new comments, you may do so <a href="%s">here</a></p>
<p>Please be aware that you will not be sent these a second time!</p>
<p>Please be aware that you will not be sent these a second time!</p>
<p>If this was a mistake or you resolved the issue yourself, you can close it <a href="%s">here</a></p>

View File

@ -1,2 +1,3 @@
<h1>This issue was moved or deleted</h1>
<p>This issue was moved or deleted and is no longer accessible</p>
<p>This issue was moved or deleted and is no longer accessible</p>
<p>Your subscription has therefore been removed</p>