mirror of
https://github.com/Sosokker/B2D-Ventures.git
synced 2025-12-20 06:24:06 +01:00
209 lines
4.3 KiB
TypeScript
209 lines
4.3 KiB
TypeScript
import { SupabaseClient } from "@supabase/supabase-js";
|
|
|
|
async function getTopProjects(
|
|
client: SupabaseClient,
|
|
numberOfRecords: number = 4
|
|
) {
|
|
try {
|
|
const { data, error } = await client
|
|
.from("project")
|
|
.select(
|
|
`
|
|
id,
|
|
project_name,
|
|
business_id,
|
|
published_time,
|
|
project_short_description,
|
|
card_image_url,
|
|
project_investment_detail (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
project_tag (
|
|
tag (
|
|
id,
|
|
value
|
|
)
|
|
),
|
|
business (
|
|
location
|
|
)
|
|
`
|
|
)
|
|
.order("published_time", { ascending: false })
|
|
.limit(numberOfRecords);
|
|
|
|
if (error) {
|
|
console.error("Error fetching top projects:", error.message);
|
|
return { data: null, error: error.message };
|
|
}
|
|
|
|
return { data, error: null };
|
|
} catch (err) {
|
|
console.error("Unexpected error:", err);
|
|
return { data: null, error: "An unexpected error occurred." };
|
|
}
|
|
}
|
|
|
|
function getProjectDataQuery(client: SupabaseClient, projectId: number) {
|
|
return client
|
|
.from("project")
|
|
.select(
|
|
`
|
|
project_name,
|
|
project_short_description,
|
|
project_description,
|
|
published_time,
|
|
...project_investment_detail!inner (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
tags:item_tag!inner (
|
|
...tag!inner (
|
|
tag_name:value
|
|
)
|
|
)
|
|
`
|
|
)
|
|
.eq("id", projectId)
|
|
.single();
|
|
}
|
|
|
|
async function getProjectData(client: SupabaseClient, projectId: number) {
|
|
const query = client
|
|
.from("project")
|
|
.select(
|
|
`
|
|
project_name,
|
|
project_short_description,
|
|
project_description,
|
|
published_time,
|
|
...project_investment_detail!inner (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
tags:item_tag!inner (
|
|
...tag!inner (
|
|
tag_name:value
|
|
)
|
|
)
|
|
`
|
|
)
|
|
.eq("id", projectId)
|
|
.single();
|
|
|
|
const { data, error } = await query;
|
|
return { data, error };
|
|
}
|
|
|
|
export interface FilterParams {
|
|
searchTerm?: string;
|
|
tagsFilter?: string[];
|
|
projectStatus?: string;
|
|
projectStatusFilter?: string;
|
|
businessTypeFilter?: string;
|
|
sortByTimeFilter?: string;
|
|
}
|
|
|
|
export interface FilterProjectQueryParams extends FilterParams {
|
|
page: number;
|
|
pageSize: number;
|
|
}
|
|
|
|
function searchProjectsQuery(
|
|
client: SupabaseClient,
|
|
{
|
|
searchTerm,
|
|
tagsFilter,
|
|
projectStatus,
|
|
businessTypeFilter,
|
|
sortByTimeFilter,
|
|
page = 1,
|
|
pageSize = 4,
|
|
}: FilterProjectQueryParams
|
|
) {
|
|
const start = (page - 1) * pageSize;
|
|
const end = start + pageSize - 1;
|
|
|
|
let query = client
|
|
.from("project")
|
|
.select(
|
|
`
|
|
project_id:id,
|
|
project_name,
|
|
published_time,
|
|
project_short_description,
|
|
card_image_url,
|
|
...project_status!inner (
|
|
project_status:value
|
|
),
|
|
...project_investment_detail!inner (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
tags:item_tag!inner (
|
|
...tag!inner (
|
|
tag_name:value
|
|
)
|
|
),
|
|
...business!inner (
|
|
...business_type!inner (
|
|
business_type:value
|
|
),
|
|
business_location:location
|
|
)
|
|
`
|
|
)
|
|
.order("published_time", { ascending: false })
|
|
.range(start, end);
|
|
|
|
if (sortByTimeFilter === "all") {
|
|
sortByTimeFilter = undefined;
|
|
}
|
|
|
|
if (projectStatus === "all") {
|
|
projectStatus = undefined;
|
|
}
|
|
|
|
if (businessTypeFilter === "all") {
|
|
businessTypeFilter = undefined;
|
|
}
|
|
|
|
if (tagsFilter?.length === 0) {
|
|
tagsFilter = undefined;
|
|
}
|
|
|
|
if (searchTerm) {
|
|
query = query.ilike("project_name", `%${searchTerm}%`);
|
|
}
|
|
|
|
if (tagsFilter) {
|
|
query = query.in("item_tag.tag.value", tagsFilter);
|
|
}
|
|
|
|
if (projectStatus) {
|
|
query = query.eq("project_status.value", projectStatus);
|
|
}
|
|
|
|
if (businessTypeFilter) {
|
|
query = query.eq("business.business_type.value", businessTypeFilter);
|
|
}
|
|
|
|
return query;
|
|
}
|
|
|
|
export {
|
|
getProjectData,
|
|
getProjectDataQuery,
|
|
getTopProjects,
|
|
searchProjectsQuery,
|
|
};
|