Skip to content

Commit f9ba814

Browse files
committed
refactor(resources): remove resource-table and add implementation using table component, update actions for improved readability
1 parent 37cba14 commit f9ba814

16 files changed

+428
-348
lines changed

src/actions/resources.ts

Lines changed: 0 additions & 184 deletions
This file was deleted.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"use server";
2+
3+
import { createClient } from "@/lib/supabase/server";
4+
import type { ResourceForm } from "@/types";
5+
6+
export const createResource = async (input: ResourceForm) => {
7+
const supabase = await createClient();
8+
9+
const { data: userData, error: userError } = await supabase.auth.getUser();
10+
if (userError || !userData?.user) throw new Error("User not found");
11+
12+
const { id: userId } = userData.user;
13+
const payload = { ...input, author: userId };
14+
const { data, error } = await supabase
15+
.from("resources")
16+
.insert([payload])
17+
.select()
18+
.single();
19+
20+
if (error) throw new Error("Error creating resource");
21+
return data;
22+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"use server";
2+
3+
import { revalidatePath } from "next/cache";
4+
import { createClient } from "@/lib/supabase/server";
5+
6+
export async function deleteResourceByAdmin(resourceId: string) {
7+
const supabase = await createClient();
8+
const { error } = await supabase
9+
.from("resources")
10+
.delete()
11+
.eq("id", resourceId);
12+
13+
if (error) throw new Error("Failed to delete resource");
14+
15+
const pathsToRevalidate = ["/explore", "/trending"];
16+
17+
for (const path of pathsToRevalidate) {
18+
revalidatePath(path);
19+
}
20+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"use server";
2+
3+
import { createClient } from "@/lib/supabase/server";
4+
import type { Resource } from "@/types";
5+
6+
export const getAllResources = async (): Promise<Resource[]> => {
7+
const supabase = await createClient();
8+
const { data, error } = await supabase.from("resources").select(`*,
9+
category:categories (id, name, slug, created_at),
10+
author:profiles (id, username, full_name, avatar_url)`);
11+
12+
if (error) throw new Error("Failed to fetch resources");
13+
return data;
14+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"use server";
2+
3+
import type { ResourceList } from "@/types";
4+
5+
export async function getRandomResources(): Promise<ResourceList[]> {
6+
const res = await fetch(
7+
`${process.env.NEXT_PUBLIC_BASE_URL}/api/resources/random`,
8+
{ next: { revalidate: 86400 } },
9+
);
10+
return await res.json();
11+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"use server";
2+
3+
import { createClient } from "@/lib/supabase/server";
4+
import type { Resource } from "@/types";
5+
6+
export const getResourceBySlug = async (
7+
slug: string,
8+
): Promise<Resource | null> => {
9+
const supabase = await createClient();
10+
const { data, error } = await supabase
11+
.from("resources")
12+
.select(
13+
"*, category:categories (id, name, slug, created_at), author:profiles (id, username, full_name, avatar_url)",
14+
)
15+
.eq("slug", slug)
16+
.single();
17+
18+
if (error) throw new Error("Failed to fetch resource");
19+
return data;
20+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use server";
2+
3+
import { createClient } from "@/lib/supabase/server";
4+
import type { ResourceList } from "@/types";
5+
6+
export const getResourcesByCategory = async (
7+
category: string,
8+
): Promise<ResourceList[]> => {
9+
const supabase = await createClient();
10+
const { data, error } = await supabase
11+
.from("resources")
12+
.select(
13+
`
14+
id,
15+
name,
16+
slug,
17+
image,
18+
tags,
19+
category:categories!inner (id, name, slug)
20+
`,
21+
)
22+
.eq("categories.slug", category);
23+
24+
if (error) throw new Error("Failed to fetch resources");
25+
// @ts-expect-error - supabase returns an array, but we want to return a single object
26+
return data;
27+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"use server";
2+
3+
import { createClient } from "@/lib/supabase/server";
4+
import type { Resource, Filters } from "@/types";
5+
6+
export async function getResources(
7+
filters: Filters,
8+
from: number = 0,
9+
to: number = 9,
10+
): Promise<Resource[]> {
11+
const supabase = await createClient();
12+
let query = supabase.from("resources").select("*").range(from, to);
13+
14+
// Filters
15+
if (filters.category) {
16+
query = query.eq("category", filters.category);
17+
}
18+
19+
if (filters.search) {
20+
query = query.ilike("name", `%${filters.search}%`);
21+
}
22+
23+
query = query.eq("status", "approved");
24+
25+
// Sorting
26+
switch (filters.sortBy) {
27+
case "newest":
28+
query = query.order("created_at", { ascending: false });
29+
break;
30+
case "oldest":
31+
query = query.order("created_at", { ascending: true });
32+
break;
33+
case "popular":
34+
query = query.order("views", { ascending: false });
35+
break;
36+
case "name":
37+
query = query.order("name", { ascending: true });
38+
break;
39+
case "":
40+
break;
41+
}
42+
43+
const { data, error } = await query;
44+
if (error) throw new Error("Failed to fetch resources");
45+
return data;
46+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"use server";
2+
3+
import { createClient } from "@/lib/supabase/server";
4+
5+
export async function getUserResources(userId: string) {
6+
const supabase = await createClient();
7+
const { data, error } = await supabase
8+
.from("resources")
9+
.select(`*, category:categories (id, name)`)
10+
.eq("author", userId);
11+
12+
if (error) throw new Error("Failed to fetch resources");
13+
return data;
14+
}

src/actions/resources/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export * from "./create-resource-by-user";
2+
export * from "./delete-resource-by-admin";
3+
export * from "./get-all-resources";
4+
export * from "./get-random-resources";
5+
export * from "./get-resource-by-slug";
6+
export * from "./get-resources-by-category";
7+
export * from "./get-resources";
8+
export * from "./get-user-resources";
9+
export * from "./search-resources";
10+
export * from "./update-resource-by-user";
11+
export * from "./update-resource-status-by-admin";

0 commit comments

Comments
 (0)