UNPKG

@flowfuse/flowfuse

Version:

An open source low-code development platform

174 lines (162 loc) 6.1 kB
module.exports = function (app) { app.addSchema({ $id: 'Application', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, description: { type: 'string' }, createdAt: { type: 'string' }, updatedAt: { type: 'string' }, links: { $ref: 'LinksMeta' }, team: { $ref: 'TeamSummary' } } }) function application (application) { if (application) { const raw = application.toJSON() const filtered = { id: raw.hashid, name: raw.name, description: raw.description, createdAt: raw.createdAt, updatedAt: raw.updatedAt, links: raw.links } if (application.Team) { filtered.team = app.db.views.Team.teamSummary(application.Team) } return filtered } else { return null } } app.addSchema({ $id: 'ApplicationSummary', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, description: { type: 'string' }, links: { $ref: 'LinksMeta' }, deviceGroupCount: { type: 'number' }, snapshotCount: { type: 'number' }, pipelineCount: { type: 'number' } }, additionalProperties: true }) function applicationSummary (application, { detailed = false } = {}) { // application could already be a vanilla object, // or a database model object. if (Object.hasOwn(application, 'get')) { application = application.get({ plain: true }) } const summary = { id: application.hashid, name: application.name, description: application.description, links: application.links } if (detailed) { summary.deviceCount = application.get('deviceCount') summary.instanceCount = application.get('instanceCount') summary.deviceGroupCount = application.get('deviceGroupCount') summary.snapshotCount = application.get('snapshotCount') summary.pipelineCount = application.get('pipelineCount') } return summary } app.addSchema({ $id: 'TeamApplicationList', type: 'array', items: { type: 'object', allOf: [{ $ref: 'ApplicationSummary' }], properties: { instances: { $ref: 'InstanceSummaryList' }, devices: { $ref: 'DeviceSummaryList' }, // should be using oneOf but blocked by https://github.com/fastify/fast-json-stringify/issues/642 instancesSummary: { type: 'object', properties: { count: { type: 'number' }, instances: { $ref: 'InstanceSummaryList' } } }, devicesSummary: { type: 'object', properties: { count: { type: 'number' }, devices: { $ref: 'DeviceSummaryList' } } } }, additionalProperties: true } }) async function teamApplicationList (applications, { includeInstances = false, includeApplicationDevices = false, includeApplicationSummary = false } = {}) { return applications.map((application) => { const summary = applicationSummary(application, { detailed: includeApplicationSummary }) if (includeInstances) { if (includeApplicationSummary) { summary.instancesSummary = { instances: app.db.views.Project.instancesSummaryList(application.Instances), count: application.get('instanceCount') } } else { summary.instances = app.db.views.Project.instancesSummaryList(application.Instances) } } if (includeApplicationDevices) { if (includeApplicationSummary) { summary.devicesSummary = { devices: application.Devices.map(app.db.views.Device.deviceSummary), count: application.get('deviceCount') } } else { summary.devices = application.Devices.map(app.db.views.Device.deviceSummary) } } return summary }) } app.addSchema({ $id: 'ApplicationAssociationsStatusList', type: 'array', items: { type: 'object', allOf: [{ $ref: 'ApplicationSummary' }], properties: { id: { type: 'string' }, instances: { $ref: 'InstanceStatusList' }, devices: { $ref: 'DeviceStatusList' } }, additionalProperties: true } }) async function applicationAssociationsStatusList (applicationsArray) { return Promise.all(applicationsArray.map(async (application) => { return { id: application.hashid, instances: await app.db.views.Project.instanceStatusList(application.Instances), devices: await app.db.views.Device.deviceStatusList(application.Devices, { includeEditor: true }) } })) } app.addSchema({ $id: 'ApplicationBom', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, children: { type: 'array', items: { $ref: 'dependant' } } // dependant is defined in BOM.js }, additionalProperties: true }) return { application, applicationAssociationsStatusList, teamApplicationList, applicationSummary } }