feat: search by keyword on AccessList, CertificateList, WorkflowList

This commit is contained in:
Fu Diwei
2025-02-13 20:31:11 +08:00
parent 970fba90e0
commit 664bb692b6
15 changed files with 262 additions and 144 deletions

View File

@@ -4,11 +4,16 @@ import { type AccessModel } from "@/domain/access";
import { COLLECTION_NAME_ACCESS, getPocketBase } from "./_pocketbase";
export const list = async () => {
return await getPocketBase().collection(COLLECTION_NAME_ACCESS).getFullList<AccessModel>({
const list = await getPocketBase().collection(COLLECTION_NAME_ACCESS).getFullList<AccessModel>({
batch: 65535,
filter: "deleted=null",
sort: "-created",
requestKey: null,
});
return {
totalItems: list.length,
items: list,
};
};
export const save = async (record: MaybeModelRecord<AccessModel>) => {

View File

@@ -1,55 +1,51 @@
import dayjs from "dayjs";
import { type RecordListOptions } from "pocketbase";
import { type CertificateModel } from "@/domain/certificate";
import { COLLECTION_NAME_CERTIFICATE, getPocketBase } from "./_pocketbase";
export type ListCertificateRequest = {
keyword?: string;
state?: "expireSoon" | "expired";
page?: number;
perPage?: number;
state?: "expireSoon" | "expired";
};
export const list = async (request: ListCertificateRequest) => {
const pb = getPocketBase();
const page = request.page || 1;
const perPage = request.perPage || 10;
const options: RecordListOptions = {
expand: "workflowId",
filter: "deleted=null",
sort: "-created",
requestKey: null,
};
const filters: string[] = ["deleted=null"];
if (request.keyword) {
filters.push(pb.filter("(subjectAltNames~{:keyword} || serialNumber={:keyword})", { keyword: request.keyword }));
}
if (request.state === "expireSoon") {
options.filter = pb.filter("expireAt<{:expiredAt} && deleted=null", {
expiredAt: dayjs().add(20, "d").toDate(),
});
filters.push(pb.filter("expireAt<{:expiredAt}", { expiredAt: dayjs().add(20, "d").toDate() }));
} else if (request.state === "expired") {
options.filter = pb.filter("expireAt<={:expiredAt} && deleted=null", {
expiredAt: new Date(),
});
filters.push(pb.filter("expireAt<={:expiredAt}", { expiredAt: new Date() }));
}
return pb.collection(COLLECTION_NAME_CERTIFICATE).getList<CertificateModel>(page, perPage, options);
const page = request.page || 1;
const perPage = request.perPage || 10;
return pb.collection(COLLECTION_NAME_CERTIFICATE).getList<CertificateModel>(page, perPage, {
expand: "workflowId",
filter: filters.join(" && "),
sort: "-created",
requestKey: null,
});
};
export const listByWorkflowRunId = async (workflowRunId: string) => {
const pb = getPocketBase();
const options: RecordListOptions = {
filter: pb.filter("workflowRunId={:workflowRunId}", {
workflowRunId: workflowRunId,
}),
const list = await pb.collection(COLLECTION_NAME_CERTIFICATE).getFullList<CertificateModel>({
batch: 65535,
filter: pb.filter("workflowRunId={:workflowRunId}", { workflowRunId: workflowRunId }),
sort: "-created",
requestKey: null,
};
const items = await pb.collection(COLLECTION_NAME_CERTIFICATE).getFullList<CertificateModel>(options);
});
return {
totalItems: items.length,
items: items,
totalItems: list.length,
items: list,
};
};

View File

@@ -1,30 +1,33 @@
import { type RecordListOptions, type RecordSubscription } from "pocketbase";
import { type RecordSubscription } from "pocketbase";
import { type WorkflowModel } from "@/domain/workflow";
import { COLLECTION_NAME_WORKFLOW, getPocketBase } from "./_pocketbase";
export type ListWorkflowRequest = {
keyword?: string;
enabled?: boolean;
page?: number;
perPage?: number;
enabled?: boolean;
};
export const list = async (request: ListWorkflowRequest) => {
const pb = getPocketBase();
const page = request.page || 1;
const perPage = request.perPage || 10;
const options: RecordListOptions = {
sort: "-created",
requestKey: null,
};
const filters: string[] = [];
if (request.keyword) {
filters.push(pb.filter("name~{:keyword}", { keyword: request.keyword }));
}
if (request.enabled != null) {
options.filter = pb.filter("enabled={:enabled}", { enabled: request.enabled });
filters.push(pb.filter("enabled={:enabled}", { enabled: request.enabled }));
}
return await pb.collection(COLLECTION_NAME_WORKFLOW).getList<WorkflowModel>(page, perPage, options);
const page = request.page || 1;
const perPage = request.perPage || 10;
return await pb.collection(COLLECTION_NAME_WORKFLOW).getList<WorkflowModel>(page, perPage, {
filter: filters.join(" && "),
sort: "-created",
requestKey: null,
});
};
export const get = async (id: string) => {

View File

@@ -12,24 +12,21 @@ export type ListWorkflowRunsRequest = {
};
export const list = async (request: ListWorkflowRunsRequest) => {
const page = request.page || 1;
const perPage = request.perPage || 10;
const pb = getPocketBase();
let filter = "";
const params: Record<string, string> = {};
const filters: string[] = [];
if (request.workflowId) {
filter = `workflowId={:workflowId}`;
params.workflowId = request.workflowId;
filters.push(pb.filter("workflowId={:workflowId}", { workflowId: request.workflowId }));
}
return await getPocketBase()
.collection(COLLECTION_NAME_WORKFLOW_RUN)
.getList<WorkflowRunModel>(page, perPage, {
filter: getPocketBase().filter(filter, params),
sort: "-created",
requestKey: null,
expand: request.expand ? "workflowId" : undefined,
});
const page = request.page || 1;
const perPage = request.perPage || 10;
return await pb.collection(COLLECTION_NAME_WORKFLOW_RUN).getList<WorkflowRunModel>(page, perPage, {
filter: filters.join(" && "),
sort: "-created",
requestKey: null,
expand: request.expand ? "workflowId" : undefined,
});
};
export const remove = async (record: MaybeModelRecordWithId<WorkflowRunModel>) => {