| 1 |
<?php |
| 2 |
//if accessed directly exit |
| 3 |
if (!defined('ABSPATH')) exit; |
| 4 |
|
| 5 |
use FluentBoards\App\Http\Controllers\BoardController; |
| 6 |
use FluentBoards\App\Http\Controllers\CommentController; |
| 7 |
use FluentBoards\App\Http\Controllers\LabelController; |
| 8 |
use FluentBoards\App\Http\Controllers\MCPSettingsController; |
| 9 |
use FluentBoards\App\Http\Controllers\NotificationController; |
| 10 |
use FluentBoards\App\Http\Controllers\OptionsController; |
| 11 |
use FluentBoards\App\Http\Controllers\PublicBoardController; |
| 12 |
use FluentBoards\App\Http\Controllers\ReportController; |
| 13 |
use FluentBoards\App\Http\Controllers\StageController; |
| 14 |
use FluentBoards\App\Http\Controllers\TaskController; |
| 15 |
use FluentBoards\App\Http\Controllers\UserController; |
| 16 |
use FluentBoards\App\Http\Controllers\WebhookController; |
| 17 |
|
| 18 |
|
| 19 |
/** |
| 20 |
* @var $router \FluentBoards\Framework\Http\Router |
| 21 |
*/ |
| 22 |
|
| 23 |
$router->prefix('tasks')->withPolicy('AuthPolicy')->group(function ($router) { |
| 24 |
$router->get('/top-in-boards', [TaskController::class, 'getTopTasksForBoards']); |
| 25 |
$router->get('/crm-associated-tasks/{associated_id}', [TaskController::class, 'getAssociatedTasks'])->int('associated_id'); |
| 26 |
$router->get('/stage/{task_id}', [TaskController::class, 'getStageByTask']); //FUTURE: this api need to be relocated |
| 27 |
|
| 28 |
$router->get('/boards-by-type/{type}', [BoardController::class, 'getBoardsByType']); |
| 29 |
|
| 30 |
// Task tabs configuration |
| 31 |
$router->get('/task-tabs/config', [TaskController::class, 'getTaskTabsConfig']); |
| 32 |
$router->post('/task-tabs/config', [TaskController::class, 'saveTaskTabsConfig']); |
| 33 |
}); |
| 34 |
|
| 35 |
$router->withPolicy('BoardUserPolicy')->group(function ($router) { |
| 36 |
|
| 37 |
$router->get('/quick-search', [OptionsController::class, 'quickSearch']); |
| 38 |
|
| 39 |
$router->get('/member-associated-users/{id}', [UserController::class, 'memberAssociatedTaskUsers']); |
| 40 |
$router->get('ajax-options', [OptionsController::class, 'selectorOptions']); |
| 41 |
$router->post('update-global-notification-settings', [OptionsController::class, 'updateGlobalNotificationSettings']); |
| 42 |
$router->get('get-global-notification-settings', [OptionsController::class, 'getGlobalNotificationSettings']); |
| 43 |
$router->put('update-dashboard-view-settings', [OptionsController::class, 'updateDashboardViewSettings']); |
| 44 |
$router->get('get-dashboard-view-settings', [OptionsController::class, 'getDashboardViewSettings']); |
| 45 |
$router->get('projects/reports', [ReportController::class, 'getBoardReports']); |
| 46 |
$router->get('reports/timesheet', [ReportController::class, 'getTimeSheetReport']); |
| 47 |
|
| 48 |
}); |
| 49 |
|
| 50 |
$router->prefix('projects')->withPolicy('AuthPolicy')->group(function ($router) { |
| 51 |
$router->get('/', [BoardController::class, 'getBoards']); |
| 52 |
$router->post('/', [BoardController::class, 'create']); |
| 53 |
$router->get('/get-default-board-colors', [BoardController::class, 'getBoardDefaultBackgroundColors']); |
| 54 |
$router->get('/list-of-boards', [BoardController::class, 'getBoardsList']); // it is using for to get all boards by user |
| 55 |
$router->get('/user-accessible-boards', [BoardController::class, 'getOnlyBoardsByUser']); |
| 56 |
$router->get('/crm-associated-boards/{id}', [BoardController::class, 'getAssociatedBoards'])->int('associated_id'); |
| 57 |
$router->get('/currencies', [BoardController::class, 'getCurrencies']); |
| 58 |
$router->get('/user-admin-in-boards', [BoardController::class, 'getUsersOfBoards']); |
| 59 |
$router->get('/recent-boards', [BoardController::class, 'getRecentBoards']); |
| 60 |
$router->get('/pinned-boards', [BoardController::class, 'getPinnedBoards']); |
| 61 |
|
| 62 |
$router->post('/onboard', [BoardController::class, 'createFirstBoard']); |
| 63 |
$router->put('/skip-onboarding', [BoardController::class, 'skipOnboarding']); |
| 64 |
|
| 65 |
|
| 66 |
}); |
| 67 |
|
| 68 |
$router->prefix('projects/{board_id}')->withPolicy('SingleBoardPolicy')->group(function ($router) { |
| 69 |
$router->get('/', [BoardController::class, 'find'])->int('board_id'); |
| 70 |
$router->get('/has-data-changed', [BoardController::class, 'hasDataChanged'])->int('board_id'); |
| 71 |
$router->put('/update-board-properties', [BoardController::class, 'updateBoardProperties'])->int('board_id'); |
| 72 |
$router->put('/', [BoardController::class, 'update'])->int('board_id'); |
| 73 |
$router->delete('/', [BoardController::class, 'delete'])->int('board_id'); |
| 74 |
$router->get('/labels', [LabelController::class, 'getLabelsByBoard']); |
| 75 |
$router->post('/labels', [LabelController::class, 'createLabel']); |
| 76 |
$router->get('/labels/used-in-tasks', [LabelController::class, 'getLabelsByBoardUsedInTasks']); |
| 77 |
$router->get('/tasks/{task_id}/labels', [LabelController::class, 'getLabelsByTask']); //FUTURE: these api need to be relocated |
| 78 |
$router->post('/labels/task', [LabelController::class, 'createLabelForTask']); |
| 79 |
$router->put('/labels/{label_id}', [LabelController::class, 'editLabelofBoard']); |
| 80 |
$router->delete('/labels/{label_id}', [LabelController::class, 'deleteLabelOfBoard']); |
| 81 |
$router->delete('/tasks/{task_id}/labels/{label_id}', [LabelController::class, 'deleteLabelOfTask']); |
| 82 |
$router->put('/pin-board', [BoardController::class, 'pinBoard']); |
| 83 |
$router->put('/unpin-board', [BoardController::class, 'unpinBoard']); |
| 84 |
|
| 85 |
$router->get('/users', [BoardController::class, 'getBoardUsers']); |
| 86 |
$router->post('/user/{user_id}/remove', [BoardController::class, 'removeUserFromBoard'])->int('board_id')->int('user_id'); |
| 87 |
$router->post('/add-members', [BoardController::class, 'addMembersInBoard']); |
| 88 |
|
| 89 |
$router->get('/assignees', [BoardController::class, 'getAssigneesByBoard'])->int('board_id'); |
| 90 |
$router->get('/activities', [BoardController::class, 'getActivities'])->int('board_id'); |
| 91 |
|
| 92 |
$router->put('/stage-move-all-task', [BoardController::class, 'moveAllTasks'])->int('board_id'); |
| 93 |
$router->post('/stage-create', [BoardController::class, 'createStage'])->int('board_id'); |
| 94 |
$router->put('/stage/{stage_id}/sort-task', [StageController::class, 'sortStageTasks'])->int('board_id')->int('stage_id'); |
| 95 |
$router->put('/stage/{stage_id}/archive-all-task', [BoardController::class, 'archiveAllTasksInStage'])->int('board_id')->int('stage_id'); |
| 96 |
$router->put('/re-position-stages', [BoardController::class, 'repositionStages'])->int('board_id'); |
| 97 |
$router->put('/update-stage/{stage_id}', [StageController::class, 'updateStage'])->int('board_id'); //Todo:: will delete later |
| 98 |
$router->put('/update-stage-property/{stage_id}', [StageController::class, 'updateStageProperty'])->int('board_id'); |
| 99 |
$router->put('/archive-stage/{stage_id}', [BoardController::class, 'archiveStage'])->int('board_id'); |
| 100 |
$router->put('/stage-view/{stage_id}', [BoardController::class, 'changeStageView'])->int('board_id'); |
| 101 |
$router->put('/restore-stage/{stage_id}', [BoardController::class, 'restoreStage'])->int('board_id'); |
| 102 |
$router->put('/drag-stage', [StageController::class, 'dragStage'])->int('board_id'); |
| 103 |
$router->get('/archived-stages', [BoardController::class, 'getArchivedStage'])->int('board_id'); |
| 104 |
$router->get('/archived-tasks', [TaskController::class, 'getArchivedTasks'])->int('board_id'); |
| 105 |
$router->put('/bulk-restore-tasks', [TaskController::class, 'bulkRestoreTasks'])->int('board_id'); |
| 106 |
$router->delete('/bulk-delete-tasks', [TaskController::class, 'bulkDeleteTasks'])->int('board_id'); |
| 107 |
$router->get('/stage-task-available-positions/{stage_id}', [BoardController::class, 'getStageTaskAvailablePositions'])->int('board_id')->int('stage_id'); |
| 108 |
|
| 109 |
$router->post('/crm-contact', [BoardController::class, 'updateAssociateCrmContact'])->int('board_id'); |
| 110 |
$router->get('/crm-contacts', [BoardController::class, 'getAssociateCrmContacts'])->int('board_id'); |
| 111 |
$router->delete('/crm-contact/{contact_id}', [BoardController::class, 'deleteAssociateCrmContact'])->int('board_id')->int('contact_id'); |
| 112 |
|
| 113 |
$router->get('/notification-settings', [NotificationController::class, 'getBoardNotificationSettings'])->int('board_id'); |
| 114 |
$router->put('/update-notification-settings', [NotificationController::class, 'updateBoardNotificationSettings'])->int('board_id'); |
| 115 |
|
| 116 |
$router->post('/duplicate-board', [BoardController::class, 'duplicateBoard'])->int('board_id'); |
| 117 |
$router->post('/import-from-board', [BoardController::class, 'importFromBoard'])->int('board_id'); |
| 118 |
|
| 119 |
$router->put('/upload/background', [BoardController::class, 'setBoardBackground'])->int('board_id'); |
| 120 |
$router->post('/upload/background-image', [BoardController::class, 'uploadBoardBackground'])->int('board_id'); |
| 121 |
$router->put('/archive-board', [BoardController::class, 'archiveBoard'])->int('board_id'); |
| 122 |
$router->put('/restore-board', [BoardController::class, 'restoreBoard'])->int('board_id'); |
| 123 |
$router->get('/board-menu-items', [BoardController::class, 'getBoardMenuItems'])->int('board_id'); |
| 124 |
$router->get('/stage-wise-reports', [ReportController::class, 'getStageWiseBoardReports'])->int('board_id'); |
| 125 |
|
| 126 |
$router->get('/public-access-settings', [BoardController::class, 'getPublicAccessSettings'])->int('board_id'); |
| 127 |
$router->put('/toggle-public-access', [BoardController::class, 'togglePublicAccess'])->int('board_id'); |
| 128 |
|
| 129 |
|
| 130 |
//# Tasks under a single board routes |
| 131 |
//# Route prefix: /projects/{id}/tasks |
| 132 |
$router->prefix('/tasks')->group(function ($router) { |
| 133 |
$router->get('/', [TaskController::class, 'getTasksByBoard'])->int('board_id'); |
| 134 |
$router->get('/filtered', [TaskController::class, 'getFilteredBoardTasks'])->int('board_id'); |
| 135 |
$router->get('/table', [TaskController::class, 'getTableTasks'])->int('board_id'); |
| 136 |
$router->get('/by-stage', [TaskController::class, 'getTasksByBoardStage'])->int('board_id'); |
| 137 |
$router->get('/stage-page', [TaskController::class, 'getStageTasksPage'])->int('board_id'); |
| 138 |
$router->post('/', [TaskController::class, 'create']); |
| 139 |
$router->post('/create-task-from-image', [TaskController::class, 'createTaskFromImage'])->int('board_id'); |
| 140 |
$router->get('/archived', [TaskController::class, 'getArchivedTasks'])->int('board_id'); |
| 141 |
$router->get('/{task_id}', [TaskController::class, 'find'])->int('board_id')->int('task_id')->int('task_id'); |
| 142 |
$router->put('/{task_id}', [TaskController::class, 'updateTaskProperties'])->int('board_id')->int('task_id'); |
| 143 |
$router->post('/{task_id}/dates', [TaskController::class, 'updateTaskDates'])->int('board_id')->int('task_id'); |
| 144 |
$router->put('/{task_id}/move-task', [TaskController::class, 'moveTask'])->int('board_id')->int('task_id'); |
| 145 |
$router->post('/bulk-actions', [TaskController::class, 'bulkActions'])->int('board_id'); |
| 146 |
$router->post('/update-cover-photo/{task_id}', [TaskController::class, 'updateTaskCoverPhoto'])->int('task_id'); |
| 147 |
$router->post('/status-update/{task_id}', [TaskController::class, 'taskStatusUpdate'])->int('task_id'); |
| 148 |
$router->delete('/{task_id}', [TaskController::class, 'deleteTask'])->int('board_id')->int('task_id'); |
| 149 |
$router->put('/{task_id}/move-to-next-stage', [TaskController::class, 'moveTaskToNextStage'])->int('board_id')->int('task_id'); |
| 150 |
$router->put('/{task_id}/pin', [TaskController::class, 'toggleTaskPinned'])->int('board_id')->int('task_id'); |
| 151 |
|
| 152 |
// Comments Routes Area |
| 153 |
$router->get('/{task_id}/comments', [CommentController::class, 'getComments'])->int('board_id')->int('task_id'); |
| 154 |
$router->post('/{task_id}/comments', [CommentController::class, 'create'])->int('board_id')->int('task_id'); |
| 155 |
$router->put('/comments/{comment_id}', [CommentController::class, 'update'])->int('board_id')->int('comment_id'); |
| 156 |
$router->put('/reply/{reply_id}', [CommentController::class, 'updateReply'])->int('board_id')->int('reply_id'); |
| 157 |
$router->delete('/comments/{comment_id}', [CommentController::class, 'deleteComment'])->int('board_id')->int('comment_id'); |
| 158 |
$router->delete('/reply/{reply_id}', [CommentController::class, 'deleteReply'])->int('board_id')->int('reply_id'); |
| 159 |
$router->put('/comments/{comment_id}/privacy', [CommentController::class, 'updateCommentPrivacy'])->int('board_id')->int('comment_id'); |
| 160 |
|
| 161 |
|
| 162 |
// Activities Area |
| 163 |
$router->get('/{task_id}/activities', [TaskController::class, 'getActivities'])->int('board_id')->int('task_id'); |
| 164 |
|
| 165 |
$router->post('/{task_id}/assign-yourself', [TaskController::class, 'assignYourselfInTask'])->int('board_id')->int('task_id'); |
| 166 |
$router->post('/{task_id}/detach-yourself', [TaskController::class, 'detachYourselfFromTask'])->int('board_id')->int('task_id'); |
| 167 |
$router->get('/{task_id}/comments-and-activities', [TaskController::class, 'getCommentsAndActivities'])->int('board_id')->int('task_id'); |
| 168 |
$router->post('/{task_id}/comment-image-upload', [CommentController::class, 'handleImageUpload'])->int('board_id')->int('task_id'); |
| 169 |
$router->post('/{task_id}/task-cover-image-upload', [TaskController::class, 'handleTaskCoverImageUpload'])->int('board_id')->int('task_id'); |
| 170 |
$router->post('/{task_id}/remove-task-cover', [TaskController::class, 'removeTaskCover'])->int('board_id')->int('task_id'); |
| 171 |
$router->post('/{task_id}/wp-editor-media-file-upload', [TaskController::class, 'uploadMediaFileFromWpEditor'])->int('board_id')->int('task_id'); |
| 172 |
$router->post('/{task_id}/clone-task', [TaskController::class, 'cloneTask'])->int('board_id')->int('task_id'); |
| 173 |
}); |
| 174 |
}); |
| 175 |
|
| 176 |
$router->prefix('admin')->withPolicy('AdminPolicy')->group(function ($router) { |
| 177 |
|
| 178 |
$router->get('/feature-modules', [OptionsController::class, 'getAddonsSettings']); |
| 179 |
$router->post('/feature-modules', [OptionsController::class, 'saveAddonsSettings']); |
| 180 |
$router->post('/feature-modules/install-plugin', [OptionsController::class, 'installPlugin']); |
| 181 |
|
| 182 |
$router->get('/general-settings', [OptionsController::class, 'getGeneralSettings']); |
| 183 |
$router->post('/general-settings', [OptionsController::class, 'saveGeneralSettings']); |
| 184 |
|
| 185 |
$router->get('/mcp/status', [MCPSettingsController::class, 'status']); |
| 186 |
$router->post('/mcp/toggle', [MCPSettingsController::class, 'toggle']); |
| 187 |
$router->post('/mcp/install-adapter', [MCPSettingsController::class, 'installAdapter']); |
| 188 |
$router->get('/mcp/config-snippet', [MCPSettingsController::class, 'getConfigSnippet']); |
| 189 |
|
| 190 |
$router->get('pages', [OptionsController::class, 'getPages']); |
| 191 |
|
| 192 |
}); |
| 193 |
|
| 194 |
$router->prefix('webhooks')->withPolicy('WebhookPolicy')->group(function ($router) { |
| 195 |
$router->get('/', [WebhookController::class, 'index']); |
| 196 |
$router->post('/', [WebhookController::class, 'create']); |
| 197 |
$router->put('/{id}', [WebhookController::class, 'update'])->int('id'); |
| 198 |
$router->delete('/{id}', [WebhookController::class, 'delete'])->int('id'); |
| 199 |
}); |
| 200 |
|
| 201 |
// Add outgoing webhook routes |
| 202 |
$router->prefix('outgoing-webhooks')->withPolicy('WebhookPolicy')->group(function ($router) { |
| 203 |
$router->get('/', [WebhookController::class, 'outgoingWebhooks']); |
| 204 |
$router->post('/', [WebhookController::class, 'createOutgoingWebhook']); |
| 205 |
$router->put('/{id}', [WebhookController::class, 'updateOutgoingWebhook'])->int('id'); |
| 206 |
$router->delete('/{id}', [WebhookController::class, 'deleteOutgoingWebhook'])->int('id'); |
| 207 |
}); |
| 208 |
|
| 209 |
|
| 210 |
$router->prefix('member/{id}')->withPolicy('UserPolicy')->group(function ($router) { |
| 211 |
$router->get('/', [UserController::class, 'getMemberInfo']); |
| 212 |
$router->get('/projects', [UserController::class, 'getMemberBoards']); |
| 213 |
$router->get('/tasks', [UserController::class, 'getMemberAssociatedTasks']); |
| 214 |
$router->get('/activities', [UserController::class, 'getMemberRelatedAcitivies']); |
| 215 |
}); |
| 216 |
|
| 217 |
/* |
| 218 |
* TODO: I guess we can minimize the number of routes. and Backend code needs to be refactored |
| 219 |
*/ |
| 220 |
|
| 221 |
// Notification routes |
| 222 |
$router->prefix('notifications')->withPolicy('UserPolicy')->group(function ($router) { |
| 223 |
$router->get('/', [NotificationController::class, 'getAllNotifications']); |
| 224 |
$router->get('/unread', [NotificationController::class, 'getAllUnreadNotifications']); |
| 225 |
$router->get('/unread-count', [NotificationController::class, 'newNotificationNumber']); |
| 226 |
$router->put('/read', [NotificationController::class, 'readNotification']); |
| 227 |
}); |
| 228 |
|
| 229 |
$router->prefix('contacts/{board_id}')->withPolicy('SingleBoardPolicy')->group(function ($router) { |
| 230 |
$router->get('/', [TaskController::class, 'getAssociatedCrmContacts'])->int('board_id'); |
| 231 |
}); |
| 232 |
|
| 233 |
$router->prefix('public/boards/{board_id}')->withPolicy('PublicBoardPolicy')->group(function ($router) { |
| 234 |
$router->get('/', [PublicBoardController::class, 'find'])->int('board_id'); |
| 235 |
$router->get('/tasks', [PublicBoardController::class, 'getTasksByBoard'])->int('board_id'); |
| 236 |
$router->get('/tasks/by-stage', [PublicBoardController::class, 'getTasksByBoardStage'])->int('board_id'); |
| 237 |
$router->get('/tasks/stage-page', [PublicBoardController::class, 'getStageTasksPage'])->int('board_id'); |
| 238 |
}); |
| 239 |
|
| 240 |
// User utility routes |
| 241 |
$router->withPolicy('UserPolicy')->group(function ($router) { |
| 242 |
$router->get('/quick-search', [OptionsController::class, 'quickSearch']); |
| 243 |
}); |
| 244 |
|
| 245 |
|
| 246 |
$router->prefix('options')->withPolicy('AuthPolicy')->group(function ($router) { |
| 247 |
$router->get('members', [OptionsController::class, 'getBoardMembers']); |
| 248 |
$router->get('projects', [OptionsController::class, 'getBoards']); |
| 249 |
}); |
| 250 |
|