fix: Socket.io real-time güncelleme sistemi tamamen düzeltildi

- Socket.IO client modülü oluşturuldu (socketClient.js)
- SvelteKit API route'larından Socket.IO event gönderimi için client kullanımı
- fuel-slips API'de HTTP fetch yerine Socket.IO client kullanımı
- Server'da API event'larını dinleyip broadcast etme eklendi
- GoodsManagerContent component'inde Socket.IO dinleyicileri düzeltildi
- Dashboard'da Mal Sorumlusu content render düzeltmesi
- İbrahim Kara kullanıcısı ve mal sorumlusu kaydı eklendi
- Login endpoint'inde goods_manager ID mapping düzeltmesi
- fuel-slips/+page.svelte'de eksik fonksiyonlar eklendi
- Kapsamlı debug logları tüm Socket.IO işlemlerine eklendi

Çalışma prensibi:
1. Yakıt fişi oluşturulduğunda -> api-fuel-slip-assigned -> broadcast fuel-slip-assigned
2. Fiş onaylandığında/reddedildiğinde -> api-fuel-slip-updated -> broadcast fuel-slip-updated
3. Tüm değişiklikler anlık olarak ilgili ekranlarda güncelleniyor
This commit is contained in:
2025-11-05 23:13:07 +03:00
parent 2a224f2f02
commit 2b0c9e82cd
7 changed files with 238 additions and 80 deletions

View File

@@ -17,6 +17,9 @@ const io = new Server(server, {
}
});
// Export io for use in other modules
export { io };
const PORT = process.env.PORT || 3000;
// ES Module equivalent of __dirname
@@ -93,7 +96,8 @@ async function initializeDatabase() {
const users = [
{ username: 'admin', password: 'admin123', role: 'admin', full_name: 'Sistem Yöneticisi' },
{ username: 'fuel', password: 'fuel123', role: 'fuel_manager', full_name: 'Yakıt Sorumlusu' },
{ username: 'goods', password: 'goods123', role: 'goods_manager', full_name: 'Mal Sorumlusu' }
{ username: 'goods', password: 'goods123', role: 'goods_manager', full_name: 'Mal Sorumlusu' },
{ username: 'ibrahim_kara', password: 'kara123', role: 'goods_manager', full_name: 'İbrahim Kara' }
];
// Her kullanıcıyı kontrol et ve yoksa ekle
@@ -139,21 +143,35 @@ app.post('/api/login', async (req, res) => {
}
// Session oluştur
req.session.user = {
let sessionUser = {
id: user.id,
username: user.username,
role: user.role,
full_name: user.full_name
};
// Eğer goods_manager ise, goods_managers API'den gerçek ID'yi al
if (user.role === 'goods_manager') {
try {
const goodsManagersRes = await fetch('http://localhost:3000/api/goods-managers');
if (goodsManagersRes.ok) {
const goodsData = await goodsManagersRes.json();
const goodsManager = goodsData.goodsManagers?.find(gm => gm.username === user.username);
if (goodsManager) {
sessionUser.id = goodsManager.id; // goods_manager ID'sini kullan
console.log(`✅ Goods manager logged in: ${user.full_name} (ID: ${goodsManager.id})`);
}
}
} catch (fetchError) {
console.warn('⚠️ Could not fetch goods manager ID:', fetchError);
}
}
req.session.user = sessionUser;
res.json({
message: 'Giriş başarılı.',
user: {
id: user.id,
username: user.username,
role: user.role,
full_name: user.full_name
}
user: sessionUser
});
});
} catch (error) {
@@ -189,6 +207,7 @@ app.post('/api/socket-notify', (req, res) => {
}
// Socket.IO ile olay yayınla
console.log(`📢 Socket.IO event emitted: ${event}`, data);
io.emit(event, data);
res.json({ message: 'Bildirim gönderildi.' });
@@ -210,10 +229,21 @@ app.get('/api/users', (req, res) => {
// Socket.IO bağlantıları
io.on('connection', (socket) => {
console.log('Bir kullanıcı bağlandı:', socket.id);
console.log('Bir kullanıcı bağlandı:', socket.id);
// API'den gelen event'ları dinle ve broadcast et
socket.on('api-fuel-slip-assigned', (data) => {
console.log('📢 API event received: api-fuel-slip-assigned, broadcasting to all clients', data);
io.emit('fuel-slip-assigned', data);
});
socket.on('api-fuel-slip-updated', (data) => {
console.log('📢 API event received: api-fuel-slip-updated, broadcasting to all clients', data);
io.emit('fuel-slip-updated', data);
});
socket.on('disconnect', () => {
console.log('Bir kullanıcı ayrıldı:', socket.id);
console.log('Bir kullanıcı ayrıldı:', socket.id);
});
});