Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
089d8a2
feat: add `SynonymSet` and `SynonymSets` classes for global synonym m…
tharropoulos Aug 19, 2025
61f80d9
feat(client): register synonym set classes in client
tharropoulos Aug 19, 2025
bb7596f
feat(test): add utility for checking to skip old synonym tests
tharropoulos Aug 19, 2025
79e23ca
feat(test): skip deprecated API tests for Synonyms and Analytics
tharropoulos Aug 19, 2025
985a4df
test: add test suite for synonym sets
tharropoulos Aug 19, 2025
4e2c8c4
fix(synonyms): rename `synonyms` to `items` inside synonym sets
tharropoulos Sep 23, 2025
2f601a4
feat(curation): add curation set classes
tharropoulos Sep 23, 2025
afa1476
feat: register curation set classes to client object
tharropoulos Sep 23, 2025
6eced84
test(curation): add test suite for curation sets
tharropoulos Sep 23, 2025
5aa6daf
feat(analytics): add analytics v2 classes
tharropoulos Aug 20, 2025
c9ac574
feat(client): register analytics v2 to client object
tharropoulos Aug 20, 2025
a3df825
test: add test suite for analytics v2
tharropoulos Aug 20, 2025
e129f69
refactor(analytics): rename old analytics to analyticsV1
tharropoulos Aug 20, 2025
3211ac7
chore: lint
tharropoulos Sep 29, 2025
917589e
ci: upgrade typesense version to v30
tharropoulos Oct 21, 2025
268ac3a
fix(test): also match non-prefixed `v` versions on check
tharropoulos Oct 21, 2025
3176e32
ci: increase number of analytics per minute
tharropoulos Oct 21, 2025
696524c
ci: manually run typesense on ci
tharropoulos Oct 21, 2025
26e6f80
docs: add definition docs to analytic events
tharropoulos Oct 31, 2025
ad047c9
fix(analytics): add readonly array access to analytics rules
tharropoulos Oct 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 17 additions & 12 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,28 @@ jobs:
test:
name: Run tests with PHP v8.3
runs-on: ubuntu-latest
services:
typesense:
image: typesense/typesense:28.0.rc36
ports:
- 8108:8108/tcp
volumes:
- /tmp/typesense-server-data:/data
env:
TYPESENSE_DATA_DIR: /data
TYPESENSE_API_KEY: xyz
TYPESENSE_ENABLE_CORS: true
steps:
- name: Start Typesense
run: |
docker run -d \
-p 8108:8108 \
--name typesense \
-v /tmp/typesense-data:/data \
-v /tmp/typesense-analytics-data:/analytics-data \
typesense/typesense:30.0.alpha1 \
--api-key=xyz \
--data-dir=/data \
--enable-search-analytics=true \
--analytics-dir=/analytics-data \
--analytics-flush-interval=60 \
--analytics-minute-rate-limit=50 \
--enable-cors

- uses: actions/checkout@v4
- name: Setup PHP 8.3
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
php-version: "8.3"
coverage: xdebug
- uses: php-actions/composer@v6
- name: Run tests
Expand Down
2 changes: 1 addition & 1 deletion src/Analytics.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ public function events()
}
return $this->events;
}
}
}
24 changes: 15 additions & 9 deletions src/AnalyticsEvents.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

/**
* Class AnalyticsEvents
*
* Implements the updated analytics events API for Typesense v30.0+
*
* @package \Typesense
*/
Expand All @@ -27,21 +29,25 @@ public function __construct(ApiCall $apiCall)
}

/**
* @param array $params
*
* @return array
* Create an analytics event
*
* @param array $params Event parameters including name, event_type, and data
* @return array Response from the API
* @throws TypesenseClientError|HttpClientException
*/
public function create($params)
public function create(array $params)
{
return $this->apiCall->post($this->endpoint_path(), $params);
return $this->apiCall->post(self::RESOURCE_PATH, $params);
}

/**
* @return string
* Retrieve analytics events
*
* @param array $params Query parameters
* @return array Response from the API
*/
private function endpoint_path($operation = null)
public function retrieve(array $params = [])
{
return self::RESOURCE_PATH . ($operation === null ? '' : "/$operation");
return $this->apiCall->get(self::RESOURCE_PATH, $params);
}
}
}
47 changes: 47 additions & 0 deletions src/AnalyticsEventsV1.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace Typesense;

/**
* Class AnalyticsEventsV1
*
* @package \Typesense
*/
class AnalyticsEventsV1
{
const RESOURCE_PATH = '/analytics/events';

/**
* @var ApiCall
*/
private ApiCall $apiCall;

/**
* AnalyticsEventsV1 constructor.
*
* @param ApiCall $apiCall
*/
public function __construct(ApiCall $apiCall)
{
$this->apiCall = $apiCall;
}

/**
* @param array $params
*
* @return array
* @throws TypesenseClientError|HttpClientException
*/
public function create($params)
{
return $this->apiCall->post($this->endpoint_path(), $params);
}

/**
* @return string
*/
private function endpoint_path($operation = null)
{
return self::RESOURCE_PATH . ($operation === null ? '' : "/$operation");
}
}
27 changes: 24 additions & 3 deletions src/AnalyticsRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,48 @@

class AnalyticsRule
{
private $ruleName;
private string $ruleName;
private ApiCall $apiCall;

public function __construct(string $ruleName, ApiCall $apiCall)
{
$this->ruleName = $ruleName;
$this->apiCall = $apiCall;
$this->apiCall = $apiCall;
}

/**
* Retrieve a specific analytics rule
*
* @return array Response from the API
*/
public function retrieve()
{
return $this->apiCall->get($this->endpointPath(), []);
}

/**
* Delete a specific analytics rule
*
* @return array Response from the API
*/
public function delete()
{
return $this->apiCall->delete($this->endpointPath());
}

/**
* Update a specific analytics rule
*
* @param array $params Rule parameters
* @return array Response from the API
*/
public function update(array $params)
{
return $this->apiCall->put($this->endpointPath(), $params);
}

private function endpointPath()
{
return AnalyticsRules::RESOURCE_PATH . '/' . encodeURIComponent($this->ruleName);
}
}
}
30 changes: 30 additions & 0 deletions src/AnalyticsRuleV1.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Typesense;

class AnalyticsRuleV1
{
private $ruleName;
private ApiCall $apiCall;

public function __construct(string $ruleName, ApiCall $apiCall)
{
$this->ruleName = $ruleName;
$this->apiCall = $apiCall;
}

public function retrieve()
{
return $this->apiCall->get($this->endpointPath(), []);
}

public function delete()
{
return $this->apiCall->delete($this->endpointPath());
}

private function endpointPath()
{
return AnalyticsRulesV1::RESOURCE_PATH . '/' . encodeURIComponent($this->ruleName);
}
}
52 changes: 36 additions & 16 deletions src/AnalyticsRules.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,58 @@ class AnalyticsRules implements \ArrayAccess
const RESOURCE_PATH = '/analytics/rules';

private ApiCall $apiCall;
private $analyticsRules = [];

/**
* @var array
*/
private array $analyticsRules = [];

public function __construct(ApiCall $apiCall)
{
$this->apiCall = $apiCall;
}

public function __get($ruleName)
{
if (!isset($this->analyticsRules[$ruleName])) {
$this->analyticsRules[$ruleName] = new AnalyticsRule($ruleName, $this->apiCall);
}
return $this->analyticsRules[$ruleName];
}

public function upsert($ruleName, $params)
/**
* Create multiple analytics rules
*
* @param array $rules Array of rule objects
* @return array Response from the API
*/
public function create(array $rules)
{
return $this->apiCall->put($this->endpoint_path($ruleName), $params);
return $this->apiCall->post(self::RESOURCE_PATH, $rules);
}

/**
* Retrieve all analytics rules
*
* @return array Response from the API
*/
public function retrieve()
{
return $this->apiCall->get($this->endpoint_path(), []);
return $this->apiCall->get(self::RESOURCE_PATH, []);
}

private function endpoint_path($operation = null)
/**
* Get a specific rule by name
*
* @param string $ruleName
* @return AnalyticsRule
*/
public function __get($ruleName)
{
return self::RESOURCE_PATH . ($operation === null ? '' : "/" . encodeURIComponent($operation));
if (isset($this->{$ruleName})) {
return $this->{$ruleName};
}
if (!isset($this->analyticsRules[$ruleName])) {
$this->analyticsRules[$ruleName] = new AnalyticsRule($ruleName, $this->apiCall);
}

return $this->analyticsRules[$ruleName];
}

/**
* @inheritDoc
* ArrayAccess implementation for backwards compatibility
*/
public function offsetExists($offset): bool
{
Expand Down Expand Up @@ -72,4 +92,4 @@ public function offsetUnset($offset): void
{
unset($this->analyticsRules[$offset]);
}
}
}
75 changes: 75 additions & 0 deletions src/AnalyticsRulesV1.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

namespace Typesense;

class AnalyticsRulesV1 implements \ArrayAccess
{
const RESOURCE_PATH = '/analytics/rules';

private ApiCall $apiCall;
private $analyticsRules = [];

public function __construct(ApiCall $apiCall)
{
$this->apiCall = $apiCall;
}

public function __get($ruleName)
{
if (!isset($this->analyticsRules[$ruleName])) {
$this->analyticsRules[$ruleName] = new AnalyticsRuleV1($ruleName, $this->apiCall);
}
return $this->analyticsRules[$ruleName];
}

public function upsert($ruleName, $params)
{
return $this->apiCall->put($this->endpoint_path($ruleName), $params);
}

public function retrieve()
{
return $this->apiCall->get($this->endpoint_path(), []);
}

private function endpoint_path($operation = null)
{
return self::RESOURCE_PATH . ($operation === null ? '' : "/" . encodeURIComponent($operation));
}

/**
* @inheritDoc
*/
public function offsetExists($offset): bool
{
return isset($this->analyticsRules[$offset]);
}

/**
* @inheritDoc
*/
public function offsetGet($offset): AnalyticsRuleV1
{
if (!isset($this->analyticsRules[$offset])) {
$this->analyticsRules[$offset] = new AnalyticsRuleV1($offset, $this->apiCall);
}

return $this->analyticsRules[$offset];
}

/**
* @inheritDoc
*/
public function offsetSet($offset, $value): void
{
$this->analyticsRules[$offset] = $value;
}

/**
* @inheritDoc
*/
public function offsetUnset($offset): void
{
unset($this->analyticsRules[$offset]);
}
}
Loading