MMMMMMMMMMMMMMMM types

This commit is contained in:
Zoe
2023-01-10 21:21:09 -06:00
parent 880d1bf375
commit cd76dfc147
21 changed files with 147 additions and 82 deletions

View File

@@ -88,6 +88,7 @@
<script lang="ts">
import { useGlobalStore } from '~/stores/store'
import { IServer } from '~/types';
export default {
data() {
@@ -99,7 +100,7 @@ export default {
methods: {
async createServer() {
const globalStore = useGlobalStore();
const { server } = await $fetch('/api/channels/create', { method: 'post', body: { serverName: this.serverName } })
const server: IServer = await $fetch('/api/channels/create', { method: 'post', body: { serverName: this.serverName } })
this.createServerModelOpen = false;
this.serverName = '';
globalStore.addServer(server)

26
package-lock.json generated
View File

@@ -16,6 +16,8 @@
},
"devDependencies": {
"@nuxt/kit": "^3.0.0",
"@types/bcryptjs": "^2.4.2",
"@types/uuid": "^9.0.0",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.20",
"prisma": "^4.8.0",
@@ -1104,6 +1106,12 @@
"node": ">=10.13.0"
}
},
"node_modules/@types/bcryptjs": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
"integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==",
"dev": true
},
"node_modules/@types/cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
@@ -1132,6 +1140,12 @@
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
},
"node_modules/@types/uuid": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==",
"dev": true
},
"node_modules/@unhead/dom": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.14.tgz",
@@ -8493,6 +8507,12 @@
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
},
"@types/bcryptjs": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
"integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==",
"dev": true
},
"@types/cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
@@ -8521,6 +8541,12 @@
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
},
"@types/uuid": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==",
"dev": true
},
"@unhead/dom": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.14.tgz",

View File

@@ -18,6 +18,8 @@
},
"devDependencies": {
"@nuxt/kit": "^3.0.0",
"@types/bcryptjs": "^2.4.2",
"@types/uuid": "^9.0.0",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.20",
"prisma": "^4.8.0",

View File

@@ -4,6 +4,7 @@
<script lang="ts">
import { useGlobalStore } from '~/stores/store'
import { IChannel } from '~/types'
definePageMeta({
middleware: 'auth'
@@ -13,18 +14,17 @@ export default {
async setup() {
const route = useRoute()
const { channel: server } = await $fetch(`/api/channels/${route.params.id}`)
const server: IChannel = await $fetch(`/api/channels/${route.params.id}`)
if (!server) return;
useGlobalStore().addDM(server);
await useGlobalStore().setActive('dms', server.id);
useGlobalStore().setActive('dms', server.id);
console.log(server)
return {
server,
}
},
async updated() {
if (!useGlobalStore().activeServer == this.server) await useGlobalStore().setActive('dms', this.server.id)
if (!useGlobalStore().activeServer == this.server) useGlobalStore().setActive('dms', this.server.id)
},
}
</script>

View File

@@ -5,8 +5,9 @@
</form>
</template>
<script>
<script lang="ts">
import { useGlobalStore } from '~/stores/store'
import { IChannel } from '~/types'
definePageMeta({
middleware: 'auth'
@@ -20,7 +21,7 @@ export default {
},
methods: {
async startDM() {
const { server } = await $fetch('/api/channels/createDM', { method: 'post', body: { partnerId: this.userId } })
const server: IChannel = await $fetch('/api/channels/createDM', { method: 'post', body: { partnerId: this.userId } })
useGlobalStore().addDM(server)
useRouter().push({ path: '/channel/@me/' + server.id })

View File

@@ -2,36 +2,34 @@
<MessagePane :server="server" />
</template>
<script async setup lang="ts">
const route = useRoute()
const server: IChannel = await $fetch(`/api/channels/${route.params.id}`)
const realServer = useGlobalStore().user.servers.find((e) => e.channels.some((el) => el.id == route.params.id))
if (realServer) {
useGlobalStore().addServer(realServer);
useGlobalStore().setActive('servers', realServer.id)
}
</script>
<script lang="ts">
import { useGlobalStore } from '~/stores/store'
import { IChannel } from '~/types'
definePageMeta({
middleware: 'auth'
})
export default {
async setup() {
const route = useRoute()
const { channel: server } = await $fetch(`/api/channels/${route.params.id}`)
if (!server) return;
const realServer = await useGlobalStore().user.servers.find((e) => e.channels.some((el) => el.id == route.params.id ) )
useGlobalStore().addServer(realServer);
await useGlobalStore().setActive('servers', realServer.id)
return {
server
}
},
async updated() {
if (!this.server) return;
this.server = await $fetch(`/api/channels/${route.params.id}`);
if (!await useGlobalStore().activeServer == this.server.id) await useGlobalStore().setActive('servers', this.server.id)
if (!useGlobalStore().activeServer == this.server.id) useGlobalStore().setActive('servers', this.server.id)
}
}
</script>

View File

@@ -20,8 +20,9 @@
</div>
</template>
<script>
<script lang="ts">
import { useGlobalStore } from '~/stores/store'
import { IUser } from '~/types';
definePageMeta({
layout: 'clean'
@@ -42,14 +43,14 @@ export default {
username: this.username,
password: this.password
}
})
}) as { userId: string; token: string; user: IUser; }
const userId = useCookie('userId')
userId.value = user.userId
const token = useCookie('sessionToken')
token.value = user.token
useGlobalStore().setUser(user)
useGlobalStore().setUser(user.user)
navigateTo('/channel/@me')
}

View File

@@ -29,8 +29,10 @@
</div>
</template>
<script>
<script lang="ts">
import { NuxtLink } from '~/.nuxt/components';
import { useGlobalStore } from '~/stores/store'
import { IUser } from '~/types';
definePageMeta({
layout: 'clean'
@@ -53,14 +55,14 @@ export default {
email: this.email,
password: this.password
}
})
}) as { userId: string; token: string; user: IUser; }
const userId = useCookie('userId')
userId.value = user.userId
const token = useCookie('sessionToken')
token.value = user.token
useGlobalStore().setUser(user)
useGlobalStore().setUser(user.user)
navigateTo('/channel/@me')
}

View File

@@ -1,3 +1,4 @@
import { IChannel, IServer, IUser } from '../../../../types'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
@@ -23,7 +24,7 @@ export default defineEventHandler(async (event) => {
messages: true,
dmParticipants: true
}
})
}) as IChannel
if (!channel) {
event.node.res.statusCode = 404;
@@ -40,9 +41,9 @@ export default defineEventHandler(async (event) => {
include: {
participants: true
}
})
}) as IServer
const userInServer = server.participants.filter((e) => e.id === event.context.user.id)
const userInServer: Array<IUser> = server.participants.filter((e: IUser) => e.id === event.context.user.id)
if (!userInServer) {
event.node.res.statusCode = 401;
@@ -52,7 +53,5 @@ export default defineEventHandler(async (event) => {
}
}
return {
channel
}
return channel
})

View File

@@ -1,3 +1,4 @@
import { IServer } from '~/types'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
@@ -22,7 +23,7 @@ export default defineEventHandler(async (event) => {
where: {
name: serverName
}
})
}) as IServer
if (preExistingServer) {
event.node.res.statusCode = 409;
@@ -47,9 +48,7 @@ export default defineEventHandler(async (event) => {
channels: true,
participants: true
}
})
}) as IServer
return {
server
}
return server
})

View File

@@ -1,3 +1,4 @@
import { IChannel, IUser } from '~/types'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
@@ -22,13 +23,13 @@ export default defineEventHandler(async (event) => {
where: {
id: partnerId
}
})
}) as IUser
const user = await prisma.user.findFirst({
where: {
id: event.context.user.id
}
})
}) as IUser
if (!partner) {
event.node.res.statusCode = 400;
@@ -42,7 +43,7 @@ export default defineEventHandler(async (event) => {
name: `${user.id}-${partner.id}`,
DM: true
}
})
}) as IChannel
if (preExistingServer) {
event.node.res.statusCode = 409;
@@ -60,9 +61,7 @@ export default defineEventHandler(async (event) => {
include: {
dmParticipants: true
}
})
}) as IChannel
return {
server
}
return server
})

View File

@@ -1,8 +1,10 @@
import { IChannel, IServer, IUser, IMessage } from '~/types'
import { Server } from 'socket.io'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
declare global {
var io: Server | undefined
var io: Server
}
export default defineEventHandler(async (event) => {
@@ -29,7 +31,7 @@ export default defineEventHandler(async (event) => {
include: {
dmParticipants: true
}
})
}) as IChannel
if (!channel.DM) {
const server = await prisma.server.findFirst({
@@ -39,11 +41,11 @@ export default defineEventHandler(async (event) => {
include: {
participants: true
}
})
}) as IServer
const userInServer = server.participants.filter((e) => e.id === event.context.user.id)
const userInServer: Array<IUser> = server.participants.filter((e) => e.id === event.context.user.id)
if (!userInServer.length > 0) {
if (userInServer.length > 0) {
event.node.res.statusCode = 401;
return {
message: 'You must be in the server to send a message.'
@@ -57,9 +59,9 @@ export default defineEventHandler(async (event) => {
}
}
} else {
const userInDM = channel.dmParticipants.filter((e) => e.id === event.context.user.id)
const userInDM: Array<IUser> | undefined = channel.dmParticipants?.filter((e) => e.id === event.context.user.id)
if (!userInDM.length > 0) {
if (!userInDM || userInDM.length > 0) {
event.node.res.statusCode = 401;
return {
message: 'You must be in the DM to send a message.'
@@ -84,7 +86,7 @@ export default defineEventHandler(async (event) => {
include: {
creator: true
}
})
}) as IMessage
global.io.emit(`message-${channel.id}`, { message });

View File

@@ -1,4 +1,5 @@
import { PrismaClient } from '@prisma/client'
import { IUser } from '../../types'
const prisma = new PrismaClient()
export default defineEventHandler(async (event) => {
@@ -45,7 +46,7 @@ export default defineEventHandler(async (event) => {
},
},
}
})
}) as IUser
user.passwordhash = undefined;

View File

@@ -1,3 +1,4 @@
import { IServer } from '~/types'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
@@ -21,7 +22,7 @@ export default defineEventHandler(async (event) => {
participants: true,
channels: true
}
})
}) as IServer
if (!server) {
event.node.res.statusCode = 404;

View File

@@ -1,6 +1,7 @@
import bcryptjs from "bcryptjs";
import { v4 as uuidv4 } from "uuid";
import { PrismaClient } from '@prisma/client'
import { IUser } from "../../types";
const prisma = new PrismaClient()
export default defineEventHandler(async (event) => {
@@ -17,7 +18,7 @@ export default defineEventHandler(async (event) => {
where: {
username: body.username
}
})
}) as IUser
const isCorrect = await bcryptjs.compare(body.password, user.passwordhash)
@@ -39,6 +40,7 @@ export default defineEventHandler(async (event) => {
return {
token,
userId: user.id
userId: user.id,
user
}
})

View File

@@ -1,6 +1,7 @@
import bcryptjs from "bcryptjs";
import { v4 as uuidv4 } from "uuid";
import { PrismaClient } from '@prisma/client'
import { IUser } from "../../types";
const prisma = new PrismaClient()
export default defineEventHandler(async (event) => {
@@ -24,7 +25,7 @@ export default defineEventHandler(async (event) => {
}
]
}
})
}) as IUser
if (preExistingUser) {
event.node.res.statusCode = 409;
@@ -41,7 +42,7 @@ export default defineEventHandler(async (event) => {
passwordhash,
email: body.email
}
})
}) as IUser
const token = uuidv4()
@@ -54,6 +55,7 @@ export default defineEventHandler(async (event) => {
return {
token,
userId: user.id
userId: user.id,
user
}
})

View File

@@ -1,3 +1,4 @@
import { IUser } from '~/types'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
@@ -16,9 +17,9 @@ export default defineEventHandler(async (event) => {
include: {
channels: true
}
})
}) as IUser
user.passwordhash = undefined;
servers.passwordhash = undefined;
return user
return servers
})

View File

@@ -1,21 +1,23 @@
import { IUser, IServer, IChannel } from "../types";
export const useGlobalStore = defineStore('global', {
state: () => ({
activeServer: {},
user: {}
activeServer: {} as IServer | Record<string, unknown>,
user: {} as IUser
}),
actions: {
setUser(user) {
setUser(user: IUser) {
this.user = user;
},
addServer(server) {
addServer(server: IServer) {
if (this.user.servers.find((e) => e.id === server.id)) return;
this.user.servers.push(server)
},
addDM(dmChannel) {
addDM(dmChannel: IChannel) {
if (this.user.channels.includes(dmChannel)) return;
this.user.channels.push(dmChannel)
},
setActive(type, serverId) {
setActive(type: string, serverId: string) {
if (serverId === '@me') {
this.activeServer = {}
return;
@@ -23,7 +25,10 @@ export const useGlobalStore = defineStore('global', {
type = (type === 'dm') ? 'channels' : 'servers'
this.activeServer = this["user"][type].find((e) => e.id === serverId)
if (type !== 'channels' && type !== 'servers') return;
const searchableArray: IChannel[] | IServer[] = this["user"][type]
this.activeServer = searchableArray.find((e: IServer | IChannel) => e.id === serverId)
},
},
})

View File

@@ -25,15 +25,6 @@
"./*"
]
},
"types": [
"@nuxt/types",
"@types/node"
]
},
"exclude": [
"node_modules",
".nuxt",
"dist"
],
"extends": "./.nuxt/tsconfig.json"
}

1
tsconfig.tsbuildinfo Normal file
View File

@@ -0,0 +1 @@
{"version":"4.7.4"}

View File

@@ -1,4 +1,35 @@
export interface IUser {
id: string;
email: string;
username: string;
passwordhash: string | undefined;
servers: Array<IServer>;
serverId?: string;
channels: Array<IChannel>;
}
export interface IServer {
id: string;
name: string;
channels: Array<IChannel>;
participants: Array<IUser>;
}
export interface IChannel {
id: string;
name: string;
server?: IServer;
messages: Array<unknown>
DM?: boolean;
dmParticipants?: Array<IUser>;
serverId: string;
}
export interface IMessage {
id: string;
body: string;
creator: IUser;
channel: IChannel;
userId: string;
channelId: string;
}