From 5e01d358204540965455f27c5402b5acee769e59 Mon Sep 17 00:00:00 2001 From: STEINNI Date: Sun, 12 Oct 2025 19:45:57 +0000 Subject: [PATCH] api in groups + agents types & sprites --- api/agents.js | 41 ++++++++++++ api/index.js | 14 ++++ api/users.js | 156 +++++++++++++++++++++++++++++++++++++++++++++ p42ApiEndpoints.js | 156 ++------------------------------------------- p42api.js | 4 +- 5 files changed, 218 insertions(+), 153 deletions(-) create mode 100644 api/agents.js create mode 100644 api/index.js create mode 100644 api/users.js diff --git a/api/agents.js b/api/agents.js new file mode 100644 index 0000000..32971dc --- /dev/null +++ b/api/agents.js @@ -0,0 +1,41 @@ +import { authGuard } from '../authGuard.js' + +export const mappings = [ + { method: 'get', url:'/agent-types', handler: 'getAgentTypes', middlewares: [authGuard]}, + { method: 'get', url:'/agent-sprites/:group', handler: 'getAgentSprites', middlewares: [authGuard]}, +] + +export const methods = { + async getAgentTypes(req, res) { + let results + if(req.params.family){ + results = await this.db.execute(` + SELECT * + FROM p42SIM.agent_types + WHERE atp_fam_name = ? + `, [req.params.family]) + + } else { + results = await this.db.execute(`SELECT * FROM p42SIM.agent_types`, []) + } + + this.ok(req, res, { + agentTypes : results + }) + }, + + async getAgentSprites(req, res) { + const results = await this.db.execute(` + SELECT * + FROM p42SIM.agent_types + LEFT JOIN p42GUI.agents_sprites on asp_atp_id = atp_id + WHERE asp_group = ?`, [req.params.group]) + const fullObj = {} + for(const row of results){ + fullObj[row.atp_name] = row.asp_3d + } + this.ok(req, res, { + agentSprites: fullObj + }) + }, +} \ No newline at end of file diff --git a/api/index.js b/api/index.js new file mode 100644 index 0000000..a6ddd9b --- /dev/null +++ b/api/index.js @@ -0,0 +1,14 @@ +import { methods as userMethods, mappings as userMappings } from './users.js' +import { methods as agentMethods, mappings as agentMappings } from './agents.js' + +export const apiMappings = [ + ...userMappings, + ...agentMappings, +] + +export const apiMethods = { + ...userMethods, + ...agentMethods, +} + + diff --git a/api/users.js b/api/users.js new file mode 100644 index 0000000..d50b44e --- /dev/null +++ b/api/users.js @@ -0,0 +1,156 @@ +import { authGuard } from '../authGuard.js' +import { verifyPassword } from '../helpers/pwd.js' + +export const mappings = [ + { method: 'get', url:'/checkauth', handler: 'checkauth', middlewares: []}, + { method: 'post', url:'/login', handler: 'login', middlewares: []}, + { method: 'get', url:'/logout', handler: 'logout', middlewares: []}, + { method: 'get', url:'/preferences', handler: 'getPrefs', middlewares: [authGuard]}, + { method: 'put', url:'/preferences', handler: 'setPrefs', middlewares: [authGuard]}, +] + +export const methods = { + async checkauth(req, res) { + if(req.session.userInfos && req.session.authenticated && req.session.userInfos && req.session.userInfos.identity && req.session.userInfos.identity.username) { + this.ok(req, res, { + authenticated: true, + userInfos: req.session.userInfos, + trials: 3, + locked: false, + }) + } else { + let trials = 3 + let locked = false + if(req.session.userInfos && req.session.userInfos.identity && req.session.userInfos.identity.username) { + const results = await this.db.execute('SELECT usr_trials, usr_locked FROM users WHERE usr_name = ?', [req.session.userInfos.username]) + if(results.length==1){ + trials = results[0].usr_trials + locked = results[0].usr_locked + } + } + this.ok(req, res, { + authenticated: false, + userInfos: null, + trials: trials, + locked: locked, + }) + } + + }, + + async setUserLock(username, locked, trials){ + await this.db.execute('UPDATE users SET usr_locked=?, usr_trials=? WHERE usr_name = ?', [locked, trials, username]) + }, + + async login(req, res) { + let [isValid, payload, errors] = this.utils.validateMapObject(req.body, { + username: ((val, obj) => (typeof(val)=='string') && (val.length>0) && (/^\w+$/.test(val))), + passwd: ((val, obj) => (typeof(val)=='string') && (val.length>0) ), + },{ + 'username': 'username', + 'passwd': 'passwd', + }) + + if((!isValid)){ + this.err(req, res, `Invalid request`, `Invalid login payload:: ${errors}`, 401) + return + } + + const results = await this.db.execute('SELECT * FROM users WHERE usr_name = ?', [payload.username]) + let pwdCheck = false + let userLocked = false + let trials = 3 + if(results.length==1){ + userLocked = results[0].usr_locked + trials = results[0].usr_trials + if(userLocked) { + this.ok(req, res, { + authenticated: false, + userInfos: null, + trials: 0, + locked: true, + }) + return + } + } + + if(results.length>0) pwdCheck = await verifyPassword(payload.passwd, results[0].usr_pwd) + if(pwdCheck){ + req.session.userInfos = { + identity:{ + username: payload.username, + uuid: results[0].usr_uuid, + }, + roles: ['admin'], + } + req.session.authenticated = true + + await this.setUserLock(payload.username, false, 3) + this.ok(req, res, { + authenticated: true, + userInfos: req.session.userInfos, + trials: 3, + locked: false, + }) + } else { + let newtrials = (trials>0) ? trials-1 : 0 + if(newtrials == 0){ + await this.setUserLock(payload.username, true, 0) + this.ok(req, res, { + authenticated: false, + userInfos: null, + trials: 0, + locked: true, + }) + return + } else { + await this.setUserLock(payload.username, false, newtrials) + } + + req.session.authenticated = false + req.session.userInfos = null + this.ok(req, res, { + authenticated: false, + userInfos: null, + trials: newtrials, + locked: false, + }) + } + }, + + async logout(req, res) { + if(req.session.userInfos && req.session.authenticated) { + req.session.authenticated = false + this.ok(req, res, { + authenticated: false, + userInfos: null, + trials: 3, + locked: false, + }) + } + + }, + + async getPrefs(req, res) { + const results = await this.db.execute(` + SELECT * FROM preferences + LEFT JOIN users ON prf_usr_id=usr_id + WHERE usr_uuid = ? + `, [req.session.userInfos.identity.uuid]) + let prefs = {} + if(results.length){ prefs = results[0].prf_value } + this.ok(req, res, prefs) + }, + + + async setPrefs(req, res) { + const results = await this.db.execute(` + INSERT INTO preferences (prf_usr_id, prf_value) + SELECT usr_id, ? + FROM users + WHERE usr_uuid = ? + ON DUPLICATE KEY UPDATE prf_value = ? + `, [req.body, req.session.userInfos.identity.uuid, req.body]) + this.ok(req, res, {}) + }, +} \ No newline at end of file diff --git a/p42ApiEndpoints.js b/p42ApiEndpoints.js index 019ba46..c3d446c 100644 --- a/p42ApiEndpoints.js +++ b/p42ApiEndpoints.js @@ -1,7 +1,6 @@ import { Utils } from './helpers/utils.js' -import { verifyPassword } from './helpers/pwd.js' import { MySQLClient } from './helpers/mysqlClient.js' -import { authGuard } from './authGuard.js' +import { apiMethods, apiMappings } from './api/index.js' export class P42ApiEndpoints{ constructor(app, db) { @@ -9,15 +8,14 @@ export class P42ApiEndpoints{ this.app = app this.userinfos = null this.utils = new Utils() + Object.assign(this, apiMethods) this.registerPaths() } registerPaths(){ - this.app.get('/checkauth', this.checkauth.bind(this)) - this.app.post('/login', this.login.bind(this)) - this.app.get('/logout', this.logout.bind(this)) - this.app.get('/preferences', authGuard, this.getPrefs.bind(this)) - this.app.put('/preferences', authGuard, this.setPrefs.bind(this)) + for(const apiEntry of apiMappings){ + this.app[apiEntry.method](apiEntry.url, apiEntry.middlewares, this[apiEntry.handler].bind(this)) + } } err(req, res, msg, debug, status=500) { @@ -60,148 +58,4 @@ export class P42ApiEndpoints{ return(false) } -///////////////////////////API starts here...///////////////////////////// - async checkauth(req, res) { - if(req.session.userInfos && req.session.authenticated && req.session.userInfos && req.session.userInfos.identity && req.session.userInfos.identity.username) { - this.ok(req, res, { - authenticated: true, - userInfos: req.session.userInfos, - trials: 3, - locked: false, - }) - } else { - let trials = 3 - let locked = false - if(req.session.userInfos && req.session.userInfos.identity && req.session.userInfos.identity.username) { - const results = await this.db.execute('SELECT usr_trials, usr_locked FROM users WHERE usr_name = ?', [req.session.userInfos.username]) - if(results.length==1){ - trials = results[0].usr_trials - locked = results[0].usr_locked - } - } - this.ok(req, res, { - authenticated: false, - userInfos: null, - trials: trials, - locked: locked, - }) - } - - } - - async setUserLock(username, locked, trials){ - await this.db.execute('UPDATE users SET usr_locked=?, usr_trials=? WHERE usr_name = ?', [locked, trials, username]) - } - - async login(req, res) { - let [isValid, payload, errors] = this.utils.validateMapObject(req.body, { - username: ((val, obj) => (typeof(val)=='string') && (val.length>0) && (/^\w+$/.test(val))), - passwd: ((val, obj) => (typeof(val)=='string') && (val.length>0) ), - },{ - 'username': 'username', - 'passwd': 'passwd', - }) - - if((!isValid)){ - this.err(req, res, `Invalid request`, `Invalid login payload:: ${errors}`, 401) - return - } - - const results = await this.db.execute('SELECT * FROM users WHERE usr_name = ?', [payload.username]) - let pwdCheck = false - let userLocked = false - let trials = 3 - if(results.length==1){ - userLocked = results[0].usr_locked - trials = results[0].usr_trials - if(userLocked) { - this.ok(req, res, { - authenticated: false, - userInfos: null, - trials: 0, - locked: true, - }) - return - } - } - - if(results.length>0) pwdCheck = await verifyPassword(payload.passwd, results[0].usr_pwd) - if(pwdCheck){ - req.session.userInfos = { - identity:{ - username: payload.username, - uuid: results[0].usr_uuid, - }, - roles: ['admin'], - } - req.session.authenticated = true - - await this.setUserLock(payload.username, false, 3) - this.ok(req, res, { - authenticated: true, - userInfos: req.session.userInfos, - trials: 3, - locked: false, - }) - } else { - let newtrials = (trials>0) ? trials-1 : 0 - if(newtrials == 0){ - await this.setUserLock(payload.username, true, 0) - this.ok(req, res, { - authenticated: false, - userInfos: null, - trials: 0, - locked: true, - }) - return - } else { - await this.setUserLock(payload.username, false, newtrials) - } - - req.session.authenticated = false - req.session.userInfos = null - this.ok(req, res, { - authenticated: false, - userInfos: null, - trials: newtrials, - locked: false, - }) - } - } - - async logout(req, res) { - if(req.session.userInfos && req.session.authenticated) { - req.session.authenticated = false - this.ok(req, res, { - authenticated: false, - userInfos: null, - trials: 3, - locked: false, - }) - } - - } - - async getPrefs(req, res) { - const results = await this.db.execute(` - SELECT * FROM preferences - LEFT JOIN users ON prf_usr_id=usr_id - WHERE usr_uuid = ? - `, [req.session.userInfos.identity.uuid]) - let prefs = {} - if(results.length){ prefs = results[0].prf_value } - this.ok(req, res, prefs) - } - - - async setPrefs(req, res) { - const results = await this.db.execute(` - INSERT INTO preferences (prf_usr_id, prf_value) - SELECT usr_id, ? - FROM users - WHERE usr_uuid = ? - ON DUPLICATE KEY UPDATE prf_value = ? - `, [req.body, req.session.userInfos.identity.uuid, req.body]) - this.ok(req, res, {}) - } } diff --git a/p42api.js b/p42api.js index 890807c..4e3304a 100755 --- a/p42api.js +++ b/p42api.js @@ -23,7 +23,7 @@ const mysqlCreds = { socketPath: '/var/run/mysqld/mysqld.sock', user: 'p42', password: 'C3h=V9!r>Mvc>skxPf9?W2P3duJTk', - database: 'p42', + database: 'p42GUI', waitForConnections: true, connectionLimit: 10, queueLimit: 0 @@ -44,7 +44,7 @@ const sessionStore = new MySQLStore({ createDatabaseTable: false, clearExpired: true, schema: { - tableName: 'p42_sessions', + tableName: 'sessions', columnNames: { session_id: 'session_id', expires: 'expires',