You've already forked obsidian-visualiser
Campaign character insertion and deletion. Updating the inventory rendering. Update of the character_config IDs.
This commit is contained in:
43
server/api/character/[id]/campaign/[cid].delete.ts
Normal file
43
server/api/character/[id]/campaign/[cid].delete.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { and, eq, or } from 'drizzle-orm';
|
||||
import useDatabase from '~/composables/useDatabase';
|
||||
import { campaignCharactersTable, campaignMembersTable, campaignTable, characterTable } from '~/db/schema';
|
||||
|
||||
export default defineEventHandler(async (e) => {
|
||||
const _id = getRouterParam(e, "id");
|
||||
if(!_id)
|
||||
{
|
||||
setResponseStatus(e, 400);
|
||||
return;
|
||||
}
|
||||
const id = parseInt(_id, 10);
|
||||
|
||||
const _campaign_id = getRouterParam(e, "cid");
|
||||
if(!_campaign_id)
|
||||
{
|
||||
setResponseStatus(e, 400);
|
||||
return;
|
||||
}
|
||||
const campaign_id = parseInt(_campaign_id, 10);
|
||||
|
||||
const session = await getUserSession(e);
|
||||
if(!session.user || session.user.state !== 1)
|
||||
{
|
||||
setResponseStatus(e, 401);
|
||||
return;
|
||||
}
|
||||
|
||||
const db = useDatabase();
|
||||
|
||||
const campaign = db.select({ id: campaignTable.id }).from(campaignMembersTable).innerJoin(campaignTable, eq(campaignMembersTable.id, campaignTable.id)).where(and(eq(campaignMembersTable.id, campaign_id), or(eq(campaignMembersTable.user, session.user.id), eq(campaignTable.owner, session.user.id)))).get();
|
||||
if(!campaign || campaign.id !== campaign_id)
|
||||
return setResponseStatus(e, 404);
|
||||
|
||||
const character = db.select({ id: campaignCharactersTable.character }).from(campaignCharactersTable).where(and(eq(campaignCharactersTable.id, campaign_id), eq(campaignCharactersTable.character, id))).get();
|
||||
if(!character || character.id !== id)
|
||||
return setResponseStatus(e, 403);
|
||||
|
||||
db.delete(campaignCharactersTable).where(and(eq(campaignCharactersTable.id, campaign_id), eq(campaignCharactersTable.character, id))).run();
|
||||
|
||||
setResponseStatus(e, 200);
|
||||
return;
|
||||
});
|
||||
45
server/api/character/[id]/campaign/[cid].post.ts
Normal file
45
server/api/character/[id]/campaign/[cid].post.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { and, eq, notExists } from 'drizzle-orm';
|
||||
import useDatabase from '~/composables/useDatabase';
|
||||
import { campaignCharactersTable, campaignMembersTable, campaignTable, characterTable } from '~/db/schema';
|
||||
import { CharacterVariablesValidation } from '#shared/character.util';
|
||||
|
||||
export default defineEventHandler(async (e) => {
|
||||
const _id = getRouterParam(e, "id");
|
||||
if(!_id)
|
||||
{
|
||||
setResponseStatus(e, 400);
|
||||
return;
|
||||
}
|
||||
const id = parseInt(_id, 10);
|
||||
|
||||
const _campaign_id = getRouterParam(e, "cid");
|
||||
if(!_campaign_id)
|
||||
{
|
||||
setResponseStatus(e, 400);
|
||||
return;
|
||||
}
|
||||
const campaign_id = parseInt(_campaign_id, 10);
|
||||
|
||||
const session = await getUserSession(e);
|
||||
if(!session.user || session.user.state !== 1)
|
||||
{
|
||||
setResponseStatus(e, 401);
|
||||
return;
|
||||
}
|
||||
|
||||
const db = useDatabase();
|
||||
const character = db.select({ id: characterTable.id }).from(characterTable).where(and(eq(characterTable.id, id), eq(characterTable.owner, session.user.id))).get();
|
||||
if(!character || character.id !== id)
|
||||
return setResponseStatus(e, 403);
|
||||
|
||||
const campaign = db.select({ id: campaignMembersTable.id }).from(campaignMembersTable).where(and(eq(campaignMembersTable.id, campaign_id), eq(campaignMembersTable.user, session.user.id))).get();
|
||||
if(!campaign || campaign.id !== campaign_id)
|
||||
return setResponseStatus(e, 404);
|
||||
|
||||
db.insert(campaignCharactersTable).values({
|
||||
id: campaign_id,
|
||||
character: id,
|
||||
}).onConflictDoNothing().run();
|
||||
|
||||
return setResponseStatus(e, 200);
|
||||
});
|
||||
@@ -3,6 +3,10 @@ import type { User } from "~/types/auth";
|
||||
|
||||
export default defineWebSocketHandler({
|
||||
message(peer, message) {
|
||||
const id = new URL(peer.request.url).pathname.split('/').slice(-1)[0];
|
||||
if(!id) return peer.close();
|
||||
|
||||
const topic = `campaigns/${id}`;
|
||||
const data = message.json<SocketMessage>();
|
||||
switch(data.type)
|
||||
{
|
||||
@@ -10,6 +14,10 @@ export default defineWebSocketHandler({
|
||||
peer.send(JSON.stringify({ type: 'PONG' }));
|
||||
return;
|
||||
|
||||
case 'character':
|
||||
peer.publish(topic, data);
|
||||
peer.send(data);
|
||||
|
||||
default: return;
|
||||
}
|
||||
},
|
||||
@@ -23,14 +31,14 @@ export default defineWebSocketHandler({
|
||||
|
||||
const topic = `campaigns/${id}`;
|
||||
peer.subscribe(topic);
|
||||
peer.publish(topic, { type: 'user', data: [{ user: (peer.context.user as User).id, status: true }] });
|
||||
peer.send({ type: 'user', data: peer.peers.values().filter(e => e.topics.has(topic)).map(e => ({ user: (e.context.user as User).id, status: true })).toArray() })
|
||||
peer.publish(topic, { type: 'status', data: [{ user: (peer.context.user as User).id, status: true }] });
|
||||
peer.send({ type: 'status', data: peer.peers.values().filter(e => e.topics.has(topic)).map(e => ({ user: (e.context.user as User).id, status: true })).toArray() })
|
||||
},
|
||||
close(peer, details) {
|
||||
const id = new URL(peer.request.url).pathname.split('/').slice(-1)[0];
|
||||
if(!id) return peer.close();
|
||||
|
||||
peer.publish(`campaigns/${id}`, { type: 'user', data: [{ user: (peer.context.user as User).id, status: false }] });
|
||||
peer.publish(`campaigns/${id}`, { type: 'status', data: [{ user: (peer.context.user as User).id, status: false }] });
|
||||
peer.unsubscribe(`campaigns/${id}`);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user