apps.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. const User = require('../database/UserModel');
  2. const { appCard } = require('../components/appCard')
  3. const { exec, execSync } = require("child_process");
  4. const { dashCard } = require('../components/dashCard');
  5. const yaml = require('js-yaml');
  6. const { install } = require('../functions/package_manager');
  7. const templates_json = require('../templates.json');
  8. let templates = templates_json.templates;
  9. // sort templates alphabetically
  10. templates = templates.sort((a, b) => {
  11. if (a.name < b.name) {
  12. return -1;
  13. }
  14. });
  15. exports.Apps = async function(req, res) {
  16. if (req.session.role == "admin") {
  17. // Get the user.
  18. let user = await User.findOne({ where: { UUID: req.session.UUID }});
  19. let page = Number(req.query.page) || 1;
  20. let list_start = (page - 1) * 28;
  21. let list_end = (page * 28);
  22. let last_page = Math.ceil(templates.length / 28);
  23. // generate values for prev and next buttons so that i can go back and forth between pages
  24. let prev = '/apps?page=' + (page - 1);
  25. let next = '/apps?page=' + (page + 1);
  26. if (page == 1) {
  27. prev = '/apps?page=' + (page);
  28. }
  29. if (page == last_page) {
  30. next = '/apps?page=' + (page);
  31. }
  32. let apps_list = '';
  33. for (let i = list_start; i < list_end && i < templates.length; i++) {
  34. let app_card = appCard(templates[i]);
  35. apps_list += app_card;
  36. }
  37. // Render the home page
  38. res.render("pages/apps", {
  39. name: user.first_name + ' ' + user.last_name,
  40. role: user.role,
  41. avatar: user.avatar,
  42. isLoggedIn: true,
  43. list_start: list_start + 1,
  44. list_end: list_end,
  45. app_count: templates.length,
  46. prev: prev,
  47. next: next,
  48. apps_list: apps_list
  49. });
  50. } else {
  51. // Redirect to the login page
  52. res.redirect("/login");
  53. }
  54. }
  55. exports.searchApps = async function(req, res) {
  56. if (req.session.role == "admin") {
  57. // Get the user.
  58. let user = await User.findOne({ where: { UUID: req.session.UUID }});
  59. let page = Number(req.query.page) || 1;
  60. let list_start = (page - 1) * 28;
  61. let list_end = (page * 28);
  62. let last_page = Math.ceil(templates.length / 28);
  63. // generate values for prev and next buttons so that i can go back and forth between pages
  64. let prev = '/apps?page=' + (page - 1);
  65. let next = '/apps?page=' + (page + 1);
  66. if (page == 1) {
  67. prev = '/apps?page=' + (page);
  68. }
  69. if (page == last_page) {
  70. next = '/apps?page=' + (page);
  71. }
  72. let apps_list = '';
  73. let search_results = [];
  74. let search = req.body.search;
  75. // split value of search into an array of words
  76. search = search.split(' ');
  77. try {console.log(search[0]);} catch (error) {}
  78. try {console.log(search[1]);} catch (error) {}
  79. try {console.log(search[2]);} catch (error) {}
  80. function searchTemplates(word) {
  81. for (let i = 0; i < templates.length; i++) {
  82. if ((templates[i].description.includes(word)) || (templates[i].name.includes(word)) || (templates[i].title.includes(word))) {
  83. search_results.push(templates[i]);
  84. }
  85. }
  86. // console.log(search_results);
  87. }
  88. searchTemplates(search);
  89. for (let i = 0; i < search_results.length; i++) {
  90. let app_card = appCard(search_results[i]);
  91. apps_list += app_card;
  92. }
  93. // Render the home page
  94. res.render("pages/apps", {
  95. name: user.first_name + ' ' + user.last_name,
  96. role: user.role,
  97. avatar: user.avatar,
  98. isLoggedIn: true,
  99. list_start: list_start + 1,
  100. list_end: list_end,
  101. app_count: templates.length,
  102. prev: prev,
  103. next: next,
  104. apps_list: apps_list
  105. });
  106. } else {
  107. // Redirect to the login page
  108. res.redirect("/login");
  109. }
  110. }
  111. exports.Install = async function (req, res) {
  112. if (req.session.role == "admin") {
  113. install(req.body);
  114. let container_info = {
  115. name: req.body.name,
  116. service: req.body.service_name,
  117. state: 'installing',
  118. image: req.body.image,
  119. restart_policy: req.body.restart_policy
  120. }
  121. let installCard = dashCard(container_info);
  122. req.app.locals.install = installCard;
  123. // Redirect to the home page
  124. res.redirect("/");
  125. } else {
  126. // Redirect to the login page
  127. res.redirect("/login");
  128. }
  129. }
  130. exports.Uninstall = async function (req, res) {
  131. if (req.session.role == "admin") {
  132. if (req.body.confirm == 'Yes') {
  133. exec(`docker compose -f ./appdata/${req.body.service_name}/docker-compose.yml down`, (error, stdout, stderr) => {
  134. if (error) { console.error(`error: ${error.message}`); return; }
  135. if (stderr) { console.error(`stderr: ${stderr}`); return; }
  136. console.log(`stdout:\n${stdout}`);
  137. });
  138. }
  139. // Redirect to the home page
  140. res.redirect("/");
  141. } else {
  142. // Redirect to the login page
  143. res.redirect("/login");
  144. }
  145. }