diff --git a/server/public/assets/admin/authenticated/js/main.js b/server/public/assets/admin/authenticated/js/main.js index 39000d53..061721d1 100644 --- a/server/public/assets/admin/authenticated/js/main.js +++ b/server/public/assets/admin/authenticated/js/main.js @@ -4,15 +4,43 @@ var connection_options = { 'force new connection': true }; var socket = io.connect(window.location.protocol + '//' + window.location.hostname + ':8080', connection_options); +var api_token_list; $(document).ready(function(){ $('ul.tabs').tabs(); + api_token_list = $("#api_token_list").clone(); + $("#api_token_list").remove(); + loaded(); }); $(document).on("click", "#refresh_all", function(e){ e.preventDefault(); $("#descriptions_cont").empty(); $("#thumbnails_cont").empty(); + $("#api_token_name").remove(); + $.ajax({ + type: "GET", + url: "/api/api_token", + success: function(response) { + if(response.length == 0) { + if(!$(".header-api-fields").hasClass("hide")) { + $(".header-api-fields").addClass("hide"); + } + return; + } + $(".header-api-fields").removeClass("hide"); + for(var i = 0; i < response.length; i++) { + var to_add = api_token_list; + to_add.attr("id", response[i]._id); + to_add.find(".api_token_name").text(response[i].name); + to_add.find(".api_token_usage").text(response[i].usage); + to_add.find("#delete_api_token").attr("data-id", response[i]._id); + $(".channel_things").append(to_add); + } + }, + error: function(err) { + } + }); if(!$(".channel_things").hasClass("hide")) { $(".channel_things").addClass("hide") } @@ -88,59 +116,120 @@ if(!$(".channel_things").hasClass("hide")) { } $(".preloader-wrapper").removeClass("hide"); -$.ajax({ - type: "GET", - url: "/api/lists", - success: function(response){ - var output_pinned = ''; - var output_delete = ''; - for(var x = 0; x < response.length; x++){ - if(response[x].count > 5){ - output_pinned += ""; +$(document).on("click", "#delete_api_token", function(e) { + e.preventDefault(); + var id = $(this).attr("data-id"); + var that = this; + $(that).toggleClass("disabled"); + $.ajax({ + type: "DELETE", + url: "api/api_token", + data: { + id: id + }, + success: function(response) { + if(response == "success") { + Materialize.toast("Removed token!", 2000, "green lighten"); + $("#" + id).remove(); + } else { + Materialize.toast("Something went wrong...", 2000, "red lighten"); + $(that).toggleClass("disabled"); } - output_delete += ""; - } - - $("#frontpage_pinned").html(output_pinned); - $("#remove_thumbnail").html(output_delete); - $("#remove_description").html(output_delete); - $("#delete_list_name").html(output_delete); - $("#delete_userpass_name").html(output_delete); - $("#delete_channel_name").html(output_delete); - $("select").material_select(); - - if(!$(".preloader-wrapper").hasClass("hide")) { - $(".preloader-wrapper").addClass("hide") - } - $(".channel_things").removeClass("hide"); - } + }, + }) }); -$.ajax({ - type: "GET", - url: "/api/names", - success: function(response) { - for(var i = 0; i < response.length; i++) { - var icon = ""; - if(response[i].icon && response[i].icon != "") { - icon = "" + response[i]._id + ""; +function loaded() { + $.ajax({ + type: "GET", + url: "/api/api_token", + success: function(response) { + if(response.length == 0) { + if(!$(".header-api-fields").hasClass("hide")) { + $(".header-api-fields").addClass("hide"); + } + return; } - $(".names-container").append("
" + icon + response[i]._id + "
check
"); + $(".header-api-fields").removeClass("hide"); + for(var i = 0; i < response.length; i++) { + var to_add = api_token_list.clone(); + to_add.attr("id", response[i]._id); + to_add.find(".api_token_name").text(response[i].name); + to_add.find(".api_token_usage").text(response[i].usage); + to_add.find("#delete_api_token").attr("data-id", response[i]._id); + $(".channel_things").append(to_add); + } + }, + error: function(err) { } - }, -}); + }); -$.ajax({ - type: "GET", - url: "/api/thumbnails", - success: function(response){ - if(response.length > 0){ - $(".thumbnails-badge").removeClass("hide"); - $(".thumbnails-badge").text(response.length); + $.ajax({ + type: "GET", + url: "/api/lists", + success: function(response){ + var output_pinned = ''; + var output_delete = ''; + for(var x = 0; x < response.length; x++){ + if(response[x].count > 5){ + output_pinned += ""; + } + output_delete += ""; + } + + $("#frontpage_pinned").html(output_pinned); + $("#remove_thumbnail").html(output_delete); + $("#remove_description").html(output_delete); + $("#delete_list_name").html(output_delete); + $("#delete_userpass_name").html(output_delete); + $("#delete_channel_name").html(output_delete); + $("select").material_select(); + + if(!$(".preloader-wrapper").hasClass("hide")) { + $(".preloader-wrapper").addClass("hide") + } + $(".channel_things").removeClass("hide"); } - add_to_tab("thumbnails", response); - } -}); + }); + + $.ajax({ + type: "GET", + url: "/api/names", + success: function(response) { + for(var i = 0; i < response.length; i++) { + var icon = ""; + if(response[i].icon && response[i].icon != "") { + icon = "" + response[i]._id + ""; + } + $(".names-container").append("
" + icon + response[i]._id + "
check
"); + } + }, + }); + + $.ajax({ + type: "GET", + url: "/api/thumbnails", + success: function(response){ + if(response.length > 0){ + $(".thumbnails-badge").removeClass("hide"); + $(".thumbnails-badge").text(response.length); + } + add_to_tab("thumbnails", response); + } + }); + + $.ajax({ + type: "GET", + url: "/api/descriptions", + success: function(response){ + if(response.length > 0){ + $(".descriptions-badge").removeClass("hide"); + $(".descriptions-badge").text(response.length); + } + add_to_tab("descriptions", response); + } + }); +} $(document).on("click", ".approve_name", function(e) { var that = this; @@ -168,18 +257,6 @@ $(document).on("click", ".thumbnail_link", function(e) { window.open("https:" + this.value,'_blank'); }); -$.ajax({ - type: "GET", - url: "/api/descriptions", - success: function(response){ - if(response.length > 0){ - $(".descriptions-badge").removeClass("hide"); - $(".descriptions-badge").text(response.length); - } - add_to_tab("descriptions", response); - } -}); - function add_to_tab(dest, resp){ for(var x = 0; x < resp.length; x++){ if(dest == "thumbnails"){ @@ -207,12 +284,30 @@ $(document).on("click", "#get_token", function(e){ $(document).on("click", "#get_api_token", function(e){ e.preventDefault(); + var name = $("#new_api_token_name").val(); + if(name == "") { + Materialize.toast("Empty name..!", 2000, "red lighten"); + return; + } + $("#new_api_token_name").val(""); + $("#get_api_token").toggleClass("disabled"); $.ajax({ - type: "GET", + type: "POST", url: "/api/api_token", + data: { + name: name, + }, success: function(response){ if(response != false){ + Materialize.toast("Gotten token", 2000, "green lighten"); $("#new_api_token").val(response.token); + $("#get_api_token").toggleClass("disabled"); + var to_add = api_token_list; + to_add.attr("id", response._id); + to_add.find(".api_token_name").text(name); + to_add.find(".api_token_usage").text(0); + to_add.find("#delete_api_token").attr("data-id", response._id); + $(".channel_things").append(to_add); } } }) diff --git a/server/public/layouts/admin/authenticated.handlebars b/server/public/layouts/admin/authenticated.handlebars index 477ac199..fdd34ffc 100644 --- a/server/public/layouts/admin/authenticated.handlebars +++ b/server/public/layouts/admin/authenticated.handlebars @@ -100,13 +100,33 @@
-
+
+ +
+
+
+
+ Name +
+
+ Usage +
+
+
+
+
+
+
+
+ REMOVE +
+
diff --git a/server/routing/admin/api.js b/server/routing/admin/api.js index b362b550..1bc736cf 100644 --- a/server/routing/admin/api.js +++ b/server/routing/admin/api.js @@ -7,6 +7,7 @@ var db = mongojs(mongo_db_cred.config); var token_db = mongojs("tokens"); var uniqid = require('uniqid'); var crypto = require('crypto'); +var ObjectId = mongojs.ObjectId; router.use(function(req, res, next) { next(); // make sure we go to the next routes and don't stop here @@ -166,11 +167,37 @@ router.route('/api/token').get(function(req, res){ } }); -router.route('/api/api_token').get(function(req, res){ +router.route('/api/api_token').get(function(req, res) { + if(req.isAuthenticated()) { + token_db.collection("api_token").find({token: {$exists: true}}, function(err, all) { + res.json(all); + }) + } else { + res.sendStatus(403); + } +}); + +router.route('/api/api_token').delete(function(req, res){ if(req.isAuthenticated()){ + var id = req.body.id; + token_db.collection("api_token").remove({_id: ObjectId(id)}, function(err, success) { + if(err) { + res.send("failed"); + return; + } + res.send("success"); + }) + } +}); + +router.route('/api/api_token').post(function(req, res){ + if(req.isAuthenticated()){ + var name = req.body.name; var id = crypto.createHash('sha256').update(uniqid()).digest('base64'); - token_db.collection("api_token").insert({token: id}, function(err, docs){ - res.json({token: id}); + token_db.collection("api_token").insert({name: name, token: id, usage: 0}, function(err, docs){ + token_db.collection("api_token").find({token: id}, function(err, d) { + res.json({token: id, _id: d[0]._id}); + }); }); } else { res.send(false); diff --git a/server/routing/client/api.js b/server/routing/client/api.js index db54ca2a..0a86a99f 100644 --- a/server/routing/client/api.js +++ b/server/routing/client/api.js @@ -170,6 +170,9 @@ router.route('/api/list/:channel_name/:video_id').delete(function(req, res) { dont_increment = true; } db.collection(channel_name).remove({id:video_id}, function(err, docs){ + if(authorized) { + incrementToken(token); + } io.to(channel_name).emit("channel", {type:"deleted", value: video_id}); if(!dont_increment) { db.collection("frontpage_lists").update({_id: channel_name, count: {$gt: 0}}, {$inc: {count: -1}, $set:{accessed: Functions.get_time()}}, {upsert: true}, function(err, docs){ @@ -294,6 +297,9 @@ router.route('/api/conf/:channel_name').put(function(req, res) { frontpage:frontpage, accessed: Functions.get_time()} }, {upsert:true}, function(err, docs){ + if(authorized) { + incrementToken(token); + } updateTimeout(guid, res, authorized, "CONFIG", function(err, docs) { var to_return = error.no_error; to_return.results = [obj]; @@ -365,6 +371,9 @@ router.route('/api/list/:channel_name/:video_id').put(function(req,res) { song[0].votes += 1; song[0].guids.push(guid); db.collection(channel_name).update({id: video_id}, {$inc:{votes:1}, $set:{added:Functions.get_time(), type: "video"}, $push :{guids: guid}}, function(err, success) { + if(authorized) { + incrementToken(token); + } io.to(channel_name).emit("channel", {type: "vote", value: video_id, time: Functions.get_time()}); List.getNextSong(channel_name, function() { updateTimeout(guid, res, authorized, "PUT", function(err, docs) { @@ -421,6 +430,9 @@ router.route('/api/list/:channel_name/__np__').post(function(req, res) { db.collection(channel_name).find({now_playing: true}, toShowChannel, function(err, list) { if(list.length > 0) { db.collection(channel_name + "_settings").find({ id: "config" }, function(err, conf) { + if(authorized) { + incrementToken(token); + } if(conf.length == 0) { res.status(404).send(JSON.stringify(error.not_found.list)); return; @@ -530,6 +542,9 @@ router.route('/api/list/:channel_name/:video_id').post(function(req,res) { }); } db.collection(channel_name).update({"id": new_song.id}, new_song, {upsert: true}, function(err, success) { + if(authorized) { + incrementToken(token); + } if(create_frontpage_lists) { db.collection("frontpage_lists").update({"_id": channel_name, "count" : (authenticated ? 1 : 0), "frontpage": true, "accessed": Functions.get_time(), "viewers": 1}, {upsert: true}, function(err, docs) { if(authenticated) { @@ -712,6 +727,9 @@ router.route('/api/conf/:channel_name').post(function(req, res) { } else { conf.userpass = false; } + if(authorized) { + incrementToken(token); + } updateTimeout(guid, res, authorized, "POST", function(err, docs) { var to_return = error.no_error; to_return.results = conf; @@ -776,6 +794,9 @@ router.route('/api/list/:channel_name').post(function(req, res) { res.status(403).send(JSON.stringify(error.not_authenticated)); return; } + if(authorized) { + incrementToken(token); + } updateTimeout(guid, res, authorized, "POST", function(err, docs) { var to_return = error.no_error; to_return.results = list; @@ -792,6 +813,12 @@ router.route('/api/list/:channel_name').post(function(req, res) { }); }); +function incrementToken(token) { + token_db.collection("api_token").update({token: token}, {$inc: {usage: 1}}, function(err, doc) { + + }); +} + router.route('/api/imageblob').post(function(req, res) { var Jimp = require("jimp"); Jimp.read('https://img.youtube.com/vi/' + req.body.id + '/mqdefault.jpg', function (err, image) { @@ -915,7 +942,7 @@ function validateLogin(adminpass, userpass, channel_name, type, res, callback) { var exists = false; if(conf.length > 0 && ((conf[0].userpass == undefined || conf[0].userpass == "" || conf[0].userpass == userpass))) { exists = true; - } else if(conf.length > 0 && type != "config") { + } else if(conf.length > 0 && type == "config") { res.status(404).send(JSON.stringify(error.not_found.list)); return; } else if(conf.length == 0) {