cerys
1 week ago
19 changed files with 929 additions and 463 deletions
File diff suppressed because it is too large
@ -0,0 +1,97 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Auxilium\Schemas; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocumentField; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Enumerators\SchemaFieldExistence; |
||||
|
|
||||
|
#[SchemaDocument( |
||||
|
Name: "case", |
||||
|
Comment: "The case object itself SHOULD not have a value" |
||||
|
)] |
||||
|
class CaseSchema |
||||
|
{ |
||||
|
#[SchemaDocumentField( |
||||
|
Name: "title", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be a short description of what the case is about", |
||||
|
MaxSize: 2048, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $Title; |
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "clients", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the clients involved in the case", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "clients", |
||||
|
Comment: "", |
||||
|
ValidSchemas: [ |
||||
|
UserSchema::class, |
||||
|
] |
||||
|
), |
||||
|
)] |
||||
|
public array $Clients; |
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "workers", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all staff working on the case", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "workers", |
||||
|
Comment: "", |
||||
|
ValidSchemas: [ |
||||
|
UserSchema::class, |
||||
|
OrganisationSchema::class, |
||||
|
] |
||||
|
), |
||||
|
)] |
||||
|
public array $Workers; |
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "documents", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the case documents", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "documents", |
||||
|
Comment: "", |
||||
|
ValidSchemas: [ |
||||
|
DocumentSchema::class, |
||||
|
] |
||||
|
), |
||||
|
)] |
||||
|
public array $Documents; |
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "messages", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all messages that relate to this case", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "messages", |
||||
|
Comment: "", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
] |
||||
|
), |
||||
|
)] |
||||
|
public array $Messages; |
||||
|
} |
||||
|
|
@ -0,0 +1,15 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Auxilium\Schemas; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
|
||||
|
#[SchemaDocument( |
||||
|
Name: "collection", |
||||
|
MaxSize: 0, |
||||
|
Comment: "This is intended as an inheritable schema used to signify to software that it SHOULD display the numeric properties of this node as an inlined list", |
||||
|
)] |
||||
|
class CollectionSchema |
||||
|
{ |
||||
|
|
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Auxilium\Schemas; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocumentField; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Enumerators\SchemaFieldExistence; |
||||
|
|
||||
|
#[SchemaDocument( |
||||
|
Name: "document", |
||||
|
Comment: "Any given document SHOULD have metadata attached", |
||||
|
)] |
||||
|
class DocumentSchema |
||||
|
{ |
||||
|
#[SchemaDocumentField( |
||||
|
Name: "file_name", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "The filename SHOULD NOT contain an extension, this SHOULD be added by the application based on the file's mime type", |
||||
|
MaxSize: 256, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $FileName; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "created", |
||||
|
Existence: SchemaFieldExistence::MAY, |
||||
|
Comment: "The creation date, if supplied MUST be in ISO 8601 format", |
||||
|
MaxSize: 64, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $Created; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "modified", |
||||
|
Existence: SchemaFieldExistence::MAY, |
||||
|
Comment: "The last modified date, if supplied MUST be in ISO 8601 format", |
||||
|
MaxSize: 64, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $Modified; |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Auxilium\Schemas; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
|
||||
|
#[SchemaDocument( |
||||
|
Name: "enum", |
||||
|
Comment: "This is intended as an inheritable schema used to signify to software that it SHOULD be interpreted as a enumerable choice value that can be decoded based on its schema", |
||||
|
)] |
||||
|
class EnumSchema |
||||
|
{ |
||||
|
|
||||
|
} |
@ -0,0 +1,103 @@ |
|||||
|
<?php |
||||
|
|
||||
|
|
||||
|
namespace Auxilium\Schemas; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Enumerators\SchemaFieldExistence; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocumentField; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Interfaces\SchemaDocumentInterface; |
||||
|
|
||||
|
#[SchemaDocument( |
||||
|
Name: "organisation", |
||||
|
MaxSize: 0, |
||||
|
Comment: "The organisation object itself SHOULD not have a value", |
||||
|
)] |
||||
|
class OrganisationSchema |
||||
|
{ |
||||
|
#[SchemaDocumentField( |
||||
|
Name: "name", |
||||
|
Existence: SchemaFieldExistence::MUST, |
||||
|
Comment: "This MUST be the organisation's name", |
||||
|
MaxSize: 2048, |
||||
|
MimeType: "text/plain", |
||||
|
Children: [ |
||||
|
new SchemaDocumentField( |
||||
|
Name: "trading_as", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be the organisation's short trading name, or the abbreviation they would usually go by", |
||||
|
MaxSize: 256, |
||||
|
MimeType: "text/plain", |
||||
|
) |
||||
|
] |
||||
|
)] |
||||
|
public string $Name; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "departments", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all sub-organisations if applicable", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "departments", |
||||
|
Comment: null, |
||||
|
ValidSchemas: [ |
||||
|
OrganisationSchema::class, |
||||
|
], |
||||
|
), |
||||
|
)] |
||||
|
public array $Departments; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "cases", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the cases the organisation is either directly working on or the client of", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "cases", |
||||
|
Comment: null, |
||||
|
ValidSchemas: [ |
||||
|
CaseSchema::class, |
||||
|
], |
||||
|
), |
||||
|
)] |
||||
|
public array $Cases; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "staff", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the staff that cannot be categorised into departments, or in the case of small organisations with no departments, all staff", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "staff", |
||||
|
Comment: null, |
||||
|
ValidSchemas: [ |
||||
|
"https://schemas.auxiliumsoftware.co.uk/v1/user.json", |
||||
|
], |
||||
|
), |
||||
|
)] |
||||
|
public array $Staff; |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
public function __construct(array $data) |
||||
|
{ |
||||
|
$this->Name = $data["name"]; |
||||
|
$this->Departments = $data["departments"]; |
||||
|
$this->Cases = $data["cases"]; |
||||
|
$this->Staff = $data["staff"]; |
||||
|
} |
||||
|
*/ |
||||
|
} |
@ -0,0 +1,169 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Auxilium\Schemas; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocumentField; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Enumerators\SchemaFieldExistence; |
||||
|
|
||||
|
#[SchemaDocument( |
||||
|
Name: "user", |
||||
|
MaxSize: 0, |
||||
|
Comment: "The user object itself SHOULD not have a value", |
||||
|
)] |
||||
|
class UserSchema |
||||
|
{ |
||||
|
#[SchemaDocumentField( |
||||
|
Name: "name", |
||||
|
Existence: SchemaFieldExistence::MUST, |
||||
|
Comment: "This MUST be the user's full name", |
||||
|
MaxSize: 2048, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $Name; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "display_name", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be the user's first name or 'preferred' name used for UI", |
||||
|
MaxSize: 256, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $DisplayName; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "contact_email", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD NOT be used for unverified user input", |
||||
|
MaxSize: 512, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $ContactEmail; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "contact_email", |
||||
|
Existence: SchemaFieldExistence::MAY, |
||||
|
Comment: "This SHOULD be used for unverified user input instead of the 'contact_email' field", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "auxiliary_emails", |
||||
|
MaxSize: 512, |
||||
|
MimeType: "text/plain", |
||||
|
) |
||||
|
)] |
||||
|
public array $AuxiliaryEmails; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "contact_phone_number", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD include country code, and SHOULD NOT include spaces", |
||||
|
MaxSize: 64, |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $ContactPhoneNumber; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "auxiliary_phone_numbers", |
||||
|
Existence: SchemaFieldExistence::MAY, |
||||
|
Comment: "This SHOULD be used for phone numbers that need to be on record, but shouldn't be used for contact", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "auxiliary_phone_numbers", |
||||
|
Comment: "This SHOULD include country code, and SHOULD NOT include spaces", |
||||
|
MaxSize: 64, |
||||
|
MimeType: "text/plain", |
||||
|
) |
||||
|
)] |
||||
|
public array $AuxiliaryPhoneNumbers; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "contact_address", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be a full address, suitable for international postage", |
||||
|
MimeType: "text/plain", |
||||
|
)] |
||||
|
public string $ContactAddress; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "auxiliary_addresses", |
||||
|
Existence: SchemaFieldExistence::MAY, |
||||
|
Comment: "This SHOULD be used for addresses that need to be on record, but shouldn't be used for contact", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "auxiliary_addresses", |
||||
|
Comment: "This MAY be a full address, or a shortened address only suitable for local mail", |
||||
|
MimeType: "text/plain", |
||||
|
) |
||||
|
)] |
||||
|
public array $AuxiliaryAddresses; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "documents", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the user's documents", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "documents", |
||||
|
ValidSchemas: [ |
||||
|
DocumentSchema::class, |
||||
|
] |
||||
|
) |
||||
|
)] |
||||
|
public array $Documents; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "cases", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the cases the user is either directly working on or the client of", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "cases", |
||||
|
ValidSchemas: [ |
||||
|
CaseSchema::class, |
||||
|
] |
||||
|
) |
||||
|
)] |
||||
|
public array $Cases; |
||||
|
|
||||
|
|
||||
|
#[SchemaDocumentField( |
||||
|
Name: "messages", |
||||
|
Existence: SchemaFieldExistence::SHOULD, |
||||
|
Comment: "This SHOULD be an 'array node' of all the user's send and recieved messages", |
||||
|
ValidSchemas: [ |
||||
|
CollectionSchema::class, |
||||
|
], |
||||
|
MaxSize: 0, |
||||
|
Child: new SchemaDocumentField( |
||||
|
Name: "messages", |
||||
|
ValidSchemas: [ |
||||
|
MessageSchema::class, |
||||
|
] |
||||
|
) |
||||
|
)] |
||||
|
public array $Messages; |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
<phpunit |
||||
|
colors="true" |
||||
|
bootstrap="tests/bootstrap.php" |
||||
|
> |
||||
|
<testsuites> |
||||
|
<testsuite name="Darksparrow/AuxiliumSchemaBuilder Tests"> |
||||
|
<directory>tests</directory> |
||||
|
</testsuite> |
||||
|
</testsuites> |
||||
|
</phpunit> |
@ -1,24 +0,0 @@ |
|||||
<?php |
|
||||
|
|
||||
namespace Darksparrow\AuxiliumSchemaBuilder\Attributes; |
|
||||
|
|
||||
use PhpParser\Node\Attribute; |
|
||||
use PhpParser\Node\Name; |
|
||||
|
|
||||
#[\Attribute] |
|
||||
class SchemaDocumentChildField extends Attribute |
|
||||
{ |
|
||||
public string $Comment; |
|
||||
public array $ValidSchemas; |
|
||||
|
|
||||
public function __construct( |
|
||||
string $Comment, |
|
||||
array $ValidSchemas = [], |
|
||||
) |
|
||||
{ |
|
||||
$this->Comment = $Comment; |
|
||||
$this->ValidSchemas = $ValidSchemas; |
|
||||
parent::__construct(new Name("SchemaDocumentChildField"), [], []); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -0,0 +1,8 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\AuxiliumSchemaBuilder\Interfaces; |
||||
|
|
||||
|
interface SchemaDocumentInterface |
||||
|
{ |
||||
|
public function __construct(array $data); |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\AuxiliumSchemaBuilder\Utilities; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; |
||||
|
use ReflectionClass; |
||||
|
|
||||
|
class URLHandling |
||||
|
{ |
||||
|
public static string $URLBase = "https://schemas.auxiliumsoftware.co.uk/v1/"; |
||||
|
public static function GetURLForSchema(string $targetSchemaClassName): string |
||||
|
{ |
||||
|
$reflection = new ReflectionClass(new $targetSchemaClassName()); |
||||
|
foreach($reflection->getAttributes() as $attribute) |
||||
|
{ |
||||
|
if($attribute->getName() === SchemaDocument::class) |
||||
|
{ |
||||
|
$name = $attribute->getArguments()["Name"]; |
||||
|
return self::$URLBase . $name . ".json"; |
||||
|
} |
||||
|
} |
||||
|
throw new \Exception("Could not determine URL for schema " . $targetSchemaClassName . "."); |
||||
|
} |
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . "/../examples/Schemas/Message.php"; |
||||
|
require_once __DIR__ . "/../examples/Schemas/Organisation.php"; |
||||
|
|
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Examples\SchemaBuilder\Schemas\Message; |
||||
|
use Darksparrow\AuxiliumSchemaBuilder\Utilities\URLHandling; |
||||
|
use PHPUnit\Framework\TestCase; |
||||
|
|
||||
|
final class SchemaURITest extends TestCase |
||||
|
{ |
||||
|
public function test0() |
||||
|
{ |
||||
|
URLHandling::$URLBase = "https://schemas.auxiliumsoftware.co.uk/v1/"; |
||||
|
self::assertEquals( |
||||
|
expected: "https://schemas.auxiliumsoftware.co.uk/v1/message.json", |
||||
|
actual: URLHandling::GetURLForSchema(Message::class), |
||||
|
); |
||||
|
} |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace tests; |
Loading…
Reference in new issue