@flowfuse/flowfuse
Version:
An open source low-code development platform
185 lines (179 loc) • 6.34 kB
JavaScript
const { KEY_STACK_UPGRADE_HOUR } = require('../../../db/models/ProjectSettings')
module.exports = async function (app) {
app.addHook('preHandler', app.verifySession)
app.addHook('preHandler', async (request, reply) => {
if (request.params.projectId) {
try {
request.project = await app.db.models.Project.byId(request.params.projectId)
if (!request.project) {
reply.code(404).send({ code: 'not_found', error: 'Not Found' })
return
}
if (request.session.User) {
request.teamMembership = await request.session.User.getTeamMembership(request.project.Team.id)
if (!request.teamMembership && !request.session.User.admin) {
reply.code(404).send({ code: 'not_found', error: 'Not Found' })
return // eslint-disable-line no-useless-return
}
} else if (request.session.ownerId !== request.params.projectId) {
// AccessToken being used - but not owned by this project
reply.code(404).send({ code: 'not_found', error: 'Not Found' })
return // eslint-disable-line no-useless-return
}
} catch (err) {
}
} else {
reply.code(404).send({ code: 'not_found', error: 'Not Found' })
}
})
/**
* Get Instance Restart Time
* @name /apu/v1/projects/:id/autoUpdateStack
* @memberof forge.routes.api.project
*/
app.get('/', {
preHandler: app.needsPermission('project:read'),
schema: {
summary: 'Returns when a Instance allowed to be restarted ',
tags: ['Instances'],
params: {
type: 'object',
properties: {
projectId: { type: 'string' }
}
},
response: {
200: {
type: 'array',
items: {
type: 'object',
properties: {
hour: { type: 'number' },
day: { type: 'number' },
restart: { type: 'boolean' }
}
}
},
'4xx': {
$ref: 'APIError'
}
}
}
}, async (request, reply) => {
const list = []
for (let i = 0; i < 7; i++) {
const conf = await request.project.getSetting(`${KEY_STACK_UPGRADE_HOUR}_${i}`)
if (conf) {
list.push({ ...conf, day: i })
}
}
reply.send(list)
})
/**
* Set Instance Restart Time
* @name /apu/v1/projects/:id/autoUpdateStack
* @memberof forge.routes.api.project
*/
app.put('/', {
preHandler: app.needsPermission('project:edit'),
schema: {
summary: 'Sets when an Instance can be restarted',
tags: ['Instances'],
params: {
type: 'object',
properties: {
projectId: { type: 'string' }
}
},
body: {
type: 'object',
properties: {
schedule: {
type: 'array',
items: {
type: 'object',
properties: {
hour: { type: 'number' },
day: { type: 'number' },
restart: { type: 'boolean' }
}
}
}
}
},
response: {
200: {
type: 'array',
items: {
type: 'object',
properties: {
hour: { type: 'number' },
day: { type: 'number' },
restart: { type: 'boolean' }
}
}
},
'4xx': {
$ref: 'APIError'
}
}
}
}, async (request, reply) => {
if (request.body.schedule) {
for (let i = 0; i < 7; i++) {
await request.project.removeSetting(`${KEY_STACK_UPGRADE_HOUR}_${i}`)
}
try {
for (const d of request.body.schedule) {
await request.project.updateSetting(`${KEY_STACK_UPGRADE_HOUR}_${d.day}`, { hour: d.hour, restart: d.restart })
}
} catch (err) {
return reply
.code(err.statusCode || 400)
.send({
code: err.code || 'unexpected_error',
error: err.error || err.message
})
}
return reply.send(request.body.schedule)
}
})
/**
* Clear Instance Restart Time
* @name /apu/v1/projects/:id/autoUpdateStack
* @memberof forge.routes.api.project
*/
app.delete('/', {
preHandler: app.needsPermission('project:edit'),
schema: {
summary: 'Clears when an Instance can be restarted',
tags: ['Instances'],
params: {
type: 'object',
properties: {
projectId: { type: 'string' }
}
},
response: {
200: {},
'4xx': {
$ref: 'APIError'
}
}
}
}, async (request, reply) => {
try {
for (let i = 0; i < 7; i++) {
await request.project.removeSetting(`${KEY_STACK_UPGRADE_HOUR}_${i}`)
}
reply.code(201).send()
} catch (err) {
return reply
.code(err.statusCode || 400)
.send({
code: err.code || 'unexpected_error',
error: err.error || err.message
})
}
})
}