feat: v2 rewrite — hexagonal arch, ActivityPub federation, NATS, deployment-ready #1
23
thoughts-frontend/app/actions/profile.ts
Normal file
23
thoughts-frontend/app/actions/profile.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
"use server";
|
||||||
|
|
||||||
|
import { revalidateTag } from "next/cache";
|
||||||
|
import { cookies } from "next/headers";
|
||||||
|
import { updateProfile as apiUpdateProfile, UpdateProfileSchema } from "@/lib/api";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
async function getToken(): Promise<string> {
|
||||||
|
const token = (await cookies()).get("auth_token")?.value;
|
||||||
|
if (!token) throw new Error("Not authenticated");
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateProfile(
|
||||||
|
username: string,
|
||||||
|
data: z.infer<typeof UpdateProfileSchema>
|
||||||
|
) {
|
||||||
|
const token = await getToken();
|
||||||
|
const updated = await apiUpdateProfile(data, token);
|
||||||
|
revalidateTag(`profile:${username}`);
|
||||||
|
revalidateTag("me");
|
||||||
|
return updated;
|
||||||
|
}
|
||||||
28
thoughts-frontend/app/actions/social.ts
Normal file
28
thoughts-frontend/app/actions/social.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
"use server";
|
||||||
|
|
||||||
|
import { revalidateTag } from "next/cache";
|
||||||
|
import { cookies } from "next/headers";
|
||||||
|
import {
|
||||||
|
followUser as apiFollowUser,
|
||||||
|
unfollowUser as apiUnfollowUser,
|
||||||
|
} from "@/lib/api";
|
||||||
|
|
||||||
|
async function getToken(): Promise<string> {
|
||||||
|
const token = (await cookies()).get("auth_token")?.value;
|
||||||
|
if (!token) throw new Error("Not authenticated");
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function followUser(username: string) {
|
||||||
|
const token = await getToken();
|
||||||
|
await apiFollowUser(username, token);
|
||||||
|
revalidateTag(`profile:${username}`);
|
||||||
|
revalidateTag("feed");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function unfollowUser(username: string) {
|
||||||
|
const token = await getToken();
|
||||||
|
await apiUnfollowUser(username, token);
|
||||||
|
revalidateTag(`profile:${username}`);
|
||||||
|
revalidateTag("feed");
|
||||||
|
}
|
||||||
30
thoughts-frontend/app/actions/thoughts.ts
Normal file
30
thoughts-frontend/app/actions/thoughts.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
"use server";
|
||||||
|
|
||||||
|
import { revalidateTag } from "next/cache";
|
||||||
|
import { cookies } from "next/headers";
|
||||||
|
import {
|
||||||
|
createThought as apiCreateThought,
|
||||||
|
deleteThought as apiDeleteThought,
|
||||||
|
CreateThoughtSchema,
|
||||||
|
} from "@/lib/api";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
async function getToken(): Promise<string> {
|
||||||
|
const token = (await cookies()).get("auth_token")?.value;
|
||||||
|
if (!token) throw new Error("Not authenticated");
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createThought(data: z.infer<typeof CreateThoughtSchema>) {
|
||||||
|
const token = await getToken();
|
||||||
|
const thought = await apiCreateThought(data, token);
|
||||||
|
revalidateTag("feed");
|
||||||
|
return thought;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteThought(thoughtId: string) {
|
||||||
|
const token = await getToken();
|
||||||
|
await apiDeleteThought(thoughtId, token);
|
||||||
|
revalidateTag("feed");
|
||||||
|
revalidateTag(`thought:${thoughtId}`);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user