Browse Source

fix: port exposed

feat: config dao, service, controller and routes
feat: manage starting date raid for retreiving bis list
feat: fusion of ring and trinket stats
master
sebastien.cassan@geomod.fr 1 year ago
parent
commit
19f6759bc8
  1. 2
      Dockerfile
  2. 2
      configuration/server.config.js
  3. 27
      controllers/config.controller.js
  4. 6
      controllers/suivi.controller.js
  5. 76
      dao/config.dao.js
  6. 16
      dao/roster.dao.js
  7. 22
      database/migrations/20241004120002-add-config.js
  8. 15
      database/seeders/development/20241004120712-add_initial_config.js
  9. 15
      database/seeders/production/20241004120712-add_initial_config.js
  10. 47
      package-lock.json
  11. 15
      routes/suivi.routes.js
  12. 18
      services/config.service.js
  13. 4
      services/suivi.service.js

2
Dockerfile

@ -37,6 +37,6 @@ RUN mv /opt/database/suiviLootWow.db /opt/schema/suiviLootWow.db
COPY ./docker-entrypoint.sh /docker-entrypoint.sh COPY ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh RUN chmod +x /docker-entrypoint.sh
EXPOSE 3021 EXPOSE 3201
ENTRYPOINT "/docker-entrypoint.sh" ENTRYPOINT "/docker-entrypoint.sh"

2
configuration/server.config.js

@ -3,7 +3,7 @@ export default {
secret: 'e8p$2!76QKq%Wi3q8sU#qwvXqX2o2%mz', secret: 'e8p$2!76QKq%Wi3q8sU#qwvXqX2o2%mz',
database: { database: {
development: { development: {
path: 'D:/ProjetWeb/suivi-loot-wow-api/suiviLootWow.db' path: './suiviLootWow.db'
}, },
production: { production: {
path: '/opt/database/suiviLootWow.db' path: '/opt/database/suiviLootWow.db'

27
controllers/config.controller.js

@ -0,0 +1,27 @@
import configService from '../services/config.service.js';
import typesError from '../error/types.error.js';
const getConfig = async (request, reply) => {
try {
const config = await configService.getConfig()
return reply.code(200).send({ config: config.toJson() })
} catch (e) {
return reply.code(500).send({ message: e.message })
}
}
const updateConfig = async (request, reply) => {
const newConfig = request.body
try {
await configService.updateConfig(newConfig)
return reply.code(200).send({ success: true })
} catch (e) {
return reply.code(500).send({ message: typesError.TECHNICAL_UNKNOWN })
}
}
export default {
getConfig,
updateConfig
}

6
controllers/suivi.controller.js

@ -1,4 +1,5 @@
import suiviService from '../services/suivi.service.js'; import suiviService from '../services/suivi.service.js';
import configService from '../services/config.service.js';
import typesError from '../error/types.error.js'; import typesError from '../error/types.error.js';
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
@ -108,7 +109,10 @@ const deleteHistories = async (request, reply) => {
const getBisList = async (request, reply) => { const getBisList = async (request, reply) => {
try { try {
const bisList = await suiviService.getBisList() const config = await configService.getConfig()
const config_ = config.toJson()
const raidDate = config_.startingDateRaid
const bisList = await suiviService.getBisList(raidDate)
return reply.code(200).send({ bis: bisList }) return reply.code(200).send({ bis: bisList })
} catch (e) { } catch (e) {
return reply.code(500).send({ message: e.message }) return reply.code(500).send({ message: e.message })

76
dao/config.dao.js

@ -0,0 +1,76 @@
import sqlite3 from 'sqlite3'
import bcrypt from 'bcryptjs'
import ErrorType from '../error/types.error.js'
import serverConfig from '../configuration/server.config.js'
sqlite3.verbose()
const tableName = 'Config'
class Config {
constructor(options = {}) {
this.id = options.id
this.startingDateRaid = options.startingDateRaid
}
static find() {
return new Promise((resolve, reject) => {
const db = openDB()
db.serialize(() => {
db.all(`SELECT * FROM ${tableName}`, (err, configs) => {
if (err) reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
else {
if (configs.length) {
const config = createConfigFromDB(configs[0])
resolve(config);
} else reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
}
})
closeDB(db)
})
})
}
async update() {
return new Promise((resolve, reject) => {
const db = openDB();
db.serialize(() => {
db.run(`UPDATE ${tableName} SET startingDateRaid = ${this.startingDateRaid} WHERE id = ${this.id}`, err => {
if (err) reject(new Error(ErrorType.TECHNICAL_UNKNOWN))
else resolve()
})
})
closeDB(db)
})
}
toJson() {
return {
id: this.id,
startingDateRaid: this.startingDateRaid
}
}
}
export default Config
function openDB() {
const env = process.env.NODE_ENV || 'development'
return new sqlite3.Database(serverConfig.database[env].path, err => {
if (err) throw new Error(err)
})
}
function closeDB(db) {
db.close(err => {
if (err) throw new Error(err)
})
}
function createConfigFromDB(dbUser) {
return new Config({
id: dbUser.id,
startingDateRaid: dbUser.startingDateRaid
})
}

16
dao/roster.dao.js

@ -36,7 +36,7 @@ class Roster {
}) })
} }
static getBisData() { static getBisData(raidDate) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const db = openDB() const db = openDB()
db.serialize(() => { db.serialize(() => {
@ -56,7 +56,7 @@ FROM
${tableName} ${tableName}
LEFT JOIN LEFT JOIN
${historyTableName} ON ${tableName}.name = ${historyTableName}.name ${historyTableName} ON ${tableName}.name = ${historyTableName}.name
WHERE ${historyTableName}.response = 'Bis' WHERE ${historyTableName}.response = 'Bis' and ${historyTableName}.fullDate >= ${raidDate}
GROUP BY GROUP BY
${tableName}.name, ${tableName}.classe; ${tableName}.name, ${tableName}.classe;
` `
@ -146,10 +146,8 @@ function createBisFromDB(res) {
taille: 0, taille: 0,
jambes: 0, jambes: 0,
pied: 0, pied: 0,
doigt1: 0, doigt: 0,
doigt2: 0, bijou: 0,
bijou1: 0,
bijou2: 0,
arme: 0, arme: 0,
mainGauche: 0, mainGauche: 0,
relique: 0 relique: 0
@ -201,13 +199,11 @@ function createBisFromDB(res) {
totalBIS += 1 totalBIS += 1
break break
case 'Doigt': case 'Doigt':
if (data.doigt1 === 0) data.doigt1 += 1 data.doigt += 1
else data.doigt2 += 1
totalBIS += 1 totalBIS += 1
break break
case 'Bijou': case 'Bijou':
if (data.bijou1 === 0) data.bijou1 += 1 data.bijou += 1
else data.bijou2 += 1
totalBIS += 1 totalBIS += 1
break break
case 'À une main': case 'À une main':

22
database/migrations/20241004120002-add-config.js

@ -0,0 +1,22 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.createTable('Config', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
startingDateRaid: {
type: Sequelize.INTEGER
}
});
},
async down (queryInterface, Sequelize) {
await queryInterface.dropTable('Config');
}
};

15
database/seeders/development/20241004120712-add_initial_config.js

@ -0,0 +1,15 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.bulkInsert('Config', [{
id: 1,
startingDateRaid: 1717020000000,
}], {})
},
async down (queryInterface, Sequelize) {
await queryInterface.bulkDelete('Config', null, {})
}
};

15
database/seeders/production/20241004120712-add_initial_config.js

@ -0,0 +1,15 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.bulkInsert('Config', [{
id: 1,
startingDateRaid: 1717020000,
}], {})
},
async down (queryInterface, Sequelize) {
await queryInterface.bulkDelete('Config', null, {})
}
};

47
package-lock.json generated

@ -310,30 +310,10 @@
"@types/ms": "*" "@types/ms": "*"
} }
}, },
"node_modules/@types/eslint": {
"version": "8.56.10",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
"dev": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.7",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"dev": true,
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": { "node_modules/@types/estree": {
"version": "1.0.5", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true "dev": true
}, },
"node_modules/@types/json-schema": { "node_modules/@types/json-schema": {
@ -1402,9 +1382,9 @@
} }
}, },
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.17.0", "version": "5.17.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
"integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
@ -1759,9 +1739,9 @@
} }
}, },
"node_modules/find-my-way": { "node_modules/find-my-way": {
"version": "8.2.0", "version": "8.2.2",
"resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.2.tgz",
"integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", "integrity": "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==",
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"fast-querystring": "^1.0.0", "fast-querystring": "^1.0.0",
@ -4429,12 +4409,11 @@
} }
}, },
"node_modules/webpack": { "node_modules/webpack": {
"version": "5.93.0", "version": "5.95.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz",
"integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.5", "@types/estree": "^1.0.5",
"@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/ast": "^1.12.1",
"@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1",
@ -4443,7 +4422,7 @@
"acorn-import-attributes": "^1.9.5", "acorn-import-attributes": "^1.9.5",
"browserslist": "^4.21.10", "browserslist": "^4.21.10",
"chrome-trace-event": "^1.0.2", "chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.0", "enhanced-resolve": "^5.17.1",
"es-module-lexer": "^1.2.1", "es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1", "eslint-scope": "5.1.1",
"events": "^3.2.0", "events": "^3.2.0",

15
routes/suivi.routes.js

@ -1,5 +1,6 @@
import suiviController from '../controllers/suivi.controller.js'; import suiviController from '../controllers/suivi.controller.js';
import securityService from '../services/security.service.js'; import securityService from '../services/security.service.js';
import configController from '../controllers/config.controller.js';
const suiviRoutes = async (app) => { const suiviRoutes = async (app) => {
app.route({ app.route({
@ -47,6 +48,20 @@ const suiviRoutes = async (app) => {
url: '/bisList', url: '/bisList',
handler: suiviController.getBisList handler: suiviController.getBisList
}); });
app.route({
method: 'GET',
url: '/config',
preHandler: securityService.checkJWT,
handler: configController.getConfig
});
app.route({
method: 'POST',
url: '/config',
preHandler: securityService.checkJWT,
handler: configController.updateConfig
})
}; };
export default suiviRoutes; export default suiviRoutes;

18
services/config.service.js

@ -0,0 +1,18 @@
import Config from '../dao/config.dao.js'
async function getConfig() {
return Config.find()
}
async function updateConfig(options) {
const config = new Config({
id: options.id,
startingDateRaid: options.startingDateRaid
})
await config.update()
}
export default {
getConfig,
updateConfig
}

4
services/suivi.service.js

@ -49,8 +49,8 @@ async function removeHistory(id) {
return history return history
} }
async function getBisList() { async function getBisList(raidDate) {
return Roster.getBisData() return Roster.getBisData(raidDate)
} }
export default { export default {

Loading…
Cancel
Save