refacto: Deleting email mentions as there's no emailing system
This commit is contained in:
@@ -35,10 +35,6 @@
|
|||||||
<label>Nom d'utilisateur</label>
|
<label>Nom d'utilisateur</label>
|
||||||
<input type="text" id="regUsername" autocomplete="username" required />
|
<input type="text" id="regUsername" autocomplete="username" required />
|
||||||
</div>
|
</div>
|
||||||
<div class="authField">
|
|
||||||
<label>Adresse courriel</label>
|
|
||||||
<input type="email" id="regEmail" autocomplete="email" required />
|
|
||||||
</div>
|
|
||||||
<div class="authField">
|
<div class="authField">
|
||||||
<label>Mot de passe <span class="authHint">(6 caractères min.)</span></label>
|
<label>Mot de passe <span class="authHint">(6 caractères min.)</span></label>
|
||||||
<input type="password" id="regPassword" autocomplete="new-password" required />
|
<input type="password" id="regPassword" autocomplete="new-password" required />
|
||||||
@@ -64,6 +60,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<p class="authNotice">⚠ En cas d'oubli du mot de passe, aucune récupération n'est possible.</p>
|
||||||
<div class="authError hidden" id="registerError"></div>
|
<div class="authError hidden" id="registerError"></div>
|
||||||
<button type="submit" class="authSubmit">Créer le compte</button>
|
<button type="submit" class="authSubmit">Créer le compte</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -42,11 +42,11 @@ export async function apiLogin(username, password) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function apiRegister(username, email, password, team) {
|
export async function apiRegister(username, password, team) {
|
||||||
return fetch("/api/auth/register", {
|
return fetch("/api/auth/register", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
body: JSON.stringify({ username, email, password, team }),
|
body: JSON.stringify({ username, password, team }),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ const loginUsernameEl = document.getElementById("loginUsername");
|
|||||||
const loginPasswordEl = document.getElementById("loginPassword");
|
const loginPasswordEl = document.getElementById("loginPassword");
|
||||||
const loginErrorEl = document.getElementById("loginError");
|
const loginErrorEl = document.getElementById("loginError");
|
||||||
const regUsernameEl = document.getElementById("regUsername");
|
const regUsernameEl = document.getElementById("regUsername");
|
||||||
const regEmailEl = document.getElementById("regEmail");
|
|
||||||
const regPasswordEl = document.getElementById("regPassword");
|
const regPasswordEl = document.getElementById("regPassword");
|
||||||
const registerErrorEl = document.getElementById("registerError");
|
const registerErrorEl = document.getElementById("registerError");
|
||||||
const regCountBlueEl = document.getElementById("regCountBlue");
|
const regCountBlueEl = document.getElementById("regCountBlue");
|
||||||
@@ -126,12 +125,11 @@ registerForm.addEventListener("submit", async (e) => {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
clearError(registerErrorEl);
|
clearError(registerErrorEl);
|
||||||
const username = regUsernameEl.value.trim();
|
const username = regUsernameEl.value.trim();
|
||||||
const email = regEmailEl.value.trim();
|
|
||||||
const password = regPasswordEl.value;
|
const password = regPasswordEl.value;
|
||||||
const teamInput = registerForm.querySelector('input[name="regTeam"]:checked');
|
const teamInput = registerForm.querySelector('input[name="regTeam"]:checked');
|
||||||
if (!teamInput) { showError(registerErrorEl, "Please choose a team."); return; }
|
if (!teamInput) { showError(registerErrorEl, "Please choose a team."); return; }
|
||||||
try {
|
try {
|
||||||
const res = await apiRegister(username, email, password, teamInput.value);
|
const res = await apiRegister(username, password, teamInput.value);
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
const msgs = {
|
const msgs = {
|
||||||
|
|||||||
@@ -182,6 +182,14 @@ body {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.authNotice {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 11px;
|
||||||
|
color: rgba(255, 193, 113, 0.85);
|
||||||
|
text-align: center;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
.authSubmit {
|
.authSubmit {
|
||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ export async function initUsersSchema() {
|
|||||||
CREATE TABLE IF NOT EXISTS users (
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
username TEXT NOT NULL UNIQUE,
|
username TEXT NOT NULL UNIQUE,
|
||||||
email TEXT NOT NULL UNIQUE,
|
|
||||||
password_hash TEXT NOT NULL,
|
password_hash TEXT NOT NULL,
|
||||||
team TEXT NOT NULL CHECK (team IN ('blue', 'red')),
|
team TEXT NOT NULL CHECK (team IN ('blue', 'red')),
|
||||||
role TEXT NOT NULL DEFAULT 'user' CHECK (role IN ('user', 'admin')),
|
role TEXT NOT NULL DEFAULT 'user' CHECK (role IN ('user', 'admin')),
|
||||||
@@ -18,19 +17,19 @@ export async function initUsersSchema() {
|
|||||||
|
|
||||||
// ── Queries ───────────────────────────────────────────────────────────────────
|
// ── Queries ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
export async function createUser(username, email, passwordHash, team) {
|
export async function createUser(username, passwordHash, team) {
|
||||||
const { rows } = await usersPool.query(
|
const { rows } = await usersPool.query(
|
||||||
`INSERT INTO users (username, email, password_hash, team)
|
`INSERT INTO users (username, password_hash, team)
|
||||||
VALUES ($1, $2, $3, $4)
|
VALUES ($1, $2, $3)
|
||||||
RETURNING id, username, email, team, role`,
|
RETURNING id, username, team, role`,
|
||||||
[username, email, passwordHash, team]
|
[username, passwordHash, team]
|
||||||
);
|
);
|
||||||
return rows[0];
|
return rows[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getUserByUsername(username) {
|
export async function getUserByUsername(username) {
|
||||||
const { rows } = await usersPool.query(
|
const { rows } = await usersPool.query(
|
||||||
`SELECT id, username, email, team, role, password_hash FROM users WHERE username = $1`,
|
`SELECT id, username, team, role, password_hash FROM users WHERE username = $1`,
|
||||||
[username]
|
[username]
|
||||||
);
|
);
|
||||||
return rows[0] ?? null;
|
return rows[0] ?? null;
|
||||||
@@ -38,7 +37,7 @@ export async function getUserByUsername(username) {
|
|||||||
|
|
||||||
export async function getUserById(id) {
|
export async function getUserById(id) {
|
||||||
const { rows } = await usersPool.query(
|
const { rows } = await usersPool.query(
|
||||||
`SELECT id, username, email, team, role FROM users WHERE id = $1`,
|
`SELECT id, username, team, role FROM users WHERE id = $1`,
|
||||||
[id]
|
[id]
|
||||||
);
|
);
|
||||||
return rows[0] ?? null;
|
return rows[0] ?? null;
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ function issueToken(user) {
|
|||||||
|
|
||||||
// POST /api/auth/register
|
// POST /api/auth/register
|
||||||
router.post("/register", async (req, res) => {
|
router.post("/register", async (req, res) => {
|
||||||
const { username, email, password, team } = req.body ?? {};
|
const { username, password, team } = req.body ?? {};
|
||||||
if (!username || !email || !password || !team) {
|
if (!username || !password || !team) {
|
||||||
return res.status(400).json({ error: "missing_fields" });
|
return res.status(400).json({ error: "missing_fields" });
|
||||||
}
|
}
|
||||||
if (team !== "blue" && team !== "red") {
|
if (team !== "blue" && team !== "red") {
|
||||||
@@ -31,7 +31,7 @@ router.post("/register", async (req, res) => {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const passwordHash = await bcrypt.hash(password, 12);
|
const passwordHash = await bcrypt.hash(password, 12);
|
||||||
const user = await createUser(username.trim(), email.trim().toLowerCase(), passwordHash, team);
|
const user = await createUser(username.trim(), passwordHash, team);
|
||||||
const token = issueToken(user);
|
const token = issueToken(user);
|
||||||
return res.status(201).json({
|
return res.status(201).json({
|
||||||
token,
|
token,
|
||||||
@@ -39,7 +39,6 @@ router.post("/register", async (req, res) => {
|
|||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.code === "23505") {
|
if (e.code === "23505") {
|
||||||
if (e.constraint?.includes("email")) return res.status(409).json({ error: "email_taken" });
|
|
||||||
return res.status(409).json({ error: "username_taken" });
|
return res.status(409).json({ error: "username_taken" });
|
||||||
}
|
}
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
|||||||
Reference in New Issue
Block a user