add attendance

This commit is contained in:
tylen 2025-11-02 01:15:02 +02:00
parent 9a192c9b61
commit 327ab8592a
4 changed files with 168 additions and 7 deletions

View File

@ -77,7 +77,6 @@ def registerUserEndpoints(app, database):
def validate_token(): def validate_token():
data = request.json data = request.json
token = data.get('token') token = data.get('token')
user_name = data.get('userName')
query = "SELECT * FROM sessions WHERE Token=%s" query = "SELECT * FROM sessions WHERE Token=%s"
try: try:
result = database.query(query, params=(token,)) result = database.query(query, params=(token,))
@ -85,3 +84,60 @@ def registerUserEndpoints(app, database):
return jsonify(userName=result[0][1], tokenValid=True), 200 return jsonify(userName=result[0][1], tokenValid=True), 200
except Exception as e: except Exception as e:
return jsonify(success=False, message=str(e)), 500 return jsonify(success=False, message=str(e)), 500
@app.route('/users/attendance', methods=['PUT'])
def update_attendance():
data = request.json
token = data.get('token')
attendance_status = data.get('attendance') # Get attendance status from the request data
if attendance_status is None:
return jsonify(success=False, message="Attendance status is required"), 400
query_session = "SELECT * FROM sessions WHERE Token=%s"
try:
result = database.query(query_session, params=(token,))
if not result:
return jsonify(success=False, message="Token is invalid or expired"), 401
user_name = result[0][1]
attendance_query = "UPDATE users SET Attendance = %s WHERE Name = %s"
update_result = database.query(attendance_query, params=(attendance_status, user_name))
return jsonify(success=True, message="Attendance updated successfully"), 200
except Exception as e:
return jsonify(success=False, message=str(e)), 500
@app.route('/users/attendance', methods=['GET'])
def get_attendance():
token = request.args.get('token')
if not token:
return jsonify(success=False, message="Token is required"), 400
query_session = "SELECT * FROM sessions WHERE Token=%s"
try:
result = database.query(query_session, params=(token,))
if not result:
return jsonify(success=False, message="Token is invalid or expired"), 401
user_name = result[0][1]
attendance_query = "SELECT Attendance FROM users WHERE Name = %s"
attendance_result = database.query(attendance_query, params=(user_name,))
if not attendance_result:
return jsonify(success=False, message="User not found"), 404
attendance_status = attendance_result[0][0]
return jsonify(success=True, attendance=bool(attendance_status)), 200
except Exception as e:
return jsonify(success=False, message=str(e)), 500

View File

@ -0,0 +1,42 @@
import React from 'react';
import useFetchUser from '../utils/fetchUser';
const ApologyMessage: React.FC = () => {
const { updateAttendance } = useFetchUser()
const handleButtonClick = async () => {
await updateAttendance(true)
window.location.reload();
};
return (
<div style={styles.container}>
<p>
Нам очень жаль, что ты в этот раз не будешь с нами... Но может ты еще поменяешь свое мнение
</p>
<button onClick={handleButtonClick}>
Изменить мнение
</button>
</div>
);
};
const styles = {
container: {
position: 'fixed' as 'fixed',
top: 0,
left: 0,
width: '100vw',
height: '100vh',
backgroundColor: 'rgba(0, 0, 0, 1)',
display: 'flex',
flexDirection: 'column' as 'column',
justifyContent: 'center',
alignItems: 'center',
color: '#fff',
zIndex: 1000,
overflow: 'hidden',
}
}
// Export the component
export default ApologyMessage;

View File

@ -3,6 +3,7 @@ import { useCookies } from 'react-cookie';
import { GUESTS } from '../constants/constants'; import { GUESTS } from '../constants/constants';
import useFetchUser from '../utils/fetchUser'; // Import your custom hook import useFetchUser from '../utils/fetchUser'; // Import your custom hook
import { useNotification } from '../NotificationContext'; import { useNotification } from '../NotificationContext';
import ApologyMessage from './Attendance';
const InitialSetup = () => { const InitialSetup = () => {
const [cookie, setCookie] = useCookies(); const [cookie, setCookie] = useCookies();
@ -11,8 +12,9 @@ const InitialSetup = () => {
const [isSubmitted, setIsSubmitted] = useState(false); const [isSubmitted, setIsSubmitted] = useState(false);
const [password, setPassword] = useState(''); const [password, setPassword] = useState('');
const [isPasswordSet, setIsPasswordSet] = useState(false); // To track if password is set const [isPasswordSet, setIsPasswordSet] = useState(false); // To track if password is set
const [userAttendance, setUserAttendance] = useState<boolean | null>(null);
const { userSet, passwordCreate, signUser, validToken } = useFetchUser(); // Destructure functions from the hook const { userSet, passwordCreate, signUser, validToken, getAttendance } = useFetchUser(); // Destructure functions from the hook
const notify = useNotification(); const notify = useNotification();
const checkUserPassword = async (name: string) => { const checkUserPassword = async (name: string) => {
@ -32,8 +34,16 @@ const InitialSetup = () => {
setIsSubmitted(isTokenValid); setIsSubmitted(isTokenValid);
}; };
const getUserAttendance = async () => {
const attendance = await getAttendance()
setUserAttendance(attendance)
}
useEffect(() => { useEffect(() => {
if (cookie.apiToken !== undefined) validateToken(); if (cookie.apiToken !== undefined) {
getUserAttendance()
validateToken();
}
}, [cookie.apiToken]); }, [cookie.apiToken]);
@ -55,12 +65,17 @@ const InitialSetup = () => {
validateToken() validateToken()
}; };
if (isSubmitted && userAttendance !== false) {
if (isSubmitted) {
console.log('Selected', selectedName); console.log('Selected', selectedName);
return null; // or you can redirect to another component or page return null; // or you can redirect to another component or page
} }
if (userAttendance == false) {
return (
<ApologyMessage/>
)
}
return ( return (
<div style={styles.container}> <div style={styles.container}>
<h2 style={styles.title}>Выбери себя</h2> <h2 style={styles.title}>Выбери себя</h2>

View File

@ -3,7 +3,7 @@ import { API_URL } from '../constants/constants';
import { hashPassword } from './hashPassword'; import { hashPassword } from './hashPassword';
const useFetchUser = () => { const useFetchUser = () => {
const [, setApiCookie] = useCookies(['apiToken']); const [apiCookie, setApiCookie] = useCookies(['apiToken']);
const [, setUserNameCookie] = useCookies(['userName']) const [, setUserNameCookie] = useCookies(['userName'])
const userSet = async (userName: string): Promise<boolean> => { const userSet = async (userName: string): Promise<boolean> => {
@ -108,7 +108,55 @@ const useFetchUser = () => {
} }
} }
return { userSet, passwordCreate, signUser, validToken }; const updateAttendance = async (attendanceStatus: boolean): Promise<boolean> => {
const token = apiCookie.apiToken
try {
const response = await fetch(`${API_URL}/users/attendance`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
token,
attendance: attendanceStatus,
}),
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (!data.success) throw new Error(data.message);
return true; // Attendance updated successfully
} catch (error) {
console.error('Error updating attendance:', error);
return false; // Attendance update failed
}
}
const getAttendance = async (): Promise<boolean | null> => {
const token = apiCookie.apiToken
try {
const response = await fetch(`${API_URL}/users/attendance?token=${encodeURIComponent(token)}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
}
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (!data.success) throw new Error(data.message);
return data.attendance; // Returns attendance status (true/false)
} catch (error) {
console.error('Error retrieving attendance:', error);
return null; // In case of error or if attendance status is not found
}
}
return { userSet, passwordCreate, signUser, validToken, updateAttendance, getAttendance };
}; };
export default useFetchUser; export default useFetchUser;