openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
192 lines (180 loc) • 4.7 kB
JavaScript
import { Schema } from 'mongoose'
import { connectionAPI, connectionDefault } from '../config'
import { ContactUserDef } from './contactGroups'
import patchHistory from 'mongoose-patch-history'
import { camelize, pascalize } from 'humps'
const RouteDef = {
name: {
type: String, required: true
},
secured: Boolean,
host: {
type: String, required: true
},
port: {
type: Number, required: true, min: 0, max: 65536
},
path: String,
pathTransform: String,
primary: Boolean,
username: String,
password: String,
type: {
type: String, default: 'http', enum: ['http', 'tcp', 'mllp']
},
cert: Schema.Types.ObjectId,
status: {
type: String, default: 'enabled', enum: ['enabled', 'disabled']
},
forwardAuthHeader: {
type: Boolean, default: false
}
}
// Channel alerts
//
// The following alert conditions are supported:
// * status: match on a specific transaction status (404, 5xx). Supports failure rates.
// * auto-retry-max-attempted: triggers when a failing transaction has reach the max number of auto retries
//
const AlertsDef = {
condition: {
type: String, default: 'status', enum: ['status', 'auto-retry-max-attempted']
},
status: {
type: String
},
failureRate: Number,
groups: [Schema.Types.ObjectId],
users: [ContactUserDef]
}
const RewriteRuleDef = {
fromHost: {
type: String, required: true
},
toHost: {
type: String, required: true
},
fromPort: {
type: Number, required: true, default: 80
},
toPort: {
type: Number, required: true, default: 80
},
pathTransform: String
}
const UpdatedByDef = {
id: {
type: Schema.Types.ObjectId
},
name: {
type: String
}
}
const ChannelDef = {
name: {
type: String, required: true
},
description: String,
urlPattern: {
type: String, required: true
},
maxBodyAgeDays: {
type: Number, min: 1, max: 36500
},
lastBodyCleared: {
type: Date
},
timeout: {
type: Number, min: 1, max: 3600000
},
methods: [{
type: String, enum: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH']
}],
type: {
type: String, default: 'http', enum: ['http', 'tcp', 'tls', 'polling']
},
priority: {
type: Number, min: 1
},
tcpPort: {
type: Number, min: 0, max: 65536
},
tcpHost: String,
pollingSchedule: String,
requestBody: Boolean,
responseBody: Boolean,
allow: [{ type: String, required: true }],
whitelist: [String],
authType: {
type: String, default: 'private', enum: ['private', 'public']
},
routes: [RouteDef],
matchContentTypes: [String],
matchContentRegex: String,
matchContentXpath: String,
matchContentJson: String,
matchContentValue: String,
properties: [Object],
txViewAcl: [String],
txViewFullAcl: [String],
txRerunAcl: [String],
alerts: [AlertsDef],
status: {
type: String, default: 'enabled', enum: ['enabled', 'disabled', 'deleted']
},
rewriteUrls: {
type: Boolean, default: false
},
addAutoRewriteRules: {
type: Boolean, default: true
},
rewriteUrlsConfig: [RewriteRuleDef],
autoRetryEnabled: {
type: Boolean, default: false
},
autoRetryPeriodMinutes: {
type: Number, default: 60, min: 1
},
autoRetryMaxAttempts: {
type: Number, min: 0
}, // 0 means unlimited
updatedBy: UpdatedByDef
}
// Expose the route schema
export { RouteDef }
/*
* The Channel object that describes a specific channel within the OpenHIM.
* It provides some metadata describing a channel and contians a number of
* route objects. If a request matches the urlPattern of a channel it should
* be routed to each of the routes described in that channel.
*
* A channel also has an allow property. This property should contain a list
* of users or group that are authroised to send messages to this channel.
*/
const ChannelSchema = new Schema(ChannelDef)
// Use the patch history plugin to audit changes to channels
ChannelSchema.plugin(patchHistory, {
mongoose: connectionDefault,
name: 'ChannelAudits',
transforms: [
pascalize,
camelize
],
includes: {
updatedBy: {
type: {
id: Schema.Types.ObjectId,
name: String
},
required: true
}
}
})
// Create a unique index on the name field
ChannelSchema.index('name', { unique: true })
export const ChannelModelAPI = connectionAPI.model('Channel', ChannelSchema)
export const ChannelModel = connectionDefault.model('Channel', ChannelSchema)
export { ChannelDef }
// Is the channel enabled?
// If there is no status field then the channel IS enabled
export function isChannelEnabled (channel) { return !channel.status || (channel.status === 'enabled') }