Skip to content

Commit

Permalink
feat: extends SortableRequest
Browse files Browse the repository at this point in the history
  • Loading branch information
AirboZH committed Sep 28, 2024
1 parent bb35b06 commit d6a00c1
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 115 deletions.
8 changes: 4 additions & 4 deletions src/main/java/run/halo/sticker/endpoint/StickerEndpoint.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
import run.halo.sticker.model.Sticker;
import run.halo.sticker.model.StickerGroup;
import run.halo.sticker.pojo.query.StickerQuery;
import run.halo.sticker.service.StickerGroupService;
import run.halo.sticker.service.StickerService;

@Slf4j
@Component
Expand All @@ -54,7 +54,7 @@ public class StickerEndpoint implements CustomEndpoint {
private final ReactiveExtensionClient client;
private final AttachmentService attachmentService;
private final ReactiveSettingFetcher settingFetcher;
private final StickerGroupService stickerGroupService;
private final StickerService stickerService;

@Override
public RouterFunction<ServerResponse> endpoint() {
Expand All @@ -72,8 +72,8 @@ public GroupVersion groupVersion() {

private Mono<ServerResponse> listStickersByGroup(ServerRequest request) {
log.info("List stickers by group");
StickerQuery query = new StickerQuery(request.queryParams());
return stickerGroupService.listStickers(query)
var query = new StickerQuery(request);
return stickerService.listStickers(query)
.flatMap(stickers -> ServerResponse.ok().bodyValue(stickers));
}

Expand Down
82 changes: 50 additions & 32 deletions src/main/java/run/halo/sticker/pojo/query/StickerQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,57 @@
import static run.halo.app.extension.router.QueryParamBuildUtil.sortParameter;

import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.springdoc.core.fn.builders.operation.Builder;
import org.springframework.lang.Nullable;
import org.springframework.util.MultiValueMap;
import run.halo.app.extension.router.IListRequest;
import org.springframework.data.domain.Sort;
import org.springframework.web.reactive.function.server.ServerRequest;
import run.halo.app.extension.ListOptions;
import run.halo.app.extension.index.query.QueryFactory;
import run.halo.app.extension.router.SortableRequest;
import run.halo.sticker.pojo.enums.StickerSorter;

public class StickerQuery extends IListRequest.QueryListRequest {
public StickerQuery(MultiValueMap<String, String> queryParams) {
super(queryParams);
}
public class StickerQuery extends SortableRequest {

@Schema(description = "Photos filtered by group.")
public String getGroup() {
return StringUtils.defaultIfBlank(queryParams.getFirst("group"), null);
public StickerQuery(ServerRequest request) {
super(request.exchange());
}

@Nullable
@Schema(description = "Photos filtered by keyword.")
public String getKeyword() {
return StringUtils.defaultIfBlank(queryParams.getFirst("keyword"),
null
);
}
@Override
public ListOptions toListOptions() {
var builder = ListOptions.builder(super.toListOptions());

@Schema(description = "Photo collation.")
public StickerSorter getSort() {
String sort = queryParams.getFirst("sort");
return StickerSorter.convertFrom(sort);
}
Optional.ofNullable(queryParams.getFirst("keyword"))
.filter(StringUtils::isNotBlank)
.ifPresent(keyword -> builder.andQuery(QueryFactory.or(
QueryFactory.contains("spec.title", keyword),
QueryFactory.contains("spec.description", keyword)
)));

@Schema(description = "ascending order If it is true; otherwise, it is in descending order.")
public Boolean getSortOrder() {
String sortOrder = queryParams.getFirst("sortOrder");
return convertBooleanOrNull(sortOrder);
Optional.ofNullable(queryParams.getFirst("group"))
.filter(StringUtils::isNotBlank)
.ifPresent(group -> builder.andQuery(QueryFactory.equal("spec.groupName", group)));

return builder.build();
}

private Boolean convertBooleanOrNull(String value) {
return StringUtils.isBlank(value) ? null : Boolean.parseBoolean(value);
@Override
public Sort getSort() {
var sort = super.getSort();
var orders = sort.stream()
.map(order -> {
if ("creationTimestamp".equals(order.getProperty())) {
return order.withProperty("metadata.creationTimestamp");
}
// Add more custom sorting logic if needed
return order;
})
.toList();
return Sort.by(orders);
}

public static void buildParameters(Builder builder) {
IListRequest.buildParameters(builder);
SortableRequest.buildParameters(builder);
builder.parameter(sortParameter())
.parameter(parameterBuilder()
.in(ParameterIn.QUERY)
Expand All @@ -61,6 +68,17 @@ public static void buildParameters(Builder builder) {
.description("photo group name")
.implementation(String.class)
.required(false))
;
.parameter(parameterBuilder()
.in(ParameterIn.QUERY)
.name("sort")
.description("Sticker sorting field")
.implementation(StickerSorter.class)
.required(false))
.parameter(parameterBuilder()
.in(ParameterIn.QUERY)
.name("sortOrder")
.description("Sorting order (true for ascending, false for descending)")
.implementation(Boolean.class)
.required(false));
}
}
}
23 changes: 0 additions & 23 deletions src/main/java/run/halo/sticker/reconciler/StickerReconciler.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,11 @@
import run.halo.app.core.extension.attachment.Attachment;
import run.halo.app.core.extension.service.AttachmentService;
import run.halo.app.extension.ExtensionClient;
import run.halo.app.extension.ListOptions;
import run.halo.app.extension.controller.Controller;
import run.halo.app.extension.controller.ControllerBuilder;
import run.halo.app.extension.controller.Reconciler;
import run.halo.app.extension.controller.Reconciler.Request;
import run.halo.app.extension.router.selector.LabelSelector;
import run.halo.sticker.model.Sticker;
import run.halo.sticker.model.StickerGroup;


@Slf4j
Expand All @@ -43,7 +40,6 @@ public Result reconcile(Request request) {
}
addFinalizers(sticker.getMetadata(), Set.of(FINALIZER_NAME));
handleUploadSticker(sticker);
countSticker(sticker.getMetadata().getName());
client.update(sticker);
});
return Result.doNotRetry();
Expand Down Expand Up @@ -75,25 +71,6 @@ private void handleUploadSticker(Sticker sticker) {
});
}

private void countSticker(String stickerGroupName) {
if (stickerGroupName == null) {
return;
}
client.fetch(StickerGroup.class, stickerGroupName)
.ifPresent(group -> {
var status = group.getStatus();
if (status == null) {
status = new StickerGroup.StickerGroupStatus();
group.setStatus(status);
}
ListOptions options = new ListOptions();
options.setLabelSelector(LabelSelector.builder().eq("spec.groupName", stickerGroupName).build());
status.setStickerCount(client.listBy(Sticker.class, options, null).getItems().size());
log.info("StickerReconciler countSticker: {}", group);
client.update(group);
});
}

@Override
public Controller setupWith(ControllerBuilder builder) {
return builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import run.halo.sticker.model.Sticker;
import run.halo.sticker.pojo.query.StickerQuery;

public interface StickerGroupService {
public interface StickerService {

/**
* List photos.
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package run.halo.sticker.service.impl;

import java.util.function.Function;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import run.halo.app.extension.ListResult;
import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.sticker.model.Sticker;
import run.halo.sticker.pojo.query.StickerQuery;
import run.halo.sticker.service.StickerService;

@Component
public class StickerServiceImpl implements StickerService {

private final ReactiveExtensionClient client;

public StickerServiceImpl(ReactiveExtensionClient client) {
this.client = client;
}

@Override
public Mono<ListResult<Sticker>> listStickers(StickerQuery query) {
return client.listBy(Sticker.class, query.toListOptions(), query.toPageRequest())
.flatMap(listResult -> Flux.fromStream(listResult.get().map(this::enrichSticker))
.concatMap(Function.identity())
.collectList()
.map(enrichedStickers -> new ListResult<>(
listResult.getPage(),
listResult.getSize(),
listResult.getTotal(),
enrichedStickers)
)
);
}

private Mono<Sticker> enrichSticker(Sticker sticker) {
return Mono.just(sticker);
}
}

0 comments on commit d6a00c1

Please sign in to comment.