diff --git a/Dilomarkt/dilomarkt-api/app/Http/Controllers/MessageController.php b/Dilomarkt/dilomarkt-api/app/Http/Controllers/MessageController.php new file mode 100644 index 0000000..deaa6e1 --- /dev/null +++ b/Dilomarkt/dilomarkt-api/app/Http/Controllers/MessageController.php @@ -0,0 +1,29 @@ +product_id) + ->where('buyer_id', $request->buyer_id) + ->orderBy('created_at') + ->get(); + return response()->json($messages); + } + + public function store(Request $request) + { + $msg = Message::create($request->validate([ + 'product_id' => 'required|exists:products,id', + 'provider_id' => 'required|exists:providers,id', + 'buyer_id' => 'required|integer', + 'sender' => 'required|in:buyer,seller', + 'body' => 'required|string|max:1000', + ])); + return response()->json($msg, 201); + } +} \ No newline at end of file diff --git a/Dilomarkt/dilomarkt-api/app/Models/Message.php b/Dilomarkt/dilomarkt-api/app/Models/Message.php new file mode 100644 index 0000000..61d38ff --- /dev/null +++ b/Dilomarkt/dilomarkt-api/app/Models/Message.php @@ -0,0 +1,9 @@ +id(); + $table->foreignId('product_id')->constrained()->cascadeOnDelete(); + $table->foreignId('provider_id')->constrained()->cascadeOnDelete(); + $table->unsignedBigInteger('buyer_id'); + $table->enum('sender', ['buyer', 'seller']); + $table->text('body'); + $table->timestamps(); + }); + } + + public function down(): void { + Schema::dropIfExists('messages'); + } +}; \ No newline at end of file diff --git a/Dilomarkt/dilomarkt-api/routes/api.php b/Dilomarkt/dilomarkt-api/routes/api.php index 9d74c4c..e0d0dd6 100644 --- a/Dilomarkt/dilomarkt-api/routes/api.php +++ b/Dilomarkt/dilomarkt-api/routes/api.php @@ -2,8 +2,11 @@ use Illuminate\Support\Facades\Route; use App\Http\Controllers\ProductController; use App\Http\Controllers\ProviderController; +use App\Http\Controllers\MessageController; Route::get('/products', [ProductController::class, 'index']); Route::get('/products/{id}', [ProductController::class, 'show']); Route::get('/providers', [ProviderController::class, 'index']); Route::get('/providers/{id}', [ProviderController::class, 'show']); +Route::get('/messages', [MessageController::class, 'index']); +Route::post('/messages', [MessageController::class, 'store']); diff --git a/Dilomarkt/src/api.js b/Dilomarkt/src/api.js index eade735..0ca28cf 100644 --- a/Dilomarkt/src/api.js +++ b/Dilomarkt/src/api.js @@ -24,3 +24,19 @@ export async function fetchProvider(id) { if (!res.ok) throw new Error('Anbieter nicht gefunden') return res.json() } + +export async function fetchMessages(productId, buyerId) { + const res = await fetch(`${BASE}/messages?product_id=${productId}&buyer_id=${buyerId}`) + if (!res.ok) throw new Error('Fehler beim Laden der Nachrichten') + return res.json() +} + +export async function sendMessage(payload) { + const res = await fetch(`${BASE}/messages`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }) + if (!res.ok) throw new Error('Nachricht konnte nicht gesendet werden') + return res.json() +} diff --git a/Dilomarkt/src/views/ChatModal.vue b/Dilomarkt/src/views/ChatModal.vue new file mode 100644 index 0000000..9aeb8d2 --- /dev/null +++ b/Dilomarkt/src/views/ChatModal.vue @@ -0,0 +1,123 @@ + + + + + + + \ No newline at end of file diff --git a/Dilomarkt/src/views/ProductView.vue b/Dilomarkt/src/views/ProductView.vue index 6ad2382..449e04e 100644 --- a/Dilomarkt/src/views/ProductView.vue +++ b/Dilomarkt/src/views/ProductView.vue @@ -24,6 +24,13 @@
@@ -54,6 +61,10 @@ const router = useRouter() const product = ref(null) const alternatives = ref([]) const loading = ref(true) + +import ChatModal from '@/views/ChatModal.vue' +const chatOpen = ref(false) + const error = ref('') onMounted(async () => {