From a0363ebb71e5da5311392c8ce43661c012f3f94e Mon Sep 17 00:00:00 2001
From: Dave Mc Nicoll <info@mcnd.ca>
Date: Mon, 29 Mar 2021 20:02:17 +0000
Subject: [PATCH] - Added a new ObjectType annotation. - Computer entity added
 - Fixed some problem related to filter and repository of LDAP specific
 methods.

---
 src/Annotation/Classes/ObjectType.php | 15 +++++++++
 src/Entity/Computer.php               | 45 ++++++++++++++++++++++++++-
 src/EntityTrait.php                   |  2 +-
 src/Query/Filter.php                  |  2 +-
 src/Repository.php                    |  8 +++--
 5 files changed, 67 insertions(+), 5 deletions(-)
 create mode 100644 src/Annotation/Classes/ObjectType.php

diff --git a/src/Annotation/Classes/ObjectType.php b/src/Annotation/Classes/ObjectType.php
new file mode 100644
index 0000000..44f8646
--- /dev/null
+++ b/src/Annotation/Classes/ObjectType.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Ulmus\Ldap\Annotation\Classes;
+
+class ObjectType implements \Ulmus\Annotation\Annotation {
+
+    public string $type;
+
+    public function __construct($type = null)
+    {
+        if ( $type !== null ) {
+            $this->type = $type;
+        }
+    }
+}
diff --git a/src/Entity/Computer.php b/src/Entity/Computer.php
index 9a7d14c..bd9e54a 100644
--- a/src/Entity/Computer.php
+++ b/src/Entity/Computer.php
@@ -1,10 +1,53 @@
 <?php
 
-
 namespace Ulmus\Ldap\Entity;
 
+use Ulmus\Ldap\Entity\Field\{ Datetime };
 
+/**
+ * @ObjectClass('computer')
+ */
 class Computer
 {
+    use \Ulmus\Ldap\EntityTrait;
 
+    /**
+     * @Field
+     */
+    public string $samaccountname;
+
+    /**
+     * @Field
+     */
+    public string $name;
+
+    /**
+     * @Field
+     */
+    public string $description;
+
+    /**
+     * @Field('DNSHostName')
+     */
+    public string $hostname;
+
+    /**
+     * @Field
+     */
+    public string $location;
+
+    /**
+     * @Field
+     */
+    public string $operatingSystem;
+
+    /**
+     * @Field
+     */
+    public string $operatingSystemServicePack;
+
+    /**
+     * @Field
+     */
+    public string $operatingSystemVersion;
 }
\ No newline at end of file
diff --git a/src/EntityTrait.php b/src/EntityTrait.php
index 5e339d8..5bb57c7 100644
--- a/src/EntityTrait.php
+++ b/src/EntityTrait.php
@@ -4,7 +4,7 @@ namespace Ulmus\Ldap;
 
 use Ulmus\{ Ulmus, EventTrait, Query, Common\EntityResolver, Common\EntityField };
 
-use Ulmus\Ldap\Annotation\Classes\{ ObjectClass, };
+use Ulmus\Ldap\Annotation\Classes\{ ObjectClass, ObjectType, };
 
 trait EntityTrait {
     use \Ulmus\EntityTrait;
diff --git a/src/Query/Filter.php b/src/Query/Filter.php
index d0470e6..b1730c5 100644
--- a/src/Query/Filter.php
+++ b/src/Query/Filter.php
@@ -96,7 +96,7 @@ class Filter extends Fragment {
                 $return = $this->content ?: $this->content = implode("", array_filter([
                     $this->field,
                     $this->operator(),
-                    $this->operator === Filter::OPERATOR_LIKE ? "*{$this->value}*" : $value,
+                    $this->operator === Filter::OPERATOR_LIKE ? str_replace('%', '*', $this->value) : $value,
                 ]));
 
                 return $this->applyOperator($return, "");
diff --git a/src/Repository.php b/src/Repository.php
index 3738f20..43078dd 100644
--- a/src/Repository.php
+++ b/src/Repository.php
@@ -2,7 +2,7 @@
 
 namespace Ulmus\Ldap;
 
-use Ulmus\Ldap\Annotation\Classes\ObjectClass;
+use Ulmus\Ldap\Annotation\Classes\{ ObjectClass, ObjectType };
 use Ulmus\{EntityCollection, Ulmus, SearchRequest, Query};
 use Ulmus\Annotation\Property\{ Where, Having, Relation, Join, WithJoin, Relation\Ignore as RelationIgnore };
 use Ulmus\Common\EntityResolver;
@@ -27,10 +27,14 @@ class Repository extends \Ulmus\Repository
             $this->select(array_keys($this->entityResolver->fieldList(EntityResolver::KEY_COLUMN_NAME)));
         }
 
-        if ( null !== $objectClass = $this->entityResolver->getAnnotationFromClassname( ObjectClass::class ) ) {
+        if ( null !== $objectClass = $this->entityResolver->getAnnotationFromClassname( ObjectClass::class, false ) ) {
             $this->where('objectclass', $objectClass->type);
         }
 
+        if ( null !== $objectClass = $this->entityResolver->getAnnotationFromClassname( ObjectType::class, false ) ) {
+            $this->where('objecttype', $objectClass->type);
+        }
+
         return $this;
     }