wip upload files and select
This commit is contained in:
@@ -28,18 +28,20 @@ final class Channel
|
||||
) {
|
||||
$this->lucentUrl = $url . "/lucent";
|
||||
$this->filesUrl = $this->makeFilesUrl();
|
||||
|
||||
$this->previewTargetUrl = $url . "/" . $previewTarget;
|
||||
}
|
||||
|
||||
private function makeFilesUrl(): string
|
||||
{
|
||||
return match (config("filesystems.disks.lucent.driver")) {
|
||||
"s3" => config("filesystems.disks.lucent.endpoint") .
|
||||
$lucentDisk = config("lucent.disk");
|
||||
return match (config("filesystems.disks.$lucentDisk.driver")) {
|
||||
"s3" => config("filesystems.disks.$lucentDisk.endpoint") .
|
||||
"/" .
|
||||
config("filesystems.disks.lucent.bucket"),
|
||||
config("filesystems.disks.$lucentDisk.bucket"),
|
||||
"local" => $this->url .
|
||||
"/storage" .
|
||||
config("filesystems.disks.lucent.endpoint"),
|
||||
config("filesystems.disks.$lucentDisk.endpoint"),
|
||||
default => "",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -110,9 +110,9 @@ class SetupDatabase extends Command
|
||||
Blueprint $table,
|
||||
) {
|
||||
$table->uuid("id")->primary();
|
||||
$table->uuid("record");
|
||||
$table->string("name");
|
||||
$table->string("ogName");
|
||||
$table->uuid("recordId");
|
||||
$table->string("filename");
|
||||
$table->jsonb("captions");
|
||||
$table->string("mime");
|
||||
$table->string("path");
|
||||
$table->integer("size");
|
||||
@@ -122,7 +122,7 @@ class SetupDatabase extends Command
|
||||
});
|
||||
|
||||
DB::statement(
|
||||
"CREATE INDEX ON " . $this->prefix . "files (record)",
|
||||
"CREATE INDEX ON " . $this->prefix . "files (recordId)",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+35
-2
@@ -2,12 +2,14 @@
|
||||
|
||||
namespace Lucent\Data;
|
||||
|
||||
use stdClass;
|
||||
|
||||
class File
|
||||
{
|
||||
function __construct(
|
||||
public readonly string $id,
|
||||
public readonly string $recordId,
|
||||
public readonly string $originalName,
|
||||
public readonly string $filename,
|
||||
public readonly string $mime,
|
||||
public readonly string $path,
|
||||
public readonly int $size,
|
||||
@@ -21,7 +23,22 @@ class File
|
||||
return new File(
|
||||
id: data_get($data, "id"),
|
||||
recordId: data_get($data, "recordId"),
|
||||
originalName: data_get($data, "originalName"),
|
||||
filename: data_get($data, "filename"),
|
||||
mime: data_get($data, "mime"),
|
||||
path: data_get($data, "path"),
|
||||
size: data_get($data, "size"),
|
||||
width: data_get($data, "width"),
|
||||
height: data_get($data, "height"),
|
||||
checksum: data_get($data, "checksum"),
|
||||
);
|
||||
}
|
||||
|
||||
public static function fromDB(stdClass $data): File
|
||||
{
|
||||
return new File(
|
||||
id: data_get($data, "id"),
|
||||
recordId: data_get($data, "recordId"),
|
||||
filename: data_get($data, "filename"),
|
||||
mime: data_get($data, "mime"),
|
||||
path: data_get($data, "path"),
|
||||
size: data_get($data, "size"),
|
||||
@@ -35,4 +52,20 @@ class File
|
||||
{
|
||||
return \json_decode(\json_encode($this), true);
|
||||
}
|
||||
|
||||
public function toDB(): array
|
||||
{
|
||||
return [
|
||||
"id" => $this->id,
|
||||
"recordId" => $this->recordId,
|
||||
"filename" => $this->filename,
|
||||
"mime" => $this->mime,
|
||||
"path" => $this->path,
|
||||
"size" => $this->size,
|
||||
"width" => $this->width,
|
||||
"height" => $this->height,
|
||||
"checksum" => $this->checksum,
|
||||
"captions" => "[]", // for the future
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Lucent\File;
|
||||
|
||||
use Lucent\Data\File as DataFile;
|
||||
use Lucent\Database\Database;
|
||||
use Lucent\Data\File;
|
||||
|
||||
class FileRepo
|
||||
{
|
||||
public function __construct() {}
|
||||
|
||||
public static function create(DataFile $file): void
|
||||
{
|
||||
Database::make()->table("lucent_files")->insert($file->toDB());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return File[]
|
||||
*/
|
||||
public static function byRecordId(string $recordId): array
|
||||
{
|
||||
return Database::make()
|
||||
->table("lucent_files")
|
||||
->where("recordId", $recordId)
|
||||
->get()
|
||||
->map(File::fromDB(...))
|
||||
->toArray();
|
||||
}
|
||||
}
|
||||
@@ -85,10 +85,10 @@ class FileService
|
||||
[$width, $height] = $this->isImage($mimetype)
|
||||
? getimagesize($file)
|
||||
: [0, 0];
|
||||
return new DataFile(
|
||||
$dataFile = new DataFile(
|
||||
id: Id::new(),
|
||||
recordId: $recordId,
|
||||
originalName: $originalFilename,
|
||||
filename: $originalFilename,
|
||||
mime: $mimetype,
|
||||
path: $path,
|
||||
size: $file->getSize(),
|
||||
@@ -96,6 +96,9 @@ class FileService
|
||||
height: $height,
|
||||
checksum: $checksum,
|
||||
);
|
||||
|
||||
FileRepo::create($dataFile);
|
||||
return $dataFile;
|
||||
}
|
||||
|
||||
private function createFileName(
|
||||
@@ -112,10 +115,11 @@ class FileService
|
||||
private function isImage(string $mimetype): bool
|
||||
{
|
||||
$imageMimes = [
|
||||
"image/webp",
|
||||
"image/gif",
|
||||
"image/jpeg",
|
||||
"image/png",
|
||||
"image/avif",
|
||||
"image/webp",
|
||||
"image/gif",
|
||||
"image/tiff",
|
||||
];
|
||||
return in_array($mimetype, $imageMimes);
|
||||
@@ -156,4 +160,12 @@ class FileService
|
||||
$image = $originalImage->fit(300, 300);
|
||||
$disk->put($thumbDir, $image->encode("webp", 75));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return DataFile[]
|
||||
*/
|
||||
public function filesForRecord(string $recordId): array
|
||||
{
|
||||
return FileRepo::byRecordId($recordId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ use Lucent\Record\InputData\RecordInputData;
|
||||
use Lucent\Record\Manager;
|
||||
use Lucent\Record\QueryRecord;
|
||||
use Lucent\Record\RecordService;
|
||||
use Lucent\File\FileService;
|
||||
use Lucent\Record\Status;
|
||||
use Lucent\Schema\System;
|
||||
use Lucent\Schema\Ui\Reference;
|
||||
@@ -30,6 +31,7 @@ class RecordController extends Controller
|
||||
private readonly RecordService $recordService,
|
||||
private readonly AccountService $accountService,
|
||||
private readonly ChannelService $channelService,
|
||||
private readonly FileService $fileService,
|
||||
private readonly Svelte $svelte,
|
||||
private readonly Query $query,
|
||||
private readonly Manager $recordManager,
|
||||
@@ -493,4 +495,11 @@ class RecordController extends Controller
|
||||
}
|
||||
return ok();
|
||||
}
|
||||
|
||||
public function files(Request $request)
|
||||
{
|
||||
$recordId = $request->input("recordId");
|
||||
|
||||
return $this->fileService->filesForRecord($recordId);
|
||||
}
|
||||
}
|
||||
|
||||
+117
-76
@@ -12,89 +12,130 @@ use Lucent\Http\Controller\RecordController;
|
||||
use Lucent\Http\Controller\RevisionController;
|
||||
use Lucent\Http\Controller\SetupController;
|
||||
|
||||
Route::get("/lucent/setup", [SetupController::class, "setup"]);
|
||||
Route::get("/lfs-{disk}/{any}", [FileController::class, "fromDisk"])->where(
|
||||
"any",
|
||||
".*",
|
||||
);
|
||||
|
||||
Route::get('/lucent/setup', [SetupController::class, 'setup']);
|
||||
Route::get('/lfs-{disk}/{any}', [FileController::class, 'fromDisk'])->where('any', '.*');
|
||||
Route::group(
|
||||
[
|
||||
"middleware" => ["web"],
|
||||
"prefix" => "lucent",
|
||||
],
|
||||
function () {
|
||||
Route::middleware(["lucent.guest"])->group(function () {
|
||||
Route::get("/", [AuthController::class, "login"]);
|
||||
|
||||
Route::get("/register", [AuthController::class, "register"]);
|
||||
Route::post("/register", [AuthController::class, "postRegister"]);
|
||||
Route::get("/login", [AuthController::class, "login"]);
|
||||
Route::post("/login", [AuthController::class, "postLogin"]);
|
||||
Route::get("/verify", [AuthController::class, "verify"]);
|
||||
Route::post("/verify", [AuthController::class, "postVerify"]);
|
||||
});
|
||||
|
||||
Route::group([
|
||||
'middleware' => ['web'],
|
||||
'prefix' => "lucent"
|
||||
], function () {
|
||||
Route::middleware("lucent.auth")->group(function () {
|
||||
Route::get("/logout", [AuthController::class, "logout"]);
|
||||
Route::get("/profile", [AccountController::class, "profile"]);
|
||||
Route::post("/account/update-name", [
|
||||
AccountController::class,
|
||||
"updateName",
|
||||
]);
|
||||
Route::post("/account/update-email", [
|
||||
AccountController::class,
|
||||
"updateEmail",
|
||||
]);
|
||||
Route::get("/command-report/{signature}", [
|
||||
BuildController::class,
|
||||
"report",
|
||||
]);
|
||||
Route::get("/command-report-source/{signature}", [
|
||||
BuildController::class,
|
||||
"reportSource",
|
||||
]);
|
||||
Route::post("/command/{signature}", [
|
||||
BuildController::class,
|
||||
"build",
|
||||
]);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::get("/members/", [MemberController::class, "index"]);
|
||||
Route::post("/members/invite", [MemberController::class, "invite"]);
|
||||
Route::post("/members/update", [MemberController::class, "update"]);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])
|
||||
->prefix("/records")
|
||||
->group(function () {
|
||||
Route::get("/files", [RecordController::class, "files"]);
|
||||
Route::get("/new", [RecordController::class, "new"]);
|
||||
Route::get("/newInline", [
|
||||
RecordController::class,
|
||||
"newInline",
|
||||
]);
|
||||
Route::get("/suggestions", [
|
||||
RecordController::class,
|
||||
"suggestions",
|
||||
]);
|
||||
Route::get("/{rid}", [RecordController::class, "edit"]);
|
||||
Route::post("/clone/{rid}", [RecordController::class, "clone"]);
|
||||
// Route::get('/editInline/{rid}', [RecordController::class, 'editInline']);
|
||||
Route::get("/{rid}/parents", [
|
||||
RecordController::class,
|
||||
"parents",
|
||||
]);
|
||||
Route::post("/", [RecordController::class, "save"]);
|
||||
Route::post("/status/{status}", [
|
||||
RecordController::class,
|
||||
"status",
|
||||
]);
|
||||
Route::post("/delete", [RecordController::class, "delete"]);
|
||||
Route::post("/{rid}/rollback/{version}", [
|
||||
RecordController::class,
|
||||
"rollback",
|
||||
]);
|
||||
});
|
||||
|
||||
Route::middleware(['lucent.guest'])->group(function () {
|
||||
Route::get('/', [AuthController::class, 'login']);
|
||||
Route::middleware(["lucent.auth"])
|
||||
->prefix("/edges")
|
||||
->group(function () {
|
||||
Route::post("/insert-many", [
|
||||
EdgeController::class,
|
||||
"insertMany",
|
||||
]);
|
||||
});
|
||||
|
||||
Route::get('/register', [AuthController::class, 'register']);
|
||||
Route::post('/register', [AuthController::class, 'postRegister']);
|
||||
Route::get('/login', [AuthController::class, 'login']);
|
||||
Route::post('/login', [AuthController::class, 'postLogin']);
|
||||
Route::get('/verify', [AuthController::class, 'verify']);
|
||||
Route::post('/verify', [AuthController::class, 'postVerify']);
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::get("/records/{rid}/revisions", [
|
||||
RevisionController::class,
|
||||
"index",
|
||||
]);
|
||||
});
|
||||
|
||||
});
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::get("/", [HomeController::class, "home"]);
|
||||
Route::get("/home/records", [HomeController::class, "records"]);
|
||||
});
|
||||
|
||||
Route::middleware('lucent.auth')->group(function () {
|
||||
Route::get('/logout', [AuthController::class, 'logout']);
|
||||
Route::get('/profile', [AccountController::class, 'profile']);
|
||||
Route::post('/account/update-name', [AccountController::class, 'updateName']);
|
||||
Route::post('/account/update-email', [AccountController::class, 'updateEmail']);
|
||||
Route::get('/command-report/{signature}', [BuildController::class, 'report']);
|
||||
Route::get('/command-report-source/{signature}', [BuildController::class, 'reportSource']);
|
||||
Route::post('/command/{signature}', [BuildController::class, 'build']);
|
||||
});
|
||||
|
||||
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::get('/members/', [MemberController::class, 'index']);
|
||||
Route::post('/members/invite', [MemberController::class, 'invite']);
|
||||
Route::post('/members/update', [MemberController::class, 'update']);
|
||||
});
|
||||
|
||||
|
||||
Route::middleware(["lucent.auth"])->prefix("/records")->group(function () {
|
||||
|
||||
Route::get('/new', [RecordController::class, 'new']);
|
||||
Route::get('/newInline', [RecordController::class, 'newInline']);
|
||||
Route::get('/suggestions', [RecordController::class, 'suggestions']);
|
||||
Route::get('/{rid}', [RecordController::class, 'edit']);
|
||||
Route::post('/clone/{rid}', [RecordController::class, 'clone']);
|
||||
// Route::get('/editInline/{rid}', [RecordController::class, 'editInline']);
|
||||
Route::get('/{rid}/parents', [RecordController::class, 'parents']);
|
||||
Route::post('/', [RecordController::class, 'save']);
|
||||
Route::post('/status/{status}', [RecordController::class, 'status']);
|
||||
Route::post('/delete', [RecordController::class, 'delete']);
|
||||
Route::post('/{rid}/rollback/{version}', [RecordController::class, 'rollback']);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->prefix("/edges")->group(function () {
|
||||
Route::post('/insert-many', [EdgeController::class, 'insertMany']);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::get('/records/{rid}/revisions', [RevisionController::class, 'index']);
|
||||
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::get('/', [HomeController::class, 'home']);
|
||||
Route::get('/home/records', [HomeController::class, 'records']);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->prefix("/content")->group(function () {
|
||||
Route::get('/{schemaName}', [RecordController::class, 'index']);
|
||||
Route::get('/{schemaName}/csv', [RecordController::class, 'exportCSV']);
|
||||
Route::get('/{schemaName}/emptyTrash', [RecordController::class, 'emptyTrash']);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::post('/files/upload', [FileController::class, 'upload']);
|
||||
Route::get('/files/download', [FileController::class, 'download']);
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
Route::middleware(["lucent.auth"])
|
||||
->prefix("/content")
|
||||
->group(function () {
|
||||
Route::get("/{schemaName}", [RecordController::class, "index"]);
|
||||
Route::get("/{schemaName}/csv", [
|
||||
RecordController::class,
|
||||
"exportCSV",
|
||||
]);
|
||||
Route::get("/{schemaName}/emptyTrash", [
|
||||
RecordController::class,
|
||||
"emptyTrash",
|
||||
]);
|
||||
});
|
||||
|
||||
Route::middleware(["lucent.auth"])->group(function () {
|
||||
Route::post("/files/upload", [FileController::class, "upload"]);
|
||||
Route::get("/files/download", [FileController::class, "download"]);
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user