|
import { collections } from "$lib/server/database"; |
|
import { type Actions, fail, redirect } from "@sveltejs/kit"; |
|
import { ObjectId } from "mongodb"; |
|
import { authCondition } from "$lib/server/auth"; |
|
import { base } from "$app/paths"; |
|
|
|
async function assistantOnlyIfAuthor(locals: App.Locals, assistantId?: string) { |
|
const assistant = await collections.assistants.findOne({ _id: new ObjectId(assistantId) }); |
|
|
|
if (!assistant) { |
|
throw Error("Assistant not found"); |
|
} |
|
|
|
if (assistant.createdById.toString() !== (locals.user?._id ?? locals.sessionId).toString()) { |
|
throw Error("You are not the author of this assistant"); |
|
} |
|
|
|
return assistant; |
|
} |
|
|
|
export const actions: Actions = { |
|
delete: async ({ params, locals }) => { |
|
let assistant; |
|
try { |
|
assistant = await assistantOnlyIfAuthor(locals, params.assistantId); |
|
} catch (e) { |
|
return fail(400, { error: true, message: (e as Error).message }); |
|
} |
|
|
|
await collections.assistants.deleteOne({ _id: assistant._id }); |
|
|
|
|
|
await collections.settings.updateMany( |
|
{}, |
|
{ |
|
$pull: { assistants: assistant._id }, |
|
} |
|
); |
|
|
|
|
|
const fileCursor = collections.bucket.find({ filename: assistant._id.toString() }); |
|
|
|
|
|
let fileId = await fileCursor.next(); |
|
while (fileId) { |
|
await collections.bucket.delete(fileId._id); |
|
fileId = await fileCursor.next(); |
|
} |
|
|
|
throw redirect(302, `${base}/settings`); |
|
}, |
|
report: async ({ params, locals }) => { |
|
|
|
const report = await collections.reports.findOne({ |
|
assistantId: new ObjectId(params.assistantId), |
|
createdBy: locals.user?._id ?? locals.sessionId, |
|
}); |
|
|
|
if (report) { |
|
return fail(400, { error: true, message: "Already reported" }); |
|
} |
|
|
|
const { acknowledged } = await collections.reports.insertOne({ |
|
_id: new ObjectId(), |
|
assistantId: new ObjectId(params.assistantId), |
|
createdBy: locals.user?._id ?? locals.sessionId, |
|
createdAt: new Date(), |
|
updatedAt: new Date(), |
|
}); |
|
|
|
if (!acknowledged) { |
|
return fail(500, { error: true, message: "Failed to report assistant" }); |
|
} |
|
return { from: "report", ok: true, message: "Assistant reported" }; |
|
}, |
|
|
|
subscribe: async ({ params, locals }) => { |
|
const assistant = await collections.assistants.findOne({ |
|
_id: new ObjectId(params.assistantId), |
|
}); |
|
|
|
if (!assistant) { |
|
return fail(404, { error: true, message: "Assistant not found" }); |
|
} |
|
|
|
|
|
const settings = await collections.settings.findOne(authCondition(locals)); |
|
|
|
if (settings?.assistants?.includes(assistant._id)) { |
|
return fail(400, { error: true, message: "Already subscribed" }); |
|
} |
|
|
|
const result = await collections.settings.updateOne(authCondition(locals), { |
|
$addToSet: { assistants: assistant._id }, |
|
}); |
|
|
|
|
|
if (result.modifiedCount > 0) { |
|
await collections.assistants.updateOne({ _id: assistant._id }, { $inc: { userCount: 1 } }); |
|
} |
|
|
|
return { from: "subscribe", ok: true, message: "Assistant added" }; |
|
}, |
|
|
|
unsubscribe: async ({ params, locals }) => { |
|
const assistant = await collections.assistants.findOne({ |
|
_id: new ObjectId(params.assistantId), |
|
}); |
|
|
|
if (!assistant) { |
|
return fail(404, { error: true, message: "Assistant not found" }); |
|
} |
|
|
|
const result = await collections.settings.updateOne(authCondition(locals), { |
|
$pull: { assistants: assistant._id }, |
|
}); |
|
|
|
|
|
if (result.modifiedCount > 0) { |
|
await collections.assistants.updateOne({ _id: assistant._id }, { $inc: { userCount: -1 } }); |
|
} |
|
|
|
throw redirect(302, `${base}/settings`); |
|
}, |
|
}; |
|
|