diff --git a/App.vue b/App.vue index 7b53958..aec58d3 100644 --- a/App.vue +++ b/App.vue @@ -2,9 +2,12 @@
-
@@ -12,12 +15,19 @@ \ No newline at end of file diff --git a/components/Sidebar.vue b/components/Sidebar.vue index 5bb4c6f..964e529 100644 --- a/components/Sidebar.vue +++ b/components/Sidebar.vue @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/nuxt.config.ts b/nuxt.config.ts index 33f7159..47d0601 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -28,6 +28,7 @@ export default { autoImports: [ // automatically imports `defineStore` 'defineStore', // import { defineStore } from 'pinia' + 'storeToRefs', // automatically imports `defineStore` as `definePiniaStore` ['defineStore', 'definePiniaStore'], // import { defineStore as definePiniaStore } from 'pinia' ], diff --git a/pages/channel/@me/[dmId].vue b/pages/channel/@me/[dmId].vue index b801255..aa692f3 100644 --- a/pages/channel/@me/[dmId].vue +++ b/pages/channel/@me/[dmId].vue @@ -1,16 +1,105 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/pages/channel/[id].vue b/pages/channel/[id].vue index f1ba158..201a7bf 100644 --- a/pages/channel/[id].vue +++ b/pages/channel/[id].vue @@ -1,12 +1,25 @@ - \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c7a40d2..5f6b72b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,10 +12,10 @@ model User { email String @unique username String @unique passwordhash String - Server Server[] + server Server[] serverId String? - Messages Message[] - Session Session[] + messages Message[] + session Session[] } model Server { @@ -28,9 +28,9 @@ model Server { model Channel { id String @id @default(cuid()) name String - Server Server? @relation(fields: [serverId], references: [id]) + server Server? @relation(fields: [serverId], references: [id]) serverId String? - Message Message[] + messages Message[] } model Message { diff --git a/server/api/channel/messages/[id].get.ts b/server/api/channel/messages/[id].get.ts new file mode 100644 index 0000000..d002bf4 --- /dev/null +++ b/server/api/channel/messages/[id].get.ts @@ -0,0 +1,35 @@ +import { PrismaClient } from '@prisma/client' +const prisma = new PrismaClient() + +export default defineEventHandler(async (event) => { + if (!event.context.user.authenticated) return { + message: 'You must be logged in to view a channel.' + } + + if (!event.context.params.id) { + event.node.res.statusCode = 400; + return { + message: 'A channelId is required' + } + } + + const channel = await prisma.channel.findFirst({ + where: { + id: event.context.params.id + }, + include: { + messages: true, + } + }) + + if (!channel) { + event.node.res.statusCode = 404; + return { + message: `Channel with id "${event.context.params.id}" not found` + } + } + + return { + channel + } +}) \ No newline at end of file diff --git a/server/api/channel/sendMessage.post.ts b/server/api/channel/sendMessage.post.ts new file mode 100644 index 0000000..d964f37 --- /dev/null +++ b/server/api/channel/sendMessage.post.ts @@ -0,0 +1,71 @@ +import { PrismaClient } from '@prisma/client' +const prisma = new PrismaClient() + +export default defineEventHandler(async (event) => { + if (!event.context.user.authenticated) { + event.node.res.statusCode = 401; + return { + message: 'You must be logged in to send a message.' + } + } + + const { body, channelId } = await readBody(event) + + if (!body || !channelId) { + event.node.res.statusCode = 400; + return { + message: 'A body or channelId is required to send a message.' + } + } + + const channel = await prisma.channel.findFirst({ + where: { + id: channelId + } + }) + + const server = await prisma.server.findFirst({ + where: { + id: channel.serverId + }, + include: { + participants: true + } + }) + + const userInServer = server.participants.filter((e) => e.id === event.context.user.id) + + if (!userInServer.length > 0) { + event.node.res.statusCode = 401; + return { + message: 'You must be in the server to send a message.' + } + } + + if (!server) { + event.node.res.statusCode = 404; + return { + message: 'Server not found' + } + } + + const message = await prisma.message.create({ + data: { + body, + creator: { + connect: { + id: event.context.user.id + } + }, + channel: { + connect: { + id: channelId + } + } + } + }) + + return { + message + } +}) \ No newline at end of file diff --git a/server/middleware/auth.ts b/server/middleware/auth.ts index 3e4ea44..2426669 100644 --- a/server/middleware/auth.ts +++ b/server/middleware/auth.ts @@ -4,8 +4,6 @@ const prisma = new PrismaClient() export default defineEventHandler(async (event) => { const cookies = parseCookies(event) - console.log(cookies.sessionToken) - if (!cookies.sessionToken) { event.context.user = { authenticated: false } return; diff --git a/stores/servers.ts b/stores/servers.ts index 58f36d6..49f1713 100644 --- a/stores/servers.ts +++ b/stores/servers.ts @@ -2,14 +2,19 @@ export const useServerStore = defineStore('server', { state: () => ({ servers: [], dms: [], - activeServer: undefined + activeServer: {} }), actions: { addServer(server) { + if (this.servers.includes(server)) return; this.servers.push(server) }, addDM(server) { + if (this.dms.includes(server)) return; this.dms.push(server) - } + }, + setActive(type, serverId) { + this.activeServer = this[type].find((e) => e.id === serverId) + }, }, })