apis.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import config from "config";
  2. import async from "async";
  3. import request from "request";
  4. import { isAdminRequired } from "./hooks";
  5. // const moduleManager = require("../../index");
  6. import UtilsModule from "../utils";
  7. export default {
  8. /**
  9. * Fetches a list of songs from Youtubes API
  10. *
  11. * @param {object} session - user session
  12. * @param {string} query - the query we'll pass to youtubes api
  13. * @param {Function} cb - callback
  14. * @returns {{status: string, data: object}} - returns an object
  15. */
  16. searchYoutube: (session, query, cb) => {
  17. const params = [
  18. "part=snippet",
  19. `q=${encodeURIComponent(query)}`,
  20. `key=${config.get("apis.youtube.key")}`,
  21. "type=video",
  22. "maxResults=15"
  23. ].join("&");
  24. return async.waterfall(
  25. [
  26. next => {
  27. request(`https://www.googleapis.com/youtube/v3/search?${params}`, next);
  28. },
  29. (res, body, next) => {
  30. next(null, JSON.parse(body));
  31. }
  32. ],
  33. async (err, data) => {
  34. console.log(data.error);
  35. if (err || data.error) {
  36. if (!err) err = data.error.message;
  37. err = await UtilsModule.runJob("GET_ERROR", { error: err });
  38. console.log(
  39. "ERROR",
  40. "APIS_SEARCH_YOUTUBE",
  41. `Searching youtube failed with query "${query}". "${err}"`
  42. );
  43. return cb({ status: "failure", message: err });
  44. }
  45. console.log("SUCCESS", "APIS_SEARCH_YOUTUBE", `Searching YouTube successful with query "${query}".`);
  46. return cb({ status: "success", data });
  47. }
  48. );
  49. },
  50. /**
  51. * Gets Discogs data
  52. *
  53. * @param session
  54. * @param query - the query
  55. * @param {Function} cb
  56. */
  57. searchDiscogs: isAdminRequired((session, query, page, cb) => {
  58. async.waterfall(
  59. [
  60. next => {
  61. const params = [`q=${encodeURIComponent(query)}`, `per_page=20`, `page=${page}`].join("&");
  62. const options = {
  63. url: `https://api.discogs.com/database/search?${params}`,
  64. headers: {
  65. "User-Agent": "Request",
  66. Authorization: `Discogs key=${config.get("apis.discogs.client")}, secret=${config.get(
  67. "apis.discogs.secret"
  68. )}`
  69. }
  70. };
  71. request(options, (err, res, body) => {
  72. if (err) next(err);
  73. body = JSON.parse(body);
  74. next(null, body);
  75. if (body.error) next(body.error);
  76. });
  77. }
  78. ],
  79. async (err, body) => {
  80. if (err) {
  81. err = await UtilsModule.runJob("GET_ERROR", { error: err });
  82. console.log(
  83. "ERROR",
  84. "APIS_SEARCH_DISCOGS",
  85. `Searching discogs failed with query "${query}". "${err}"`
  86. );
  87. return cb({ status: "failure", message: err });
  88. }
  89. console.log(
  90. "SUCCESS",
  91. "APIS_SEARCH_DISCOGS",
  92. `User "${session.userId}" searched Discogs succesfully for query "${query}".`
  93. );
  94. return cb({
  95. status: "success",
  96. results: body.results,
  97. pages: body.pagination.pages
  98. });
  99. }
  100. );
  101. }),
  102. /**
  103. * Joins a room
  104. *
  105. * @param {object} session - user session
  106. * @param {string} page - the room to join
  107. * @param {Function} cb - callback
  108. */
  109. joinRoom: (session, page, cb) => {
  110. if (page === "home") {
  111. UtilsModule.runJob("SOCKET_JOIN_ROOM", {
  112. socketId: session.socketId,
  113. room: page
  114. })
  115. .then()
  116. .catch(err => {
  117. console.log("ERROR", `Joining room failed: ${err.message}`);
  118. });
  119. }
  120. cb({});
  121. },
  122. /**
  123. * Joins an admin room
  124. *
  125. * @param {object} session - user session
  126. * @param {string} page - the admin room to join
  127. * @param {Function} cb - callback
  128. */
  129. joinAdminRoom: isAdminRequired((session, page, cb) => {
  130. if (
  131. page === "queue" ||
  132. page === "songs" ||
  133. page === "stations" ||
  134. page === "reports" ||
  135. page === "news" ||
  136. page === "users" ||
  137. page === "statistics" ||
  138. page === "punishments"
  139. ) {
  140. UtilsModule.runJob("SOCKET_JOIN_ROOM", {
  141. socketId: session.socketId,
  142. room: `admin.${page}`
  143. });
  144. }
  145. cb({});
  146. }),
  147. /**
  148. * Returns current date
  149. *
  150. * @param {object} session - user session
  151. * @param {Function} cb - callback
  152. */
  153. ping: (session, cb) => {
  154. cb({ date: Date.now() });
  155. }
  156. };