implemented step 05 by Gemini

added action saveConsent and ConsentService
This commit is contained in:
2026-06-12 17:22:20 +02:00
parent 20ff641811
commit 071aa2f5c9
3 changed files with 77 additions and 1 deletions

5
.gitignore vendored
View File

@ -1,2 +1,5 @@
/data/users/*.json
/data/admin/*.json
/data/consent/*.json
/data/llm/*.json
/data/projects/*.json
/data/users/*.json

View File

@ -52,6 +52,7 @@ try {
// Router
$projectActions = new \App\Actions\ProjectActions();
$consentService = new \App\Services\ConsentService();
switch ($action) {
case 'ping':
@ -78,6 +79,18 @@ try {
sendResponse(true, $projectActions->getProjectStatus($userId, $projectId));
break;
case 'saveConsent':
$projectId = $data['project_id'] ?? null;
$consentText = $data['payload']['consent_text'] ?? null;
if (!$projectId || !$consentText) {
sendResponse(false, ['code' => 'MISSING_DATA', 'message' => 'Project ID and consent text are required.'], 400);
}
$success = $consentService->saveConsent($projectId, $userId, $consentText);
sendResponse($success, ['message' => 'Consent saved successfully.']);
break;
default:
sendResponse(false, ['code' => 'UNKNOWN_ACTION', 'message' => "Action '$action' is not defined."], 404);
break;

View File

@ -0,0 +1,60 @@
<?php
declare(strict_types=1);
namespace App\Services;
use Exception;
class ConsentService
{
private FileStorage $storage;
private const CONSENT_VERSION = 'webwizard-mvp-2026-06-12';
public function __construct()
{
$this->storage = new FileStorage();
}
/**
* Saves user consent for a specific project.
*/
public function saveConsent(string $projectId, string $userId, string $consentText): bool
{
// Verify project exists and belongs to user
$projectData = $this->storage->get("projects/{$projectId}.json");
if (!$projectData) {
throw new Exception("Project not found.", 404);
}
if ($projectData['user_id'] !== $userId) {
throw new Exception("Unauthorized access to project.", 403);
}
$consentData = [
'project_id' => $projectId,
'user_id' => $userId,
'consent_text_version' => self::CONSENT_VERSION,
'consent_text' => $consentText,
'accepted' => true,
'accepted_at' => gmdate('Y-m-d\TH:i:s\Z')
];
return $this->storage->put("consent/{$projectId}.json", $consentData);
}
/**
* Checks if a project has a valid consent record.
*/
public function hasConsent(string $projectId): bool
{
return $this->storage->exists("consent/{$projectId}.json");
}
/**
* Returns the current consent version.
*/
public function getVersion(): string
{
return self::CONSENT_VERSION;
}
}