Files
cattr/app/Http/Controllers/Api/CompanySettingsController.php
Noor E Ilahi 7ccf44f7da first commit
2026-01-09 12:54:53 +05:30

230 lines
8.9 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\CompanySettings\UpdateCompanySettingsRequest;
use App\Http\Transformers\CompanySettingsTransformer;
use App\Models\Priority;
use Illuminate\Http\JsonResponse;
use Settings;
class CompanySettingsController extends Controller
{
/**
* @api {get} /company-settings/ List
* @apiDescription Returns all company settings.
*
* @apiVersion 4.0.0
* @apiName ListCompanySettings
* @apiGroup Company Settings
*
* @apiUse AuthHeader
*
* @apiVersion 4.0.0
* @apiName ListCompanySettings
* @apiGroup Company Settings
*
* @apiUse AuthHeader
*
* @apiSuccess {String} timezone The timezone setting for the company.
* @apiSuccess {String} language The language setting for the company.
* @apiSuccess {Integer} work_time The configured work time in hours.
* @apiSuccess {Array} color Array of colors configured for the company settings.
* @apiSuccess {Array} internal_priorities Array of internal priorities.
* @apiSuccess {Integer} internal_priorities.id The unique ID of the priority.
* @apiSuccess {String} internal_priorities.name The name of the priority.
* @apiSuccess {String} internal_priorities.created_at The creation timestamp of the priority.
* @apiSuccess {String} internal_priorities.updated_at The last update timestamp of the priority.
* @apiSuccess {String} internal_priorities.color The color associated with the priority.
* @apiSuccess {Integer} heartbeat_period The period for heartbeat checks in seconds.
* @apiSuccess {Boolean} auto_thinning Indicates if automatic thinning of old data is enabled.
* @apiSuccess {Integer} screenshots_state The current state of screenshot monitoring.
* @apiSuccess {Integer} env_screenshots_state The environmental screenshot state.
* @apiSuccess {Integer} default_priority_id The default priority ID.
* @apiSuccessExample {json} Response Example
* HTTP/1.1 200 OK
* {
* {
* "timezone": "UTC",
* "language": "ru",
* "work_time": 0,
* "color": [],
* "internal_priorities": [
* {
* "id": 1,
* "name": "Normal",
* "created_at": "2023-10-26T10:26:17.000000Z",
* "updated_at": "2024-07-12T17:57:40.000000Z",
* "color": null
* },
* {
* "id": 2,
* "name": "Normal",
* "created_at": "2023-10-26T10:26:17.000000Z",
* "updated_at": "2024-06-21T10:06:50.000000Z",
* "color": "#49E637"
* },
* {
* "id": 3,
* "name": "High",
* "created_at": "2023-10-26T10:26:17.000000Z",
* "updated_at": "2024-06-21T10:07:00.000000Z",
* "color": "#D40C0C"
* },
* {
* "id": 5,
* "name": "Normal",
* "created_at": "2024-07-12T17:10:54.000000Z",
* "updated_at": "2024-07-12T17:10:54.000000Z",
* "color": null
* }
*],
* "heartbeat_period": 60,
* "auto_thinning": true,
* "screenshots_state": 1,
* "env_screenshots_state": -1,
* "default_priority_id": 2
* }
* }
*
* @apiUse 400Error
* @apiUse UnauthorizedError
*/
public function index(): JsonResponse
{
return responder()->success(
array_merge(
Settings::scope('core')->all(),
['internal_priorities' => Priority::all()]
),
new CompanySettingsTransformer
)->respond();
}
/**
* @param UpdateCompanySettingsRequest $request
*
* @return JsonResponse
*
* @api {patch} /company-settings/ Update
* @apiDescription Updates the specified company settings.
*
* @apiVersion 4.0.0
* @apiName UpdateCompanySettings
* @apiGroup Company Settings
*
* @apiUse AuthHeader
*
* @apiParam {String} timezone The timezone setting for the company.
* @apiParam {String} language The language setting for the company.
* @apiParam {Integer} work_time The configured work time in hours.
* @apiParam {Array} color Array of colors configured for the company settings.
* @apiParam {Array} internal_priorities Array of internal priorities.
* @apiParam {Integer} internal_priorities.id The unique ID of the priority.
* @apiParam {String} internal_priorities.name The name of the priority.
* @apiParam {String} internal_priorities.created_at The creation timestamp of the priority.
* @apiParam {String} internal_priorities.updated_at The last update timestamp of the priority.
* @apiParam {String} internal_priorities.color The color associated with the priority.
* @apiParam {Integer} heartbeat_period The period for heartbeat checks in seconds.
* @apiParam {Boolean} auto_thinning Indicates if automatic thinning of old data is enabled.
* @apiParam {Integer} screenshots_state The current state of screenshot monitoring.
* @apiParam {Integer} env_screenshots_state The environmental screenshot state.
* @apiParam {Integer} default_priority_id The default priority ID.
*
* @apiParamExample {json} Request Example
* { "timezone" : "Europe/Moscow",
* "language" : "en",
* "work_time" : 0,
* "color" : [],
* "internal_priorities" : [
* {
* "id" : 1,
* "name" : "Normal",
* "created_at" : "2023-10-26T10:26:17.000000Z",
* "updated_at" : "2024-07-12T17:57:40.000000Z",
* "color" : null
* },
* {
* "id" : 2,
* "name" : "Normal",
* "created_at" : "2023-10-26T10:26:17.000000Z",
* "updated_at" : "2024-06-21T10:06:50.000000Z",
* "color" : "#49E637"},
* {
* "id" : 3,
* "name" : "High",
* "created_at" : "2023-10-26T10:26:17.000000Z",
* "updated_at" : "2024-06-21T10:07:00.000000Z",
* "color" : "#D40C0C"
* },{
* "id" : 5,
* "name" : "Normal",
* "created_at" : "2024-07-12T17:10:54.000000Z",
* "updated_at" : "2024-07-12T17:10:54.000000Z",
* "color" : null
* }
* ],
* "heartbeat_period" : 60,
* "auto_thinning" : true,
* "screenshots_state" : 1,
* "env_screenshots_state" : -1,
* "default_priority_id" : 2
* }
*
* @apiSuccess {Array} data Contains an array of settings that changes were applied to
*
* @apiSuccessExample {json} Response Example
* HTTP/1.1 204 No Content
* {
* }
*
* @apiUse 400Error
* @apiUse UnauthorizedError
*
*/
public function update(UpdateCompanySettingsRequest $request): JsonResponse
{
Settings::scope('core')->set($request->validated());
return responder()->success()->respond(204);
}
/**
* @api {get} /offline-sync/public-key Get Offline Sync Public Key
* @apiDescription Retrieves the public key for offline synchronization.
*
* @apiVersion 4.0.0
* @apiName GetOfflineSyncPublicKey
* @apiGroup OfflineSync
*
* @apiUse AuthHeader
*
* @apiPermission offline_sync_view
* @apiPermission offline_sync_full_access
*
* @apiSuccess {Boolean} success Indicates if the operation was successful.
* @apiSuccess {Object} data The response data.
* @apiSuccess {String} data.key The public key for offline synchronization.
*
* @apiSuccessExample {json} Response Example
* HTTP/1.1 200 OK
* {
* "key": null
* }
* @apiError (Error 401) Unauthorized The user is not authorized to access this resource.
* @apiError (Error 403) Forbidden The user does not have the necessary permissions.
* @apiError (Error 404) NotFound The requested resource was not found.
*
* @apiUse 400Error
* @apiUse UnauthorizedError
* @apiUse ItemNotFoundError
* @apiUse ForbiddenError
*/
public function getOfflineSyncPublicKey(): JsonResponse
{
return responder()->success(
[ 'key' => Settings::scope('core.offline-sync')->get('public_key')],
)->respond();
}
}