db.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. const fs = require('fs');
  2. const sqlite = require('sqlite3');
  3. const crypto = require('crypto');
  4. const sql = require('./sql');
  5. // Indique si un fichier existe
  6. function fileExist(path) {
  7. try {
  8. return fs.existsSync(path);
  9. } catch (err) {
  10. return false;
  11. }
  12. }
  13. // Class Db
  14. function Db() {
  15. // Verbeux ou non
  16. if (global.sqlVerbose) {
  17. sqlite.verbose();
  18. }
  19. // Connection à la base
  20. const exist = fileExist(this.DB_PATH);
  21. this.db = new sqlite.Database(this.DB_PATH);
  22. // Création si besoins de la base
  23. if (!exist) {
  24. this.createDb();
  25. }
  26. }
  27. Db.prototype.DB_PATH = './data/loquicompta.db';
  28. Db.prototype.createDb = function () {
  29. this._execute(sql.createUserTable);
  30. this._execute(sql.createFileTable);
  31. this._execute(sql.createUserFileTable);
  32. };
  33. Db.prototype.userExist = function (username) {
  34. if (typeof username !== 'string') {
  35. return false;
  36. }
  37. return new Promise((resolve, reject) => {
  38. this.db.all(sql.userExist, username, (err, rows) => {
  39. if (err) {
  40. if (global.verbose) {
  41. console.error(err);
  42. }
  43. resolve(false);
  44. } else {
  45. resolve(rows[0].nb > 0);
  46. }
  47. });
  48. });
  49. };
  50. Db.prototype.getUser = function (username) {
  51. if (typeof username !== 'string') {
  52. return false;
  53. }
  54. return new Promise((resolve, reject) => {
  55. this.db.all(sql.getUser, username, (err, rows) => {
  56. if (err) {
  57. if (global.verbose) {
  58. console.error(err);
  59. }
  60. resolve(false);
  61. } else {
  62. resolve(rows[0]);
  63. }
  64. });
  65. });
  66. };
  67. Db.prototype.addUser = function (username, passwordhash) {
  68. if (typeof username !== 'string' && typeof passwordhash !== 'string') {
  69. return false;
  70. }
  71. return new Promise((resolve, resject) => {
  72. this.userExist(username).then((result) => {
  73. if (!result) {
  74. this._execute(sql.insertUser, [username, passwordhash]);
  75. resolve(true);
  76. } else {
  77. resolve(false);
  78. }
  79. });
  80. });
  81. };
  82. Db.prototype.listFile = function (username) {
  83. if (typeof username !== 'string') {
  84. return false;
  85. }
  86. return new Promise((resolve, reject) => {
  87. this.db.all(sql.listFile, username, (err, rows) => {
  88. if (err) {
  89. if (global.verbose) {
  90. console.error(err);
  91. }
  92. resolve(false);
  93. } else {
  94. resolve(rows);
  95. }
  96. });
  97. });
  98. };
  99. Db.prototype.fileExist = function (username, fileId) {
  100. if (typeof username !== 'string' || typeof fileId !== 'string') {
  101. return false;
  102. }
  103. return new Promise((resolve, reject) => {
  104. this.db.all(sql.fileExist, [username, fileId], (err, rows) => {
  105. if (err) {
  106. if (global.verbose) {
  107. console.error(err);
  108. }
  109. resolve(false);
  110. } else {
  111. resolve(rows[0].nb > 0);
  112. }
  113. });
  114. });
  115. };
  116. Db.prototype.getFile = function (username, fileId) {
  117. if (typeof username !== 'string' || typeof fileId !== 'string') {
  118. return false;
  119. }
  120. return new Promise((resolve, reject) => {
  121. this.db.all(sql.getFile, [username, fileId], (err, rows) => {
  122. if (err) {
  123. if (global.verbose) {
  124. console.error(err);
  125. }
  126. resolve(false);
  127. } else {
  128. // Regarde si il y a des resultat
  129. if (rows.length > 0) {
  130. resolve(rows[0]);
  131. } else {
  132. resolve(null);
  133. }
  134. }
  135. });
  136. });
  137. };
  138. Db.prototype.addFile = function (username, filename, data) {
  139. if (typeof username !== 'string' || typeof filename !== 'string' || typeof data !== 'string') {
  140. return false;
  141. }
  142. // Ajout du fichier
  143. return new Promise((resolve, reject) => {
  144. // Ajoute les données de base du fichier
  145. this._execute(sql.addFile, [filename, data]);
  146. // Recupère l'id du fichier
  147. this.db.all(sql.lastId, (err, rows) => {
  148. if (err) {
  149. if (global.verbose) {
  150. console.error(err);
  151. }
  152. resolve(false);
  153. } else {
  154. const fileId = rows[0].lastId;
  155. //Calcul du hash
  156. let hash = fileId + '-' + username + '-' + filename;
  157. hash = crypto.createHash('md5').update(hash).digest('base64');
  158. hash = hash.replace(/=/g, '').replace(/\//g, '');
  159. // Ajoute le hash
  160. this._execute(sql.addFileHash, [hash, fileId]);
  161. // Recupération de l'utilisateur
  162. this.getUser(username).then((user) => {
  163. if (user === false) {
  164. if (global.verbose) {
  165. console.error(err);
  166. }
  167. resolve(false);
  168. } else {
  169. // Ajoute le lien entre utilisateur et fichier
  170. this._execute(sql.addUserFile, [user.id, fileId]);
  171. // Retourne le hash du fichier
  172. resolve(hash);
  173. }
  174. });
  175. }
  176. });
  177. });
  178. };
  179. Db.prototype.updateFile = function (username, fileId, data) {
  180. if (typeof username !== 'string' || typeof fileId !== 'string' || typeof data !== 'string') {
  181. return false;
  182. }
  183. this.fileExist(username, fileId).then((result) => {
  184. if (result) {
  185. this._execute(sql.updateFile, [data, fileId]);
  186. }
  187. });
  188. return true;
  189. };
  190. Db.prototype._execute = function (sql, params) {
  191. try {
  192. if (params !== undefined && params !== null) {
  193. this.db.run(sql, params);
  194. } else {
  195. this.db.run(sql);
  196. }
  197. } catch (err) {
  198. if (global.verbose) {
  199. console.error(err);
  200. }
  201. throw new Error('Error during request');
  202. }
  203. };
  204. // Export
  205. module.exports = new Db();