finnow/finnow-api/source/auth/api_public.d

77 lines
2.5 KiB
D

module auth.api_public;
import handy_http_primitives;
import handy_http_handlers.path_handler;
import handy_http_data.json;
import slf4d;
import auth.model;
import auth.data;
import auth.service;
import auth.data_impl_fs;
@PostMapping("/api/login")
void postLogin(ref ServerHttpRequest request, ref ServerHttpResponse response) {
struct LoginData {
string username;
string password;
}
LoginData data = readJsonBodyAs!LoginData(request);
string token = generateTokenForLogin(data.username, data.password);
response.writeBodyString(token);
debugF!"Generated token for user: %s"(data.username);
}
struct UsernameAvailabilityResponse {
const bool available;
}
@GetMapping("/api/register/username-availability")
void getUsernameAvailability(ref ServerHttpRequest request, ref ServerHttpResponse response) {
string username = null;
foreach (param; request.queryParams) {
if (param.key == "username" && param.values.length > 0) {
username = param.values[0];
break;
}
}
if (username is null || username.length == 0) {
response.status = HttpStatus.BAD_REQUEST;
response.writeBodyString("Missing username parameter.");
return;
}
UserRepository userRepo = new FileSystemUserRepository();
bool available = userRepo.findByUsername(username).isNull;
writeJsonBody(response, UsernameAvailabilityResponse(available));
}
struct RegistrationData {
string username;
string password;
}
@PostMapping("/api/register")
void postRegister(ref ServerHttpRequest request, ref ServerHttpResponse response) {
RegistrationData registrationData = readJsonBodyAs!RegistrationData(request);
if (!validateUsername(registrationData.username)) {
response.status = HttpStatus.BAD_REQUEST;
response.writeBodyString("Invalid username.");
return;
}
if (!validatePassword(registrationData.password)) {
response.status = HttpStatus.BAD_REQUEST;
response.writeBodyString("Invalid password.");
return;
}
UserRepository userRepo = new FileSystemUserRepository();
if (!userRepo.findByUsername(registrationData.username).isNull) {
response.status = HttpStatus.BAD_REQUEST;
response.writeBodyString("Username is taken.");
return;
}
User user = createNewUser(userRepo, registrationData.username, registrationData.password);
infoF!"Created user: %s"(registrationData.username);
response.writeBodyString(user.username);
}