Skip to content

Commit 38f8e41

Browse files
authored
enhance account with a display name (#55)
1 parent 66469e6 commit 38f8e41

File tree

10 files changed

+53
-23
lines changed

10 files changed

+53
-23
lines changed

public/auth/sign_up.html

+7-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ <h1>Sign Up</h1>
2626
<i class="fa-solid fa-user"></i>
2727
<input type="text" placeholder="Username" id="username" class="input">
2828
</div>
29+
30+
<label for="display-name">Enter your display name</label>
31+
<div class="input-group">
32+
<i class="fa-solid fa-user"></i>
33+
<input type="text" placeholder="Display Name" id="display-name" class="input">
34+
</div>
2935
</div>
3036

3137
<div class="container">
@@ -60,4 +66,4 @@ <h1>Sign Up</h1>
6066
</main>
6167
</body>
6268

63-
</html>
69+
</html>

public/auth/sign_up.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ document.querySelector("#form").addEventListener("submit", async (e) => {
44
e.preventDefault();
55

66
const username = document.querySelector("#username").value;
7+
const display_name = document.querySelector("#display-name").value;
78
const password1 = document.querySelector("#password1").value;
89
const password2 = document.querySelector("#password2").value;
910

@@ -12,7 +13,7 @@ document.querySelector("#form").addEventListener("submit", async (e) => {
1213
return;
1314
}
1415

15-
const account = new NewAccount(username, password1);
16+
const account = new NewAccount(username, display_name, password1);
1617
const res = await create(account);
1718
if (res.ok) {
1819
window.location = "/index.html";

public/feed.html

+5-3
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ <h1><a href="/challenge.html">Weekly PushUps Challenge</a></h1>
4040

4141
<template id="post-template">
4242
<div class="container post">
43-
<div class="container">
44-
<div><b>Athlet:&nbsp;</b></div>
45-
<a class="post-athlete-link"><div class="post-name"></div></a>
43+
<div class="container flex-row">
44+
<!--<div><b>Athlet:&nbsp;</b></div>-->
45+
<div class="post-display-name"></div>
46+
&nbsp;
47+
<a class="post-athlete-link flex-row"><div class="post-username"></div>@sportsfriend</a>
4648
</div>
4749

4850
<div class="container">

public/feed.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ async function main() {
116116
let clone = post_template.content.cloneNode(true);
117117

118118
const athlete_link = `/athletes/${activity.author_id}`;
119-
const author_name = user_by_id.get(activity.author_id).username;
119+
const author = user_by_id.get(activity.author_id);
120120
let duration = "";
121121
{
122122
const diff = new Date(activity.end_time) - new Date(activity.start_time);
@@ -154,7 +154,8 @@ async function main() {
154154
}
155155

156156
clone.querySelector(".post").id = `${activity.id}`;
157-
clone.querySelector(".post-name").innerHTML = author_name;
157+
clone.querySelector(".post-username").innerHTML = author.username;
158+
clone.querySelector(".post-display-name").innerHTML = author.display_name;
158159
clone.querySelector(".post-athlete-link").href = athlete_link;
159160
clone.querySelector(".post-activity-type").innerHTML = activity.activity_type;
160161
clone.querySelector(".post-start-time").innerHTML = activity.start_time;

public/scripts/api/account.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
import {BASE_ACCOUNT_URL, STATUS, Result} from "./main.js"
22

33
export class Account {
4-
constructor(id, username, password_hash) {
4+
constructor(id, username, display_name, password_hash) {
55
this.id = id;
66
this.username = username;
7+
this.display_name = display_name;
78
this.password_hash = password_hash;
89
}
910
}
1011

1112
export class NewAccount {
12-
constructor(username, password) {
13+
constructor(username, display_name, password) {
1314
this.username = username;
15+
this.display_name = display_name;
1416
this.password = password;
1517
}
1618
}
1719

1820
export class EditAccount {
19-
constructor(username) {
21+
constructor(username, display_name) {
2022
this.username = username;
23+
this.display_name = display_name;
2124
}
2225
}
2326

@@ -45,7 +48,7 @@ export async function get() {
4548
let response = await fetch(request);
4649
if (response.status === STATUS.OK) {
4750
let value = await response.json();
48-
return new Result(true, new Account(value.id, value.username, value.password_hash));
51+
return new Result(true, new Account(value.id, value.username, value.display_name, value.password_hash));
4952
} else {
5053
let error = await response.text();
5154
return new Result(false, error);
@@ -68,7 +71,7 @@ export async function create(account) {
6871
let response = await fetch(request);
6972
if (response.status === STATUS.CREATED) {
7073
let value = await response.json();
71-
return new Result(true, new Account(value.id, value.username, value.password_hash));
74+
return new Result(true, new Account(value.id, value.username, value.display_name, value.password_hash));
7275
} else {
7376
let error = await response.text();
7477
return new Result(false, error);
@@ -91,7 +94,7 @@ export async function edit(account) {
9194
let response = await fetch(request);
9295
if (response.status === STATUS.OK) {
9396
let value = await response.json();
94-
return new Result(true, new Account(value.id, value.username, value.password_hash));
97+
return new Result(true, new Account(value.id, value.username, value.display_name, value.password_hash));
9598
} else {
9699
let error = await response.text();
97100
return new Result(false, error);
@@ -141,7 +144,7 @@ export async function remove(current_password) {
141144
let response = await fetch(request);
142145
if (response.status === STATUS.OK) {
143146
let value = await response.json();
144-
return new Result(true, new Account(value.id, value.username, value.password_hash));
147+
return new Result(true, new Account(value.id, value.username, value.display_name, value.password_hash));
145148
} else {
146149
let error = await response.text();
147150
return new Result(false, error);

public/scripts/api/auth.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export async function login(username, password) {
1818
let response = await fetch(request);
1919
if (response.status === STATUS.OK) {
2020
let value = await response.json();
21-
return new Result(true, new Account(value.id, value.username, value.password_hash));
21+
return new Result(true, new Account(value.id, value.username, value.display_name, value.password_hash));
2222
} else {
2323
let error = await response.text();
2424
return new Result(false, error);

public/scripts/api/users.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import {BASE_USERS_URL, STATUS, Result} from "./main.js";
22

33
export class User {
4-
constructor(id, username) {
4+
constructor(id, username, display_name) {
55
this.id = id;
66
this.username = username;
7+
this.display_name = display_name;
78
}
89
}
910

@@ -19,7 +20,7 @@ export async function get(username) {
1920
let response = await fetch(request);
2021
if (response.status === STATUS.OK) {
2122
let value = await response.json();
22-
return new Result(true, new User(value.id, value.username));
23+
return new Result(true, new User(value.id, value.username, value.display_name));
2324
} else {
2425
let error = await response.text();
2526
return new Result(false, error);
@@ -38,7 +39,7 @@ export async function get_id(id) {
3839
let response = await fetch(request);
3940
if (response.status === STATUS.OK) {
4041
let value = await response.json();
41-
return new Result(true, new User(value.id, value.username));
42+
return new Result(true, new User(value.id, value.username, value.display_name));
4243
} else {
4344
let error = await response.text();
4445
return new Result(false, error);

src/account.rs

+13
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use std::convert::Into;
1010
pub struct Account {
1111
pub id: i64,
1212
pub username: String,
13+
pub display_name: String,
1314
pub password_hash: String,
1415
}
1516

@@ -27,12 +28,22 @@ impl AuthUser<i64> for Account {
2728
#[derive(Deserialize)]
2829
pub struct EditAccount {
2930
pub username: String,
31+
pub display_name: String,
3032
}
3133

3234
/// Like `Account`, but instead of storing the password hash, it stores the plain-text password.
3335
/// Is used when the user logs-in or signs-up. !!Should not be used outside of these routes!!
3436
#[derive(Deserialize)]
3537
pub struct BareAccount {
38+
pub username: String,
39+
pub display_name: String,
40+
pub password: String,
41+
}
42+
43+
/// Like `Account`, but instead of storing the password hash, it stores the plain-text password.
44+
/// Is used when the user logs-in or signs-up. !!Should not be used outside of these routes!!
45+
#[derive(Deserialize)]
46+
pub struct LoginAccount {
3647
pub username: String,
3748
pub password: String,
3849
}
@@ -43,6 +54,7 @@ pub struct BareAccount {
4354
pub struct User {
4455
pub id: i64,
4556
pub username: String,
57+
pub display_name: String,
4658
}
4759

4860
/// Because a `User` is a subset of the `Account` we can convert any `Account` into a `User`.
@@ -51,6 +63,7 @@ impl From<Account> for User {
5163
Self {
5264
id: user.id,
5365
username: user.username,
66+
display_name: user.display_name,
5467
}
5568
}
5669
}

src/database.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ pub async fn init() -> Result<SqlitePool, sqlx::Error> {
3737
"CREATE TABLE IF NOT EXISTS 'users' (
3838
'id' INTEGER UNIQUE,
3939
'username' TEXT NOT NULL UNIQUE,
40+
'display_name' TEXT NOT NULL,
4041
'password_hash' TEXT NOT NULL UNIQUE,
4142
PRIMARY KEY('id' AUTOINCREMENT))",
4243
)
@@ -111,9 +112,10 @@ pub mod account {
111112
let password_hash = hasher::hash(&account.password);
112113

113114
let user: Account = sqlx::query_as(
114-
"INSERT INTO users (username, password_hash) VALUES ($1, $2) RETURNING *",
115+
"INSERT INTO users (username, display_name, password_hash) VALUES ($1, $2, $3) RETURNING *",
115116
)
116117
.bind(&account.username)
118+
.bind(&account.display_name)
117119
.bind(password_hash)
118120
.fetch_one(&mut connection)
119121
.await?;
@@ -130,8 +132,9 @@ pub mod account {
130132
let mut connection = pool.acquire().await?;
131133

132134
let result: Account =
133-
sqlx::query_as("UPDATE users SET username = $1 WHERE id = $2 RETURNING *")
135+
sqlx::query_as("UPDATE users SET username = $1, display_name = $2 WHERE id = $3 RETURNING *")
134136
.bind(&account.username)
137+
.bind(&account.display_name)
135138
.bind(id)
136139
.fetch_one(&mut connection)
137140
.await?;
@@ -210,7 +213,7 @@ pub mod user {
210213
}
211214
}
212215

213-
/// Checks weather a account/user (given by its is) exists
216+
/// Checks weather a account/user (given by its id) exists
214217
pub async fn exists_id(pool: SqlitePool, id: i64) -> bool {
215218
let user = get_id(pool, id).await;
216219
match user {

src/logic/auth.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::account::{Account, BareAccount};
1+
use crate::account::{Account, LoginAccount};
22
use crate::database;
33
use crate::hasher;
44

@@ -14,7 +14,7 @@ type AuthContext = axum_login::extractors::AuthContext<i64, Account, SqliteStore
1414
pub async fn login(
1515
State(pool): State<SqlitePool>,
1616
mut auth: AuthContext,
17-
Json(payload): Json<BareAccount>,
17+
Json(payload): Json<LoginAccount>,
1818
) -> impl IntoResponse {
1919
let user = match database::account::get(pool, &payload.username).await {
2020
Ok(user) => user,

0 commit comments

Comments
 (0)