Register endpoint
This commit is contained in:
parent
d94c342bd6
commit
af588ab174
@ -15,7 +15,7 @@ class Login extends Api
|
||||
$email = Input::post("email");
|
||||
if (empty($email)) throw new Exception("Missing email", 400);
|
||||
$password = Input::post("password");
|
||||
if (empty($password)) throw new Exception("Missing Password", 400);
|
||||
if (empty($password)) throw new Exception("Missing password", 400);
|
||||
|
||||
try {
|
||||
return Response::json(User::logIn($email, $password));
|
||||
@ -24,9 +24,9 @@ class Login extends Api
|
||||
case "Failed":
|
||||
throw new Exception("Login failed", 500);
|
||||
case "NotFound":
|
||||
throw new Exception("User not Found", 404);
|
||||
throw new Exception("User not found", 404);
|
||||
case "Invalid":
|
||||
throw new Exception("Invalid Username or Password", 401);
|
||||
throw new Exception("Invalid username or password", 401);
|
||||
default:
|
||||
throw $err;
|
||||
}
|
||||
|
||||
33
exam/api/Register/Register.php
Normal file
33
exam/api/Register/Register.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Api\Register;
|
||||
|
||||
use Exception;
|
||||
use Khofmann\Api\Api;
|
||||
use Khofmann\Input\Input;
|
||||
use Khofmann\Response\Response;
|
||||
use Khofmann\Models\User\User;
|
||||
|
||||
class Register extends Api
|
||||
{
|
||||
public function post()
|
||||
{
|
||||
$username = Input::post("username");
|
||||
if (empty($username)) throw new Exception("Missing username", 400);
|
||||
$email = Input::post("email");
|
||||
if (empty($email)) throw new Exception("Missing email", 400);
|
||||
$password = Input::post("password");
|
||||
if (empty($password)) throw new Exception("Missing password", 400);
|
||||
|
||||
try {
|
||||
return Response::json(User::create($username, $email, $password));
|
||||
} catch (Exception $err) {
|
||||
switch ($err->getMessage()) {
|
||||
case "Duplicate":
|
||||
throw new Exception("A user with this username or email already exists", 400);
|
||||
default:
|
||||
throw $err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -18,7 +18,7 @@ class User extends Api
|
||||
} catch (Exception $err) {
|
||||
switch ($err->getMessage()) {
|
||||
case "NotFound":
|
||||
throw new Exception("User not Found", 404);
|
||||
throw new Exception("User not found", 404);
|
||||
default:
|
||||
throw $err;
|
||||
}
|
||||
@ -36,7 +36,7 @@ class User extends Api
|
||||
} catch (Exception $err) {
|
||||
switch ($err->getMessage()) {
|
||||
case "NotFound":
|
||||
throw new Exception("User not Found", 404);
|
||||
throw new Exception("User not found", 404);
|
||||
case "FailedUsername":
|
||||
throw new Exception("Failed to update username", 500);
|
||||
case "FailedPassword":
|
||||
@ -61,7 +61,7 @@ class User extends Api
|
||||
} catch (Exception $err) {
|
||||
switch ($err->getMessage()) {
|
||||
case "NotFound":
|
||||
throw new Exception("User not Found", 404);
|
||||
throw new Exception("User not found", 404);
|
||||
case "FailedUsername":
|
||||
throw new Exception("Failed to update username", 500);
|
||||
case "FailedPassword":
|
||||
@ -81,7 +81,7 @@ class User extends Api
|
||||
} catch (Exception $err) {
|
||||
switch ($err->getMessage()) {
|
||||
case "NotFound":
|
||||
throw new Exception("User not Found", 404);
|
||||
throw new Exception("User not found", 404);
|
||||
default:
|
||||
throw $err;
|
||||
}
|
||||
|
||||
@ -28,13 +28,13 @@ paths:
|
||||
Success:
|
||||
value: true
|
||||
400:
|
||||
description: Missing Fields
|
||||
description: Missing fields
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
Missing Fields:
|
||||
Missing fields:
|
||||
value: { "message": "Missing email" }
|
||||
401:
|
||||
description: Invalid credentials
|
||||
@ -43,17 +43,17 @@ paths:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
Invalid Username or Password:
|
||||
value: { "message": "Invalid Username or Password" }
|
||||
Invalid username or password:
|
||||
value: { "message": "Invalid username or password" }
|
||||
404:
|
||||
description: User not Found
|
||||
description: User not found
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
User not Found:
|
||||
value: { "message": "User not Found" }
|
||||
User not found:
|
||||
value: { "message": "User not found" }
|
||||
500:
|
||||
description: Failed
|
||||
content:
|
||||
@ -68,7 +68,7 @@ paths:
|
||||
/logout:
|
||||
post:
|
||||
summary: Logout
|
||||
description: Log out User
|
||||
description: Log out user
|
||||
security:
|
||||
- BasicAuth: []
|
||||
responses:
|
||||
@ -83,6 +83,42 @@ paths:
|
||||
value: true
|
||||
tags:
|
||||
- Login/Logout
|
||||
/register:
|
||||
post:
|
||||
summary: Register
|
||||
description: Register a new user
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/RegisterRequest"
|
||||
responses:
|
||||
200:
|
||||
description: Success
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/BooleanResponse"
|
||||
examples:
|
||||
Success:
|
||||
value: true
|
||||
400:
|
||||
description: Missing fields or duplicate
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
Missing fields:
|
||||
value: { "message": "Missing email" }
|
||||
Duplicate:
|
||||
value:
|
||||
{
|
||||
"message": "A user with this username or email already exists",
|
||||
}
|
||||
tags:
|
||||
- Register
|
||||
/user{id}:
|
||||
get:
|
||||
summary: Get user
|
||||
@ -116,14 +152,14 @@ paths:
|
||||
"isAdmin": true,
|
||||
}
|
||||
404:
|
||||
description: User not Found
|
||||
description: User not found
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
User not Found:
|
||||
value: { "message": "User not Found" }
|
||||
User not found:
|
||||
value: { "message": "User not found" }
|
||||
tags:
|
||||
- User
|
||||
patch:
|
||||
@ -158,14 +194,14 @@ paths:
|
||||
Success:
|
||||
value: true
|
||||
404:
|
||||
description: User not Found
|
||||
description: User not found
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
User not Found:
|
||||
value: { "message": "User not Found" }
|
||||
User not found:
|
||||
value: { "message": "User not found" }
|
||||
500:
|
||||
description: Update failed
|
||||
content:
|
||||
@ -173,7 +209,7 @@ paths:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
User not Found:
|
||||
User not found:
|
||||
value: { "message": "Failed to update username" }
|
||||
tags:
|
||||
- User
|
||||
@ -202,14 +238,14 @@ paths:
|
||||
Success:
|
||||
value: true
|
||||
404:
|
||||
description: User not Found
|
||||
description: User not found
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ErrorResponse"
|
||||
examples:
|
||||
User not Found:
|
||||
value: { "message": "User not Found" }
|
||||
User not found:
|
||||
value: { "message": "User not found" }
|
||||
tags:
|
||||
- User
|
||||
|
||||
@ -263,6 +299,19 @@ components:
|
||||
image:
|
||||
type: string
|
||||
format: binary
|
||||
RegisterRequest:
|
||||
type: object
|
||||
required:
|
||||
- username
|
||||
- email
|
||||
- password
|
||||
properties:
|
||||
username:
|
||||
type: string
|
||||
email:
|
||||
type: string
|
||||
password:
|
||||
type: string
|
||||
securitySchemes:
|
||||
BasicAuth:
|
||||
type: apiKey
|
||||
@ -270,4 +319,5 @@ components:
|
||||
in: header
|
||||
tags:
|
||||
- name: Login/Logout
|
||||
- name: Register
|
||||
- name: User
|
||||
|
||||
File diff suppressed because one or more lines are too long
21
exam/classes/GUID/GUID.php
Normal file
21
exam/classes/GUID/GUID.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Khofmann\GUID;
|
||||
|
||||
class GUID
|
||||
{
|
||||
public static function v4($data = null)
|
||||
{
|
||||
// Generate 16 bytes (128 bits) of random data or use the data passed into the function.
|
||||
$data = $data ?? random_bytes(16);
|
||||
assert(strlen($data) == 16);
|
||||
|
||||
// Set version to 0100
|
||||
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
|
||||
// Set bits 6-7 to 10
|
||||
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
|
||||
|
||||
// Output the 36 character UUID.
|
||||
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
|
||||
}
|
||||
}
|
||||
@ -8,6 +8,8 @@ use DateTime;
|
||||
use Khofmann\Database\Database;
|
||||
use Config\Config;
|
||||
use JsonSerializable;
|
||||
use Khofmann\GUID\GUID;
|
||||
use PDOException;
|
||||
|
||||
class User implements JsonSerializable
|
||||
{
|
||||
@ -153,6 +155,37 @@ class User implements JsonSerializable
|
||||
}
|
||||
}
|
||||
|
||||
public static function create(string $username, string $email, string $password)
|
||||
{
|
||||
$db = Database::getInstance();
|
||||
$guid = GUID::v4();
|
||||
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO
|
||||
egb_benutzer(benutzer, passwort, email, confirmationcode)
|
||||
VALUES(:USR, :PAS, :EMA, :COD)"
|
||||
);
|
||||
$stmt->bindValue(":USR", $username);
|
||||
$stmt->bindValue(":PAS", password_hash($password, PASSWORD_DEFAULT));
|
||||
$stmt->bindValue(":EMA", $email);
|
||||
$stmt->bindValue(":COD", $guid);
|
||||
|
||||
try {
|
||||
$stmt->execute();
|
||||
|
||||
mail(
|
||||
$email,
|
||||
"Account activation GuestBookDB",
|
||||
"Hello $username. To activate your account, visit https://khofmann.userpage.fu-berlin.de/phpCourse/exam/confirm?c=$guid"
|
||||
);
|
||||
|
||||
return true;
|
||||
} catch (Exception $err) {
|
||||
if ($err->getCode() === "23000") throw new Exception("Duplicate");
|
||||
|
||||
throw $err;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Members
|
||||
*/
|
||||
|
||||
@ -14,6 +14,11 @@ class Response
|
||||
|
||||
public static function json($value, int $options = 0, int $dept = 512)
|
||||
{
|
||||
if (is_bool($value)) {
|
||||
Response::response()->header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode($value, $options, $dept);
|
||||
exit(0);
|
||||
}
|
||||
return SimpleRouter::response()->json($value, $options, $dept);
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@ SimpleRouter::all("/", function () {
|
||||
*/
|
||||
// Login
|
||||
SimpleRouter::post("/login", [Api\Login\Login::class, "post"]);
|
||||
SimpleRouter::post("/register", [Api\Register\Register::class, "post"]);
|
||||
/*
|
||||
* Normal Auth routes
|
||||
*/
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user