From b04208106f2119a6a82b356dd8d1117426c00af2 Mon Sep 17 00:00:00 2001 From: BinarySandia04 Date: Sun, 29 Sep 2024 13:49:28 +0200 Subject: [PATCH] User rework falta nomes fer prompt de primera contrasenya i generar links --- backend/models/User.js | 2 +- backend/routes/admin.js | 67 ++++++++- backend/routes/user.js | 29 ++-- client/src/services/Windows.js | 15 +- client/src/views/partials/BigIconTemplate.vue | 14 +- client/src/views/partials/EditUserPartial.vue | 20 +-- .../src/views/windows/EditProfileWindow.vue | 26 +++- ...sterWindow.vue => FirstRegisterWindow.vue} | 12 +- client/src/views/windows/LoginWindow.vue | 19 +-- client/src/views/windows/MainMenuWindow.vue | 18 --- client/src/views/windows/SettingsWindow.vue | 24 +++- .../settings/AccountManagementWindow.vue | 35 ++++- .../windows/settings/RegisterUserWindow.vue | 135 ++++++++++++++++++ locales/ca.json | 11 ++ locales/en-US.json | 13 +- locales/es-ES.json | 11 ++ 16 files changed, 354 insertions(+), 97 deletions(-) rename client/src/views/windows/{RegisterWindow.vue => FirstRegisterWindow.vue} (90%) create mode 100644 client/src/views/windows/settings/RegisterUserWindow.vue diff --git a/backend/models/User.js b/backend/models/User.js index abac13be..9aeac942 100755 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -5,7 +5,7 @@ const UserSchema = new Schema({ name: {type: String, required: true}, username: { type: String, required: true, unique: true }, email: { type: String, required: true, unique: true }, - password: { type: String, required: true }, + password: { type: String }, date: { type: Date, default: Date.now}, admin: {type: Boolean, default: false}, image: { type: String }, diff --git a/backend/routes/admin.js b/backend/routes/admin.js index f6e00eea..4082883e 100644 --- a/backend/routes/admin.js +++ b/backend/routes/admin.js @@ -1,13 +1,76 @@ const express = require('express'); const router = express.Router(); + +const bcrypt = require('bcryptjs'); +const rateLimitMiddleware = require("../config/rate-limiter"); + const { isAdmin } = require('../config/middleware'); const User = require("../models/User"); +router.post('/register', rateLimitMiddleware, (req, res) => { + User.findOne({admin: true}).then((data) => { + if(!data) { + let { + name, + username, + email, + password + } = req.body; + + if(!(name && username && email && password)){ + res.json({ + error: true, + msg: "params" + }); + return; + } + + User.findOne({username: username}).then((user) => { + if(user){ + res.json({ + error: true, + msg: "already-exists" + }); + } else { + User.findOne({email: email}).then((user) => { + if(user){ + res.json({ + error: true, + msg: "already-email" + }); + } else { + var user = new User({ + name: name, + username: username, + password: password, + email: email, + admin: true + }); + + bcrypt.genSalt(10, (err, salt) => { + bcrypt.hash(user.password, salt, (err, hash) => { + if(err) throw err; + user.password = hash; + user.save().then(user => { + res.json({ + success: true + }); + return; + }).catch((error) => { res.json({ error: true }); return; }); + }); + }) + } + }).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; }); + } + }).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; }); + } + }); + +}); + router.get('/users', isAdmin, (req, res) => { - console.log("HJDSHAKJDHKH") User.find({}).then((users) => { - console.log("HJDSHAKJDHKH2") res.json({ users }); diff --git a/backend/routes/user.js b/backend/routes/user.js index ab02d20a..e0b21077 100755 --- a/backend/routes/user.js +++ b/backend/routes/user.js @@ -8,21 +8,20 @@ const secret = require('../config/keys').secret; const rateLimitMiddleware = require("../config/rate-limiter"); const { default: jwtDecode } = require('jwt-decode'); -const { hasUser } = require('../config/middleware'); +const { isAdmin } = require('../config/middleware'); const User = require("../models/User"); const upload = require("../config/storage"); -router.post('/register', rateLimitMiddleware, (req, res) => { +router.post('/register', isAdmin, (req, res) => { let { name, username, - email, - password + email } = req.body; - if(!(name && username && email && password)){ + if(!(name && username && email)){ res.json({ error: true, msg: "params" @@ -47,28 +46,20 @@ router.post('/register', rateLimitMiddleware, (req, res) => { var user = new User({ name: name, username: username, - password: password, email: email, admin: true }); - - bcrypt.genSalt(10, (err, salt) => { - bcrypt.hash(user.password, salt, (err, hash) => { - if(err) throw err; - user.password = hash; - user.save().then(user => { - res.json({ - success: true - }); - return; - }).catch((error) => { res.json({ error: true }); return; }); + + user.save().then(user => { + res.json({ + status: "ok", + user }); }) } }).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; }); } - }).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; }); - + }).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; }); }); router.post('/login', rateLimitMiddleware, (req, res) => { diff --git a/client/src/services/Windows.js b/client/src/services/Windows.js index 23feba51..88742f1e 100644 --- a/client/src/services/Windows.js +++ b/client/src/services/Windows.js @@ -4,7 +4,6 @@ import { Disconnect } from './Campaign'; const windows = ref([]); import LoginWindow from '@/views/windows/LoginWindow.vue' -import RegisterWindow from '@/views/windows/RegisterWindow.vue' import ExampleWindow from '@/views/windows/ExampleWindow.vue' import MainMenuWindow from '@/views/windows/MainMenuWindow.vue' import EditProfileWindow from '@/views/windows/EditProfileWindow.vue' @@ -30,13 +29,16 @@ import DatabaseWindow from '@/views/windows/game/DatabaseWindow.vue' import AccountManagementWindow from '@/views/windows/settings/AccountManagementWindow.vue' import PluginManagementWindow from '@/views/windows/settings/PluginManagementWindow.vue' import PluginWindow from '../views/windows/settings/PluginWindow.vue'; +import FirstRegisterWindow from '../views/windows/FirstRegisterWindow.vue'; +import RegisterUserWindow from '../views/windows/settings/RegisterUserWindow.vue'; let windowMap = { test: ExampleWindow, login: LoginWindow, main_menu: MainMenuWindow, welcome: WelcomeWindow, - register: RegisterWindow, + first_register: FirstRegisterWindow, + register_user: RegisterUserWindow, edit_profile: EditProfileWindow, settings: SettingsWindow, campaign_list: CampaignListWindow, @@ -80,8 +82,8 @@ const defValues = { id: 'login', title: 'Login', }, - 'register': { - id: 'register', + 'first_register': { + id: 'first_register', title: 'register-admin.title', }, 'main_menu': { @@ -101,11 +103,6 @@ const defValues = { title: "Edit Profile", close: () => ClearWindow('edit_profile') }, - 'settings': { - id: 'settings', - title: 'settings.title', - close: () => ClearWindow('settings') - }, 'campaign_list': { id: 'campaign_list', title: 'campaigns.title', diff --git a/client/src/views/partials/BigIconTemplate.vue b/client/src/views/partials/BigIconTemplate.vue index 9bdf28c3..7bc06cd8 100644 --- a/client/src/views/partials/BigIconTemplate.vue +++ b/client/src/views/partials/BigIconTemplate.vue @@ -1,11 +1,22 @@