Skip to content

the-labo/the-resource-user

Repository files navigation

the-resource-user

Build Status npm Version JS Standard

User resource for the-db

Installation

$ npm install the-resource-user --save

Usage

'use strict'

const theDb = require('the-db')
const {
  TheUserResource
} = require('the-resource-user')

async function tryExample () {
  // Create a db instance
  let db = theDb({
    dialect: 'memory'
  })

  db.load(class extends TheUserResource { /* ... */ }, 'User')
  db.load(class extends TheUserResource.Sign { /* ... */ }, 'UserSign')
  db.load(class extends TheUserResource.Profile { /* ... */ }, 'UserProfile')
  db.load(class extends TheUserResource.Role { /* ... */ }, 'UserRole')

  let {
    User,
    UserSign,
    UserProfile,
    UserRole
  } = db.resources

  let session = {}

  // Signup an user
  async function signup (username, password, options = {}) {
    let { email = null, profile = {}, roles = [] } = options
    let user = await User.create({ username, email })
    user.sign = await UserSign.create({ user, password })
    user.profile = await UserProfile.create({ user, profile })
    user.roles = await UserRole.createBulk(roles.map((code) => ({ user, code })))
    await user.save()
    return user
  }

  // Start user session
  async function signin (username, password, options = {}) {
    let { agent } = options
    let user = await User.only({ username })
    let sign = user && await UserSign.only({ user })
    let valid = sign && await sign.testPassword(password)
    if (!valid) {
      throw new Error('Signin failed!')
    }
    await user.sync()
    session.signed = user
    return user
  }

  // Finish session
  async function signout (token) {
    delete session.signed
  }

  // Call the functions
  {
    await signup('user01', 'xxxxxxxx', {
      roles: [ 'OPERATOR', 'CONSUMER' ]
    })

    let { token } = signin('user01', 'xxxxxxxx')
    /* ... */
    await signout(token)
  }
}

tryExample().catch((err) => console.error(err))

Policies

Property Description Type Required Unique
name Name to identify the user "cly:string" true true
email User email "cly:string" true
profile Use profile "cly:entity"
sign User signature "cly:entity"
roles Use roles "cly:entity"
Property Description Type Required Unique
user "cly:entity" true
name "cly:string"
image "cly:string"
Property Description Type Required Unique
user Pointer to user entity "cly:entity" true
code Role code "cly:string" true
Property Description Type Required Unique
user Pointer to user entity "cly:entity" true
password Password string "cly:string"
passwordHash Sign code "cly:string"
salt Salt of password "cly:string"
algorithm Digest algorithm "cly:string"
Property Description Type Required Unique
user Pointer to user entity "cly:entity" true
target Verify target "cly:string" true
token Verify token "cly:string" true true
expiredAt Date expire "cly:date"
done Done or not "cly:boolean"

API Guide

License

This software is released under the MIT License.

Links