yinxing
Version:
581 lines (459 loc) • 10.5 kB
JavaScript
const R=require("ramda")
const {
any_nil,
merge_o,
drop_id,
drop_keys,
split_o_clean,
}=require('yinxing/fp')
const {
NODE_ENV,
PWD_KEY="ccc",
}=process.env
const {ObjectID}=require('mongodb')
const {
create_code,
encode_pwd,
now,
check_code,
}=require('yinxing/encode/captcha')
const {
create_token,
parse_token,
refresh_token,
}=require('yinxing/token')
const {
send,
}=require("yinxing/sms")
// $or=[{username:"xx"},{phone:"xxx"}]
const check_exist=async (t,$or=[])=>{
let exist=false
if ($or.length==0) {
throw "...."
}
try{
exist=await t.findOne({$or})
console.log('check_exist>>>>',exist)
}catch(e){
console.log('check_exist>>>>[error]',exist)
}finally{
return exist
}
}
const exist_user=async (c,n)=>{
//let d=c.params
let d=c.req_query
console.log('insert>>>>',d)
let {
username,
phone,
}=d
// let d1=[{username},{phone}]
let d1=split_o_clean({username,phone})
let exist=await check_exist(user_basic,d1)
if (exist) {
return c.json({exist:true})
}
return c.json({exist:false})
}
const login1=async (c,n)=>{
let d=c.req_query || {}
let db=c.dbs.dbs[DB]
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
let {
username,
password,
}=d
if (any_nil([username,password])){
throw "???"
}
let pwd=encode_pwd(password,PWD_KEY)
let d1={username,password:pwd}
try{
let u=await user_basic.findOne({username})
if (!u) {
return c.error_404("nothing")
}
if(u.password != pwd){
return c.error_401("bad pwd")
}
let basic=u.drop_keys(["password"])
let detail=await user_detail.findOne({user_id:u._id})
// let role=await role.find({user_id:u._id}).toArray()
let u1={
basic,
detail,
// role,
}
//let token=create_token({user_id: u? u._id : 0})
let token=create_token(u1)
let r = {...u1,token}
return c.json(r)
}catch(e){
console.log(e)
return c.error_500(e)
}
}
const login2=async (c,n)=>{
let d=c.req_query || {}
let {
username,
password,
}=d
if (any_nil([username,password])){
throw "???"
}
let pwd=encode_pwd(password,PWD_KEY)
let d1={username,password:pwd}
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let u=await user_basic.findOne({username})
if (!u) {
return c.error_404("nothing")
}
if(u.password != pwd){
return c.error_401("bad pwd")
}
let basic=u.drop_keys(["password"])
let detail=await user_detail.findOne({user_id:u._id})
// let role=await role.find({user_id:u._id}).toArray()
let u1={
basic,
detail,
// role,
}
//let token=create_token({user_id: u? u._id : 0})
let token=create_token(u1)
let r = {...u1,token}
return c.json(r)
}catch(e){
console.log(e)
}
}
const logout=async (c,n)=>{
}
const list=async (c, n) => {
//let d=c.params
let d=c.req_query || {}
console.log('list >>>>',d)
console.log('-----------',c.dbs)
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let r=await user_basic.find(d).toArray()
let r1=r.map(drop_keys(["password"]))
console.log('list <<<<',r)
return c.json(r1)
}catch(e){
console.log('list <<<<',e)
}
}
const find=async (c, n) => {
//let d=c.params
let d=c.req_query || {}
console.log('find >>>>',d)
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let basic=await user_basic.findOne(d)
if (!basic){
return c.error_404({})
}
let d1={
user_id:basic._id,
}
let detail=(await user_detail.findOne(d1)) || {}
let r={basic,detail}
console.log('find <<<<',r)
c.json(r)
}catch(e){
console.log('find <<<<',e)
c.error_500(e)
}
}
const update=async (c, n) => {
//let d=c.params
let d=c.req_query
let {_id,password,username,phone,...z}=d
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
let d1={"$set": {...z}}
// encode password
if (password){
let pwd=encode_pwd(password,PWD_KEY)
d1["$set"]['password']=pwd
}
try{
let r=await user_basic.findOneAndUpdate({_id:ObjectID(_id)},d1)
console.log('update<<<<',r)
c.json(r)
}catch(e){
/*
{
err: {
index: 0,
code: 11000,
errmsg: 'E11000 duplicate key error collection: test.user_basic index: username_1 dup key: { username: "c" }',
op: { username: 'c', phone: 'c', _id: 5e22f5bdda3cb90ee14ebf8f }
}
}
*/
console.log('update<<<<',e)
c.error_500(e)
}
}
const create_detail=async (c,n)=>{
//let d=c.params
let d=c.req_query
let {_id,password,username,phone,...z}=d
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let d1={user_id:_id,...z}
let r=await user_detail.insert(d1)
return c.json(r)
}catch(e){
return c.error_500(e)
}
}
const update_detail=async (c,n)=>{
//let d=c.params
let d=c.req_query
let {_id,password,username,phone,...z}=d
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
let d1={ "$set": { ...z}}
try{
let r=await user_detail.updateOne({user_id:ObjectID(_id)},d1)
c.json(r)
}catch(e){
c.error_500(e)
}
}
const insert=async (c, n) => {
//let d=c.params
let d=c.req_query
console.log('insert>>>>',d)
let {
username,
password,
phone,
}=d
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
let pwd=encode_pwd(password,PWD_KEY)
let d1={...drop_id(d),password:pwd}
try{
let r1=await user_basic.insertOne(d1)
let {result,insertedCount,insertedId,n:qty,ok}=r1
// init role
// init user_detail
// ...
console.log('insert<<<<<',r1)
c.json({result,insertedCount,insertedId,qty,ok})
}catch(e){
console.log('insert<<<<<',e)
c.error_500(e)
}
}
const inserts=async (c, n) => {
//let d=c.params
let d=c.req_query
console.log('insert_many>>>>',d)
let {data}=d
if (data.length==0){
return c.json()
}
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let d1=data.map(drop_id)
let r1=await user_basic.insertMany(d1)
return c.json(r1)
}catch(e){
return c.error_500(e)
}
}
const remove=async (c, n) => {
//let d=c.params
let d=c.req_query
console.log('delete>>>>',d)
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let id = ObjectID(d._id)
let r = await user_basic.deleteOne({_id:id})
let r1=await user_detail.deleteOne({user_id:id})
console.log('delete<<<<',r)
let { result,deletedCount,n:qty,ok }=r
c.json({ result,deletedCount,qty,ok })
}catch(e){
console.log('delete<<<<',e)
}
}
const removes=async (c,n)=>{
let d=c.req_query
console.log('delete_many>>>>',d)
let {ids}=d
if (ids.length==0){
return c.json([])
}
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let ids1=ids.map(ObjectID)
let q={_id: { $in:ids1}}
let q1={user_id: { $in:ids1}}
let r=await user_basic.deleteMany(q)
let r1=await user_detail.deleteMany(q1)
console.log('delete_many<<<<',r)
return c.json(r)
}catch(e){
console.log('delete_many<<<<',e)
return c.error_500(e)
}
}
const forget_pwd=async (c, n) => {
// let { basic:{_id} }=c.token.payload
let d=c.req_query
console.log('forget>>>>',d)
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let u=await user_basic.findOne({phone})
if (!u){
return c.error_404("nothing")
}
let duration=3 //min
let d1=create_code({phone},duration) //ip?
let r=await send(phone,code)
// await send({phone,email,payload:token})
let r1=await sms.insertOne(d1)
c.json({phone})
}catch(e){
c.error_500('db...')
}
}
const verify_code=async (c, n) => {
let d=c.req_query
let {phone,code,exp}=d
console.log('verify_code>>>>',d)
if(any_nil([phone,code])){
return c.error_401("no code/phone")
}
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
let code1=await sms.findOne({phone,code})
if (!code1){
return c.error_401("bad code")
}
return c.json({})
}
const reset_pwd=async (c, n) => {
let d=c.req_query
console.log('reset_pwd>>>>',d)
let {phone,password,code}=d
let db=c.dbs.dbs[DB]
const {
user_basic,
user_detail,
sms,
token,
role,
}=c.service
try{
let code1=await sms.findOne({phone,code})
if ( !check_code(code1)) {
return c.error_401("code exp")
}
let d1={ "$set": { "password":encode_pwd(password),}}
let r1=await user_basic.updateOne({_id:ObjectID(_id)},d1)
let r2=await sms.deleteOne(code1)
return c.json(d)
}catch(e){
return c.error_500(e)
}
}
module.exports={
login1,
login2,
logout,
forget_pwd,
verify_code,
reset_pwd,
list,
find,
insert,
inserts,
update,
update_detail,
remove,
removes,
}