feat: enhance user management with matricula retrieval and validation
- Updated user-related queries and mutations to retrieve the matricula from associated funcionario records, improving data accuracy. - Refactored user creation and listing functionalities to ensure matricula is correctly handled and displayed. - Enhanced error handling and validation for user operations, ensuring a more robust user management experience. - Improved the overall structure of user-related code for better maintainability and clarity.
This commit is contained in:
@@ -94,7 +94,9 @@ export const criarConversa = mutation({
|
||||
conversaId,
|
||||
remetenteId: usuarioAtual._id,
|
||||
titulo: "Adicionado a grupo",
|
||||
descricao: `Você foi adicionado ao grupo "${args.nome || "Sem nome"}" por ${usuarioAtual.nome}`,
|
||||
descricao: `Você foi adicionado ao grupo "${
|
||||
args.nome || "Sem nome"
|
||||
}" por ${usuarioAtual.nome}`,
|
||||
lida: false,
|
||||
criadaEm: Date.now(),
|
||||
});
|
||||
@@ -226,8 +228,9 @@ export const enviarMensagem = mutation({
|
||||
for (const participanteId of conversa.participantes) {
|
||||
// ✅ MODIFICADO: Permite notificação para si mesmo se flag estiver ativa
|
||||
const ehOMesmoUsuario = participanteId === usuarioAtual._id;
|
||||
const deveCriarNotificacao = !ehOMesmoUsuario || args.permitirNotificacaoParaSiMesmo;
|
||||
|
||||
const deveCriarNotificacao =
|
||||
!ehOMesmoUsuario || args.permitirNotificacaoParaSiMesmo;
|
||||
|
||||
if (deveCriarNotificacao) {
|
||||
const tipoNotificacao = args.mencoes?.includes(participanteId)
|
||||
? "mencao"
|
||||
@@ -318,7 +321,10 @@ export const cancelarMensagemAgendada = mutation({
|
||||
}
|
||||
|
||||
if (mensagem.remetenteId !== usuarioAtual._id) {
|
||||
return { sucesso: false, erro: "Você só pode cancelar suas próprias mensagens" };
|
||||
return {
|
||||
sucesso: false,
|
||||
erro: "Você só pode cancelar suas próprias mensagens",
|
||||
};
|
||||
}
|
||||
|
||||
if (!mensagem.agendadaPara) {
|
||||
@@ -611,16 +617,20 @@ export const listarConversas = query({
|
||||
// Para conversas individuais, pegar o outro usuário
|
||||
let outroUsuario = null;
|
||||
if (conversa.tipo === "individual") {
|
||||
const outroUsuarioRaw = participantes.find((p) => p?._id !== usuarioAtual._id);
|
||||
const outroUsuarioRaw = participantes.find(
|
||||
(p) => p?._id !== usuarioAtual._id
|
||||
);
|
||||
if (outroUsuarioRaw) {
|
||||
// 🔄 BUSCAR DADOS ATUALIZADOS DO USUÁRIO (não usar snapshot)
|
||||
const usuarioAtualizado = await ctx.db.get(outroUsuarioRaw._id);
|
||||
|
||||
|
||||
if (usuarioAtualizado) {
|
||||
// Adicionar URL da foto de perfil
|
||||
let fotoPerfilUrl = null;
|
||||
if (usuarioAtualizado.fotoPerfil) {
|
||||
fotoPerfilUrl = await ctx.storage.getUrl(usuarioAtualizado.fotoPerfil);
|
||||
fotoPerfilUrl = await ctx.storage.getUrl(
|
||||
usuarioAtualizado.fotoPerfil
|
||||
);
|
||||
}
|
||||
outroUsuario = {
|
||||
...usuarioAtualizado,
|
||||
@@ -643,7 +653,7 @@ export const listarConversas = query({
|
||||
.query("mensagens")
|
||||
.withIndex("by_conversa", (q) => q.eq("conversaId", conversa._id))
|
||||
.collect();
|
||||
|
||||
|
||||
const mensagens = todasMensagens.filter((m) => !m.agendadaPara);
|
||||
|
||||
let naoLidas = 0;
|
||||
@@ -756,7 +766,16 @@ export const obterMensagensAgendadas = query({
|
||||
*/
|
||||
export const listarAgendamentosChat = query({
|
||||
args: {},
|
||||
handler: async (ctx): Promise<Array<Doc<"mensagens"> & { conversaInfo: Doc<"conversas"> | null; destinatarioInfo: Doc<"usuarios"> | null }>> => {
|
||||
handler: async (
|
||||
ctx
|
||||
): Promise<
|
||||
Array<
|
||||
Doc<"mensagens"> & {
|
||||
conversaInfo: Doc<"conversas"> | null;
|
||||
destinatarioInfo: Doc<"usuarios"> | null;
|
||||
}
|
||||
>
|
||||
> => {
|
||||
const usuarioAtual = await getUsuarioAutenticado(ctx);
|
||||
if (!usuarioAtual) {
|
||||
return [];
|
||||
@@ -912,20 +931,31 @@ export const listarTodosUsuarios = query({
|
||||
.withIndex("by_ativo", (q) => q.eq("ativo", true))
|
||||
.collect();
|
||||
|
||||
// Excluir o usuário atual
|
||||
return usuarios
|
||||
.filter((u) => u._id !== usuarioAtual._id)
|
||||
.map((u) => ({
|
||||
_id: u._id,
|
||||
nome: u.nome,
|
||||
email: u.email,
|
||||
matricula: u.matricula,
|
||||
avatar: u.avatar,
|
||||
fotoPerfil: u.fotoPerfil,
|
||||
statusPresenca: u.statusPresenca,
|
||||
statusMensagem: u.statusMensagem,
|
||||
setor: u.setor,
|
||||
}));
|
||||
// Excluir o usuário atual e buscar matrículas
|
||||
const usuariosComMatricula = await Promise.all(
|
||||
usuarios
|
||||
.filter((u) => u._id !== usuarioAtual._id)
|
||||
.map(async (u) => {
|
||||
let matricula: string | undefined = undefined;
|
||||
if (u.funcionarioId) {
|
||||
const funcionario = await ctx.db.get(u.funcionarioId);
|
||||
matricula = funcionario?.matricula;
|
||||
}
|
||||
return {
|
||||
_id: u._id,
|
||||
nome: u.nome,
|
||||
email: u.email,
|
||||
matricula,
|
||||
avatar: u.avatar,
|
||||
fotoPerfil: u.fotoPerfil,
|
||||
statusPresenca: u.statusPresenca,
|
||||
statusMensagem: u.statusMensagem,
|
||||
setor: u.setor,
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
return usuariosComMatricula;
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user