Init
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -1,20 +1,48 @@
|
||||
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.messages = await response.json();
|
||||
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 = [];
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user