[ENG-1004] Add offset pagination to search queries (#1255)

fix undefined cursors
This commit is contained in:
Brendan Allan
2023-08-27 12:45:29 +08:00
committed by GitHub
parent 0def8fb048
commit 09857de4c8
4 changed files with 61 additions and 13 deletions

View File

@@ -357,6 +357,13 @@ pub fn mount() -> AlphaRouter<Ctx> {
)
})
.procedure("paths", {
#[derive(Deserialize, Type, Debug)]
#[serde(rename_all = "camelCase")]
enum FilePathPagination {
Cursor { pub_id: file_path::pub_id::Type },
Offset(i32),
}
#[derive(Deserialize, Type, Debug)]
#[serde(rename_all = "camelCase")]
struct FilePathSearchArgs {
@@ -365,7 +372,7 @@ pub fn mount() -> AlphaRouter<Ctx> {
#[specta(optional)]
order: Option<FilePathSearchOrdering>,
#[specta(optional)]
cursor: Option<Vec<u8>>,
pagination: Option<FilePathPagination>,
#[serde(default)]
filter: FilePathFilterArgs,
#[serde(default = "default_group_directories")]
@@ -381,7 +388,7 @@ pub fn mount() -> AlphaRouter<Ctx> {
FilePathSearchArgs {
take,
order,
cursor,
pagination,
filter,
group_directories,
}| async move {
@@ -404,8 +411,13 @@ pub fn mount() -> AlphaRouter<Ctx> {
query = query.order_by(order.into_param());
}
if let Some(cursor) = cursor {
query = query.cursor(file_path::pub_id::equals(cursor));
if let Some(pagination) = pagination {
match pagination {
FilePathPagination::Cursor { pub_id } => {
query = query.cursor(file_path::pub_id::equals(pub_id));
}
FilePathPagination::Offset(offset) => query = query.skip(offset as i64),
}
}
let (file_paths, cursor) = {
@@ -466,6 +478,13 @@ pub fn mount() -> AlphaRouter<Ctx> {
})
})
.procedure("objects", {
#[derive(Deserialize, Type, Debug)]
#[serde(rename_all = "camelCase")]
enum ObjectPagination {
Cursor { pub_id: object::pub_id::Type },
Offset(i32),
}
#[derive(Deserialize, Type, Debug)]
#[serde(rename_all = "camelCase")]
struct ObjectSearchArgs {
@@ -474,7 +493,7 @@ pub fn mount() -> AlphaRouter<Ctx> {
#[specta(optional)]
order: Option<ObjectSearchOrdering>,
#[specta(optional)]
cursor: Option<Vec<u8>>,
pagination: Option<ObjectPagination>,
#[serde(default)]
filter: ObjectFilterArgs,
}
@@ -484,7 +503,7 @@ pub fn mount() -> AlphaRouter<Ctx> {
ObjectSearchArgs {
take,
order,
cursor,
pagination,
filter,
}| async move {
let Library { db, .. } = library.as_ref();
@@ -500,8 +519,15 @@ pub fn mount() -> AlphaRouter<Ctx> {
query = query.order_by(order.into_param());
}
if let Some(cursor) = cursor {
query = query.cursor(object::pub_id::equals(cursor));
if let Some(pagination) = pagination {
match pagination {
ObjectPagination::Cursor { pub_id } => {
query = query.cursor(object::pub_id::equals(pub_id));
}
ObjectPagination::Offset(offset) => {
query = query.skip(offset as i64);
}
}
}
let (objects, cursor) = {

View File

@@ -178,7 +178,13 @@ const useItems = ({
'search.paths',
{
...queryKey[1].arg,
cursor
pagination: cursor
? {
cursor: {
pub_id: cursor
}
}
: undefined
}
]),
getNextPageParam: (lastPage) => lastPage.cursor ?? undefined,

View File

@@ -87,7 +87,13 @@ export function useItems(
'search.paths',
{
...queryKey[1].arg,
cursor
pagination: cursor
? {
cursor: {
pub_id: cursor
}
}
: undefined
}
]),
getNextPageParam: (lastPage) => lastPage.cursor ?? undefined,
@@ -116,7 +122,13 @@ export function useItems(
'search.objects',
{
...queryKey[1].arg,
cursor
pagination: cursor
? {
cursor: {
pub_id: cursor
}
}
: undefined
}
]),
getNextPageParam: (lastPage) => lastPage.cursor ?? undefined

View File

@@ -142,7 +142,9 @@ export type FilePath = { id: number; pub_id: number[]; is_dir: boolean | null; c
export type FilePathFilterArgs = { locationId?: number | null; search?: string | null; extension?: string | null; createdAt?: OptionalRange<string>; path?: string | null; object?: ObjectFilterArgs | null }
export type FilePathSearchArgs = { take?: number | null; order?: FilePathSearchOrdering | null; cursor?: number[] | null; filter?: FilePathFilterArgs; groupDirectories?: boolean }
export type FilePathPagination = { cursor: { pub_id: number[] } } | { offset: number }
export type FilePathSearchArgs = { take?: number | null; order?: FilePathSearchOrdering | null; pagination?: FilePathPagination | null; filter?: FilePathFilterArgs; groupDirectories?: boolean }
export type FilePathSearchOrdering = { field: "name"; value: SortOrder } | { field: "sizeInBytes"; value: SortOrder } | { field: "dateCreated"; value: SortOrder } | { field: "dateModified"; value: SortOrder } | { field: "dateIndexed"; value: SortOrder } | { field: "object"; value: ObjectSearchOrdering }
@@ -262,7 +264,9 @@ export type ObjectFilterArgs = { favorite?: boolean | null; hidden?: ObjectHidde
export type ObjectHiddenFilter = "exclude" | "include"
export type ObjectSearchArgs = { take?: number | null; order?: ObjectSearchOrdering | null; cursor?: number[] | null; filter?: ObjectFilterArgs }
export type ObjectPagination = { cursor: { pub_id: number[] } } | { offset: number }
export type ObjectSearchArgs = { take?: number | null; order?: ObjectSearchOrdering | null; pagination?: ObjectPagination | null; filter?: ObjectFilterArgs }
export type ObjectSearchOrdering = { field: "dateAccessed"; value: SortOrder } | { field: "kind"; value: SortOrder }