Skip to content

Commit e9e5c3c

Browse files
author
Sebastian Fix
committed
wip
1 parent eef1a6d commit e9e5c3c

7 files changed

Lines changed: 103 additions & 216 deletions

File tree

src/DTO/PropertyValue.php

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,61 @@
55
namespace CodebarAg\MFiles\DTO;
66

77
use CodebarAg\MFiles\Enums\MFDataTypeEnum;
8-
use Illuminate\Support\Arr;
98

109
final class PropertyValue
1110
{
1211
public function __construct(
1312
public readonly int $propertyDef,
1413
public readonly MFDataTypeEnum $dataType,
1514
public readonly mixed $value,
16-
public readonly ?array $lookup = null,
17-
public readonly ?array $lookups = null,
1815
) {}
1916

20-
public static function fromArray(array $data): self
17+
public static function fromArray(int $propertyDef, MFDataTypeEnum $dataType, mixed $value): self
2118
{
22-
$typedValue = Arr::get($data, 'TypedValue', []);
23-
$dataTypeId = Arr::get($typedValue, 'DataType', 0);
24-
$dataType = MFDataTypeEnum::tryFrom($dataTypeId) ?? MFDataTypeEnum::UNINITIALIZED;
25-
2619
return new self(
27-
propertyDef: Arr::get($data, 'PropertyDef'),
20+
propertyDef: $propertyDef,
2821
dataType: $dataType,
29-
value: Arr::get($typedValue, 'Value'),
30-
lookup: Arr::get($typedValue, 'Lookup'),
31-
lookups: Arr::get($typedValue, 'Lookups'),
22+
value: $value,
3223
);
3324
}
3425

3526
public function toArray(): array
3627
{
37-
$typedValue = [
38-
'DataType' => $this->dataType->value,
39-
];
40-
41-
if ($this->lookup !== null) {
42-
$typedValue['Lookup'] = $this->lookup;
43-
} elseif ($this->lookups !== null) {
44-
$typedValue['Lookups'] = $this->lookups;
45-
} else {
46-
$typedValue['Value'] = $this->value;
47-
}
48-
49-
return [
50-
'PropertyDef' => $this->propertyDef,
51-
'TypedValue' => $typedValue,
52-
];
28+
return match ($this->dataType) {
29+
MFDataTypeEnum::TEXT, MFDataTypeEnum::DATE, MFDataTypeEnum::TIMESTAMP, MFDataTypeEnum::BOOLEAN, MFDataTypeEnum::MULTILINETEXT => [
30+
'PropertyDef' => $this->propertyDef,
31+
'TypedValue' => [
32+
'DataType' => $this->dataType->value,
33+
'Value' => $this->value,
34+
],
35+
],
36+
MFDataTypeEnum::LOOKUP => [
37+
'PropertyDef' => $this->propertyDef,
38+
'TypedValue' => [
39+
'DataType' => 9,
40+
'Lookup' => [
41+
'Item' => $this->value,
42+
'Version' => -1,
43+
],
44+
],
45+
],
46+
MFDataTypeEnum::MULTISELECTLOOKUP => [
47+
'PropertyDef' => $this->propertyDef,
48+
'TypedValue' => [
49+
'DataType' => 10,
50+
'Lookups' => collect((array) $this->value)->map(fn (mixed $item) => [
51+
'Item' => $item,
52+
'Version' => -1,
53+
])->values()->all(),
54+
],
55+
],
56+
default => [
57+
'PropertyDef' => $this->propertyDef,
58+
'TypedValue' => [
59+
'DataType' => $this->dataType->value,
60+
'Value' => $this->value,
61+
],
62+
],
63+
};
5364
}
5465
}

src/Requests/CreateSingleFileDocumentRequest.php

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
use CodebarAg\MFiles\DTO\Document;
88
use CodebarAg\MFiles\DTO\PropertyValue;
9-
use CodebarAg\MFiles\Enums\MFDataTypeEnum;
10-
use CodebarAg\MFiles\Helpers\TypedPropertyBuilder;
119
use CodebarAg\MFiles\Responses\CreateSingleFileDocumentResponse;
1210
use Saloon\Contracts\Body\HasBody;
1311
use Saloon\Enums\Method;
@@ -24,51 +22,22 @@ class CreateSingleFileDocumentRequest extends Request implements HasBody
2422

2523
public function __construct(
2624
public string $title,
27-
public array $file,
28-
public ?array $propertyValues = null,
29-
public ?int $objectTypeId = null,
30-
) {
31-
if (empty($this->title)) {
32-
throw new \InvalidArgumentException('Title is required');
33-
}
34-
35-
if (empty($this->file)) {
36-
throw new \InvalidArgumentException('File data is required');
37-
}
38-
39-
if ($this->propertyValues !== null) {
40-
$this->propertyValues = array_map(
41-
fn ($propertyValue) => $propertyValue instanceof PropertyValue ? $propertyValue->toArray() : $propertyValue,
42-
$this->propertyValues
43-
);
44-
}
45-
}
25+
public array $files = [],
26+
public array $propertyValues = [],
27+
) {}
4628

4729
public function resolveEndpoint(): string
4830
{
4931
return '/objects/0';
5032
}
5133

5234
protected function defaultBody(): array
53-
{
54-
$body = [];
55-
56-
if ($this->propertyValues !== null) {
57-
$body['PropertyValues'] = $this->propertyValues;
58-
} else {
59-
$body['PropertyValues'] = $this->getDefaultPropertyValues();
60-
}
61-
62-
$body['Files'] = [$this->file];
63-
64-
return $body;
65-
}
66-
67-
protected function getDefaultPropertyValues(): array
6835
{
6936
return [
70-
TypedPropertyBuilder::buildTypedProperty(0, MFDataTypeEnum::TEXT, $this->title),
71-
TypedPropertyBuilder::buildTypedProperty(22, MFDataTypeEnum::BOOLEAN, true),
37+
'PropertyValues' => collect($this->propertyValues)
38+
->map(fn (PropertyValue $propertyValue) => $propertyValue->toArray())
39+
->toArray(),
40+
'Files' => $this->files,
7241
];
7342
}
7443

src/Requests/UploadFileRequest.php

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace CodebarAg\MFiles\Requests;
66

7+
use Illuminate\Support\Arr;
8+
use Illuminate\Support\Str;
79
use Saloon\Contracts\Body\HasBody;
810
use Saloon\Data\MultipartValue;
911
use Saloon\Enums\Method;
@@ -19,15 +21,7 @@ class UploadFileRequest extends Request implements HasBody
1921
public function __construct(
2022
public string $fileContent,
2123
public string $fileName,
22-
) {
23-
if (empty($this->fileContent)) {
24-
throw new \InvalidArgumentException('File content is required');
25-
}
26-
27-
if (empty($this->fileName)) {
28-
throw new \InvalidArgumentException('File name is required');
29-
}
30-
}
24+
) {}
3125

3226
public function resolveEndpoint(): string
3327
{
@@ -48,11 +42,9 @@ protected function defaultBody(): array
4842
public function createDtoFromResponse(\Saloon\Http\Response $response): array
4943
{
5044
$data = $response->json();
51-
52-
$data['Title'] = \Illuminate\Support\Str::beforeLast($this->fileName, '.');
53-
$data['Extension'] = \Illuminate\Support\Str::afterLast($this->fileName, '.');
54-
55-
unset($data['FileInformationType']);
45+
$data = Arr::add($data, 'Title', Str::beforeLast($this->fileName, '.'));
46+
$data = Arr::add($data, 'Extension', Str::afterLast($this->fileName, '.'));
47+
Arr::forget($data, 'FileInformationType');
5648

5749
return $data;
5850
}

tests/Feature/Requests/CreateSingleFileDocumentRequestTest.php

Lines changed: 13 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
declare(strict_types=1);
44

5-
use Carbon\CarbonImmutable;
65
use CodebarAg\MFiles\Connectors\MFilesConnector;
76
use CodebarAg\MFiles\DTO\Config\ConfigWithCredentials;
87
use CodebarAg\MFiles\DTO\Document;
@@ -12,49 +11,10 @@
1211
use CodebarAg\MFiles\Requests\CreateSingleFileDocumentRequest;
1312
use CodebarAg\MFiles\Requests\LogInToVaultRequest;
1413
use CodebarAg\MFiles\Requests\UploadFileRequest;
14+
use Illuminate\Support\Arr;
1515
use Saloon\Http\Faking\MockResponse;
1616
use Saloon\Laravel\Facades\Saloon;
1717

18-
test('can create single file document with basic parameters', function () {
19-
20-
/* Saloon::fake([
21-
LogInToVaultRequest::class => MockResponse::fixture('login-to-vault'),
22-
UploadFileRequest::class => MockResponse::fixture('upload-file'),
23-
CreateSingleFileDocumentRequest::class => MockResponse::fixture('create-single-file-document'),
24-
]); */
25-
26-
$config = new ConfigWithCredentials(
27-
url: config('m-files.auth.url'),
28-
vaultGuid: config('m-files.vault_guid'),
29-
username: config('m-files.auth.username'),
30-
password: config('m-files.auth.password'),
31-
cacheDriver: 'array'
32-
);
33-
$connector = new MFilesConnector($config);
34-
35-
$filePath = __DIR__.'/../../Fixtures/Files/test-1.pdf';
36-
$fileContent = file_get_contents($filePath);
37-
$fileName = 'test-1.pdf';
38-
39-
$uploadedFile = $connector->send(new UploadFileRequest(
40-
fileContent: $fileContent,
41-
fileName: $fileName
42-
))->dto();
43-
$document = $connector->send(new CreateSingleFileDocumentRequest(
44-
title: 'Sample Document',
45-
file: $uploadedFile
46-
))->dto();
47-
48-
expect($document)->toBeInstanceOf(Document::class);
49-
expect($document->id)->toBe(123);
50-
expect($document->title)->toBe('Sample Document');
51-
expect($document->objectType)->toBeNull(); // objectType is null from fixture
52-
expect($document->objectTypeId)->toBe(0);
53-
expect($document->version)->toBe('1');
54-
expect($document->isCheckedOut)->toBeFalse();
55-
expect($document->isDeleted)->toBeFalse();
56-
});
57-
5818
test('can create single file document with custom property values', function () {
5919
/* Saloon::fake([
6020
LogInToVaultRequest::class => MockResponse::fixture('login-to-vault'),
@@ -75,77 +35,27 @@
7535
$fileContent = file_get_contents($filePath);
7636
$fileName = 'test-1.pdf';
7737

78-
$uploadedFile = $connector->send(new UploadFileRequest(
38+
$fileUpload = $connector->send(new UploadFileRequest(
7939
fileContent: $fileContent,
8040
fileName: $fileName
8141
))->dto();
8242

8343
$propertyValues = [
84-
new PropertyValue(0, MFDataTypeEnum::TEXT, 'Custom Title'),
85-
new PropertyValue(5, MFDataTypeEnum::DATE, '2024-01-01'),
44+
new PropertyValue(0, MFDataTypeEnum::TEXT, Arr::get($fileUpload, 'Title')),
45+
new PropertyValue(38, MFDataTypeEnum::LOOKUP, 121),
46+
new PropertyValue(39, MFDataTypeEnum::LOOKUP, 474),
47+
new PropertyValue(100, MFDataTypeEnum::LOOKUP, 207),
8648
];
49+
8750
$document = $connector->send(new CreateSingleFileDocumentRequest(
8851
title: 'Custom Document',
89-
file: $uploadedFile,
52+
files: [$fileUpload],
9053
propertyValues: $propertyValues
91-
))->dto();
54+
));
55+
56+
dd($document->status(), $document->json());
9257

9358
expect($document)->toBeInstanceOf(Document::class);
9459
expect($document->id)->toBe(123);
95-
expect($document->title)->toBe('Sample Document');
96-
});
97-
98-
test('throws exception when title is empty', function () {
99-
expect(fn () => new CreateSingleFileDocumentRequest(
100-
title: '',
101-
file: ['ID' => 1, 'Name' => 'test.pdf']
102-
))->toThrow(\InvalidArgumentException::class, 'Title is required');
103-
});
104-
105-
test('throws exception when file data is empty', function () {
106-
expect(fn () => new CreateSingleFileDocumentRequest(
107-
title: 'Valid Title',
108-
file: []
109-
))->toThrow(\InvalidArgumentException::class, 'File data is required');
110-
});
111-
112-
test('can access file properties from document', function () {
113-
/* Saloon::fake([
114-
LogInToVaultRequest::class => MockResponse::fixture('login-to-vault'),
115-
UploadFileRequest::class => MockResponse::fixture('upload-file'),
116-
CreateSingleFileDocumentRequest::class => MockResponse::fixture('create-single-file-document'),
117-
]); */
118-
119-
$config = new ConfigWithCredentials(
120-
url: config('m-files.auth.url'),
121-
vaultGuid: config('m-files.vault_guid'),
122-
username: config('m-files.auth.username'),
123-
password: config('m-files.auth.password'),
124-
);
125-
126-
$connector = new MFilesConnector($config);
127-
128-
$filePath = __DIR__.'/../../Fixtures/Files/test-1.pdf';
129-
$fileContent = file_get_contents($filePath);
130-
$fileName = 'test-1.pdf';
131-
132-
$uploadedFile = $connector->send(new UploadFileRequest(
133-
fileContent: $fileContent,
134-
fileName: $fileName
135-
))->dto();
136-
$document = $connector->send(new CreateSingleFileDocumentRequest(
137-
title: 'Document with File',
138-
file: $uploadedFile
139-
))->dto();
140-
141-
expect($document->files)->not->toBeNull();
142-
expect($document->files->count())->toBe(1);
143-
144-
$file = $document->files->first();
145-
expect($file)->toBeInstanceOf(File::class);
146-
expect($file->id)->toBe(456);
147-
expect($file->name)->toBe('test-1.pdf');
148-
expect($file->extension)->toBe('pdf');
149-
expect($file->size)->toBe(8600);
150-
expect($file->lastModified)->toBeInstanceOf(CarbonImmutable::class);
151-
});
60+
expect($document->title)->toBe('Custom Document');
61+
})->group('create-single-file-document');

0 commit comments

Comments
 (0)