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:
2025-11-04 14:37:28 -03:00
parent d0692c3608
commit fbec5c46c2
10 changed files with 1250 additions and 587 deletions

View File

@@ -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;
},
});