This commit is contained in:
2023-10-02 23:10:49 +03:00
commit c6cb488379
255 changed files with 18731 additions and 0 deletions
@@ -0,0 +1,51 @@
<?php
namespace Lucent\Http\Controller\Api;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\View\View;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Lucent\Account\AuthService;
use Lucent\LucentException;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
use function Lucent\Svelte\svelte;
class AccountController extends Controller
{
public function __construct(
private readonly AuthService $authService,
)
{
}
public function profile(): View
{
return svelte(
layout: "account",
view: "profile",
title: "Profile",
data: []
);
}
public function updateName(Request $request): Response
{
try {
$this->authService->updateName(session("user.id"), $request->input("name"));
} catch (LucentException $th) {
return fail($th);
}
$request->session()->put("user.name", $request->input("name"));
return ok();
}
}
@@ -0,0 +1,37 @@
<?php
namespace Lucent\Http\Controller\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Lucent\Edge\EdgeService;
use Lucent\LucentException;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
class EdgeController extends Controller
{
public function create(Request $request): Response
{
try {
$edge = EdgeService::create(
source: $request->input("source"),
target: $request->input("target"),
sourceSchema: $request->input("sourceSchema"),
targetSchema: $request->input("targetSchema"),
field: $request->input("field"),
rank: $request->input("rank") ?? "",
);
} catch (LucentException $th) {
return fail($th);
}
return ok([
"edge" => $edge,
]);
}
}
@@ -0,0 +1,39 @@
<?php
namespace Lucent\Http\Controller\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Lucent\Channel\ChannelContext;
use Lucent\Schema\FieldRepo;
use Lucent\Schema\SchemaRepo;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
class FieldController extends Controller
{
public function create(Request $request)
{
try {
$schema = SchemaRepo::findByName($request->input("schema"));
FieldRepo::create($schema, $request->input("field"));
} catch (\Throwable $th) {
return fail($th);
}
return ok();
}
public function update(Request $request)
{
try {
$schema = SchemaRepo::findByName($request->input("schema"));
FieldRepo::update($schema, $request->input("field"));
} catch (\Throwable $th) {
return fail($th);
}
return ok();
}
}
@@ -0,0 +1,62 @@
<?php
namespace Lucent\Http\Controller\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Lucent\Account\AuthService;
use Lucent\Channel\ChannelRepo;
use Lucent\File\FileUploadResult;
use Lucent\Query\Query;
use Lucent\Record\RecordService;
use function Lucent\File\uploadFile;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
class FileController extends Controller
{
public function __construct(
private readonly RecordService $recordService,
private readonly Query $query
)
{
}
public function upload(Request $request)
{
$validator = Validator::make(request()->all(), [
'files.*' => 'required|file|max:100000',
]);
if ($validator->fails()) {
return fail($validator->errors()->first());
}
$channel = ChannelRepo::current();
$schema = $channel->schemas->firstWhere("name", $request->input("schema"));
$files = request()->file('files');
$uploadResults = collect($files)->map(fn($file) => uploadFile($schema, $file))->toArray();
$insertedIds = collect($uploadResults)
->filter(fn(FileUploadResult $res) => !$res->isDuplicate)
->values()
->map(function (FileUploadResult $uploadResult) use ($schema, $request) {
return $this->recordService->create(
userId: AuthService::currentUserId($request),
schemaName: $schema->name,
data: [],
file: (array)$uploadResult->recordFile,
edges: [],
status: $request->input("status") ?? "published",
uploadFromUrl: ""
);
})->toArray();
return ok($insertedIds);
}
}
@@ -0,0 +1,107 @@
<?php
namespace Lucent\Http\Controller\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Lucent\Channel\ChannelRepo;
use Lucent\LucentException;
use Lucent\Query\Query;
use Lucent\Record\RecordService;
use Lucent\Schema\Validator\ValidatorException;
use Throwable;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
class RecordController extends Controller
{
public function __construct(
private readonly RecordService $recordService,
private readonly Query $query
)
{
}
public function records(Request $request)
{
$channel = ChannelRepo::current();
$urlParams = $request->all();
$sort = data_get($urlParams, "sort") ?? "-_sys.updatedAt";
$filter = data_get($urlParams, "filter") ?? [];
$arguments = array_merge([
], $filter);
$skip = data_get($urlParams, "skip") ?? 0;
$limit = data_get($urlParams, "limit") ?? 15;
$queryResult = $this->query
->filter($arguments)
->limit($limit)
->skip($skip)
->sort($sort)
->childrenDepth($request->input("childrenDepth") ?? 1)
->parentsDepth($request->input("parentsDepth") ?? 0)
->runWithCount();
$graph = $queryResult->getQueryRecords($channel->schemas);
$total = $queryResult->getTotal();
return ok([
"graph" => $graph->toArray(),
"sort" => $sort,
"limit" => $limit,
"skip" => $skip,
"total" => $total,
]);
}
public function create(Request $request)
{
try {
$recordId = $this->recordService->create(
userId: $request->input("userId"),
schemaName: $request->input("schema"),
data: $request->input("data") ?? [],
file: $request->input("file") ?? [],
edges: $request->input("edges") ?? [],
status: $request->input("status") ?? "draft",
uploadFromUrl: $request->input("uploadFromUrl") ?? ""
);
} catch (ValidatorException $th) {
return fail($th->getValidatorErrors());
} catch (LucentException $th) {
return fail($th);
}
return ok(["id" => $recordId]);
}
public function update(Request $request)
{
try {
$this->recordService->update(
userId: $request->input("userId"),
id: $request->route("id"),
data: $request->input("data"),
status: $request->input("status"),
edges: $request->input("edges") ?? [],
updateEdges: false,
);
} catch (ValidatorException $th) {
return fail($th->getValidatorErrors());
} catch (LucentException $th) {
return fail($th);
} catch (Throwable $th) {
if ($th->getCode() == 11000) {
return fail("ID has to be unique in the channel");
}
return fail($th);
}
return ok();
}
}
@@ -0,0 +1,81 @@
<?php
namespace Lucent\Http\Controller\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Lucent\Schema\SchemaService;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
class SchemaController extends Controller
{
public function __construct(
private readonly SchemaService $schemaService
)
{
}
// public function find(Request $request)
// {
// $cid = $request->header("CHANNEL-ID");
// $channelContext = ChannelContext::fromId($cid)->withSchemas();
// return ok($channelContext->getSchemas());
// }
// public function findOne(Request $request, string $name)
// {
// $cid = $request->header("CHANNEL-ID");
// $channelContext = ChannelContext::fromId($cid)->withSchemas();
// $schema = SchemaRepo::context($channelContext)->findByName($name);
// return ok($schema->toArray());
// }
public function create(Request $request)
{
try {
$schema = $this->schemaService->create(
name: $request->input("name"),
label: $request->input("label"),
type: $request->input("type"),
isEntry: $request->input("isEntry"),
revisionRetentionDays: $request->input("revisionRetentionDays"),
revisionRetentionNumber: $request->input("revisionRetentionNumber"),
trashedRetentionDays: $request->input("trashedRetentionDays"),
fields: $request->input("fields"),
titleTemplate: $request->input("titleTemplate") ?? "",
visible: $request->input("visible") ?? [],
path: $request->input("path") ?? "",
);
} catch (\Throwable $th) {
return fail($th);
}
return ok($schema->toArray());
}
// public function update(Request $request)
// {
// $cid = $request->header("CHANNEL-ID");
// try {
// $channelContext = ChannelContext::fromId($cid);
// SchemaRepo::context($channelContext)->update($request->all());
// } catch (\Throwable $th) {
// return fail($th);
// }
// $schema = SchemaRepo::context($channelContext)->findByName($request->input("name"));
// return ok($schema->toArray());
// }
public function delete(Request $request)
{
try {
$this->schemaService->delete($request->route("name"));
} catch (\Throwable $th) {
return fail($th);
}
return ok();
}
}