Skip to content

Commit 659fbc1

Browse files
committed
Add websignup page
1 parent 7357660 commit 659fbc1

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed

app/Controllers/Http/UserController.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,62 @@ class UserController {
8686
});
8787
}
8888

89+
// Register a new user via web
90+
async websignup({ request, response, auth }) {
91+
if (Env.get('IS_REGISTRATION_ENABLED') == 'false') {
92+
// eslint-disable-line eqeqeq
93+
return response.status(401).send({
94+
message: 'Registration is disabled on this server',
95+
status: 401,
96+
});
97+
}
98+
99+
// Validate user input
100+
const validation = await validateAll(request.all(), {
101+
firstname: 'required',
102+
lastname: 'required',
103+
email: 'required|email|unique:users,email',
104+
password: 'required',
105+
});
106+
107+
if (validation.fails()) {
108+
return response.status(401).send({
109+
message: 'Invalid POST arguments',
110+
messages: validation.messages(),
111+
status: 401,
112+
});
113+
}
114+
115+
const data = request.only(['firstname', 'lastname', 'email', 'password']);
116+
117+
// Hash password
118+
const hashedPassword = crypto
119+
.createHash('sha256')
120+
.update(data.password)
121+
.digest('base64');
122+
123+
// Create user in DB
124+
let user;
125+
try {
126+
user = await User.create({
127+
email: data.email,
128+
password: hashedPassword,
129+
username: data.firstname,
130+
lastname: data.lastname,
131+
});
132+
} catch (e) {
133+
return response.status(401).send({
134+
message: 'E-Mail Address already in use',
135+
status: 401,
136+
});
137+
}
138+
139+
await auth.generate(user);
140+
141+
// Redirect user to login page, confirmaiton would be nice
142+
return response.redirect('/user/login');
143+
}
144+
89145
// Login using an existing user
90146
async login({ request, response, auth }) {
91147
if (!request.header('Authorization')) {
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
@layout('layouts.v2')
2+
3+
@section('content')
4+
<div class="w-screen bg-purple-200 flex items-center justify-center">
5+
<form class="w-full max-w-sm bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4"
6+
action="/websignup" method="POST">
7+
<h1 class="text-gray-700 text-center text-2xl pb-5">
8+
Signup for a Ferdium account
9+
</h1>
10+
<p class="text-gray-600 text-sm text-center py-2">
11+
Please provide your details so your Ferdium account can be created.
12+
</p>
13+
14+
@if(flashMessage('error'))
15+
<div class="bg-orange-100 border-l-4 border-orange-500 text-orange-700 p-4">
16+
{{ flashMessage('error') }}
17+
</div>
18+
@endif
19+
@if(old('message'))
20+
<div class="bg-orange-100 border-l-4 border-orange-500 text-orange-700 p-4">
21+
{{ old('message') }}
22+
</div>
23+
@endif
24+
25+
<div class="mb-4">
26+
<label class="block text-gray-700 text-sm font-bold mb-2" for="firstname">
27+
First Name
28+
</label>
29+
<input
30+
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
31+
id="firstname"
32+
name="firstname"
33+
type="text"
34+
placeholder="First Name"
35+
value="{{ old('firstname', '') }}"
36+
required>
37+
</div>
38+
<div class="mb-4">
39+
<label class="block text-gray-700 text-sm font-bold mb-2" for="lastname">
40+
Last Name
41+
</label>
42+
<input
43+
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
44+
id="lastname"
45+
name="lastname"
46+
type="text"
47+
placeholder="Last Name"
48+
value="{{ old('lastname', '') }}"
49+
required>
50+
</div>
51+
<div class="mb-4">
52+
<label class="block text-gray-700 text-sm font-bold mb-2" for="email">
53+
E-Mail
54+
</label>
55+
<input
56+
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
57+
id="email"
58+
name="email"
59+
type="text"
60+
placeholder="E-Mail"
61+
value="{{ old('email', '') }}"
62+
required>
63+
</div>
64+
<div class="mb-6">
65+
<label class="block text-gray-700 text-sm font-bold mb-2" for="password">
66+
Password
67+
</label>
68+
<input
69+
class="shadow appearance-none rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline"
70+
id="password"
71+
type="password"
72+
name="password"
73+
placeholder="*****"
74+
autocomplete="current-password"
75+
required>
76+
</div>
77+
<button
78+
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline"
79+
type="submit">
80+
Signup
81+
</button>
82+
<p class="text-gray-600 text-sm text-center py-2">
83+
By signing up for your Franz/Ferdi account, you accept the <a href="/terms">terms of service</a> and <a href="/privacy">privacy
84+
policy</a>
85+
</p>
86+
<div class="text-center">
87+
<a class="w-full font-bold text-sm text-blue-500 hover:text-blue-800" href="/user/login">
88+
Login to an existing account
89+
</a>
90+
</div>
91+
</form>
92+
</div>
93+
@endsection

start/routes.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ Route.get('new', ({ response, view }) => {
118118
Route.post('import', 'UserController.import');
119119
Route.get('import', ({ view }) => view.render('others.import'));
120120

121+
// Ferdium account signup
122+
Route.post('websignup', 'UserController.websignup');
123+
Route.get('websignup', ({ view }) => view.render('others.websignup'));
124+
121125
// Legal documents
122126
Route.get('terms', ({ response }) => response.redirect('/terms.html'));
123127
Route.get('privacy', ({ response }) => response.redirect('/privacy.html'));

0 commit comments

Comments
 (0)