Skip to content
Snippets Groups Projects
Commit bbc1dee7 authored by „Sophia's avatar „Sophia
Browse files

push

parent c88ceb15
Branches versuch
No related merge requests found
{
"name": "Product Webservice",
"version": "0.1.0",
"description": "Service to perform CRUD-operations on products.",
"title": "API Product Service"
}
......@@ -68,22 +68,6 @@
<div id="startseite" class="page active">
<div class="container mb-3 d-none" id="add-user-container">
<form id="add-user-form">
<div class="row mb-3">
<div class="col"></div>
</div>
<div class="row">
<div class="col">
<button type="submit" class="btn btn-primary">Registrieren</button>
</div>
</div>
</form>
</div>
<div class="modal fade" id="edit-user-modal">
<div class="modal-dialog">
<div class="modal-content">
......@@ -118,6 +102,10 @@
<!-- Titeltext-->
<section class="horizon-changers-opening">
<div class="horizon-changers-opening-container">
<br>
<br>
<br>
<br>
<h2 class="horizon-changers-opening-title">Horizon Changers</h2>
<p class="horizon-changers-description">
Bei uns erlebst du Reisen, die Herz und Abenteuerlust vereinen. Tauche ein in soziale Projekte, entdecke <br> neue Kulturen und spüre den Nervenkitzel unvergesslicher Outdoor-Erlebnisse. Mach deine Reise zu etwas Bedeutungsvollem! <br> Wähle ein soziales Projekt plus passende abenteuerliche Freizeitaktivitäten (die Erste ist inklusive) und <br> starte in dein Abenteuer...
......@@ -208,8 +196,8 @@
</div>
</div>
<div id="registrieren" class="page">
<i class="fa-solid fa-circle-arrow-left" class="backButton"></i>
<div id="registrieren" class="page justify-content-center">
<i class="fa-solid fa-circle-arrow-left backButton"></i>
<div class="card" id="card-registrieren">
<div class="card-body">
......@@ -217,7 +205,7 @@
<h1>Registrieren</h1>
<!-- Formular erstellen -->
<form>
<form id="add-user-form">
<div id="label1" class="form-text-registrieren">
Vorname
......@@ -251,7 +239,7 @@
<input type="password" class="form-control-registrieren" id="add-user-repeatPassword">
</div>
<button onclick="showPage('meineReisen')" type="submit" class="btn btn-primary" id="registrierenButton" >Registrieren</button>
<button type="submit" class="btn btn-primary" id="registrierenButton" onclick="showPage ('meineReisen')">Registrieren</button>
</form>
</div>
......@@ -263,16 +251,18 @@
<div class="container-meineReisen">
<aside class="sidebar">
<i class="fa-solid fa-circle-arrow-left " class="backButton" onclick="showPage('startseite')"></i>
<p class="greeting" id="current-user-email">Hallo, Annika!</p>
<i class="fa-solid fa-circle-arrow-left backButton" onclick="showPage('startseite')"></i>
<p class="greeting" id="current-user-firstName">Hallo,</p>
<nav class="menu">
<ul id="logout-form">
<ul>
<li><a href="#">Meine Reisen</a></li>
<li><a onclick="showPage('profil')">Mein Profil</a></li>
<li><a href="#">Merkliste</a></li>
<li><a href="#">Meine Supportanfragen</a></li>
<li><a href="#">Reisebericht schreiben</a></li>
<li><a id="logout-button" onclick="showPage('startseite')">Abmelden</a></li>
<div id="logout-form">
<li><a id="logout-button" onclick="showPage('startseite')">Abmelden</a></li>
</div>
</ul>
</nav>
</aside>
......@@ -307,8 +297,8 @@
<div id="profil" class="page">
<div class="sidebar-container">
<aside class="sidebar">
<i class="fa-solid fa-circle-arrow-left" class="backButton" onclick="showPage('startseite')"></i>
<p class="greeting">Hallo, Annika!</p>
<i class="fa-solid fa-circle-arrow-left backButton" onclick="showPage('startseite')"></i>
<p class="greeting">Hallo,</p>
<nav class="menu">
<ul>
<li><a onclick="showPage('meineReisen')">Meine Reisen</a></li>
......
......@@ -57,12 +57,14 @@ document.addEventListener("DOMContentLoaded", (): void => {
// Check, if any given value is empty
if (!firstName || !lastName || !eMail || !password || !repeatPassword) {
addMessage("Bitte alle Felder ausfüllen!");
showPage('registrieren');
return;
}
// Validate passwords match
if (password !== repeatPassword) {
addMessage("Passwörter stimmen nicht überein!");
showPage('registrieren')
return;
}
......@@ -72,23 +74,20 @@ document.addEventListener("DOMContentLoaded", (): void => {
headers: {
"Content-type": "application/json",
},
body: JSON.stringify({ firstName, lastName, eMail, password, repeatPassword}),
body: JSON.stringify({firstName, lastName, eMail, password, repeatPassword}),
});
const data: any = await res.json();
addMessage(data.message);
if (res.status === 400) {
const data: any = await res.json();
if (res.status === 201) {
addMessage(data.message);
showPage('startseite');
} else if (res.status === 201) {
const data: any = await res.json();
showLoggedInStatus(data.user);
} else {
addMessage(data.message);
showPage('meineReisen');
showPage('registrieren');
}
readUsers();
// Clear the input fields
firstNameEl.value = "";
......@@ -166,7 +165,7 @@ document.addEventListener("DOMContentLoaded", (): void => {
method: "POST",
}
);
showLoggedOutStatus()
/*showLoggedOutStatus()*/
});
});
/**
......@@ -199,7 +198,7 @@ async function readUsers(): Promise<void> {
* Displays the logged in username
*/
function showLoggedInStatus(user: User): void {
const firstName: HTMLElement = document.getElementById('current-user-email')!;
const firstName: HTMLElement = document.getElementById('current-user-firstName')!;
firstName.innerHTML = `Hallo, ${user.firstName}!`;
readUsers();
......@@ -209,7 +208,7 @@ function showLoggedInStatus(user: User): void {
* Resets the site to the logged-out state.
* Clears user list, shows login form, hides logout form-
*/
function showLoggedOutStatus(): void {
/*function showLoggedOutStatus(): void {
const eMail: HTMLElement = document.getElementById('current-user-email')!;
eMail.innerHTML = ``;
......@@ -223,7 +222,7 @@ function showLoggedOutStatus(): void {
login.classList.remove("d-none"); // show login
(document.getElementById('add-user-form') as HTMLFormElement).reset();
}
}*/
/// für ADMIN wieder relevant
/**
......
......@@ -21,7 +21,6 @@ header {
padding: 20px 10%;
}
.logo img {
height: 50px;
align-items: center;
......@@ -340,8 +339,6 @@ header {
}
/*SPA*/
#backButtonRegistrieren {
position: absolute;
......@@ -424,7 +421,6 @@ header {
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-start;
box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
height: 100vh;
......@@ -631,14 +627,14 @@ h2 {
}
/* Header Hero-Bereich */
.hero {
.hero-aboutUs {
position: relative;
width: 100%;
height: 400px;
overflow: hidden;
}
.hero-image {
.hero-image-aboutUs {
width: 100%;
height: 100%;
object-fit: cover;
......@@ -792,6 +788,7 @@ h2 {
left: 80%;
transform: translate(-50%, -50%);
white-space: nowrap; /* Verhindert Zeilenumbrüche */
padding-right: 60px;
}
#hero-button {
......@@ -811,7 +808,6 @@ h2 {
/* Horizon Changers Section */
.horizon-changers-opening {
background-color: #f5f9ff; /* Heller Hintergrund */
padding: 60px 20px; /* Abstand innen */
text-align: center; /* Zentriert den Text */
}
......@@ -873,6 +869,10 @@ h2 {
}
.active {
display: block;
display: flex;
}
#startseite {
flex-direction: column;
}
}
\ No newline at end of file
......@@ -3,10 +3,10 @@ USE `horizon_changers`;
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`eMail` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`firstName` varchar(255) NOT NULL,
`lastName` varchar(255) NOT NULL,
`eMail` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`adress` varchar(32) NOT NULL,
PRIMARY KEY (user_id)
......@@ -18,5 +18,5 @@ Die Logindaten für den Nutzer lauten:
Username: admin
Password: admin
*/
INSERT INTO `user` (`user_id`, `eMail`, `password`, `firstName`, `lastName`, `adress`) VALUES
(2, 'bob.hase@outlook.com', '09876543', 'Bob', 'Hase', 'Musterstraße 9, 12345 Musterstadt');
INSERT INTO `user` (`user_id`, `firstName`, `lastName`,`eMail`, `password`, `adress`) VALUES
(2, 'Bob', 'Hase','bob.hase@outlook.com', '09876543', 'Musterstraße 9, 12345 Musterstadt');
......@@ -70,17 +70,6 @@ export interface User {
eMail: string;
}
/**
* @apiDefine SessionExpired
*
* @apiError (Client Error) {401} SessionNotFound The session of the user is expired or was not set
*
* @apiErrorExample SessionNotFound:
* HTTP/1.1 401 Unauthorized
* {
* "message":"Session expired, please log in again."
* }
*/
function isLoggedIn(req: Request, res: Response, next: NextFunction) {
// Abstract middleware route for checking login state of the user
if (req.session.user != null) {
......@@ -98,9 +87,10 @@ function isLoggedIn(req: Request, res: Response, next: NextFunction) {
* HTTP ROUTES: LOGIN *
*****************************************************************************/
/**
* @api {get} /login Request login state
* @apiName GetLogin
* @api {get} /login Login-Status überprüfen
* @apiName LoginStatus
* @apiGroup Login
* @apiDescription Überprüft, ob ein Benutzer noch eingeloggt ist. Gibt bei Erfolg die Benutzerdaten zurück.
*
* @apiSuccess {User} user The user object
* @apiSuccess {string} message Message stating that the user is still logged in
......@@ -109,11 +99,10 @@ function isLoggedIn(req: Request, res: Response, next: NextFunction) {
* HTTP/1.1 200 OK
* {
* "user":{
* "id":1,
* "username":"admin",
* "givenName":"Peter",
* "familyName":"Kneisel",
* "creationTime":"2017-11-12T09:33:25.000Z"
* "user_id":42,
* "firstName":"Peter",
* "lastName":"Kneisel",
* "eMail":"admin",
* },
* "message":"User still logged in"
* }
......@@ -126,6 +115,7 @@ function isLoggedIn(req: Request, res: Response, next: NextFunction) {
* "message":"Session expired, please log in again."
* }
*/
app.get('/login', isLoggedIn, (req: Request, res: Response): void => {
res.status(200).send({
message: 'User still logged in',
......@@ -133,45 +123,41 @@ app.get('/login', isLoggedIn, (req: Request, res: Response): void => {
});
});
/**
* @api {post} /login Send login request
* @apiName PostLogin
* @apiGroup Login
*
* @apiBody {string} username Username of the user to log in
* @apiBody {string} password Password of the user to log in
* @api {post} /login Benutzer-Login
* @apiName BenutzerLogin
* @apiGroup User
* @apiDescription Authentifiziert einen Benutzer anhand von E-Mail und Passwort. Speichert den Benutzer bei erfolgreichem Login in der Session.
*
* @apiSuccess {User} user The user object
* @apiSuccess {string} message Message stating the user logged in successfully
* @apiBody {String} eMail E-Mail-Adresse des Benutzers. Muss angegeben werden.
* @apiBody {String} password Passwort des Benutzers. Muss angegeben werden.
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* HTTP/1.1 201 OK
* {
* "user":{
* "id":1,
* "username":"admin",
* "firstName":"Peter",
* "lastName":"Kneisel",
* "creationTime":"2017-11-12T09:33:25.000Z"
* },
* "message":"Successfully logged in"
* "message":"'Erfolgreich eingeloggt :)!'"
* }
*
* @apiError (Client Error) {401} LoginIncorrect The login data provided is not correct.
* @apiError (Server Error) {500} DatabaseRequestFailed The request to the database failed.
*
* @apiErrorExample LoginIncorrect:
* @apiSuccess {String} message Erfolgsnachricht.
* @apiSuccess {Object} user Details des authentifizierten Benutzers.
* @apiSuccess {Number} user.user_id ID des Benutzers.
* @apiSuccess {String} user.firstName Vorname des Benutzers.
* @apiSuccess {String} user.lastName Nachname des Benutzers.
* @apiSuccess {String} user.eMail E-Mail-Adresse des Benutzers.
* @apiSuccess {String} user.adress Adresse des Benutzers (bei Login nicht verpflichtete Angabe).
* @apiSuccess {String} user.role Rolle des Benutzers (Standardeinstellung user).
*
* @apiError {String} message Fehlermeldung.
*
* @apiErrorExample {json} 401 Fehler (Ungültige Login-Daten):
* HTTP/1.1 401 Unauthorized
* {
* "message":"Username or password is incorrect."
* "message": "Passwort und/oder Email stimmt/stimmen nicht."
* }
*
*
* @apiErrorExample DatabaseRequestFailed:
* HTTP/1.1 500 Internal Server Errror
* @apiErrorExample {json} 500 Fehler (Datenbankproblem):
* HTTP/1.1 500 Internal Server Error
* {
* "message":"Database request failed: ..."
* "message": "Database request failed: [Fehlerdetails]"
* }
*/
app.post('/login', async (req: Request, res: Response): Promise<void> => {
......@@ -182,8 +168,7 @@ app.post('/login', async (req: Request, res: Response): Promise<void> => {
// Create database query and data
const data: [string, string] = [
eMail,
password
//crypto.createHash("sha512").update(password).digest('hex')
crypto.createHash("sha512").update(password).digest('hex'),
];
console.log(data)
const query: string = 'SELECT * FROM user WHERE eMail = ? AND password = ?;';
......@@ -199,7 +184,7 @@ app.post('/login', async (req: Request, res: Response): Promise<void> => {
lastName: rows[0].lastName,
eMail: rows[0].eMail,
adress: rows[0].adress,
role: rows[0].role,
role: rows[0].role || 'user',
};
req.session.user = user; // Store user object in session for authentication
......@@ -232,7 +217,7 @@ app.post('/login', async (req: Request, res: Response): Promise<void> => {
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* message: "Successfully logged out"
* message: "Erfolgreich ausgeloggt! Bis zum nächsten mal :)"
* }
*/
app.post('/logout', isLoggedIn, (req: Request, res: Response): void => {
......@@ -246,106 +231,132 @@ app.post('/logout', isLoggedIn, (req: Request, res: Response): void => {
* HTTP ROUTES: USER, USERS *
*****************************************************************************/
/**
* @api {post} /user Create a new user
* @apiName postUser
*
* @api {post} /user Benutzerregistrierung
* @apiName BenutzerRegistrierung
* @apiGroup User
*
* @apiBody {string} givenName First name of the user
* @apiBody {string} familyName Last name of the user
* @apiDescription Registriert einen neuen Benutzer und loggt ihn anschließend automatisch ein.
*
* @apiBody {String} firstName Vorname des Benutzers. Muss angegeben werden.
* @apiBody {String} lastName Nachname des Benutzers. Muss angegeben werden.
* @apiBody {String} eMail E-Mail-Adresse des Benutzers. Muss angegeben werden.
* @apiBody {String} password Passwort des Benutzers. Muss angegeben werden.
* @apiBody {String} repeatPassword Wiederholung des Passworts. Muss mit `password` übereinstimmen.
*
* @apiSuccess {string} message Message stating the new user has been created successfully
* @apiSuccess {string} message Bestätigungsnachricht.
* @apiSuccess {Object} user Details des neu erstellten Benutzers.
* @apiSuccess {Number} user.user_id ID des Benutzers.
* @apiSuccess {String} user.firstName Vorname des Benutzers.
* @apiSuccess {String} user.lastName Nachname des Benutzers.
* @apiSuccess {String} user.eMail E-Mail-Adresse des Benutzers.
* @apiSuccess {String} user.adress Adresse des Benutzers (falls vorhanden, optional).
* @apiSuccess {String} user.role Rolle des Benutzers (Standardwert: "user").
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* HTTP/1.1 201 OK
* {
* "message":"Successfully created new user"
* "message":"'Erfolgreich registriert und eingeloggt!'"
* }
*
* @apiError (Client Error) {400} NotAllMandatoryFields The request did not contain all mandatory fields
* @apiError {String} message Fehlermeldung.
*
* @apiErrorExample NotAllMandatoryFields:
* @apiErrorExample {json} 400 Fehler (Felder fehlen):
* HTTP/1.1 400 Bad Request
* {
* "message":"Not all mandatory fields are filled in"
* "message": "Bitte alle Felder ausfüllen!"
* }
*
* @apiErrorExample {json} 400 Fehler (Passwörter stimmen nicht überein):
* HTTP/1.1 400 Bad Request
* {
* "message": "Passwörter stimmen nicht überein!"
* }
*
* @apiErrorExample {json} 500 Fehler (Datenbankproblem):
* HTTP/1.1 500 Internal Server Error
* {
* "message": "Datenbankanfrage fehlgeschlagen: [Fehlerdetails]"
* }
*
* @apiErrorExample {json} 500 Fehler (Benutzer nicht abrufbar):
* HTTP/1.1 500 Internal Server Error
* {
* "message": "Registrierung erfolgreich, aber der Benutzer konnte nicht abgerufen werden."
* }
*/
app.post('/user', async (req: Request, res: Response): Promise<void> => {
// Read data from request body
const firstName: string = req.body.firstName;
const lastName: string = req.body.lastName;
const eMail: string = req.body.eMail;
const password: string = req.body.password;
const repeatPassword: string = req.body.repeatPassword;
// add a new user if first- and familyName exist
if (eMail && password && firstName && lastName) {
console.log(password);
console.log(repeatPassword);
// Check, if any given value is empty
if (!firstName || !lastName || !eMail || !password || !repeatPassword) {
res.status(400).send({
message: "Bitte alle Felder ausfüllen!",
});
return;
}
// Check if password and repeatPassword match
if (password !== repeatPassword) {
res.status(400).send({
message: 'Passwörter stimmen nicht überein!',
});
}
// Check if password and repeatPassword match
if (password !== repeatPassword) {
res.status(400).send({
message: 'Passwörter stimmen nicht überein!',
});
return;
}
const data: [string, string, string, string] = [
eMail,
crypto.createHash("sha512").update(password).digest('hex'),
firstName,
lastName,
];
const query: string = 'INSERT INTO user (eMail, password, firstName, lastName) VALUES (?, ?, ?, ?);';
try {
const [result] = await database.query<ResultSetHeader>(query, data);
// Hol den neu erstellten Benutzer aus der Datenbank
const [userRows] = await database.query<RowDataPacket[]>(
'SELECT * FROM user WHERE user_id = ?;',
[result.insertId]
);
if (userRows.length === 1) {
const user: User = {
user_id: userRows[0].user_id,
firstName: userRows[0].firstName,
lastName: userRows[0].lastName,
eMail: userRows[0].eMail,
adress: userRows[0].adress || '',
role: userRows[0].role || 'user',
};
// Speichere den Benutzer in der Session
req.session.user = user;
const data: [string, string, string, string, string] = [
eMail,
crypto.createHash("sha512").update(password).digest('hex'),
firstName,
lastName,
new Date().toLocaleString()
];
const query: string = 'INSERT INTO user (firstName, lastName, eMail, password) VALUES (?, ?, ?, ?);';
// Execute database query
try {
const [result] = await database.query<ResultSetHeader>(query, data);
res.status(201).send({
message: `Erfolgreiches Erstellen einer User-ID: ${result.insertId}`,
message: 'Erfolgreich registriert und eingeloggt!',
user,
});
} catch (error) {
// Send response
} else {
res.status(500).send({
message: 'Database request failed: ' + error,
message: 'Registrierung erfolgreich, aber der Benutzer konnte nicht abgerufen werden.',
});
}
} else {
res.status(400).send({
message: 'Da fehlt doch noch was ;)!',
} catch (error) {
res.status(500).send({
message: 'Datenbankanfrage fehlgeschlagen: ' + error,
});
}
});
/**
* @api {get} /user/:userId Get user with given id
* @apiName getUser
* @apiGroup User
*
* @apiParam {number} userId The id of the requested user
*
* @apiSuccess {User} user The requested user object
* @apiSuccess {string} message Message stating the user has been found
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "user":{
* "id":1,
* "givenName":"Peter",
* "familyName":"Kneisel",
* "creationTime":"2018-10-21 14:19:12"
* },
* "message":"Successfully got user"
* }
*
* @apiError (Client Error) {404} NotFound The requested user can not be found
*
* @apiErrorExample NotFound:
* HTTP/1.1 404 Not Found
* {
* "message":"The requested user can not be found."
* }
*/
app.get('/user/:userId', isLoggedIn, async (req: Request, res: Response): Promise<void> => {
// Read data from request parameters
const data: [number] = [
......@@ -384,38 +395,6 @@ app.get('/user/:userId', isLoggedIn, async (req: Request, res: Response): Promis
}
});
/**
* @api {put} /user/:userId Update user with given id
* @apiName putUser
* @apiGroup User
*
* @apiParam {number} userId The id of the requested user
* @apiBody {string} givenName The (new) first name of the user
* @apiBody {string} familyName The (new) last name of the user
*
* @apiSuccess {string} message Message stating the user has been updated
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "message":"Successfully updated user ..."
* }
*
* @apiError (Client Error) {400} NotAllMandatoryFields The request did not contain all mandatory fields
* @apiError (Client Error) {404} NotFound The requested user can not be found
*
* @apiErrorExample NotAllMandatoryFields:
* HTTP/1.1 400 Bad Request
* {
* "message":"Not all mandatory fields are filled in"
* }
*
* @apiErrorExample NotFound:
* HTTP/1.1 404 Not Found
* {
* "message":"The user to update could not be found"
* }
*/
app.put('/user/:userId', isLoggedIn, async (req: Request, res: Response): Promise<void> => {
// Read data from request
const userId: number = parseInt(req.params.userId);
......@@ -495,34 +474,7 @@ app.delete('/user/:userId', isLoggedIn, async (req: Request, res: Response): Pro
}
});
/**
* @api {get} /users Get all users
* @apiName getUsers
* @apiGroup Users
*
* @apiSuccess {User[]} userList The list of all users
* @apiSuccess {string} message Message stating the users have been found
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "userList": [
* {
* "givenName": "Hans",
* "familyName": "Mustermann",
* "creationTime": "2018-11-04T13:02:44.791Z",
* "id": 1
* },
* {
* "givenName": "Bruce",
* "familyName": "Wayne",
* "creationTime": "2018-11-04T13:03:18.477Z",
* "id": 2
* }
* ]
* "message":"Successfully requested user list"
* }
*/
app.get('/users', isLoggedIn, async (req: Request, res: Response): Promise<void> => {
// Send user list to client
const query: string = 'SELECT * FROM user;';
......
......@@ -3,8 +3,17 @@ POST http://localhost:8080/login HTTP/1.1
Content-Type: application/json
{
"eMail": "bob.hase@outlook.com",
"password": "09876543"
"eMail": "lilith@fa.gmx.de",
"password": "lölli"
}
### Login
POST http://localhost:8080/login HTTP/1.1
Content-Type: application/json
{
"eMail": "lilith@fa.gmx.de",
"password": "passwort"
}
### Create a new user
......@@ -19,23 +28,28 @@ Content-Type: application/json
"repeatPassword": "1234"
}
### Get all users
GET http://localhost:8080/users HTTP/1.1
### Create a new user
POST http://localhost:8080/user HTTP/1.1
Content-Type: application/json
### Get specific user
GET http://localhost:8080/user/1 HTTP/1.1
{
"firstName": "Bruce",
"lastName": "Wayne",
"eMail": "bat",
"password": "1234",
"repeatPassword": "123456"
}
### Update specific user
PUT http://localhost:8080/user/1 HTTP/1.1
### Create a new user
POST http://localhost:8080/user HTTP/1.1
Content-Type: application/json
{
"firstName": "Selina",
"lastName": "Kyle"
"firstName": "Bruce",
"lastName": "Wayne",
"password": "1234",
"repeatPassword": "1234"
}
### Delete specific user
DELETE http://localhost:8080/user/1 HTTP/1.1
### Logout
POST http://localhost:8080/logout HTTP/1.1
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment