| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 | import async from "async";import isLoginRequired from "../hooks/loginRequired";import { useHasPermission } from "../hooks/hasPermission";// eslint-disable-next-lineimport moduleManager from "../../index";const DBModule = moduleManager.modules.db;const UtilsModule = moduleManager.modules.utils;const SoundcloudModule = moduleManager.modules.soundcloud;const CacheModule = moduleManager.modules.cache;export default {	/**	 * Fetches new SoundCloud API key	 *	 * @returns {{status: string, data: object}}	 */	fetchNewApiKey: useHasPermission("soundcloud.fetchNewApiKey", async function fetchNewApiKey(session, cb) {		this.keepLongJob();		this.publishProgress({			status: "started",			title: "Fetch new SoundCloud API key",			message: "Fetching new SoundCloud API key.",			id: this.toString()		});		await CacheModule.runJob("RPUSH", { key: `longJobs.${session.userId}`, value: this.toString() }, this);		await CacheModule.runJob(			"PUB",			{				channel: "longJob.added",				value: { jobId: this.toString(), userId: session.userId }			},			this		);		SoundcloudModule.runJob("GENERATE_SOUNDCLOUD_API_KEY", {}, this)			.then(response => {				this.log("SUCCESS", "SOUNDCLOUD_FETCH_NEW_API_KEY", `Fetching new API key was successful.`);				this.publishProgress({					status: "success",					message: "Successfully fetched new SoundCloud API key."				});				return cb({					status: "success",					data: { response }				});			})			.catch(async err => {				err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);				this.log("ERROR", "SOUNDCLOUD_FETCH_NEW_API_KEY", `Fetching new API key failed. "${err}"`);				this.publishProgress({					status: "error",					message: err				});				return cb({ status: "error", message: err });			});	}),	/**	 * Tests SoundCloud API key	 *	 * @returns {{status: string, data: object}}	 */	testApiKey: useHasPermission("soundcloud.testApiKey", async function testApiKey(session, cb) {		this.keepLongJob();		this.publishProgress({			status: "started",			title: "Test SoundCloud API key",			message: "Testing SoundCloud API key.",			id: this.toString()		});		await CacheModule.runJob("RPUSH", { key: `longJobs.${session.userId}`, value: this.toString() }, this);		await CacheModule.runJob(			"PUB",			{				channel: "longJob.added",				value: { jobId: this.toString(), userId: session.userId }			},			this		);		SoundcloudModule.runJob("TEST_SOUNDCLOUD_API_KEY", {}, this)			.then(response => {				this.log(					"SUCCESS",					"SOUNDCLOUD_TEST_API_KEY",					`Testing API key was successful. Response: ${response}.`				);				this.publishProgress({					status: "success",					message: "Successfully tested SoundCloud API key."				});				return cb({					status: "success",					data: { status: response.status }				});			})			.catch(async err => {				err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);				this.log("ERROR", "SOUNDCLOUD_TEST_API_KEY", `Testing API key failed. "${err}"`);				this.publishProgress({					status: "error",					message: err				});				return cb({ status: "error", message: err });			});	}),	/**	 * Get a Soundcloud artist from ID	 *	 * @returns {{status: string, data: object}}	 */	getArtist: useHasPermission("soundcloud.getArtist", function getArtist(session, userPermalink, cb) {		return SoundcloudModule.runJob("GET_ARTISTS_FROM_PERMALINKS", { userPermalinks: [userPermalink] }, this)			.then(res => {				if (res.artists.length === 0) {					this.log("ERROR", "SOUNDCLOUD_GET_ARTISTS_FROM_PERMALINKS", `Fetching artist failed.`);					return cb({ status: "error", message: "Failed to get artist" });				}				this.log("SUCCESS", "SOUNDCLOUD_GET_ARTISTS_FROM_PERMALINKS", `Fetching artist was successful.`);				return cb({					status: "success",					message: "Successfully fetched Soundcloud artist",					data: res.artists[0]				});			})			.catch(async err => {				err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);				this.log("ERROR", "SOUNDCLOUD_GET_ARTISTS_FROM_PERMALINKS", `Fetching artist failed. "${err}"`);				return cb({ status: "error", message: err });			});	}),	/**	 * Gets videos, used in the admin youtube page by the AdvancedTable component	 *	 * @param {object} session - the session object automatically added by the websocket	 * @param page - the page	 * @param pageSize - the size per page	 * @param properties - the properties to return for each news item	 * @param sort - the sort object	 * @param queries - the queries array	 * @param operator - the operator for queries	 * @param cb	 */	getTracks: useHasPermission(		"admin.view.soundcloudTracks",		async function getTracks(session, page, pageSize, properties, sort, queries, operator, cb) {			async.waterfall(				[					next => {						DBModule.runJob(							"GET_DATA",							{								page,								pageSize,								properties,								sort,								queries,								operator,								modelName: "soundcloudTrack",								blacklistedProperties: [],								specialProperties: {									songId: [										// Fetch songs from songs collection with a matching mediaSource, which we first need to assemble										{											$lookup: {												from: "songs",												let: {													mediaSource: { $concat: ["soundcloud:", { $toString: "$trackId" }] }												},												pipeline: [													{														$match: {															$expr: { $eq: ["$mediaSource", "$$mediaSource"] }														}													}												],												as: "song"											}										},										// Turn the array of songs returned in the last step into one object, since only one song should have been returned maximum										{											$unwind: {												path: "$song",												preserveNullAndEmptyArrays: true											}										},										// Add new field songId, which grabs the song object's _id and tries turning it into a string										{											$addFields: {												songId: {													$convert: {														input: "$song._id",														to: "string",														onError: "",														onNull: ""													}												}											}										},										// Cleanup, don't return the song object for any further steps										{											$project: {												song: 0											}										}									]								},								specialQueries: {},								specialFilters: {}							},							this						)							.then(response => {								next(null, response);							})							.catch(err => {								next(err);							});					}				],				async (err, response) => {					if (err && err !== true) {						err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);						this.log("ERROR", "SOUNDCLOUD_GET_TRACKS", `Failed to get SoundCloud tracks. "${err}"`);						return cb({ status: "error", message: err });					}					this.log("SUCCESS", "SOUNDCLOUD_GET_TRACKS", `Fetched SoundCloud tracks successfully.`);					return cb({						status: "success",						message: "Successfully fetched SoundCloud tracks.",						data: response					});				}			);		}	),	/**	 * Get a SoundCloud track	 *	 * @param {object} session - the session object automatically added by the websocket	 * @param identifier - the identifier of the SoundCloud track	 * @param createMissing - whether to create/fetch the SoundCloud track if it's missing	 * @returns {{status: string, data: object}}	 */	getTrack: isLoginRequired(function getTrack(session, identifier, createMissing, cb) {		return SoundcloudModule.runJob("GET_TRACK", { identifier, createMissing }, this)			.then(res => {				this.log("SUCCESS", "SOUNDCLOUD_GET_TRACK", `Fetching track was successful.`);				return cb({ status: "success", message: "Successfully fetched SoundCloud track", data: res.track });			})			.catch(async err => {				err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);				this.log("ERROR", "SOUNDCLOUD_GET_TRACK", `Fetching track failed. "${err}"`);				return cb({ status: "error", message: err });			});	})};
 |