apis.js 4.6 KB

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