This repository has been archived on 2021-08-17. You can view files and clone it, but cannot push or open issues or pull requests.
TaskBoard/api/itemRoutes.php

244 lines
8.8 KiB
PHP

<?php
// Create new item
$app->post('/boards/:id/items', function($id) use($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken()) {
$board = R::load('board', $id);
if ($board->id) {
$item = R::dispense('item');
$item->title = $data->title;
$item->description = $data->description;
$item->assignee = $data->assignee;
$item->category = $data->category;
$item->color = $data->color;
$item->dueDate = $data->dueDate;
$item->points = $data->points;
$item->position = getNextItemPosition($data->lane);
$board->xownLane[$data->lane]->xownItem[] = $item;
R::store($board);
runAutoActions($item);
if ($item->id) {
$actor = getUser();
logAction($actor->username . ' added item ' . $item->title . ' to board ' . $board->name,
null, $item->export(), $item->id);
$jsonResponse->addAlert('success', 'New board item created.');
$jsonResponse->addBeans(getBoards());
} else {
$jsonResponse->addAlert('error', 'Failed to create board item.');
}
}
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['id' => '\d+']); // Numbers only.
//Update existing item
$app->post('/items/:itemId', function($itemId) use ($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken()) {
$user = getUser();
$item = R::load('item', $itemId);
$before = $item->export();
if ($item->id) {
$item->title = $data->title;
$item->description = $data->description;
$item->assignee = $data->assignee;
$item->category = $data->category;
$item->color = $data->color;
$item->dueDate = $data->dueDate;
$item->points = $data->points;
if ($data->lane != $item->lane_id) {
$item->position = getNextItemPosition($data->lane);
$item->lane = R::load('lane', $data->lane);
} else {
$item->position = $data->position;
}
runAutoActions($item);
R::store($item);
logAction($user->username . ' updated item ' . $item->title, $before, $item->export(), $itemId);
$jsonResponse->addAlert('success', 'Updated item ' . $item->title . '.');
$jsonResponse->addBeans(getBoards());
}
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['itemId' => '\d+']);
// Update item positions
$app->post('/items/positions', function() use ($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken()) {
$user = getUser();
$movedItem = null;
$beforeItem = null;
$afterItem = null;
R::begin();
foreach($data->positions as $posItem) {
$item = R::load('item', $posItem->item);
$before = $item->export();
$oldLane = $item->lane->id;
$item->lane = R::load('lane', $posItem->lane);
if ($oldLane != $item->lane->id) {
$movedItem = $item;
$beforeItem = $before;
$afterItem = $item->export();
}
$item->position = $posItem->position;
runAutoActions($item);
R::store($item);
}
R::commit();
// If an item changed lanes, log the action.
if (null != $movedItem) {
logAction($user->username . ' moved item ' . $movedItem->title . ' to lane ' . $movedItem->lane->name,
$beforeItem, $afterItem, $movedItem->id);
}
$jsonResponse->addBeans(getBoards());
}
$app->response->setBody($jsonResponse->asJson());
});
// Add a comment to an item.
$app->post('/items/:itemId/comment', function($itemId) use ($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken()) {
$user = getUser();
$item = R::load('item', $itemId);
if ($item->id) {
$comment = R::dispense('comment');
$comment->text = $data->text;
$comment->userId = $user->id;
$comment->timestamp = time();
$item->ownComment[] = $comment;
R::store($item);
logAction($user->username . ' added a comment to item ' . $item->title, null, $comment, $itemId);
$jsonResponse->addAlert('success', 'Comment added to item ' . $item->title . '.');
$jsonResponse->addBeans(R::load('item', $itemId));
}
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['itemId' => '\d+']);
// Remove a comment from an item.
$app->post('/items/:itemId/comment/remove', function($itemId) use ($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken()) {
$user = getUser();
$comment = R::load('comment', $data->id);
if ($comment->id) {
$before = $comment->export();
R::trash($comment);
$item = R::load('item', $itemId);
logAction($user->username . ' removed comment from item ' . $item->title . '.', $before, null, $item->id);
$jsonResponse->addAlert('success', 'Comment was deleted.');
$jsonResponse->addBeans(R::load('item', $itemId));
}
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['itemId' => '\d+']);
// Add an attachment to an item.
$app->post('/items/:itemId/upload', function($itemId) use ($app, $jsonResponse) {
$upload = $_FILES['file'];
if (!file_exists('uploads/')) {
mkdir('uploads', 0777, true);
}
if (validateToken()) {
$file = R::dispense('attachment');
$item = R::load('item', $itemId);
$before = $item->export();
$user = getUser();
$file->filename = sha1($upload['tmp_name']);
$file->name = $upload['name'];
$file->type = $upload['type'];
$file->userId = $user->id;
$file->timestamp = time();
$item->ownAttachment[] = $file;
R::store($item);
move_uploaded_file($upload['tmp_name'], 'uploads/' . $file->filename);
logAction($user->username . ' uploaded attachment ' . $file->name . ' to item ' . $item->name,
$before, $item, $itemId);
$jsonResponse->addAlert('success', $file->name . ' was added.');
$jsonResponse->addBeans($item);
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['itemId' => '\d+']);
// Get an item attachment's information.
$app->get('/items/:itemId/upload/:attachmentId', function($itemId, $attachmentId) use ($app, $jsonResponse) {
if (validateToken()) {
$file = R::load('attachment', $attachmentId);
if ($file->id) {
$file->username = 'unknown';
$user = R::load('user', $file->userId);
if ($user->id) {
$file->username = $user->username;
}
$jsonResponse->addBeans($file);
}
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['itemId' => '\d+', 'attachmentId' => '\d+']);
// Remove an attachment from an item.
$app->post('/items/:itemId/upload/remove', function($itemId) use ($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken()) {
$item = R::load('item', $itemId);
$before = $item->export();
$actor = getUser();
$file = R::load('attachment', $data->fileId);
if ($file->id) {
$filename = $file->name;
$before = $item->export();
unlink('uploads/' . $file->filename);
R::trash($file);
R::store($item);
logAction($actor->username . ' removed attachment ' . $filename . ' from item ' . $item->title,
$before, $item, $itemId);
$jsonResponse->addAlert('success', $filename . ' was deleted.');
$jsonResponse->addBeans($item);
}
}
$app->response->setBody($jsonResponse->asJson());
})->conditions(['itemId' => '\d+']);
// Remove an item.
$app->post('/items/remove', function() use ($app, $jsonResponse) {
$data = json_decode($app->environment['slim.input']);
if (validateToken(true)) {
$item = R::load('item', $data->itemId);
if ($item->id) {
$before = $item->export();
R::trash($item);
$actor = getUser();
logAction($actor->username . ' removed item ' . $item->title, $before, null, $data->itemId);
$jsonResponse->addAlert('success', $item->title . ' was deleted.');
$jsonResponse->addBeans(getBoards());
}
}
$app->response->setBody($jsonResponse->asJson());
});