Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions app/api/web_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def api_get_user_permissions():
@web_api.route("/api/users", methods=["POST"])
def api_add_user():
user_data = request.get_json()
user = User(user_data["name"], user_data["key"], user_data["email"])
user = User(user_data["name"], user_data["email"], user_data["phone"], user_data["key"])

number_of_new_user_added = user.save()

Expand All @@ -101,23 +101,23 @@ def api_add_user():

@web_api.route("/api/users/<user_key>", methods=["DELETE"])
def api_delete_user(user_key):
user = User(key=user_key, name=None)
user = User(key=user_key, name=None, email=None, phone=None)
user.delete()

return jsonify({"message": "User deleted successfully"})


@web_api.route("/api/users/<user_key>/devices/<device_id>", methods=["POST"])
def api_add_user_permission(user_key, device_id):
user = User(key=user_key, name=None)
user = User(key=user_key, name=None, email=None, phone=None)
user.add_permission(device_id)

return jsonify({"message": "User permission added successfully"})


@web_api.route("/api/users/<user_key>/devices/<device_id>", methods=["DELETE"])
def api_remove_user_permission(user_key, device_id):
user = User(key=user_key, name=None)
user = User(key=user_key, name=None, email=None, phone=None)
user.remove_permission(device_id)

return jsonify({"message": "User permission removed successfully"})
Expand Down
28 changes: 16 additions & 12 deletions app/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@


class User:
def __init__(self, name, key, email=None):
def __init__(self, name, email, phone, key):
self.name = name
self.key = key
self.email = email
self.phone = phone
self.key = key

@classmethod
def get_by_key(cls, key):
Expand All @@ -15,7 +16,7 @@ def get_by_key(cls, key):
cursor.execute("SELECT * FROM users WHERE key = ?", (key,))
result = cursor.fetchone()
if result:
return User(result[0], result[1], result[2])
return User(result[0], result[1], result[2], result[3])

return None

Expand All @@ -33,15 +34,16 @@ def save(self):
number_of_new_user = 0
if existing_user:
# Update existing user data
# Updating mechanism needs to be improved
cursor.execute(
"UPDATE users SET name = ?, key = ? WHERE email = ?",
(self.name, self.key, self.email if self.email else None),
(self.name, self.key, self.email),
)
else:
# Create new user
cursor.execute(
"INSERT INTO users (name, key, email) VALUES (?, ?, ?)",
(self.name, self.key, self.email if self.email else None),
"INSERT INTO users (name, email, phone, key) VALUES (?, ?, ?, ?)",
(self.name, self.email, self.phone, self.key),
)
number_of_new_user = 1
conn.commit()
Expand Down Expand Up @@ -79,7 +81,7 @@ def get_permissions(cls, user_key=None):
if user_key:
cursor.execute(
"""
SELECT users.name, users.key, users.email,
SELECT users.name, users.email, users.phone, users.key,
(SELECT operation_time
FROM event_logs
WHERE user_key = users.key
Expand All @@ -93,7 +95,7 @@ def get_permissions(cls, user_key=None):
else:
cursor.execute(
"""
SELECT users.name, users.key, users.email,
SELECT users.name, users.email, users.phone, users.key,
(SELECT operation_time
FROM event_logs
WHERE user_key = users.key
Expand All @@ -105,9 +107,10 @@ def get_permissions(cls, user_key=None):

for row in cursor.fetchall():
user_name = row[0]
user_key = row[1]
user_email = row[2] if row[2] else None # Handle email being None
latest_activity = row[3]
user_email = row[1] if row[1] else None # Handle email being None
user_phone = row[2] if row[2] else None # Handle phone being None
user_key = row[3]
latest_activity = row[4]

# Get device permissions for the current user
device_permissions = []
Expand Down Expand Up @@ -138,8 +141,9 @@ def get_permissions(cls, user_key=None):
# Combine user information and permissions into a single record
user_record = {
"user_name": user_name,
"user_key": user_key,
"user_email": user_email,
"user_phone": user_phone,
"user_key": user_key,
"permissions": device_permissions,
"latest_activity": latest_activity,
}
Expand Down
6 changes: 4 additions & 2 deletions app/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ CREATE TABLE IF NOT EXISTS admins
CREATE TABLE IF NOT EXISTS users
(
name TEXT NOT NULL,
key TEXT NOT NULL,
email TEXT NOT NULL
email TEXT NOT NULL,
phone TEXT DEFAULT NULL,
key TEXT NOT NULL

);
CREATE TABLE IF NOT EXISTS permissions
(
Expand Down
42 changes: 30 additions & 12 deletions app/templates/prismo/users.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,18 @@
<div class="card-body">
<h5 class="card-title">Add last used RFID card as new user: <span id="used-key-at"></span></h5>
<div class="input-group mb-3">
<button class="btn btn-primary" type="submit" onclick="addUser(document.getElementById('user_name').value, document.getElementById('user_email').value)" ><i class="bi bi-person-add"></i> Add User</button>
<button
class="btn btn-primary"
type="submit"
onclick="addUser(
document.getElementById('user_name').value,
document.getElementById('user_email').value,
document.getElementById('user_phone').value)">
<i class="bi bi-person-add"></i>Add User
</button>
<input type="text" class="form-control" id="user_name" placeholder="User Name">
<input type="email" class="form-control ms-2" id="user_email" placeholder="Email">
<input type="telephone" class="form-control ms-3" id="user_phone" placeholder="Phone Number">
</div>
</div>
</div>
Expand All @@ -28,11 +37,11 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
$('#used-key-at').text(latestKey.operation_time);
} else {
console.error("Latest key data or operation_time is missing.");
// Handle the error appropriately, e.g., display a placeholder message
$('#used-key-at').text('No recent key detected');
}
}).catch((error) => {
console.error('Error fetching latest key:', error);
// Handle the error appropriately, e.g., display an error message
$('#used-key-at').text('Error fetching key');
});
});

Expand All @@ -49,7 +58,11 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
}
// Example curl request to add a new user:
// curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"john@example.com","key":"RFID_KEY"}' http://localhost:5000/api/users
async function addUser(name, email) {
async function addUser(name, email, phone) {
if (!name || !email) {
alert('Name and email are required');
throw new Error('Name and email are required');
}
try {
const latestKey = await getLatestKey(); // Wait for API call

Expand All @@ -60,7 +73,7 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name, email, key })
body: JSON.stringify({ name, email, phone, key })
});

if (!response.ok) {
Expand All @@ -71,6 +84,7 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
usersTable.clear().rows.add(newData).draw();
} else {
console.error("Latest key data is missing or invalid.");
alert('Latest key data is missing or invalid.');
// Handle the error appropriately, e.g., display a message to the user
}
} catch (error) {
Expand Down Expand Up @@ -100,16 +114,17 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
return data.map(user => {
return {
name: user.user_name,
email: user.user_email,
phone: user.user_phone,
key: user.user_key,
latestActivity: user.latest_activity,
...user.permissions.reduce((acc, obj) => {
acc[obj.device_name] = {
allowed: obj.allowed,
device_id: obj.device_id
}
return acc
}, {}),
latestActivity: user.latest_activity,
email: user.user_email,
operation: '<button class="btn btn-sm btn-danger" onclick="deleteUser(\'' + user.user_key + '\')">Delete</button>'
}
})
Expand Down Expand Up @@ -149,12 +164,15 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
}
return {
data: (row) => {
const value = row[key]
return typeof value === 'string'
? value
: `<input type="checkbox" ${value?.allowed ? "checked" : ""} onchange="updatePermissions('${row.key}', '${value?.device_id}', ${value?.allowed})">`
const value = row[key];
// If value is null or undefined, return empty string (no checkbox)
if (value === null || value === undefined) return '';
// If value is a string, just return it
if (typeof value === 'string') return value;
// Otherwise, render checkbox for permissions
return `<input type="checkbox" ${value?.allowed ? "checked" : ""} onchange="updatePermissions('${row.key}', '${value?.device_id}', ${value?.allowed})">`;
},
visible: key !== 'key',
visible: key !== 'key',
title: key.charAt(0).toUpperCase() + key.slice(1)
}
})
Expand Down
Loading