вложения, канальчики, бим-бим + бам-бам
This commit is contained in:
@@ -1,97 +1,158 @@
|
||||
import type { FastifyInstance } from 'fastify'
|
||||
import type { Namespace } from '../types/webrtc.ts'
|
||||
import { z } from 'zod'
|
||||
import prisma from '../prisma/client.ts'
|
||||
import { socketToClient } from '../utils/socket-to-client.ts'
|
||||
import type { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox'
|
||||
import { Type } from 'typebox'
|
||||
import { UserSchema } from '../schemas/auth.ts'
|
||||
import { UpdateUserPreferencesSchema, UserPreferencesSchema } from '../schemas/user.ts'
|
||||
|
||||
export default function (fastify: FastifyInstance) {
|
||||
fastify.get('/preferences', async (req, reply) => {
|
||||
if (req.user) {
|
||||
return prisma.userPreferences.findFirst({ where: { userId: req.user.id } })
|
||||
}
|
||||
|
||||
reply.code(401).send(false)
|
||||
})
|
||||
|
||||
fastify.patch('/preferences', async (req, reply) => {
|
||||
if (!req.user) {
|
||||
reply.code(401).send(false)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const schema = z.object({
|
||||
toggleInputHotkey: z.string().optional(),
|
||||
toggleOutputHotkey: z.string().optional(),
|
||||
volumes: z.record(z.string(), z.number()).optional(),
|
||||
const plugin: FastifyPluginAsyncTypebox = async (fastify) => {
|
||||
fastify.get(
|
||||
'/user',
|
||||
{
|
||||
schema: {
|
||||
summary: 'Get user',
|
||||
tags: ['User'],
|
||||
operationId: 'user.get',
|
||||
querystring: Type.Partial(Type.Object({
|
||||
username: Type.String(),
|
||||
})),
|
||||
response: {
|
||||
200: UserSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
async (req, reply) => {
|
||||
const user = await fastify.prisma.user.findFirst({
|
||||
where: { username: req.query.username },
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
displayName: true,
|
||||
createdAt: true,
|
||||
},
|
||||
})
|
||||
const input = schema.parse(req.body)
|
||||
|
||||
return prisma.userPreferences.upsert({
|
||||
where: { userId: req.user.id },
|
||||
if (!user) {
|
||||
return reply.notFound('User not found')
|
||||
}
|
||||
|
||||
return {
|
||||
...user,
|
||||
createdAt: user.createdAt.toISOString(),
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
fastify.get(
|
||||
'/user/preferences',
|
||||
{
|
||||
schema: {
|
||||
summary: 'Get preferences',
|
||||
tags: ['User'],
|
||||
operationId: 'user.getPreferences',
|
||||
response: {
|
||||
200: UserPreferencesSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
async (req, reply) => {
|
||||
const user = req.user!
|
||||
|
||||
const preferences = await fastify.prisma.userPreferences.upsert({
|
||||
where: { userId: user.id },
|
||||
create: { userId: user.id },
|
||||
update: {},
|
||||
})
|
||||
|
||||
if (!preferences) {
|
||||
return reply.notFound('User preferences not found')
|
||||
}
|
||||
|
||||
return {
|
||||
toggleInputHotkey: preferences.toggleInputHotkey || '',
|
||||
toggleOutputHotkey: preferences.toggleOutputHotkey || '',
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
fastify.patch(
|
||||
'/user/preferences',
|
||||
{
|
||||
schema: {
|
||||
summary: 'Update preferences',
|
||||
tags: ['User'],
|
||||
operationId: 'user.updatePreferences',
|
||||
body: UpdateUserPreferencesSchema,
|
||||
},
|
||||
},
|
||||
async (req) => {
|
||||
const user = req.user!
|
||||
|
||||
return fastify.prisma.userPreferences.upsert({
|
||||
where: { userId: user.id },
|
||||
create: {
|
||||
userId: req.user.id,
|
||||
...input,
|
||||
userId: user.id,
|
||||
...req.body,
|
||||
},
|
||||
update: input,
|
||||
update: req.body,
|
||||
})
|
||||
}
|
||||
catch (err) {
|
||||
fastify.log.error(err)
|
||||
reply.code(400)
|
||||
},
|
||||
)
|
||||
|
||||
if (err instanceof z.ZodError) {
|
||||
reply.send({ error: z.prettifyError(err) })
|
||||
}
|
||||
else {
|
||||
reply.send({ error: err.message })
|
||||
}
|
||||
}
|
||||
})
|
||||
fastify.patch(
|
||||
'/profile',
|
||||
{
|
||||
schema: {
|
||||
summary: 'Update profile',
|
||||
tags: ['User'],
|
||||
operationId: 'user.updateProfile',
|
||||
body: Type.Object({
|
||||
displayName: Type.String(),
|
||||
}),
|
||||
response: {
|
||||
200: UserSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
async (req, reply) => {
|
||||
const user = req.user!
|
||||
|
||||
fastify.patch('/profile', async (req, reply) => {
|
||||
if (!req.user) {
|
||||
reply.code(401).send(false)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const schema = z.object({
|
||||
displayName: z.string().optional(),
|
||||
})
|
||||
const input = schema.parse(req.body)
|
||||
|
||||
const updatedUser = prisma.user.update({
|
||||
where: { id: req.user.id },
|
||||
const updatedUser = await fastify.prisma.user.update({
|
||||
where: { id: user.id },
|
||||
data: {
|
||||
displayName: input.displayName,
|
||||
displayName: req.body.displayName,
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
displayName: true,
|
||||
createdAt: true,
|
||||
},
|
||||
})
|
||||
|
||||
const namespace: Namespace = fastify.io.of('/webrtc')
|
||||
const sockets = await namespace.fetchSockets()
|
||||
|
||||
const found = sockets.find(socket => socket.data.joined && socket.data.userId === req.user!.id)
|
||||
|
||||
if (found) {
|
||||
found.data.displayName = input.displayName
|
||||
namespace.emit('clientChanged', found.id, socketToClient(found))
|
||||
if (!updatedUser) {
|
||||
return reply.notFound('User not found')
|
||||
}
|
||||
|
||||
return updatedUser
|
||||
}
|
||||
catch (err) {
|
||||
fastify.log.error(err)
|
||||
reply.code(400)
|
||||
const response = {
|
||||
...updatedUser,
|
||||
createdAt: updatedUser.createdAt.toISOString(),
|
||||
}
|
||||
|
||||
if (err instanceof z.ZodError) {
|
||||
reply.send({ error: z.prettifyError(err) })
|
||||
}
|
||||
else {
|
||||
reply.send({ error: err.message })
|
||||
}
|
||||
}
|
||||
})
|
||||
fastify.bus.emit('user:profile-updated', response)
|
||||
|
||||
// TODO: подписаться в webrtc
|
||||
// const namespace: Namespace = fastify.io.of('/webrtc')
|
||||
// const sockets = await namespace.fetchSockets()
|
||||
//
|
||||
// const found = sockets.find(socket => socket.data.joined && socket.data.userId === req.user!.id)
|
||||
//
|
||||
// if (found) {
|
||||
// found.data.displayName = req.body.displayName
|
||||
// namespace.emit('clientChanged', found.id, socketToClient(found))
|
||||
// }
|
||||
|
||||
return response
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
export default plugin
|
||||
|
||||
Reference in New Issue
Block a user