Skip to content

Commit

Permalink
[release-2.2] fix: route for the tag is not registered when halo star…
Browse files Browse the repository at this point in the history
…ts (#3323)

This is an automated cherry-pick of #3322

/assign guqing

```release-note
修复 #3316 引入的 tags 标签的路由没有注册的问题
```
  • Loading branch information
halo-dev-bot authored Feb 15, 2023
1 parent 3ae174c commit a227341
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 51 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package run.halo.app.core.extension.reconciler;

import java.time.Duration;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
Expand Down Expand Up @@ -34,20 +33,17 @@ public TagReconciler(ExtensionClient client, TagPermalinkPolicy tagPermalinkPoli

@Override
public Result reconcile(Request request) {
return client.fetch(Tag.class, request.name())
.map(tag -> {
client.fetch(Tag.class, request.name())
.ifPresent(tag -> {
if (isDeleted(tag)) {
cleanUpResourcesAndRemoveFinalizer(request.name());
return new Result(false, null);
return;
}
addFinalizerIfNecessary(tag);

this.reconcileStatusPermalink(request.name());

reconcileStatusPosts(request.name());
return new Result(true, Duration.ofMinutes(1));
})
.orElseGet(() -> new Result(false, null));
});
return new Result(false, null);
}

@Override
Expand Down Expand Up @@ -90,22 +86,6 @@ private void cleanUpResourcesAndRemoveFinalizer(String tagName) {
});
}

private void reconcileStatusPermalink(String tagName) {
client.fetch(Tag.class, tagName)
.ifPresent(tag -> {
Tag oldTag = JsonUtils.deepCopy(tag);
tagPermalinkPolicy.onPermalinkDelete(oldTag);

tag.getStatusOrDefault()
.setPermalink(tagPermalinkPolicy.permalink(tag));
tagPermalinkPolicy.onPermalinkAdd(tag);

if (!oldTag.equals(tag)) {
client.update(tag);
}
});
}

private void reconcileStatusPosts(String tagName) {
client.fetch(Tag.class, tagName).ifPresent(tag -> {
Tag oldTag = JsonUtils.deepCopy(tag);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package run.halo.app.core.extension.reconciler;

import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import run.halo.app.content.permalinks.TagPermalinkPolicy;
import run.halo.app.core.extension.content.Tag;
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;

@Component
@RequiredArgsConstructor
public class TagRouteReconciler implements Reconciler<Reconciler.Request> {
private final ExtensionClient client;
private final TagPermalinkPolicy tagPermalinkPolicy;

@Override
public Result reconcile(Request request) {
client.fetch(Tag.class, request.name())
.ifPresent(tag -> {
if (tag.getMetadata().getDeletionTimestamp() != null) {
// TagReconciler already did it, so there is no need to remove permalink
return;
}

reconcilePermalinkRoute(request.name());
});
return new Result(false, null);
}

private void reconcilePermalinkRoute(String tagName) {
client.fetch(Tag.class, tagName)
.ifPresent(tag -> {
final String oldPermalink = tag.getStatusOrDefault().getPermalink();

tagPermalinkPolicy.onPermalinkDelete(tag);

String permalink = tagPermalinkPolicy.permalink(tag);
tag.getStatusOrDefault().setPermalink(permalink);
tagPermalinkPolicy.onPermalinkAdd(tag);

if (!StringUtils.equals(permalink, oldPermalink)) {
client.update(tag);
}
});
}

@Override
public Controller setupWith(ControllerBuilder builder) {
return builder
.extension(new Tag())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,32 +40,6 @@ class TagReconcilerTest {
@InjectMocks
private TagReconciler tagReconciler;

@Test
void reconcile() {
Tag tag = tag();
when(client.fetch(eq(Tag.class), eq("fake-tag")))
.thenReturn(Optional.of(tag));
when(tagPermalinkPolicy.permalink(any()))
.thenAnswer(arg -> "/tags/" + tag.getSpec().getSlug());
ArgumentCaptor<Tag> captor = ArgumentCaptor.forClass(Tag.class);

tagReconciler.reconcile(new TagReconciler.Request("fake-tag"));

verify(client, times(3)).update(captor.capture());
verify(tagPermalinkPolicy, times(1)).onPermalinkAdd(any());
verify(tagPermalinkPolicy, times(1)).onPermalinkDelete(any());
Tag capture = captor.getValue();
assertThat(capture.getStatus().getPermalink()).isEqualTo("/tags/fake-slug");

// change slug
tag.getSpec().setSlug("new-slug");
tagReconciler.reconcile(new TagReconciler.Request("fake-tag"));
verify(client, times(4)).update(captor.capture());
verify(tagPermalinkPolicy, times(2)).onPermalinkAdd(any());
verify(tagPermalinkPolicy, times(2)).onPermalinkDelete(any());
assertThat(capture.getStatus().getPermalink()).isEqualTo("/tags/new-slug");
}

@Test
void reconcileDelete() {
Tag tag = tag();
Expand Down

0 comments on commit a227341

Please sign in to comment.