Private
Public Access
1
0

refacto: Deleting email mentions as there's no emailing system

This commit is contained in:
gauvainboiche
2026-03-31 16:54:11 +02:00
parent 42e68db00b
commit 7fa41ef7ac
6 changed files with 22 additions and 21 deletions

View File

@@ -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>

View File

@@ -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 }),
}); });
} }

View File

@@ -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 = {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);