forked from halo-dev/halo
/
ReplyReconciler.java
83 lines (71 loc) · 3 KB
/
ReplyReconciler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package run.halo.app.core.extension.reconciler;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import static run.halo.app.extension.ExtensionUtil.addFinalizers;
import java.util.Set;
import lombok.AllArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import run.halo.app.content.comment.ReplyNotificationSubscriptionHelper;
import run.halo.app.core.extension.content.Reply;
import run.halo.app.event.post.ReplyChangedEvent;
import run.halo.app.event.post.ReplyCreatedEvent;
import run.halo.app.event.post.ReplyDeletedEvent;
import run.halo.app.extension.ExtensionClient;
import run.halo.app.extension.controller.Controller;
import run.halo.app.extension.controller.ControllerBuilder;
import run.halo.app.extension.controller.Reconciler;
/**
* Reconciler for {@link Reply}.
*
* @author guqing
* @since 2.0.0
*/
@Component
@AllArgsConstructor
public class ReplyReconciler implements Reconciler<Reconciler.Request> {
protected static final String FINALIZER_NAME = "reply-protection";
private final ExtensionClient client;
private final ApplicationEventPublisher eventPublisher;
private final ReplyNotificationSubscriptionHelper replyNotificationSubscriptionHelper;
@Override
public Result reconcile(Request request) {
client.fetch(Reply.class, request.name())
.ifPresent(reply -> {
if (reply.getMetadata().getDeletionTimestamp() != null) {
cleanUpResourcesAndRemoveFinalizer(request.name());
return;
}
if (addFinalizers(reply.getMetadata(), Set.of(FINALIZER_NAME))) {
client.update(reply);
eventPublisher.publishEvent(new ReplyCreatedEvent(this, reply));
}
if (reply.getSpec().getCreationTime() == null) {
reply.getSpec().setCreationTime(
defaultIfNull(reply.getSpec().getApprovedTime(),
reply.getMetadata().getCreationTimestamp()
)
);
}
client.update(reply);
replyNotificationSubscriptionHelper.subscribeNewReplyReasonForReply(reply);
eventPublisher.publishEvent(new ReplyChangedEvent(this, reply));
});
return new Result(false, null);
}
private void cleanUpResourcesAndRemoveFinalizer(String replyName) {
client.fetch(Reply.class, replyName).ifPresent(reply -> {
if (reply.getMetadata().getFinalizers() != null) {
reply.getMetadata().getFinalizers().remove(FINALIZER_NAME);
}
client.update(reply);
// on reply removing
eventPublisher.publishEvent(new ReplyDeletedEvent(this, reply));
});
}
@Override
public Controller setupWith(ControllerBuilder builder) {
return builder
.extension(new Reply())
.build();
}
}