Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion app/Http/Controllers/Api/Client/Servers/FileController.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Illuminate\Http\Response;
use Illuminate\Http\JsonResponse;
use Everest\Services\Nodes\NodeJWTService;
use Everest\Services\Files\FileDiffService;
use Everest\Repositories\Wings\DaemonFileRepository;
use Everest\Transformers\Api\Client\FileObjectTransformer;
use Everest\Http\Controllers\Api\Client\ClientApiController;
Expand All @@ -22,6 +23,7 @@
use Everest\Http\Requests\Api\Client\Servers\Files\DecompressFilesRequest;
use Everest\Http\Requests\Api\Client\Servers\Files\GetFileContentsRequest;
use Everest\Http\Requests\Api\Client\Servers\Files\WriteFileContentRequest;
use Everest\Http\Requests\Api\Client\Servers\Files\WriteFileWithDiffRequest;

class FileController extends ClientApiController
{
Expand All @@ -30,7 +32,8 @@ class FileController extends ClientApiController
*/
public function __construct(
private NodeJWTService $jwtService,
private DaemonFileRepository $fileRepository
private DaemonFileRepository $fileRepository,
private FileDiffService $diffService
) {
parent::__construct();
}
Expand Down Expand Up @@ -113,6 +116,41 @@ public function write(WriteFileContentRequest $request, Server $server): JsonRes
return new JsonResponse([], Response::HTTP_NO_CONTENT);
}

/**
* Writes the contents of the specified file to the server with diff tracking.
* This endpoint accepts JSON with original and new content to calculate diffs.
*
* @throws \Everest\Exceptions\Http\Connection\DaemonConnectionException
*/
public function writeWithDiff(WriteFileWithDiffRequest $request, Server $server): JsonResponse
{
$file = $request->input('file');
$content = $request->input('content');
$originalContent = $request->input('original_content', '');

// Write the new content to the file
$this->fileRepository->setServer($server)->putContent($file, $content);

// Build activity log with diff information if it's a text file
$activity = Activity::event('server:file.write')->property('file', $file);

if ($this->diffService->isTextFile($file) && $originalContent !== null) {
$diff = $this->diffService->calculateDiff($originalContent, $content, $file);

$activity->property('diff', [
'additions' => $diff['additions'],
'deletions' => $diff['deletions'],
'hunks' => $diff['hunks'],
'is_new_file' => $diff['is_new_file'] ?? false,
'large_file' => $diff['large_file'] ?? false,
]);
}

$activity->log();

return new JsonResponse([], Response::HTTP_NO_CONTENT);
}

/**
* Creates a new folder on the server.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Everest\Http\Requests\Api\Client\Servers\Files;

use Everest\Models\Permission;
use Everest\Contracts\Http\ClientPermissionsRequest;
use Everest\Http\Requests\Api\Client\ClientApiRequest;

class WriteFileWithDiffRequest extends ClientApiRequest implements ClientPermissionsRequest
{
/**
* Returns the permissions string indicating which permission should be used to
* validate that the authenticated user has permission to perform this action against
* the given resource (server).
*/
public function permission(): string
{
return Permission::ACTION_FILE_CREATE;
}

/**
* Validation rules for writing a file with diff tracking.
*/
public function rules(): array
{
return [
'file' => 'required|string',
'content' => 'present|string',
'original_content' => 'nullable|string',
];
}
}
Loading
Loading