138 lines
4.3 KiB
JavaScript
138 lines
4.3 KiB
JavaScript
/*
|
|
* v1 Controller
|
|
* -------------------------------------------------------------
|
|
* Put some description here!
|
|
*/
|
|
const Out = _flitter.model('v1:Out')
|
|
const Project = _flitter.model('v1:Project')
|
|
const Invite = _flitter.model('v1:Invite')
|
|
const Snippet = _flitter.model('v1:Snippet')
|
|
const share_api = {
|
|
project: Project,
|
|
snippet: Snippet,
|
|
}
|
|
const share_views = {
|
|
project: async function(item){
|
|
return '/dash/v1/project/view/'+item.id
|
|
},
|
|
snippet: async function(item){
|
|
const project = await Project.findById(item.project_id);
|
|
return '/dash/v1/project/snippet/'+project.id+'/view/'+item.uuid
|
|
},
|
|
}
|
|
class v1 {
|
|
|
|
/*
|
|
* Serve the main page.
|
|
*/
|
|
main(req, res){
|
|
|
|
/*
|
|
* Return the main view.
|
|
* It must be passed the response.
|
|
* View parameters can be passed as an optional third
|
|
* argument to the view() method.
|
|
*/
|
|
return view(res, 'view_name')
|
|
}
|
|
|
|
async new_out( req, res, next ){
|
|
console.log(req.body)
|
|
const project = await Project.findOne({ uuid: req.params.key })
|
|
|
|
if ( !project ){
|
|
return res.status(404).send({
|
|
success: false,
|
|
error: 'Project not found with specified key.'
|
|
})
|
|
}
|
|
|
|
if ( !req.body.data ){
|
|
return res.status(400).send({
|
|
success: false,
|
|
error: 'Missing data.'
|
|
})
|
|
}
|
|
|
|
let data
|
|
try {
|
|
data = JSON.parse(req.body.data)
|
|
}
|
|
catch (e){
|
|
return res.status(400).send({
|
|
success: false,
|
|
error: 'Invalid JSON.'
|
|
})
|
|
}
|
|
|
|
if ( !data.brief ){
|
|
data.brief = 'Breakpoint. (No Message.)'
|
|
}
|
|
|
|
const out = new Out({
|
|
brief: data.brief,
|
|
data: JSON.stringify(data.data),
|
|
project_id: project.id
|
|
})
|
|
|
|
await out.save()
|
|
|
|
return res.send({
|
|
success: true
|
|
})
|
|
}
|
|
|
|
async invite_show(req, res, next){
|
|
const invite = await Invite.findById(req.params.id)
|
|
if ( !invite ) _flitter.error(res, 404, {reason: 'Invitation not found with the specified URL.'})
|
|
|
|
if ( invite.used ) _flitter.error(res, 401, {reason: 'This invitation link has been used or has expired.'})
|
|
|
|
const share_model = share_api[invite.api_type];
|
|
const project = await share_model.findById(invite.project_id)
|
|
if ( !project ) _flitter.error(res, 404, {reason: 'This '+invite.api_type+' no longer exists.'})
|
|
|
|
const user = await _flitter.model('User').findOne({uuid: invite.by_user_id})
|
|
if ( !user ) _flitter.error(res, 500, {reason: 'This user no longer exists. Sorry.'})
|
|
|
|
return _flitter.view(res, 'dash_v1:accept', {invite, project, user})
|
|
}
|
|
|
|
async invite_accept(req, res, next){
|
|
const invite = await Invite.findById(req.params.id)
|
|
if ( !invite ) _flitter.error(res, 404, {reason: 'Invitation not found with the specified URL.'})
|
|
|
|
if ( invite.used ) _flitter.error(res, 401, {reason: 'This invitation link has been used or has expired.'})
|
|
|
|
const share_model = share_api[invite.api_type];
|
|
const project = await share_model.findById(invite.project_id)
|
|
if ( !project ) _flitter.error(res, 404, {reason: 'This '+invite.api_type+' no longer exists.'})
|
|
|
|
const user = await _flitter.model('User').findOne({uuid: invite.by_user_id})
|
|
if ( !user ) _flitter.error(res, 500, {reason: 'This user no longer exists. Sorry.'})
|
|
|
|
// if we're signed in
|
|
if ( req.session.auth && req.session.auth.user ){
|
|
if ( project.user_id !== req.session.auth.uuid && !project.shared_user_ids.includes(req.session.auth.uuid) ){
|
|
project.shared_user_ids.push(req.session.auth.uuid)
|
|
await project.save()
|
|
}
|
|
invite.used = true
|
|
await invite.save()
|
|
return res.redirect(await share_views[invite.api_type](project))
|
|
}
|
|
else {
|
|
req.session.invite = true
|
|
req.session.invite_data = {
|
|
invite: invite.id,
|
|
project: project.id,
|
|
user: user.id,
|
|
}
|
|
|
|
return res.redirect('/dash/v1')
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = exports = v1
|