feat: impl file rename
This commit is contained in:
2
packages/convex/_generated/api.d.ts
vendored
2
packages/convex/_generated/api.d.ts
vendored
@@ -17,6 +17,7 @@ import type * as files from "../files.js";
|
||||
import type * as functions from "../functions.js";
|
||||
import type * as model_directories from "../model/directories.js";
|
||||
import type * as model_error from "../model/error.js";
|
||||
import type * as model_files from "../model/files.js";
|
||||
import type * as model_user from "../model/user.js";
|
||||
import type * as users from "../users.js";
|
||||
|
||||
@@ -33,6 +34,7 @@ declare const fullApi: ApiFromModules<{
|
||||
functions: typeof functions;
|
||||
"model/directories": typeof model_directories;
|
||||
"model/error": typeof model_error;
|
||||
"model/files": typeof model_files;
|
||||
"model/user": typeof model_user;
|
||||
users: typeof users;
|
||||
}>;
|
||||
|
@@ -3,6 +3,7 @@ import { v } from "convex/values"
|
||||
import { authenticatedMutation, authenticatedQuery } from "./functions"
|
||||
import type { DirectoryItem } from "./model/directories"
|
||||
import * as Directories from "./model/directories"
|
||||
import * as Files from "./model/files"
|
||||
|
||||
export const generateUploadUrl = authenticatedMutation({
|
||||
handler: async (ctx) => {
|
||||
@@ -72,6 +73,17 @@ export const saveFile = authenticatedMutation({
|
||||
},
|
||||
})
|
||||
|
||||
export const renameFile = authenticatedMutation({
|
||||
args: {
|
||||
directoryId: v.optional(v.id("directories")),
|
||||
itemId: v.id("files"),
|
||||
newName: v.string(),
|
||||
},
|
||||
handler: async (ctx, { directoryId, itemId, newName }) => {
|
||||
await Files.renameFile(ctx, { directoryId, itemId, newName })
|
||||
},
|
||||
})
|
||||
|
||||
export const moveToTrash = authenticatedMutation({
|
||||
args: {
|
||||
kind: v.union(v.literal("file"), v.literal("directory")),
|
||||
|
36
packages/convex/model/files.ts
Normal file
36
packages/convex/model/files.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import type { Id } from "../_generated/dataModel"
|
||||
import type { AuthenticatedMutationCtx } from "../functions"
|
||||
import * as Err from "./error"
|
||||
|
||||
export async function renameFile(
|
||||
ctx: AuthenticatedMutationCtx,
|
||||
{
|
||||
directoryId,
|
||||
itemId,
|
||||
newName,
|
||||
}: {
|
||||
directoryId?: Id<"directories">
|
||||
itemId: Id<"files">
|
||||
newName: string
|
||||
},
|
||||
) {
|
||||
const existing = await ctx.db
|
||||
.query("files")
|
||||
.withIndex("uniqueFileInDirectory", (q) =>
|
||||
q
|
||||
.eq("userId", ctx.user._id)
|
||||
.eq("directoryId", directoryId)
|
||||
.eq("name", newName)
|
||||
.eq("deletedAt", undefined),
|
||||
)
|
||||
.first()
|
||||
|
||||
if (existing) {
|
||||
throw Err.create(
|
||||
Err.Code.FileExists,
|
||||
`File with name ${newName} already exists in ${directoryId ? `directory ${directoryId}` : "root"}`,
|
||||
)
|
||||
}
|
||||
|
||||
await ctx.db.patch(itemId, { name: newName })
|
||||
}
|
Reference in New Issue
Block a user