Finished up with chat prompt autocomplete.
This commit is contained in:
parent
acbe0400c4
commit
9df7f52e9e
7 changed files with 197 additions and 100 deletions
|
|
@ -447,6 +447,17 @@ channelSchema.methods.getChannelRank = async function(user){
|
|||
return await this.getChannelRankByUserDoc(userDB);
|
||||
}
|
||||
|
||||
channelSchema.methods.permCheck = async function (user, perm){
|
||||
//Set userDB to null if we wheren't passed a real user
|
||||
if(user != null){
|
||||
var userDB = await userModel.findOne({user: user.user});
|
||||
}else{
|
||||
var userDB = null;
|
||||
}
|
||||
|
||||
return await this.permCheckByUserDoc(userDB, perm)
|
||||
}
|
||||
|
||||
channelSchema.methods.permCheckByUserDoc = async function(userDB, perm){
|
||||
//Get site-wide rank as number, default to anon for anonymous users
|
||||
const rank = userDB ? permissionModel.rankToNum(userDB.rank) : permissionModel.rankToNum("anon");
|
||||
|
|
@ -464,15 +475,25 @@ channelSchema.methods.permCheckByUserDoc = async function(userDB, perm){
|
|||
return (permCheck || overrideCheck);
|
||||
}
|
||||
|
||||
channelSchema.methods.permCheck = async function (user, perm){
|
||||
//Set userDB to null if we wheren't passed a real user
|
||||
if(user != null){
|
||||
var userDB = await userModel.findOne({user: user.user});
|
||||
}else{
|
||||
var userDB = null;
|
||||
}
|
||||
channelSchema.methods.getPermMapByUserDoc = async function(userDB){
|
||||
//Grap site-wide permissions
|
||||
const sitePerms = await permissionModel.getPerms();
|
||||
const siteMap = sitePerms.getPermMapByUserDoc(userDB);
|
||||
//Pull chan permissions keys
|
||||
let permTree = channelPermissionSchema.tree;
|
||||
let permMap = new Map();
|
||||
|
||||
return await this.permCheckByUserDoc(userDB, perm)
|
||||
//For each object in the temporary permissions object
|
||||
for(let perm of Object.keys(permTree)){
|
||||
//Check the current permission
|
||||
permMap.set(perm, await this.permCheckByUserDoc(userDB, perm));
|
||||
}
|
||||
|
||||
//return perm map
|
||||
return {
|
||||
site: siteMap.site,
|
||||
chan: permMap
|
||||
};
|
||||
}
|
||||
|
||||
channelSchema.methods.checkBanByUserDoc = async function(userDB){
|
||||
|
|
|
|||
|
|
@ -139,26 +139,8 @@ permissionSchema.statics.permCheck = async function(user, perm){
|
|||
permissionSchema.statics.permCheckByUserDoc = async function(user, perm){
|
||||
//Get permission list
|
||||
const perms = await this.getPerms();
|
||||
|
||||
//Set user to anon rank if no rank was found for the given user
|
||||
if(user == null || user.rank == null){
|
||||
user ={
|
||||
rank: "anon"
|
||||
};
|
||||
}
|
||||
|
||||
//Check if this permission exists
|
||||
if(perms[perm] != null){
|
||||
//if so get required rank as a number
|
||||
requiredRank = this.rankToNum(perms[perm])
|
||||
//if so get user rank as a number
|
||||
userRank = user ? this.rankToNum(user.rank) : 0;
|
||||
//return whether or not the user is equal to or higher than the required rank for this permission
|
||||
return (userRank >= requiredRank);
|
||||
}else{
|
||||
//if not scream and shout
|
||||
throw new Error(`Permission check '${perm}' not found!`);
|
||||
}
|
||||
//Call the perm check method
|
||||
return perms.permCheckByUserDoc(user, perm);
|
||||
}
|
||||
|
||||
permissionSchema.statics.overrideCheck = async function(user, perm){
|
||||
|
|
@ -175,27 +157,9 @@ permissionSchema.statics.overrideCheck = async function(user, perm){
|
|||
|
||||
permissionSchema.statics.overrideCheckByUserDoc = async function(user, perm){
|
||||
//Get permission list
|
||||
const perms = (await this.getPerms()).channelOverrides;
|
||||
|
||||
//Set user to anon rank if no rank was found for the given user
|
||||
if(user == null || user.rank == null){
|
||||
user ={
|
||||
rank: "anon"
|
||||
};
|
||||
}
|
||||
|
||||
//Check if this permission exists
|
||||
if(perms[perm] != null){
|
||||
//if so get required rank as a number
|
||||
requiredRank = this.rankToNum(perms[perm])
|
||||
//if so get user rank as a number
|
||||
userRank = user ? this.rankToNum(user.rank) : 0;
|
||||
//return whether or not the user is equal to or higher than the required rank for this permission
|
||||
return (userRank >= requiredRank);
|
||||
}else{
|
||||
//if not scream and shout
|
||||
throw new Error(`Permission check '${perm}' not found!`);
|
||||
}
|
||||
const perms = await this.getPerms();
|
||||
//Call the perm check method
|
||||
return perms.overrideCheckByUserDoc(user, perm);
|
||||
}
|
||||
|
||||
//Middleware for rank checks
|
||||
|
|
@ -211,4 +175,76 @@ permissionSchema.statics.reqPermCheck = function(perm){
|
|||
}
|
||||
}
|
||||
|
||||
//methods
|
||||
//these are good to have even for single-doc collections since we can loop through them without finding them in the database each time
|
||||
permissionSchema.methods.permCheckByUserDoc = function(userDB, perm){
|
||||
//Set user to anon rank if no rank was found for the given user
|
||||
if(userDB == null || userDB.rank == null){
|
||||
userDB ={
|
||||
rank: "anon"
|
||||
};
|
||||
}
|
||||
|
||||
//Check if this permission exists
|
||||
if(this[perm] != null){
|
||||
//if so get required rank as a number
|
||||
requiredRank = this.model().rankToNum(this[perm])
|
||||
//if so get user rank as a number
|
||||
userRank = userDB ? this.model().rankToNum(userDB.rank) : 0;
|
||||
//return whether or not the user is equal to or higher than the required rank for this permission
|
||||
return (userRank >= requiredRank);
|
||||
}else{
|
||||
//if not scream and shout
|
||||
throw new Error(`Permission check '${perm}' not found!`);
|
||||
}
|
||||
}
|
||||
|
||||
permissionSchema.methods.overrideCheckByUserDoc = function(userDB, perm){
|
||||
//Set user to anon rank if no rank was found for the given user
|
||||
if(userDB == null || userDB.rank == null){
|
||||
userDB ={
|
||||
rank: "anon"
|
||||
};
|
||||
}
|
||||
|
||||
//Check if this permission exists
|
||||
if(this.channelOverrides[perm] != null){
|
||||
//if so get required rank as a number
|
||||
requiredRank = this.model().rankToNum(this.channelOverrides[perm])
|
||||
//if so get user rank as a number
|
||||
userRank = userDB ? this.model().rankToNum(userDB.rank) : 0;
|
||||
//return whether or not the user is equal to or higher than the required rank for this permission
|
||||
return (userRank >= requiredRank);
|
||||
}else{
|
||||
//if not scream and shout
|
||||
throw new Error(`Permission check '${perm}' not found!`);
|
||||
}
|
||||
}
|
||||
|
||||
permissionSchema.methods.getPermMapByUserDoc = function(userDB){
|
||||
//Pull permissions keys
|
||||
let permTree = this.schema.tree;
|
||||
let overrideTree = channelPermissionSchema.tree;
|
||||
let permMap = new Map();
|
||||
let overrideMap = new Map();
|
||||
|
||||
//For each object in the temporary permissions object
|
||||
for(let perm of Object.keys(permTree)){
|
||||
//Check the current permission
|
||||
permMap.set(perm, this.permCheckByUserDoc(userDB, perm));
|
||||
}
|
||||
|
||||
//For each object in the temporary permissions object
|
||||
for(let perm of Object.keys(overrideTree)){
|
||||
//Check the current permission
|
||||
overrideMap.set(perm, this.overrideCheckByUserDoc(userDB, perm));
|
||||
}
|
||||
|
||||
//return the auto-generated schema
|
||||
return {
|
||||
site: permMap,
|
||||
channelOverrides: overrideMap
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = mongoose.model("permissions", permissionSchema);
|
||||
Loading…
Add table
Add a link
Reference in a new issue