mirror of
https://github.com/Sosokker/B2D-Ventures.git
synced 2025-12-18 21:44:06 +01:00
293 lines
6.6 KiB
TypeScript
293 lines
6.6 KiB
TypeScript
import { SupabaseClient } from "@supabase/supabase-js";
|
|
import { ProjectCardProps } from "@/types/ProjectCard";
|
|
import { Database } from "@/types/database.types";
|
|
|
|
async function getTopProjects(client: SupabaseClient, numberOfRecords: number = 4) {
|
|
try {
|
|
const { data, error } = await client
|
|
.from("project_card")
|
|
.select(
|
|
`
|
|
project_id,
|
|
project_name,
|
|
short_description,
|
|
image_url,
|
|
join_date,
|
|
location,
|
|
total_investor,
|
|
total_raise,
|
|
min_investment,
|
|
tags
|
|
`
|
|
)
|
|
.order("total_raise", { ascending: false })
|
|
.limit(numberOfRecords);
|
|
|
|
if (error) {
|
|
return { data: null, error: error.message };
|
|
}
|
|
// console.log(data);
|
|
return { data, error: null };
|
|
} catch (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_status_id,
|
|
project_type_id,
|
|
deadline,
|
|
...project_investment_detail!inner (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
tags:project_tag!inner (
|
|
...tag!inner (
|
|
tag_id:id,
|
|
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,
|
|
card_image_url,
|
|
deadline,
|
|
...project_investment_detail!inner (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
tags:project_tag!inner (
|
|
...tag!inner (
|
|
tag_name:value
|
|
)
|
|
),
|
|
...business (
|
|
user_id
|
|
)
|
|
`
|
|
)
|
|
.eq("id", projectId)
|
|
.single();
|
|
|
|
const { data, error } = await query;
|
|
return { data, error };
|
|
}
|
|
|
|
export interface FilterParams {
|
|
searchTerm?: string;
|
|
tagFilter?: string;
|
|
projectStatus?: string;
|
|
projectStatusFilter?: string;
|
|
businessTypeFilter?: string;
|
|
sortByTimeFilter?: string;
|
|
}
|
|
|
|
export interface FilterProjectQueryParams extends FilterParams {
|
|
page: number;
|
|
pageSize: number;
|
|
}
|
|
|
|
function searchProjectsQuery(
|
|
client: SupabaseClient,
|
|
{
|
|
searchTerm,
|
|
tagFilter,
|
|
projectStatusFilter,
|
|
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 (
|
|
value
|
|
),
|
|
...project_investment_detail!inner (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment,
|
|
investment_deadline
|
|
),
|
|
tags:project_tag!inner (
|
|
...tag!inner (
|
|
tag_name:value
|
|
)
|
|
),
|
|
...business!inner (
|
|
...business_type!inner (
|
|
business_type:value
|
|
),
|
|
business_location:location
|
|
),
|
|
investment_deal (
|
|
deal_amount,
|
|
investor_id
|
|
)
|
|
`
|
|
)
|
|
.range(start, end);
|
|
|
|
// if (sortByTimeFilter && sortByTimeFilter !== "all") {
|
|
// query = query.eq("published_time", sortByTimeFilter);
|
|
// }
|
|
|
|
if (projectStatusFilter && projectStatusFilter !== "all") {
|
|
query = query.eq("project_status.value", projectStatusFilter);
|
|
}
|
|
|
|
if (businessTypeFilter && businessTypeFilter !== "all") {
|
|
query = query.eq("business.business_type.value", businessTypeFilter);
|
|
}
|
|
|
|
if (tagFilter && tagFilter !== "all") {
|
|
query = query.in("project_tag.tag.value", [tagFilter]);
|
|
}
|
|
|
|
if (searchTerm) {
|
|
query = query.ilike("project_name", `%${searchTerm}%`);
|
|
}
|
|
|
|
return query.order("published_time", { ascending: false });
|
|
}
|
|
|
|
const getProjectByBusinessId = (client: SupabaseClient, businessIds: string[]) => {
|
|
return client
|
|
.from("project")
|
|
.select(
|
|
`
|
|
id,
|
|
project_name,
|
|
business_id,
|
|
published_time,
|
|
card_image_url,
|
|
project_short_description,
|
|
...project_investment_detail (
|
|
min_investment,
|
|
total_investment,
|
|
target_investment
|
|
)
|
|
`
|
|
)
|
|
.in("business_id", businessIds);
|
|
};
|
|
|
|
const getProjectByUserId = (client: SupabaseClient<Database>, userId: string) => {
|
|
return client
|
|
.from("project")
|
|
.select(
|
|
`
|
|
id,
|
|
project_name,
|
|
project_short_description,
|
|
business_id:business!inner (
|
|
user_id
|
|
),
|
|
dataroom_id
|
|
`
|
|
)
|
|
.eq("business.user_id", userId);
|
|
};
|
|
|
|
function getProjectByName(client: SupabaseClient, searchTerm: string) {
|
|
return 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
|
|
)
|
|
`
|
|
)
|
|
.ilike("project_name", `%${searchTerm}%`);
|
|
}
|
|
|
|
const getProjectCardData = async (client: SupabaseClient, projectIds: string[]) => {
|
|
const { data, error } = await client.from("project_card").select("*").in("project_id", projectIds);
|
|
|
|
if (error) {
|
|
return { data: null, error: error.message };
|
|
}
|
|
|
|
const projectSections = data.map((project) => {
|
|
const projectSection: ProjectCardProps = {
|
|
id: project.project_id,
|
|
project_name: project.project_name,
|
|
short_description: project.short_description,
|
|
image_url: project.image_url,
|
|
join_date: project.join_date,
|
|
location: project.location,
|
|
tags: project.tags || [],
|
|
min_investment: project.min_investment,
|
|
total_investor: project.total_investor,
|
|
total_raise: project.total_raise,
|
|
};
|
|
return projectSection;
|
|
});
|
|
|
|
return { data: projectSections, error: null };
|
|
};
|
|
export {
|
|
getProjectData,
|
|
getProjectDataQuery,
|
|
getTopProjects,
|
|
searchProjectsQuery,
|
|
getProjectByBusinessId,
|
|
getProjectByUserId,
|
|
getProjectByName,
|
|
getProjectCardData,
|
|
};
|