diff --git a/src/controllers/api/channel/deleteController.js b/src/controllers/api/channel/deleteController.js index 3d96fbb..6a0b5b4 100644 --- a/src/controllers/api/channel/deleteController.js +++ b/src/controllers/api/channel/deleteController.js @@ -41,6 +41,7 @@ module.exports.post = async function(req, res){ res.send({errors: validResult.array()}) } }catch(err){ + console.log(err); exceptionHandler(res, err); } diff --git a/src/controllers/api/channel/rankController.js b/src/controllers/api/channel/rankController.js new file mode 100644 index 0000000..7c725bc --- /dev/null +++ b/src/controllers/api/channel/rankController.js @@ -0,0 +1,68 @@ +/*Canopy - The next generation of stoner streaming software +Copyright (C) 2024 Rainbownapkin and the TTN Community + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see .*/ + +//npm imports +const {validationResult, matchedData} = require('express-validator'); + +//local imports +const {exceptionHandler} = require('../../../utils/loggerUtils'); +const permissionModel = require('../../../schemas/permissionSchema'); +const userModel = require('../../../schemas/userSchema'); +const channelModel = require('../../../schemas/channel/channelSchema'); + +//api channel rank functions +module.exports.get = async function(req, res){ + try{ + //Get validation results + const validResult = validationResult(req); + + //If we don't have any validation errors + if(validResult.isEmpty()){ + //Get channel document from validated/sanatized chanName querystring + const data = matchedData(req); + const chanDB = await channelModel.findOne({name: data.chanName}); + //Setup empty array for our return data + const userList = []; + + //Populate the user objects in our ranklist based off of their DB ID's + await chanDB.populate('rankList.user'); + + //For each rank object in the rank list + chanDB.rankList.forEach(async (rankObj) => { + //Create a new user object from rank object data + const userObj = { + id: rankObj.user.id, + user: rankObj.user.user, + rank: rankObj.rank + } + + //Add our user object to the list + userList.push(userObj); + }); + + //Send out the userlist we created + res.status(200); + res.send(userList); + }else{ + //If we received bad input, we have only one action: bitch, moan, and complain! + res.status(400); + res.send({errors: validResult.array()}) + } + }catch(err){ + return exceptionHandler(res, err); + } +} + diff --git a/src/controllers/api/channel/registerController.js b/src/controllers/api/channel/registerController.js index 79cff81..1a2a390 100644 --- a/src/controllers/api/channel/registerController.js +++ b/src/controllers/api/channel/registerController.js @@ -19,17 +19,23 @@ const {validationResult, matchedData} = require('express-validator'); //local imports const {exceptionHandler} = require('../../../utils/loggerUtils.js'); +const userModel = require('../../../schemas/userSchema.js'); const channelModel = require('../../../schemas/channel/channelSchema'); //api account functions module.exports.post = async function(req, res){ try{ + //Get validation result const validResult = validationResult(req); - const channel = matchedData(req); - + //If we data is valid if(validResult.isEmpty()){ - await channelModel.register(channel) + //Set channel object from sanatized/validated data, and get user document from session data + const channel = matchedData(req); + const userDB = await userModel.findOne({user: req.session.user.user}); + + //register new channel with requesting user as owner + await channelModel.register(channel, userDB); return res.sendStatus(200); }else{ res.status(400); diff --git a/src/routers/api/channelRouter.js b/src/routers/api/channelRouter.js index e8c8d87..ee6325b 100644 --- a/src/routers/api/channelRouter.js +++ b/src/routers/api/channelRouter.js @@ -25,6 +25,7 @@ const registerController = require("../../controllers/api/channel/registerContro const listController = require("../../controllers/api/channel/listController"); const settingsController = require("../../controllers/api/channel/settingsController"); const permissionsController = require("../../controllers/api/channel/permissionsController") +const rankController = require("../../controllers/api/channel/rankController"); const deleteController = require("../../controllers/api/channel/deleteController"); //globals @@ -42,6 +43,7 @@ router.get('/settings', channelValidator.name('chanName'), settingsController.ge router.post('/settings', channelValidator.name('chanName'), channelValidator.settingsMap(), settingsController.post); router.get('/permissions', channelValidator.name('chanName'), permissionsController.get); router.post('/permissions', channelValidator.name('chanName'), channelPermissionValidator.channelPermissionsMap(), permissionsController.post); +router.get('/rank', channelValidator.name('chanName'), rankController.get); router.post('/delete', channelValidator.name('chanName'), channelValidator.name('confirm'),deleteController.post); module.exports = router; \ No newline at end of file diff --git a/src/schemas/channel/channelSchema.js b/src/schemas/channel/channelSchema.js index c46b263..8c4780f 100644 --- a/src/schemas/channel/channelSchema.js +++ b/src/schemas/channel/channelSchema.js @@ -60,7 +60,7 @@ const channelSchema = new mongoose.Schema({ ref: "user" }, rank: { - type: mongoose.SchemaTypes.Boolean, + type: mongoose.SchemaTypes.String, required: true, enum: permissionModel.rankEnum } @@ -79,7 +79,7 @@ channelSchema.pre('save', async function (next){ }); //statics -channelSchema.statics.register = async function(channelObj){ +channelSchema.statics.register = async function(channelObj, ownerObj){ const {name, description, thumbnail} = channelObj; const chanDB = await this.findOne({ name }); @@ -88,7 +88,12 @@ channelSchema.statics.register = async function(channelObj){ throw new Error("Channel name already taken!"); }else{ const id = await statModel.incrementChannelCount(); - const newChannel = await this.create((thumbnail ? {id, name, description, thumbnail} : {id, name, description})); + const rankList = [{ + user: ownerObj._id, + rank: "admin" + }]; + + const newChannel = await this.create((thumbnail ? {id, name, description, thumbnail, rankList} : {id, name, description, rankList})); } } @@ -142,6 +147,19 @@ channelSchema.methods.updateChannelPerms = async function(permissionsMap){ return this.permissions; } +channelSchema.methods.setUserRank = async function(userDB,rank){ + //Create rank object based on input + const rankObj = { + user: userDB._id, + rank: rank + } + //Add it to rank list + this.rankList.push(rankObj); + //Save our channel and return rankList + await this.save(); + return this.rankList; +} + channelSchema.methods.getChannelRankFromUser = async function(userDB){ } @@ -156,9 +174,9 @@ channelSchema.methods.nuke = async function(confirm){ } //Annoyingly there isnt a good way to do this from 'this' - var oldUser = await module.exports.deleteOne(this); + var oldChan = await module.exports.deleteOne({_id: this._id}); - if(oldUser == null){ + if(oldChan.deletedCount == 0){ throw new Error("Server Error: Unable to delete channel! Please report this error to your server administrator, and with timestamp."); } }