var multiparty = require('multiparty');
var path = require('path');
var fs = require('fs');
const {getDateTime} = require("./method-media.js");
register_rest_route('nv','register-user',{
methods: 'post',
callback(data,req) {
if (!nv_validator(data,{
name: String,
password: String,
email: String,
inviteCode: String
})) {return new NV_Error("参数错误");}
const {name,password,email,inviteCode} = data;
if (!name || !password || !email) {
return new NV_Error("昵称、邮箱、密码必填");
}
else if (nv_count_admin() == 0) {
var result = nv_insert_user({
name,password,email,
power: 10,
});
if ( is_nv_error(result) ) {return result;}
return {
id: result
}
}
else if (inviteCode) {
var result = nv_verify_invite(inviteCode);
if ( is_nv_error(result) ) {return result;}
var user_id = nv_insert_user({
name,password,email,
power: result.power,
});
if ( is_nv_error(user_id) ) {return user_id;}
nv_revoke_invite(inviteCode, user_id);
return { id: user_id }
}
else {
if ( get_option('nv_allow_register',false) ) {
var result = nv_insert_user({
name,password,email,
power: 3,
});
if ( is_nv_error(result) ) {return result;}
return {
id: result
}
} else {
return new NV_Error("管理员已关闭注册");
}
}
}
});
register_rest_route('nv','user-login',{
methods: 'post',
callback(data,req) {
const {name,password} = data;
if (!name || !password) {
return new NV_Error("参数错误");
}
var result = nv_user_login(name,password);
if ( is_nv_error(result) ) {
return result;
}
var user_id = result.id;
var nvnonce = nv_create_nonce(user_id);
return {
...result,
nvnonce
}
}
});
register_rest_route('nv','user-logout',{
methods: 'post',
callback(data,req) {
nv_revoke_nonce(req.header('nvnonce'))
return {};
}
});
register_rest_route('nv','check-nonce',{
methods: 'post',
callback(data,req) {
var result = get_user_by_nonce( req.header('nvnonce') );
if ( is_nv_error(result) ) {
return result;
}
return {
...result
}
}
});
register_rest_route('nv','get-admin-user-list-metas',{
methods: 'post',
callback(data,req) {
//读取表格列配置
var defaultColumns =[
{title: '用户名',fixed:'left',key: 'name',sort: 'name'},
{title: '邮箱',key: 'email',sort: 'email'},
{title: '头像',key: 'avatar',width: 80},
{title: '角色',key: 'role',sort: 'power'},
{title: '上次登录',key: 'last_logon_date',sort: 'metas.last_logon_date'},
{title: '注册时间',key: 'created_time',sort: 'created_time'},
]
var user_list_columns = apply_filters(`manage_admin_userlist_columns`,defaultColumns);
return {
user_list_columns,
}
},
permission_callback: power=>power >= 10,
});
// 不只是query_users,同时还要加入表格自定义的列数据
register_rest_route('nv','get-admin-user-list',{
methods: 'post',
callback(data,req) {
var users = query_users(data); // 注意分页,此处应该是有分页信息的
users.data = users.data.map(user=>{
// 角色的文本信息
user.role = get_user_role(user.power);
// avatar等信息
user = apply_filters('get_user',user,user.id);
//填充自定义列内容
Object.assign(users, apply_filters('manage_admin_userlist_data',user) );
return user;
})
return users;
},
permission_callback: power=>power >= 10,
});
// 只是query_users的一个代理
register_rest_route('nv','get-user-list',{
methods: 'post',
callback(data,req) {
var users = query_users(data);
// 此处可能没有分页信息。power>=10应该只有内部在使用。用于文章更换作者modal
(Array.isArray(users) ? users : users.data).map(user=>{
user.role = get_user_role(user.power);
return user;
})
return users;
},
permission_callback: power=>power >= 10,
});
register_rest_route('nv','insert-user',{
methods: 'post',
callback(data,req) {
const {name,email,power,url,sendMail} = data;
if (!name || !power) {
return new NV_Error("参数错误");
}
//随机生成密码。然后发送邮件让用户自己去修改
var id = nv_insert_user({
name,email,power,url,
password: require('uuid').v4()
});
if (is_nv_error(id)) {
return id;
}
//创建成功,发送邮件
if (sendMail && email) {
var sitename = get_option('nv_sitename','nvPress');
var user = get_user_by_id(id);
send_mail_to_user( user, `欢迎加入`, [
`您已成为“${sitename}”网站会员,以下是您的信息:`,
`账号:${name}<br>邮箱:${email}<br>角色:${user.role}`,
`您可以在收到邮件的24小时内为您的账户创建密码: <a class="blue" href="${get_option('nv_home_url','')}/nv-admin/set-password/?name=${name}&nonce=${nv_create_nonce(id)}" target="_blank">点击此处创建密码</a>`,
`<span class='small'>超出24小时请在<a href="${get_option('nv_home_url','')}/nv-admin/login" target="_blank">登录页面</a>选择“忘记密码”来重新获取创建密码链接。</span>`
])
.then(()=>{})
.catch(err=>{console.log('欢迎新用户发送邮件失败:',err)})
}
return {id};
},
permission_callback: power=>power >= 10,
});
//列表页批量删除、列表页删除单个
register_rest_route('nv','remove-users',{
methods: 'post',
callback(data,req) {
const {ids,author} = data;
var user_id = parseInt(author);
if (!ids || !user_id) {
return new NV_Error("参数错误");
}
ids.forEach(id=>{
nv_delete_user(id);
})
// 改变post - author
nvdb.posts.setColumn(r=>ids.includes(r.author),{ author:user_id })
// 改变media - post_id
nvdb.media.setColumn(r=>ids.includes(r.user_id),{user_id})
return {};
},
permission_callback: power=>power >= 10,
});
//列表页批量修改角色
register_rest_route('nv','update-users-power',{
methods: 'post',
callback(data,req) {
const {ids,power} = data;
if (!ids || !power) {
return new NV_Error("参数错误");
}
var updated = [];
ids.forEach(id=>{
var result = nv_update_user({id,power});
if ( !is_nv_error(result) ) {
updated.push(result)
}
})
return {ids: updated};
},
permission_callback: power=>power >= 10,
});
//获取用户信息
register_rest_route('nv','get-user',{
methods: 'post',
callback(data,req) {
const {id} = data;
if (!id) { return new NV_Error("参数错误"); }
//判断当前用户权限,管理员可以获取所有用户,其他用户只能获取自己
var current_user = get_user_by_nonce( req.header('nvnonce') );
if ( is_nv_error(current_user) ) {
return current_user;
}
if (current_user.power < 10 && id !== current_user.id) {
return new NV_Error('无权限');
}
var user = get_user_by_id(id);
if (user) {
return user;
} else {
return new NV_Error(`查询不到ID为${id}的用户资料`);
}
},
});
//编辑别的用户
register_rest_route('nv','update-user',{
methods: 'post',
callback(data,req) {
if (!nv_validator(data,{
id: Number,
name: String,
email: String,
url: String,
})) {return new NV_Error("参数错误");}
var result = nv_update_user(data);
if (is_nv_error(result)) {
return result;
} else {
return {id: result}
}
},
permission_callback: power=>power >= 10,
});
//编辑自己
register_rest_route('nv','update-self',{
methods: 'post',
callback(data,req) {
if (!nv_validator(data,{
id: Number,
name: String,
email: String,
url: String,
})) {return new NV_Error("参数错误");}
var current_user = get_user_by_nonce( req.header('nvnonce') );
if ( is_nv_error(current_user) ) {
return current_user;
}
if (!data.name || !data.email) {
return new NV_Error('昵称、邮箱必填!');
}
//自己不能编辑自己的权限
delete data.power;
var result = nv_update_user({
...data,
id: current_user.id
});
if ( is_nv_error(result) ) {
return result;
} else {
return {id: result};
}
},
});
//重置密码
register_rest_route('nv','reset-password',{
methods: 'post',
callback(data,req) {
const {name,password,nonce} = data;
if (!name || !password || !nonce) {return new NV_Error('参数错误')}
var current_user = get_user_by_nonce( nonce );
if ( is_nv_error(current_user) || current_user.name !== name) {
return new NV_Error("设置密码链接已失效");
}
var id = nv_update_user({
id: current_user.id,
password
});
if ( is_nv_error(id) ) {
return id;
}
return {id};
},
});
//忘记密码,发送邮件
register_rest_route('nv','forget-password',{
methods: 'post',
callback(data,req,res) {
const {email} = data;
if (!email) {return new NV_Error('参数错误')}
var user = get_user_by_email( email );
if (!user) {return new NV_Error('邮箱不存在')}
send_mail_to_user(user,"重置密码",[
'我们收到了您重置密码的申请。',
`<a class="blue" href="${get_option('nv_home_url','')}/nv-admin/set-password/?name=${user.name}&nonce=${nv_create_nonce(user.id)}" target="_blank">点击此处重置密码</a>`,
'如果您本人未进行密码重置,则不必采取任何操作。'
])
.then(()=>{
res.json({});
return;
})
.catch(()=>{
res.json({error: '服务器发送邮件失败,请联系管理员'});
console.log('服务器发送邮件失败',err.message)
return;
})
},
});
//编辑头像
register_rest_route('nv','upload-avatar',{
methods: 'post',
callback(data,req,res) {
var current_user = get_user_by_nonce( req.header('nvnonce') );
if ( is_nv_error(current_user) ) {
return current_user;
}
var user_id = parseInt(req.query.user_id)
if ( current_user.power < 10 && user_id !== current_user.id) {
return new NV_Error("非管理员只能编辑自己的头像");
}
if ( !get_option('nv_allow_power_under_6_upload_avatar') && current_user.power < 6 ) {
return new NV_Error("禁止普通用户上传头像");
}
// 判断要不要删除用户对应的头像id
//(如果确实是头像,并且有且仅有自己一人使用,那就删掉)
var old_media_id = get_user_meta(user_id,'avatar_id');
var is_avatar = get_media_meta(old_media_id, 'is_avatar');
var all_used_users_metas = nvdb.usermeta.find(r=>r.key=="avatar_id" && r.value==old_media_id);
if (is_avatar && all_used_users_metas.length == 1) {
nv_delete_media(old_media_id);
}
//上传(和上传文件方法类似)
var nowStamp = new Date().getTime();
const {year,month} = getDateTime(nowStamp);
var uploadDir = `./nv-content/uploads/${year}/${month}`;
nv_create_dirs(uploadDir);
//处理表单的文件
let form = new multiparty.Form({uploadDir});
form.parse(req,function(err,fields,files){
if (err) {
console.log('上传文件错误:'+err);
res.json({error: '上传文件错误'});
return;
}
var file = files.file[0]; // files.file,名称是创建表单的时候命名的,这里叫file
var filename = path.parse(file.path).base;
//文件写入后,填充数据
var title = path.parse(file.originalFilename).name || '';
var mediaInfo = {
user_id: current_user.id || 0,
created_time: nowStamp,
content: "",
title,
modified_time: nowStamp,
filename,
};
var media_id = nv_insert_media(mediaInfo);
// 更新媒体信息,更新用户信息
update_media_meta(media_id,'is_avatar',1);
update_user_meta(user_id,'avatar_id',media_id);
var avatar_url = get_user_meta(user_id,'avatar_url')
res.json({
avatar_id: media_id,
avatar_url
});
return;
});
},
});
register_rest_route('nv','check-can-upload-avatar',{
methods: 'post',
callback(data,req,res) {
var current_user = get_user_by_nonce( req.header('nvnonce') );
if ( is_nv_error(current_user) ) {
return false;
}
if ( !get_option('nv_allow_power_under_6_upload_avatar') && current_user.power < 6 ) {
return false;
}
return true;
},
});