openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
139 lines (112 loc) • 4.64 kB
text/coffeescript
Client = require('../model/clients').Client
Q = require 'q'
logger = require 'winston'
authorisation = require './authorisation'
utils = require '../utils'
###
# Adds a client
###
exports.addClient = () ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to addClient denied.", 'info'
return
clientData = this.request.body
try
client = new Client clientData
result = yield Q.ninvoke client, 'save'
logger.info "User #{this.authenticated.email} created client with id #{client.id}"
this.body = 'Client successfully created'
this.status = 201
catch e
logger.error "Could not add a client via the API: #{e.message}"
this.body = e.message
this.status = 400
###
# Retrieves the details of a specific client
###
exports.getClient = (clientId, property) ->
projectionRestriction = null
# if property - Setup client projection and bypass authorization
if typeof property is 'string'
if property is 'clientName'
projectionRestriction =
_id: 0
name: 1
else
utils.logAndSetResponse this, 404, "The property (#{property}) you are trying to retrieve is not found.", 'info'
return
else
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to findClientById denied.", 'info'
return
clientId = unescape clientId
try
result = yield Client.findById(clientId, projectionRestriction).exec()
if result is null
utils.logAndSetResponse this, 404, "Client with id #{clientId} could not be found.", 'info'
else
this.body = result
catch e
logger.error "Could not find client by id #{clientId} via the API: #{e.message}"
this.body = e.message
this.status = 500
exports.findClientByDomain = (clientDomain) ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to findClientByDomain denied.", 'info'
return
clientDomain = unescape clientDomain
try
result = yield Client.findOne(clientDomain: clientDomain).exec()
if result is null
utils.logAndSetResponse this, 404, "Could not find client with clientDomain #{clientDomain}", 'info'
else
this.body = result
catch e
logger.error "Could not find client by client Domain #{clientDomain} via the API: #{e.message}"
this.body = e.message
this.status = 500
exports.updateClient = (clientId) ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to updateClient denied.", 'info'
return
clientId = unescape clientId
clientData = this.request.body
# Ignore _id if it exists, a user shouldn't be able to update the internal id
delete clientData._id if clientData._id
try
yield Client.findByIdAndUpdate(clientId, clientData).exec()
logger.info "User #{this.authenticated.email} updated client with id #{clientId}"
this.body = 'Successfully updated client.'
catch e
logger.error "Could not update client by ID #{clientId} via the API: #{e.message}"
this.body = e.message
this.status = 500
exports.removeClient = (clientId) ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeClient denied.", 'info'
return
clientId = unescape clientId
try
yield Client.findByIdAndRemove(clientId).exec()
this.body = "Successfully removed client with ID #{clientId}"
logger.info "User #{this.authenticated.email} removed client with id #{clientId}"
catch e
logger.error "Could not remove client by ID #{clientId} via the API: #{e.message}"
this.body = e.message
this.status = 500
exports.getClients = () ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getClients denied.", 'info'
return
try
this.body = yield Client.find().exec()
catch e
logger.error "Could not fetch all clients via the API: #{e.message}"
this.message = e.message
this.status = 500