This commit is contained in:
2026-07-04 13:19:56 +02:00
parent dc738a9d29
commit 54d1169888
4 changed files with 70 additions and 39 deletions
+30 -28
View File
@@ -1,35 +1,37 @@
<script lang="ts" setup>
import {ref} from 'vue'
import {onMounted, ref} from 'vue';
import {useRoute} from 'vue-router';
import {storeToRefs} from 'pinia'; // Import crucial
import {useMessageStore} from '@/stores/message';
// Exemple de données (à remplacer par vos données Pinia/API)
const messages = ref([
{
id: 1,
user: {name: 'Utilisateur 1', avatar: 'https://cdn.vuetifyjs.com/images/lists/1.jpg'},
content: 'Salut ! Comment ça va ?',
timestamp: 'Aujourd\'hui à 12:00'
},
{
id: 2,
user: {name: 'Utilisateur 2', avatar: 'https://cdn.vuetifyjs.com/images/lists/2.jpg'},
content: 'Je vais très bien, merci ! Et toi ?',
timestamp: 'Aujourd\'hui à 12:01'
const route = useRoute();
const messageStore = useMessageStore();
// "messages" ici est une référence réactive liée au store
const {messages, loading} = storeToRefs(messageStore);
const newMessage = ref('');
const sendMessage = async () => {
if (!newMessage.value.trim()) return;
const content = newMessage.value;
const channelId = route.params.id as string;
try {
await messageStore.sendMessage(channelId, content);
newMessage.value = ''; // On vide le champ après succès
} catch (e) {
// Gérer l'erreur (ex: notification toast)
}
])
};
const newMessage = ref('')
const sendMessage = () => {
if (!newMessage.value.trim()) return
// Logique d'envoi ici
messages.value.push({
id: Date.now(),
user: {name: 'Moi', avatar: ''},
content: newMessage.value,
timestamp: 'À l\'instant'
})
newMessage.value = ''
}
onMounted(() => {
const channelId = route.params.id as string;
if (channelId) {
messageStore.fetchMessages(channelId);
}
});
</script>
<template>
+33 -5
View File
@@ -1,17 +1,45 @@
import {defineStore} from "pinia";
import {useApi} from "@/composables/useApi.ts";
interface Message {
id: string;
content: string;
user: { name: string; avatar: string };
timestamp: string;
}
export const useMessageStore = defineStore("message", {
state: () => ({
messages: []
messages: [] as Message[],
loading: false,
}),
actions: {
async fetchMessages(channel_id: string) {
// todo : ici, les messages ne doivent pas être tous récupérés. Un filtre doit être appliqué.
// pour ne récupérer que les messages du channel actif
let api = useApi();
let response = await api.get("/api/messages");
this.loading = true;
try {
const api = useApi();
// Utilisation du paramètre pour cibler le channel
const response = await api.get(`/api/messages/${channel_id}`);
this.messages = await response.json();
} catch (error) {
console.error("Erreur lors du chargement des messages:", error);
} finally {
this.loading = false;
}
},
async sendMessage(channelId: string, content: string) {
const api = useApi();
try {
// Envoi au serveur pour persistance
const response = await api.post(`/api/messages/${channelId}`, {content});
const newMessage = await response.json();
// Ajout local immédiat (optimistic update)
this.messages.push(newMessage);
} catch (error) {
console.error("Erreur lors de l'envoi du message:", error);
throw error;
}
},
reset() {
this.messages = [];
+3 -3
View File
@@ -8,7 +8,7 @@ use axum::{
use axum_extra::extract::CookieJar;
use std::sync::Arc;
use std::time::Instant;
use tracing::{info, Instrument};
use tracing::{debug, info, Instrument};
use uuid::Uuid;
use super::context::{CurrentUser, RequestContext};
@@ -92,7 +92,7 @@ pub async fn auth_middleware(
mut req: Request<Body>,
next: Next,
) -> Response {
// Extraction du JWT : d'abord via le header Authorization, sinon via la query string "token"
// Extraction du JWT : d'abord via le header Authorization, ou via le cookie, sinon via la query string "token"
let token = req
.headers()
.get(header::AUTHORIZATION)
@@ -132,7 +132,7 @@ pub async fn auth_middleware(
// Mise à jour du RequestContext existant
if let Some(user) = &user {
info!(user_id = %user.id, username = %user.username, "User identified");
debug!(user_id = %user.id, username = %user.username, "User identified");
if let Some(ctx) = req.extensions_mut().get_mut::<RequestContext>() {
ctx.user = Some(user.clone());
}
+2 -1
View File
@@ -9,7 +9,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter(
std::env::var("RUST_LOG")
.unwrap_or_else(|_| "info,sqlx=debug,sea_orm=debug,sea_orm_migration=info".into()),
// .unwrap_or_else(|_| "info,sqlx=debug,sea_orm=debug,sea_orm_migration=info".into()),
.unwrap_or_else(|_| "info,sqlx=info,sea_orm=info,sea_orm_migration=info".into()),
)
.with_target(true)
.with_level(true)