Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions apps/web/actions/folders/getAllFolders.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"use server";

import { getCurrentUser } from "@cap/database/auth/session";
import { CurrentUser } from "@cap/web-domain";
import { Effect } from "effect";
import { getAllFolders } from "../../lib/folder";
import { runPromise } from "../../lib/server";

export async function getAllFoldersAction(
root:
| { variant: "user" }
| { variant: "space"; spaceId: string }
| { variant: "org"; organizationId: string }
) {
try {
const user = await getCurrentUser();
if (!user || !user.activeOrganizationId) {
return {
success: false as const,
error: "Unauthorized or no active organization",
};
}

const folders = await runPromise(
getAllFolders(root).pipe(Effect.provideService(CurrentUser, user))
);
return { success: true as const, folders };
} catch (error) {
console.error("Error fetching folders:", error);
return {
success: false as const,
error: "Failed to fetch folders",
};
}
}
84 changes: 84 additions & 0 deletions apps/web/actions/folders/moveVideosToFolder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"use server";

import { getCurrentUser } from "@cap/database/auth/session";
import { CurrentUser, Video, Folder } from "@cap/web-domain";
import { Effect } from "effect";
import { moveVideosToFolder } from "../../lib/folder";
import { runPromise } from "../../lib/server";
import { revalidatePath } from "next/cache";

interface MoveVideosToFolderParams {
videoIds: string[];
targetFolderId: string | null;
spaceId?: string | null;
}

export async function moveVideosToFolderAction({
videoIds,
targetFolderId,
spaceId,
}: MoveVideosToFolderParams) {
try {
const user = await getCurrentUser();
if (!user || !user.activeOrganizationId) {
return {
success: false as const,
error: "Unauthorized or no active organization",
};
}

const typedVideoIds = videoIds.map((id) => Video.VideoId.make(id));
const typedTargetFolderId = targetFolderId
? Folder.FolderId.make(targetFolderId)
: null;

const root = spaceId
? { variant: "space" as const, spaceId }
: { variant: "org" as const, organizationId: user.activeOrganizationId };

const result = await runPromise(
moveVideosToFolder(typedVideoIds, typedTargetFolderId, root).pipe(
Effect.provideService(CurrentUser, user)
)
);

// Revalidate paths
revalidatePath("/dashboard/caps");

if (spaceId) {
revalidatePath(`/dashboard/spaces/${spaceId}`);
result.originalFolderIds.forEach((folderId) => {
if (folderId) {
revalidatePath(`/dashboard/spaces/${spaceId}/folder/${folderId}`);
}
});
if (result.targetFolderId) {
revalidatePath(
`/dashboard/spaces/${spaceId}/folder/${result.targetFolderId}`
);
}
} else {
result.originalFolderIds.forEach((folderId) => {
if (folderId) {
revalidatePath(`/dashboard/folder/${folderId}`);
}
});
if (result.targetFolderId) {
revalidatePath(`/dashboard/folder/${result.targetFolderId}`);
}
}

return {
success: true as const,
message: `Successfully moved ${result.movedCount} video${
result.movedCount !== 1 ? "s" : ""
} to ${result.targetFolderId ? "folder" : "root"}`,
};
} catch (error) {
console.error("Error moving videos to folder:", error);
return {
success: false as const,
error: error instanceof Error ? error.message : "Failed to move videos",
};
}
}
Loading
Loading