mirror of
https://github.com/Permissionless-Software-Foundation/x402-base-facilitator.git
synced 2026-09-21 16:52:01 -07:00
249 lines
6.1 KiB
JavaScript
249 lines
6.1 KiB
JavaScript
/*
|
|
This is the JSON RPC router for the users API
|
|
*/
|
|
|
|
// Public npm libraries
|
|
const jsonrpc = require('jsonrpc-lite')
|
|
|
|
// Local libraries
|
|
const UserLib = require('../../lib/users')
|
|
const Validators = require('../validators')
|
|
|
|
class UserRPC {
|
|
constructor (localConfig) {
|
|
// Encapsulate dependencies
|
|
this.userLib = new UserLib()
|
|
this.jsonrpc = jsonrpc
|
|
this.validators = new Validators()
|
|
}
|
|
|
|
// Top-level router for this library. All other methods in this class are for
|
|
// a specific endpoint. This method routes incoming calls to one of those
|
|
// methods.
|
|
async userRouter (rpcData) {
|
|
let endpoint = 'unknown'
|
|
try {
|
|
// console.log('userRouter rpcData: ', rpcData)
|
|
|
|
endpoint = rpcData.payload.params.endpoint
|
|
let user
|
|
|
|
// Route the call based on the value of the method property.
|
|
switch (endpoint) {
|
|
case 'createUser':
|
|
return await this.createUser(rpcData)
|
|
|
|
case 'getAllUsers':
|
|
await this.validators.ensureUser(rpcData)
|
|
return await this.getAll(rpcData)
|
|
|
|
case 'getUser':
|
|
user = await this.validators.ensureUser(rpcData)
|
|
return await this.getUser(rpcData, user)
|
|
|
|
case 'updateUser':
|
|
user = await this.validators.ensureTargetUserOrAdmin(rpcData)
|
|
return await this.updateUser(rpcData, user)
|
|
|
|
case 'deleteUser':
|
|
user = await this.validators.ensureTargetUserOrAdmin(rpcData)
|
|
return await this.deleteUser(rpcData, user)
|
|
}
|
|
} catch (err) {
|
|
console.error('Error in UsersRPC/rpcRouter()')
|
|
// throw err
|
|
|
|
return {
|
|
success: false,
|
|
status: 500,
|
|
message: err.message,
|
|
endpoint
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @api {JSON} /users Create a new user
|
|
* @apiPermission public
|
|
* @apiName CreateUser
|
|
* @apiGroup JSON Users
|
|
*
|
|
* @apiExample Example usage:
|
|
* {"jsonrpc":"2.0","id":"555","method":"users","params":{ "endpoint": "createUser", "email": "test555@test.com", "name": "testy tester", "password": "password"}}
|
|
*
|
|
* @apiParam {Object} user User object (required)
|
|
* @apiParam {String} user.email Email.
|
|
* @apiParam {String} user.password Password.
|
|
* @apiParam {String} user.name name or handle
|
|
*
|
|
* @apiSuccess {Object} users User object
|
|
* @apiSuccess {ObjectId} users._id User id
|
|
* @apiSuccess {String} user.type User type (admin or user)
|
|
* @apiSuccess {String} users.name User name
|
|
* @apiSuccess {String} users.username User username
|
|
* @apiSuccess {String} users.email User email
|
|
*
|
|
* @apiSuccessExample {json} Success-Response:
|
|
* HTTP/1.1 200 OK
|
|
* {
|
|
* "user": {
|
|
* "_id": "56bd1da600a526986cf65c80"
|
|
* "name": "John Doe"
|
|
* "email": "email@format.com"
|
|
* }
|
|
* }
|
|
*
|
|
* @apiError UnprocessableEntity Missing required parameters
|
|
*
|
|
* @apiErrorExample {json} Error-Response:
|
|
* HTTP/1.1 422 Unprocessable Entity
|
|
* {
|
|
* "status": 422,
|
|
* "error": "Unprocessable Entity"
|
|
* }
|
|
*/
|
|
async createUser (rpcData) {
|
|
try {
|
|
// console.log('createUser rpcData: ', rpcData)
|
|
|
|
const retObj = await this.userLib.createUser(rpcData.payload.params)
|
|
|
|
// Add generic JSON RPC properties that every entry gets.
|
|
retObj.endpoint = 'createUser'
|
|
retObj.success = true
|
|
retObj.status = 200
|
|
retObj.message = ''
|
|
|
|
return retObj
|
|
} catch (err) {
|
|
// console.error('Error in createUser()')
|
|
// throw err
|
|
|
|
// Return an error response
|
|
return {
|
|
success: false,
|
|
status: 422,
|
|
message: err.message,
|
|
endpoint: 'createUser'
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get all Users.
|
|
async getAll () {
|
|
try {
|
|
const users = await this.userLib.getAllUsers()
|
|
|
|
return {
|
|
users,
|
|
endpoint: 'getAllUsers',
|
|
success: true,
|
|
status: 200,
|
|
message: ''
|
|
}
|
|
} catch (err) {
|
|
// console.error('Error in getAll()')
|
|
// throw err
|
|
|
|
// Return an error response
|
|
return {
|
|
success: false,
|
|
status: 422,
|
|
message: err.message,
|
|
endpoint: 'getAllUsers'
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get a specific user.
|
|
async getUser (rpcData, userModel) {
|
|
try {
|
|
// console.log('getUser rpcData: ', rpcData)
|
|
|
|
// Throw error if rpcData does not include 'userId' property for target user.
|
|
const userId = rpcData.payload.params.userId
|
|
|
|
const user = await this.userLib.getUser({ id: userId })
|
|
|
|
return {
|
|
user,
|
|
endpoint: 'getUser',
|
|
success: true,
|
|
status: 200,
|
|
message: ''
|
|
}
|
|
} catch (err) {
|
|
// console.error('Error in getUser()')
|
|
// throw err
|
|
|
|
// Return an error response
|
|
return {
|
|
success: false,
|
|
status: 422,
|
|
message: err.message,
|
|
endpoint: 'getUser'
|
|
}
|
|
}
|
|
}
|
|
|
|
async updateUser (rpcData, userModel) {
|
|
try {
|
|
// console.log('updateUser rpcData: ', rpcData)
|
|
|
|
const newData = rpcData.payload.params
|
|
|
|
const user = await this.userLib.updateUser(userModel, newData)
|
|
|
|
return {
|
|
user,
|
|
endpoint: 'updateUser',
|
|
success: true,
|
|
status: 200,
|
|
message: ''
|
|
}
|
|
} catch (err) {
|
|
// console.log('updateUser err: ', err)
|
|
|
|
// Return an error response
|
|
return {
|
|
success: false,
|
|
status: 422,
|
|
message: err.message,
|
|
endpoint: 'updateUser'
|
|
}
|
|
}
|
|
}
|
|
|
|
async deleteUser (rpcData, userModel) {
|
|
try {
|
|
// console.log('deleteUser rpcData: ', rpcData)
|
|
|
|
await this.userLib.deleteUser(userModel)
|
|
|
|
const retObj = {
|
|
endpoint: 'deleteUser',
|
|
success: true,
|
|
status: 200,
|
|
message: ''
|
|
}
|
|
|
|
return retObj
|
|
} catch (err) {
|
|
// console.error('Error in deleteUser()')
|
|
// throw err
|
|
|
|
// Return an error response
|
|
return {
|
|
success: false,
|
|
status: 422,
|
|
message: err.message,
|
|
endpoint: 'deleteUser'
|
|
}
|
|
}
|
|
}
|
|
|
|
// TODO create deleteUser()
|
|
}
|
|
|
|
module.exports = UserRPC
|