f052_admin_area #27
@@ -1,64 +1,79 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {onMount} from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import Button from "$lib/components/Button.svelte";
|
import Button from '$lib/components/Button.svelte';
|
||||||
|
|
||||||
import jsSHA from 'jssha'
|
import jsSHA from 'jssha';
|
||||||
|
|
||||||
const {data} = $props();
|
const { data } = $props();
|
||||||
|
|
||||||
let userName = $state('')
|
let userName = $state('');
|
||||||
let userPassword = $state('')
|
let userPassword = $state('');
|
||||||
let userList: { userId: string; userName: string }[] = $state([])
|
let userList: { userId: string; userName: string }[] = $state([]);
|
||||||
let addUserError = $state(false);
|
let addUserError = $state(false);
|
||||||
let addUserSuccess = $state(false);
|
let addUserSuccess = $state(false);
|
||||||
const currentUser: string = data.user.id;
|
const currentUser: string = data.user.id;
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
|
try {
|
||||||
userList = await getUsers();
|
userList = await getUsers();
|
||||||
})
|
} catch (error) {
|
||||||
|
console.log(`An error occured while retrieving users: ${error}`);
|
||||||
|
trachi93 marked this conversation as resolved
Outdated
|
|||||||
|
}
|
||||||
|
trachi93 marked this conversation as resolved
Outdated
jared
commented
sowas kann man ganz gut in eine constante auslagern also ein enum oder objekt, welches alle routen hält und ich diese dann nur referenzieren muss. das sind solche "magic strings" sowas kann man ganz gut in eine constante auslagern also ein enum oder objekt, welches alle routen hält und ich diese dann nur referenzieren muss. das sind solche "magic strings"
trachi93
commented
müsste ganzheitlich getan werden -> Ticket angelegt müsste ganzheitlich getan werden -> Ticket angelegt
|
|||||||
|
});
|
||||||
|
|
||||||
async function getUsers() {
|
async function getUsers() {
|
||||||
const URL = "/api/users"
|
const URL = '/api/users';
|
||||||
const response = await fetch(URL);
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
trachi93 marked this conversation as resolved
Outdated
jared
commented
Try Catch block Try Catch block
|
|||||||
|
const response = await fetch(URL);
|
||||||
return await response.json();
|
return await response.json();
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`Error fetching users: ${error}`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addUser() {
|
async function addUser() {
|
||||||
if (userName == "") {
|
if (userName == '') {
|
||||||
alert("Der Benutzername darf nicht leer sein.")
|
alert('Der Benutzername darf nicht leer sein.');
|
||||||
|
jared marked this conversation as resolved
Outdated
jared
commented
s.o. s.o.
|
|||||||
return;
|
return;
|
||||||
|
trachi93 marked this conversation as resolved
Outdated
jared
commented
Das hashen von Passwörtern solle stets im Backend erfolgen. Hier sollte auch auf eine sichere Methode geachtet werden die noch eine Salt wert einfügt z.B. bycrpty o.ä. Das hashen von Passwörtern solle stets im Backend erfolgen. Hier sollte auch auf eine sichere Methode geachtet werden die noch eine Salt wert einfügt z.B. bycrpty o.ä.
trachi93
commented
manuelles hashen wurde durch bcrypt ausgetauscht. manuelles hashen wurde durch bcrypt ausgetauscht.
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (userPassword == "") {
|
if (userPassword == '') {
|
||||||
alert("Das Passwort darf nicht leer sein.")
|
alert('Das Passwort darf nicht leer sein.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const URL = "/api/users";
|
const URL = '/api/users';
|
||||||
const hashedUserPassword = new jsSHA('SHA-512', 'TEXT').update(userPassword).getHash('HEX');
|
const hashedUserPassword = new jsSHA('SHA-512', 'TEXT').update(userPassword).getHash('HEX');
|
||||||
const userData = {userName: userName, userPassword: hashedUserPassword}
|
const userData = { userName: userName, userPassword: hashedUserPassword };
|
||||||
|
|
||||||
|
try {
|
||||||
|
trachi93 marked this conversation as resolved
Outdated
jared
commented
Performanter wäre es wenn du dir nach dem Erstellen des Users, dieses zurück liefern lässt. Damit reduzierst du Traffic sowas wie Performanter wäre es wenn du dir nach dem Erstellen des Users, dieses zurück liefern lässt. Damit reduzierst du Traffic
sowas wie
const newUser = await response.json();
userList = [...userList, newUser];
|
|||||||
const response = await fetch(URL, {
|
const response = await fetch(URL, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
},
|
},
|
||||||
body: JSON.stringify(userData)
|
body: JSON.stringify(userData)
|
||||||
})
|
});
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
userList = await getUsers();
|
const newUser = await response.json();
|
||||||
|
userList = [...userList, newUser];
|
||||||
addUserSuccess = true;
|
addUserSuccess = true;
|
||||||
resetInput();
|
resetInput();
|
||||||
} else {
|
} else {
|
||||||
addUserError = true;
|
addUserError = true;
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
trachi93 marked this conversation as resolved
Outdated
jared
commented
try catch try catch
|
|||||||
|
console.log(`Error creating user: ${error}`);
|
||||||
|
addUserError = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetInput() {
|
function resetInput() {
|
||||||
userName = "";
|
userName = '';
|
||||||
userPassword = "";
|
userPassword = '';
|
||||||
addUserError = false;
|
addUserError = false;
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
addUserSuccess = false;
|
addUserSuccess = false;
|
||||||
@@ -68,17 +83,22 @@
|
|||||||
async function deleteUser(userId: string) {
|
async function deleteUser(userId: string) {
|
||||||
const URL = `/api/users/${userId}`;
|
const URL = `/api/users/${userId}`;
|
||||||
|
|
||||||
|
try {
|
||||||
const response = await fetch(URL, {
|
const response = await fetch(URL, {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
if (response.status == 204) {
|
if (response.status == 204) {
|
||||||
userList = await getUsers();
|
userList = await getUsers();
|
||||||
} else {
|
} else {
|
||||||
alert("Nutzer konnte nicht gelöscht werden")
|
alert('Nutzer konnte nicht gelöscht werden');
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`Error deleting users: ${error}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +134,7 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24"
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24"
|
||||||
stroke="currentColor">
|
stroke="currentColor">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
d="M6 18L18 6M6 6l12 12"/>
|
d="M6 18L18 6M6 6l12 12" />
|
||||||
</svg>
|
</svg>
|
||||||
{/if}
|
{/if}
|
||||||
</button>
|
</button>
|
||||||
@@ -134,12 +154,12 @@
|
|||||||
<form>
|
<form>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="username">Benutzername</label>
|
<label for="username">Benutzername</label>
|
||||||
<input bind:value={userName} type="text" id="username" placeholder="Namen eingeben"/>
|
<input bind:value={userName} type="text" id="username" placeholder="Namen eingeben" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="password">Passwort</label>
|
<label for="password">Passwort</label>
|
||||||
<input bind:value={userPassword} type="password" id="password" placeholder="Passwort vergeben"/>
|
<input bind:value={userPassword} type="password" id="password" placeholder="Passwort vergeben" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -151,7 +171,7 @@
|
|||||||
<svg class="h-5 w-5 mr-3 text-yellow-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
<svg class="h-5 w-5 mr-3 text-yellow-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||||
stroke="currentColor">
|
stroke="currentColor">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
d="M12 9v2m0 4h.01M12 5a7 7 0 100 14 7 7 0 000-14z"/>
|
d="M12 9v2m0 4h.01M12 5a7 7 0 100 14 7 7 0 000-14z" />
|
||||||
</svg>
|
</svg>
|
||||||
<span class="text-sm font-medium">Der Benutzer konnte nicht hinzugefügt werden.</span>
|
<span class="text-sm font-medium">Der Benutzer konnte nicht hinzugefügt werden.</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -162,7 +182,7 @@
|
|||||||
<svg class="h-5 w-5 mr-3 text-yellow-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
<svg class="h-5 w-5 mr-3 text-yellow-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||||
stroke="currentColor">
|
stroke="currentColor">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
d="M12 9v2m0 4h.01M12 5a7 7 0 100 14 7 7 0 000-14z"/>
|
d="M12 9v2m0 4h.01M12 5a7 7 0 100 14 7 7 0 000-14z" />
|
||||||
</svg>
|
</svg>
|
||||||
<span class="text-sm font-medium">Der Benutzer wurde hinzugefügt.</span>
|
<span class="text-sm font-medium">Der Benutzer wurde hinzugefügt.</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user
try catch block benutzen