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"> <script lang="ts">
import { useGlobalStore } from '~/stores/store' import { useGlobalStore } from '~/stores/store'
import { IServer } from '~/types';
export default { export default {
data() { data() {
@@ -99,7 +100,7 @@ export default {
methods: { methods: {
async createServer() { async createServer() {
const globalStore = useGlobalStore(); 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.createServerModelOpen = false;
this.serverName = ''; this.serverName = '';
globalStore.addServer(server) globalStore.addServer(server)

26
package-lock.json generated
View File

@@ -16,6 +16,8 @@
}, },
"devDependencies": { "devDependencies": {
"@nuxt/kit": "^3.0.0", "@nuxt/kit": "^3.0.0",
"@types/bcryptjs": "^2.4.2",
"@types/uuid": "^9.0.0",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"postcss": "^8.4.20", "postcss": "^8.4.20",
"prisma": "^4.8.0", "prisma": "^4.8.0",
@@ -1104,6 +1106,12 @@
"node": ">=10.13.0" "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": { "node_modules/@types/cookie": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "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", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" "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": { "node_modules/@unhead/dom": {
"version": "1.0.14", "version": "1.0.14",
"resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.14.tgz", "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", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" "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": { "@types/cookie": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "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", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" "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": { "@unhead/dom": {
"version": "1.0.14", "version": "1.0.14",
"resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.14.tgz", "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.14.tgz",

View File

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

View File

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

View File

@@ -5,8 +5,9 @@
</form> </form>
</template> </template>
<script> <script lang="ts">
import { useGlobalStore } from '~/stores/store' import { useGlobalStore } from '~/stores/store'
import { IChannel } from '~/types'
definePageMeta({ definePageMeta({
middleware: 'auth' middleware: 'auth'
@@ -20,7 +21,7 @@ export default {
}, },
methods: { methods: {
async startDM() { 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) useGlobalStore().addDM(server)
useRouter().push({ path: '/channel/@me/' + server.id }) useRouter().push({ path: '/channel/@me/' + server.id })

View File

@@ -2,36 +2,34 @@
<MessagePane :server="server" /> <MessagePane :server="server" />
</template> </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"> <script lang="ts">
import { useGlobalStore } from '~/stores/store' import { useGlobalStore } from '~/stores/store'
import { IChannel } from '~/types'
definePageMeta({ definePageMeta({
middleware: 'auth' middleware: 'auth'
}) })
export default { 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() { async updated() {
if (!this.server) return; if (!this.server) return;
this.server = await $fetch(`/api/channels/${route.params.id}`); 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> </script>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
import { IUser } from '~/types'
import { PrismaClient } from '@prisma/client' import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient() const prisma = new PrismaClient()
@@ -16,9 +17,9 @@ export default defineEventHandler(async (event) => {
include: { include: {
channels: true 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', { export const useGlobalStore = defineStore('global', {
state: () => ({ state: () => ({
activeServer: {}, activeServer: {} as IServer | Record<string, unknown>,
user: {} user: {} as IUser
}), }),
actions: { actions: {
setUser(user) { setUser(user: IUser) {
this.user = user; this.user = user;
}, },
addServer(server) { addServer(server: IServer) {
if (this.user.servers.find((e) => e.id === server.id)) return; if (this.user.servers.find((e) => e.id === server.id)) return;
this.user.servers.push(server) this.user.servers.push(server)
}, },
addDM(dmChannel) { addDM(dmChannel: IChannel) {
if (this.user.channels.includes(dmChannel)) return; if (this.user.channels.includes(dmChannel)) return;
this.user.channels.push(dmChannel) this.user.channels.push(dmChannel)
}, },
setActive(type, serverId) { setActive(type: string, serverId: string) {
if (serverId === '@me') { if (serverId === '@me') {
this.activeServer = {} this.activeServer = {}
return; return;
@@ -23,7 +25,10 @@ export const useGlobalStore = defineStore('global', {
type = (type === 'dm') ? 'channels' : 'servers' 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" "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 { export interface IUser {
id: string; id: string;
email: string;
username: 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;
} }