OwlCyberSecurity - MANAGER
Edit File: .bash_history
node --no-experimental-fetch index.mjs #1750745133 node --no-experimental-fetch index.mjs #1750745704 node --no-experimental-fetch index.mjs #1750745966 node --no-experimental-fetch index.mjs #1750746204 node --no-experimental-fetch index.mjs #1750746418 node --no-experimental-fetch index.mjs #1750746897 node --no-experimental-fetch index.mjs #1750748578 cd ~/backend #1750748599 node --no-experimental-fetch index.mjs #1750749018 node --no-experimental-fetch index.mjs #1750749053 node --no-experimental-fetch index.mjs #1750749326 node --no-experimental-fetch index.mjs #1750749527 node --no-experimental-fetch index.mjs #1750749543 node --no-experimental-fetch index.mjs #1750749702 node --no-experimental-fetch index.mjs #1750749843 node --no-experimental-fetch index.mjs #1750749998 node --no-experimental-fetch index.mjs #1750750034 node --no-experimental-fetch index.mjs #1750750194 node --no-experimental-fetch index.mjs #1750750297 node --no-experimental-fetch index.mjs #1750750375 node --no-experimental-fetch index.mjs #1750750382 node --no-experimental-fetch index.mjs #1750750780 node --no-experimental-fetch index.mjs #1750750875 node --no-experimental-fetch index.mjs #1750751495 node --no-experimental-fetch index.mjs #1750751672 node --no-experimental-fetch index.mjs #1750751733 pm2 restart all #1750751941 pm2 start index.mjs #1750751984 pm2 restart index.mjs #1750780035 cd ~/nodeapps/backend #1750780046 node --no-experimental-fetch app.js #1750780057 pm2 save #1750780068 pm2 restart app.js #1750781500 node --no-experimental-fetch app.js #1750781510 pm2 save #1750781515 pm2 restart app.js #1750785887 node --no-experimental-fetch app.js #1750785895 pm2 save #1750785899 pm2 restart app.js #1751357265 cd ~/Leavebackend #1751357286 cd ~/backend #1751357297 pm2 restart index.mjs #1751441070 cd ~/backend #1751441075 pm2 restart index.mjs #1751441302 pm2 start index.mjs #1751441321 pm2 start backend #1751443080 pm2 start backend #1751443126 node --no-experimental-fetch index.mjs #1751443607 node --no-experimental-fetch index.mjs #1751443739 node --no-experimental-fetch index.mjs #1751443937 node --no-experimental-fetch index.mjs #1751444098 node --no-experimental-fetch index.mjs #1751444156 node --no-experimental-fetch index.mjs #1751444655 node --no-experimental-fetch index.mjs #1751445918 cd ~/backend #1751445945 pm2 restart backend #1751446304 cd ~/backend #1751446315 pm2 restart #1751446321 pm2 restart backend #1751446502 pm2 list #1751446539 pm2 logs backend #1751446629 pm2 logs index #1751446694 pm2 logs LeaveManagementSystem #1751446806 pm2 restart index #1751446839 pm2 logs index #1751447688 pm2 logs index #1751448012 nano controllers/authController.mjs #1751448147 grep db.execute controllers/authController.mjs #1751448203 pm2 delete index #1751448233 pm2 delete LeaveManagementSystem #1751448259 pm2 start index.mjs --name index #1751448280 pm2 save #1751448296 pm2 logs index #1751448904 pm2 logs index #1751448928 pm2 restart index.mjs #1751449190 cd ~/backend #1751449203 pm2 restart index.mjs #1751464423 cd ~/backend #1751464436 pm2 restart index.mjs #1751464813 pm2 restart index.mjs #1751464823 pm2 logs #1751465094 pm2 restart index.mjs #1751465094 pm2 logs #1751465386 pm2 restart index.mjs --update-env #1751465394 pm2 flush #1751465408 pm2 logs #1751465549 pm2 restart index.mjs #1751465557 pm2 logs #1751473621 cd ~backend #1751473629 cd ~/backend #1751473640 pm2 restart index.mjs #1751531863 cd ~/backend #1751531887 useEffect(() => { #1751531887 const loadAdmin = async () => { #1751531887 try { #1751531888 const empNo = await AsyncStorage.getItem('empNo'); #1751531888 const token = await AsyncStorage.getItem('token'); #1751531888 setAdminName('Admin'); #1751531888 return; #1751531888 } #1751531888 const res = await axios.get(`http://testtwo.onebox.pk:2001/api/employees/${empNo}`, { #1751531888 headers: { Authorization: `Bearer ${token}` }, #1751531888 }); #1751531888 setAdminName(res.data.EmployeeName || 'Admin'); #1751531888 } catch (err) { #1751531888 console.error('❌ Failed to load admin name:', err); #1751531888 setAdminName('Admin'); #1751531888 } #1751531888 }; #1751531888 loadAdmin(); #1751531888 fetchLeaves(); #1751531888 }, []); #1751531888 useFocusEffect( #1751531888 React.useCallback(() => { #1751531888 fetchLeaves(); #1751531888 }, []) #1751531888 ); #1751531888 useFocusEffect( #1751531888 React.useCallback(() => { #1751531888 if (selectedMenu === 'Leaves') { #1751531888 fetchLeaves(); #1751531888 } else if (selectedMenu === 'Employee') { #1751531888 fetchEmployees(); #1751531888 } else if (selectedMenu === 'YearlyLeave') { #1751531888 fetchYearlyLeaves(); #1751531888 } #1751531888 }, [selectedMenu]) #1751531888 ); #1751531888 const fetchLeaves = async () => { #1751531888 try { #1751531888 const token = await AsyncStorage.getItem('token'); #1751531888 const res = await axios.get('http://testtwo.onebox.pk:2001/api/leaves', { #1751531888 headers: { Authorization: `Bearer ${token}` }, #1751531888 }); #1751531888 setLeaveData(res.data); #1751531888 } catch (err) { #1751531888 console.error('Failed to load leaves:', err); #1751531888 } #1751531888 }; #1751531888 const fetchEmployees = async () => { #1751531888 try { #1751531888 const token = await AsyncStorage.getItem('token'); #1751531888 const res = await axios.get('http://testtwo.onebox.pk:2001/api/employees', { #1751531888 headers: { Authorization: `Bearer ${token}` }, #1751531889 }); #1751531889 setEmployeeData(res.data); #1751531889 } catch (err) { #1751531889 console.error('Failed to load employees:', err); #1751531889 } #1751531889 }; #1751531889 const fetchYearlyLeaves = async () => { #1751531889 try { #1751531889 const token = await AsyncStorage.getItem('token'); #1751531889 const res = await axios.get('http://testtwo.onebox.pk:2001/api/yearlyleave', { #1751531889 headers: { Authorization: `Bearer ${token}` }, #1751531889 }); #1751531889 setYearlyLeaveData(res.data); #1751531889 } catch (err) { #1751531889 console.error('Failed to load yearly leaves:', err); #1751531889 } #1751531889 }; #1751531889 const handleLogout = async () => { #1751531889 await AsyncStorage.clear(); #1751531889 navigation.reset({ index: 0, routes: [{ name: 'Login' }] }); #1751531889 }; #1751531889 const handleDelete = async (id) => { #1751531889 Alert.alert('Confirm', 'Are you sure you want to delete this leave?', [ #1751531889 { text: 'Cancel' },; { text: 'Delete',; onPress: async () => { #1751531889 try { #1751531889 const token = await AsyncStorage.getItem('token'); #1751531889 await axios.delete(`http://testtwo.onebox.pk:2001/api/leaves/${id}`, { #1751531889 headers: { Authorization: `Bearer ${token}` }, #1751531889 }); #1751531889 fetchLeaves(); #1751531889 } catch (err) { #1751531889 Alert.alert('Error', 'Failed to delete leave'); #1751531889 } #1751531889 } #1751531889 } #1751531889 ]); #1751531889 }; #1751531889 // ✅ SAFE RENDERING SECTION #1751531889 return ( #1751531889 <View style={styles.container}> #1751531889 {/* Header */} #1751531889 <View style={styles.header}> #1751531889 <Image #1751531889 source={require('../assets/images.png')} #1751531889 style={styles.logo} #1751531889 resizeMode="contain" #1751531889 /> #1751531889 <Text style={styles.welcome}>Welcome, {adminName}</Text> #1751531889 <TouchableOpacity onPress={handleLogout}> #1751531889 <Text style={styles.logout}>🚪 Logout</Text> #1751531889 </TouchableOpacity> #1751531889 </View> #1751531889 {/* Menu */} #1751531889 <View style={styles.menu}> #1751531889 {menuOptions.map((item) => ( #1751531889 <TouchableOpacity #1751531889 key={item} #1751531889 onPress={() => setSelectedMenu(item)} #1751531889 style={[ #1751531889 styles.menuItem, #1751531889 selectedMenu === item && styles.selectedMenuItem #1751531890 ]} #1751531890 > #1751531890 <Text #1751531890 style={[ #1751531890 styles.menuText, #1751531890 selectedMenu === item && styles.selectedMenuText #1751531890 ]} #1751531890 > #1751531890 {item} #1751531890 </Text> #1751531890 </TouchableOpacity> #1751531890 ))} #1751531890 </View> #1751531890 {/* Content */} #1751531890 <ScrollView contentContainerStyle={styles.content}> #1751531890 {selectedMenu === 'Leaves' && ( <View> #1751531890 <Text style={styles.sectionTitle}>📋 Leave Requests</Text> #1751531890 {Array.isArray(leaveData) && leaveData.map((leave) => ( #1751531890 <View key={leave.LeaveID} style={styles.card}> #1751531890 <Text>🆔 {leave.LeaveID}</Text> #1751531890 <Text>👤 {leave.EmployeeName}</Text> #1751531890 <Text>📅 {leave.LeaveDate}</Text> #1751531890 <Text>📝 {leave.LeavePurpose}</Text> #1751531890 <Text>Status: {leave.LeaveStatus}</Text> #1751531890 <View style={styles.actions}> #1751531890 <TouchableOpacity #1751531890 style={styles.editBtn} #1751531890 onPress={() => navigation.navigate('EditLeave', { leave })} #1751531890 > #1751531890 <Text style={{ color: 'blue' }}>✏️ Edit</Text> #1751531890 </TouchableOpacity> #1751531890 <TouchableOpacity onPress={() => handleDelete(leave.LeaveID)}> #1751531890 <Text style={[styles.actionButton, { color: 'red' }]}>🗑️ Delete</Text> #1751531890 </TouchableOpacity> #1751531890 </View> #1751531890 </View> #1751531890 ))} #1751531890 </View> #1751531890 )} #1751531890 {selectedMenu === 'Employee' && ( <View> #1751531890 <Text style={styles.sectionTitle}>👥 Employee Records</Text> #1751531890 <TouchableOpacity #1751531890 style={[styles.addBtn, { marginBottom: 10 }]} #1751531890 onPress={() => navigation.navigate('AddEmployee')} #1751531890 > #1751531890 <Text style={{ color: 'blue', fontWeight: 'bold' }}>➕ Add New Employee</Text> #1751531890 </TouchableOpacity> #1751531890 {Array.isArray(employeeData) && employeeData.map((emp) => ( #1751531890 <View key={emp.EmployeeId} style={styles.card}> #1751531890 <Text>🆔 ID: {emp.EmployeeId}</Text> #1751531890 <Text>👤 Name: {emp.EmployeeName}</Text> #1751531890 <Text>🆔 Emp No: {emp.EmpNo}</Text> #1751531890 <Text>🛡️ Role: {emp.role}</Text> #1751531890 <Text>🔒 Password: {emp.password}</Text> #1751531890 </View> #1751531890 ))} #1751531890 </View> #1751531890 )} #1751531890 {selectedMenu === 'YearlyLeave' && ( <View> #1751531890 <Text style={styles.sectionTitle}>📅 Yearly Leave Summary</Text> #1751531890 {Array.isArray(yearlyLeaveData) && yearlyLeaveData.length === 0 ? ( #1751531890 <Text>No records found.</Text> #1751531890 ) : ( #1751531890 yearlyLeaveData.map((item) => ( #1751531890 <View key={item.yearlyLeaveID} style={styles.card}> #1751531890 <Text>🆔 ID: {item.yearlyLeaveID}</Text> #1751531890 <Text>👤 Employee ID: {item.EmployeeId}</Text> #1751531890 <Text>🪪 Leave ID: {item.LeaveID}</Text> #1751531890 <Text>📅 Start: {item.startDate}</Text> #1751531890 <Text>📅 End: {item.endDate}</Text> #1751531890 <Text>🗓️ Duty Period: {item.periodOfDuty}</Text> #1751531890 <Text>🧮 At Credit: {item.leaveAtCredit}</Text> #1751531890 <Text>✅ Availed: {item.leaveAvailed}</Text> #1751531890 <Text>🔁 Balance: {item.balanceLeave}</Text> #1751531890 <Text>📝 Remarks: {item.remarks}</Text> #1751531890 </View> #1751531890 )) #1751531890 )} #1751531890 </View> #1751531890 )} #1751531890 </ScrollView> #1751531890 </View> #1751531890 ); #1751531911 }useEffect(() => { #1751531911 const loadAdmin = async () => { #1751531911 try { #1751531911 const empNo = await AsyncStorage.getItem('empNo'); #1751531911 const token = await AsyncStorage.getItem('token'); #1751531911 setAdminName('Admin'); #1751531911 return; #1751531911 } #1751531911 const res = await axios.get(`http://testtwo.onebox.pk:2001/api/employees/${empNo}`, { #1751531911 headers: { Authorization: `Bearer ${token}` }, #1751531911 }); #1751531911 setAdminName(res.data.EmployeeName || 'Admin'); #1751531911 } catch (err) { #1751531911 console.error('❌ Failed to load admin name:', err); #1751531911 setAdminName('Admin'); #1751531911 } #1751531911 }; #1751531911 loadAdmin(); #1751531911 fetchLeaves(); #1751531911 }, []); #1751531911 useFocusEffect( #1751531911 React.useCallback(() => { #1751531911 fetchLeaves(); #1751531911 }, []) #1751531911 ); #1751531911 useFocusEffect( #1751531911 React.useCallback(() => { #1751531911 if (selectedMenu === 'Leaves') { #1751531911 fetchLeaves(); #1751531911 } else if (selectedMenu === 'Employee') { #1751531911 fetchEmployees(); #1751531911 } else if (selectedMenu === 'YearlyLeave') { #1751531911 fetchYearlyLeaves(); #1751531911 } #1751531911 }, [selectedMenu]) #1751531911 ); #1751531911 const fetchLeaves = async () => { #1751531911 try { #1751531911 const token = await AsyncStorage.getItem('token'); #1751531911 const res = await axios.get('http://testtwo.onebox.pk:2001/api/leaves', { #1751531911 headers: { Authorization: `Bearer ${token}` }, #1751531912 }); #1751531912 setLeaveData(res.data); #1751531912 } catch (err) { #1751531912 console.error('Failed to load leaves:', err); #1751531912 } #1751531912 }; #1751531912 const fetchEmployees = async () => { #1751531912 try { #1751531912 const token = await AsyncStorage.getItem('token'); #1751531912 const res = await axios.get('http://testtwo.onebox.pk:2001/api/employees', { #1751531912 headers: { Authorization: `Bearer ${token}` }, #1751531912 }); #1751531912 setEmployeeData(res.data); #1751531912 } catch (err) { #1751531912 console.error('Failed to load employees:', err); #1751531912 } #1751531912 }; #1751531912 const fetchYearlyLeaves = async () => { #1751531912 try { #1751531912 const token = await AsyncStorage.getItem('token'); #1751531912 const res = await axios.get('http://testtwo.onebox.pk:2001/api/yearlyleave', { #1751531912 headers: { Authorization: `Bearer ${token}` }, #1751531912 }); #1751531912 setYearlyLeaveData(res.data); #1751531912 } catch (err) { #1751531912 console.error('Failed to load yearly leaves:', err); #1751531912 } #1751531912 }; #1751531912 const handleLogout = async () => { #1751531912 await AsyncStorage.clear(); #1751531912 navigation.reset({ index: 0, routes: [{ name: 'Login' }] }); #1751531912 }; #1751531912 const handleDelete = async (id) => { #1751531912 Alert.alert('Confirm', 'Are you sure you want to delete this leave?', [ #1751531912 { text: 'Cancel' },; { text: 'Delete',; onPress: async () => { #1751531912 try { #1751531912 const token = await AsyncStorage.getItem('token'); #1751531912 await axios.delete(`http://testtwo.onebox.pk:2001/api/leaves/${id}`, { #1751531912 headers: { Authorization: `Bearer ${token}` }, #1751531913 }); #1751531913 fetchLeaves(); #1751531913 } catch (err) { #1751531913 Alert.alert('Error', 'Failed to delete leave'); #1751531913 } #1751531913 } #1751531913 } #1751531913 ]); #1751531913 }; #1751531913 // ✅ SAFE RENDERING SECTION #1751531913 return ( #1751531913 <View style={styles.container}> #1751531913 {/* Header */} #1751531913 <View style={styles.header}> #1751531913 <Image #1751531913 source={require('../assets/images.png')} #1751531913 style={styles.logo} #1751531913 resizeMode="contain" #1751531913 /> #1751531913 <Text style={styles.welcome}>Welcome, {adminName}</Text> #1751531913 <TouchableOpacity onPress={handleLogout}> #1751531913 <Text style={styles.logout}>🚪 Logout</Text> #1751531913 </TouchableOpacity> #1751531913 </View> #1751531913 {/* Menu */} #1751531913 <View style={styles.menu}> #1751531913 {menuOptions.map((item) => ( #1751531913 <TouchableOpacity #1751531913 key={item} #1751531913 onPress={() => setSelectedMenu(item)} #1751531913 style={[ #1751531913 styles.menuItem, #1751531913 selectedMenu === item && styles.selectedMenuItem #1751531913 ]} #1751531913 > #1751531913 <Text #1751531913 style={[ #1751531913 styles.menuText, #1751531913 selectedMenu === item && styles.selectedMenuText #1751531913 ]} #1751531913 > #1751531913 {item} #1751531914 </Text> #1751531914 </TouchableOpacity> #1751531914 ))} #1751531914 </View> #1751531914 {/* Content */} #1751531914 <ScrollView contentContainerStyle={styles.content}> #1751531914 {selectedMenu === 'Leaves' && ( <View> #1751531914 <Text style={styles.sectionTitle}>📋 Leave Requests</Text> #1751531914 {Array.isArray(leaveData) && leaveData.map((leave) => ( #1751531914 <View key={leave.LeaveID} style={styles.card}> #1751531914 <Text>🆔 {leave.LeaveID}</Text> #1751531914 <Text>👤 {leave.EmployeeName}</Text> #1751531914 <Text>📅 {leave.LeaveDate}</Text> #1751531914 <Text>📝 {leave.LeavePurpose}</Text> #1751531914 <Text>Status: {leave.LeaveStatus}</Text> #1751531914 <View style={styles.actions}> #1751531914 <TouchableOpacity #1751531914 style={styles.editBtn} #1751531914 onPress={() => navigation.navigate('EditLeave', { leave })} #1751531914 > #1751531914 <Text style={{ color: 'blue' }}>✏️ Edit</Text> #1751531914 </TouchableOpacity> #1751531914 <TouchableOpacity onPress={() => handleDelete(leave.LeaveID)}> #1751531914 <Text style={[styles.actionButton, { color: 'red' }]}>🗑️ Delete</Text> #1751531914 </TouchableOpacity> #1751531914 </View> #1751531914 </View> #1751531914 ))} #1751531914 </View> #1751531914 )} #1751531914 {selectedMenu === 'Employee' && ( <View> #1751531914 <Text style={styles.sectionTitle}>👥 Employee Records</Text> #1751531914 <TouchableOpacity #1751531914 style={[styles.addBtn, { marginBottom: 10 }]} #1751531914 onPress={() => navigation.navigate('AddEmployee')} #1751531914 > #1751531914 <Text style={{ color: 'blue', fontWeight: 'bold' }}>➕ Add New Employee</Text> #1751531914 </TouchableOpacity> #1751531914 {Array.isArray(employeeData) && employeeData.map((emp) => ( #1751531914 <View key={emp.EmployeeId} style={styles.card}> #1751531914 <Text>🆔 ID: {emp.EmployeeId}</Text> #1751531914 <Text>👤 Name: {emp.EmployeeName}</Text> #1751531914 <Text>🆔 Emp No: {emp.EmpNo}</Text> #1751531914 <Text>🛡️ Role: {emp.role}</Text> #1751531914 <Text>🔒 Password: {emp.password}</Text> #1751531914 </View> #1751531914 ))} #1751531914 </View> #1751531914 )} #1751531914 {selectedMenu === 'YearlyLeave' && ( <View> #1751531914 <Text style={styles.sectionTitle}>📅 Yearly Leave Summary</Text> #1751531914 {Array.isArray(yearlyLeaveData) && yearlyLeaveData.length === 0 ? ( #1751531914 <Text>No records found.</Text> #1751531914 ) : ( #1751531914 yearlyLeaveData.map((item) => ( #1751531914 <View key={item.yearlyLeaveID} style={styles.card}> #1751531914 <Text>🆔 ID: {item.yearlyLeaveID}</Text> #1751531914 <Text>👤 Employee ID: {item.EmployeeId}</Text> #1751531914 <Text>🪪 Leave ID: {item.LeaveID}</Text> #1751531914 <Text>📅 Start: {item.startDate}</Text> #1751531914 <Text>📅 End: {item.endDate}</Text> #1751531914 <Text>🗓️ Duty Period: {item.periodOfDuty}</Text> #1751531914 <Text>🧮 At Credit: {item.leaveAtCredit}</Text> #1751531914 <Text>✅ Availed: {item.leaveAvailed}</Text> #1751531914 <Text>🔁 Balance: {item.balanceLeave}</Text> #1751531914 <Text>📝 Remarks: {item.remarks}</Text> #1751531914 </View> #1751531914 )) #1751531914 )} #1751531914 </View> #1751531914 )} #1751531914 </ScrollView> #1751531914 </View> #1751531914 ); #1751531957 pm2 restart index.mjs #1751547315 cd ~/backend #1751547323 pm2 restart index.mjs #1751552193 cd ~/backend #1751552200 pm2 restart index.mjs #1751873594 cd ~/backend #1751873603 pm2 restart index.mjs #1751875766 node --no-experimental-fetch index.mjs #1751877348 cd ~/backend #1751877358 pm2 restart index.mjs #1751966268 cd ~/backend #1751966275 pm2 restart index.mjs #1751967198 node --no-experimental-fetch index.mjs #1751967480 node --no-experimental-fetch index.mjs #1751968273 node --no-experimental-fetch index.mjs #1751968670 node --no-experimental-fetch index.mjs