From ac77aa136b52817102f8cfc8605f3b2adb5cfbc9 Mon Sep 17 00:00:00 2001 From: Oussama Douhou Date: Wed, 29 Oct 2025 12:04:35 +0100 Subject: [PATCH] Agents --- .gitignore | 1 + api/controllers/Playground.php | 67 ++++++++++++++++++++---------- api/libraries/Api_aeiou.php | 14 +++---- api/migrations/210_version_210.php | 28 ++++++------- api/migrations/211_version_211.php | 49 ++++++++++++++++++++++ 5 files changed, 116 insertions(+), 43 deletions(-) create mode 100644 .gitignore create mode 100644 api/migrations/211_version_211.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c317064 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +AGENTS.md diff --git a/api/controllers/Playground.php b/api/controllers/Playground.php index 83b560d..1c36135 100644 --- a/api/controllers/Playground.php +++ b/api/controllers/Playground.php @@ -288,17 +288,29 @@ class Playground extends CI_Controller ['method' => 'GET', 'path' => '/estimates/search/{keyword}', 'description' => 'Search estimates'] ] ], - 'contracts' => [ - 'name' => 'Contracts', - 'description' => 'Manage client contracts and agreements', - 'endpoints' => [ - ['method' => 'GET', 'path' => '/contracts', 'description' => 'Get all contracts'], - ['method' => 'POST', 'path' => '/contracts', 'description' => 'Create new contract'], - ['method' => 'GET', 'path' => '/contracts/{id}', 'description' => 'Get specific contract'], - ['method' => 'PUT', 'path' => '/contracts/{id}', 'description' => 'Update contract'], - ['method' => 'DELETE', 'path' => '/contracts/{id}', 'description' => 'Delete contract'] - ] - ], + 'customers' => [ + 'name' => 'Customers', + 'description' => 'Manage customer data and information', + 'endpoints' => [ + ['method' => 'GET', 'path' => '/customers', 'description' => 'Get all customers'], + ['method' => 'POST', 'path' => '/customers', 'description' => 'Create new customer'], + ['method' => 'GET', 'path' => '/customers/{id}', 'description' => 'Get specific customer'], + ['method' => 'PUT', 'path' => '/customers/{id}', 'description' => 'Update customer'], + ['method' => 'DELETE', 'path' => '/customers/{id}', 'description' => 'Delete customer'], + ['method' => 'GET', 'path' => '/customers/search/{keyword}', 'description' => 'Search customers'] + ] + ], + 'contracts' => [ + 'name' => 'Contracts', + 'description' => 'Manage client contracts and agreements', + 'endpoints' => [ + ['method' => 'GET', 'path' => '/contracts', 'description' => 'Get all contracts'], + ['method' => 'POST', 'path' => '/contracts', 'description' => 'Create new contract'], + ['method' => 'GET', 'path' => '/contracts/{id}', 'description' => 'Get specific contract'], + ['method' => 'PUT', 'path' => '/contracts/{id}', 'description' => 'Update contract'], + ['method' => 'DELETE', 'path' => '/contracts/{id}', 'description' => 'Delete contract'] + ] + ], 'credit_notes' => [ 'name' => 'Credit Notes', 'description' => 'Manage credit notes and refunds', @@ -374,17 +386,28 @@ class Playground extends CI_Controller ['method' => 'DELETE', 'path' => '/proposals/{id}', 'description' => 'Delete proposal'] ] ], - 'subscriptions' => [ - 'name' => 'Subscriptions', - 'description' => 'Manage recurring subscriptions and billing', - 'endpoints' => [ - ['method' => 'GET', 'path' => '/subscriptions', 'description' => 'Get all subscriptions'], - ['method' => 'POST', 'path' => '/subscriptions', 'description' => 'Create new subscription'], - ['method' => 'GET', 'path' => '/subscriptions/{id}', 'description' => 'Get specific subscription'], - ['method' => 'PUT', 'path' => '/subscriptions/{id}', 'description' => 'Update subscription'], - ['method' => 'DELETE', 'path' => '/subscriptions/{id}', 'description' => 'Delete subscription'] - ] - ], + 'staffs' => [ + 'name' => 'Staff', + 'description' => 'Manage staff members and user accounts', + 'endpoints' => [ + ['method' => 'GET', 'path' => '/staffs', 'description' => 'Get all staff members'], + ['method' => 'POST', 'path' => '/staffs', 'description' => 'Create new staff member'], + ['method' => 'GET', 'path' => '/staffs/{id}', 'description' => 'Get specific staff member'], + ['method' => 'PUT', 'path' => '/staffs/{id}', 'description' => 'Update staff member'], + ['method' => 'DELETE', 'path' => '/staffs/{id}', 'description' => 'Delete staff member'] + ] + ], + 'subscriptions' => [ + 'name' => 'Subscriptions', + 'description' => 'Manage recurring subscriptions and billing', + 'endpoints' => [ + ['method' => 'GET', 'path' => '/subscriptions', 'description' => 'Get all subscriptions'], + ['method' => 'POST', 'path' => '/subscriptions', 'description' => 'Create new subscription'], + ['method' => 'GET', 'path' => '/subscriptions/{id}', 'description' => 'Get specific subscription'], + ['method' => 'PUT', 'path' => '/subscriptions/{id}', 'description' => 'Update subscription'], + ['method' => 'DELETE', 'path' => '/subscriptions/{id}', 'description' => 'Delete subscription'] + ] + ], 'milestones' => [ 'name' => 'Milestones', 'description' => 'Manage project milestones and deliverables', diff --git a/api/libraries/Api_aeiou.php b/api/libraries/Api_aeiou.php index 1fa98dc..ab261ff 100644 --- a/api/libraries/Api_aeiou.php +++ b/api/libraries/Api_aeiou.php @@ -28,13 +28,13 @@ class api_aeiou return ((false === $verify_obj) || !is_object($verify_obj) || isset($verify_obj->error) || !isset($verify_obj->sold_at) || ('' == $verify_obj->supported_until)) ? $verify_obj : null; } - public function validatePurchase($module_name) - { - $module = get_instance()->app_modules->get($module_name); - $verified = false; - $verification_id = get_option($module_name . '_verification_id'); - - return true; + public function validatePurchase($module_name) + { + $module = get_instance()->app_modules->get($module_name); + $verified = false; + $verification_id = get_option($module_name . '_verification_id'); + + return true; if (!empty($verification_id)) { $verification_id = base64_decode($verification_id); diff --git a/api/migrations/210_version_210.php b/api/migrations/210_version_210.php index c7d1742..88f5c78 100644 --- a/api/migrations/210_version_210.php +++ b/api/migrations/210_version_210.php @@ -59,9 +59,9 @@ class Migration_Version_210 extends App_module_migration WHERE request_limit IS NULL OR request_limit = 0 "); - // Drop the separate user_api_quotas table (no longer needed) - $this->db->query("DROP TABLE IF EXISTS `" . db_prefix() . "user_api_quotas`"); - } + // Drop the separate user_api_quotas table (no longer needed) + $this->db->query("DROP TABLE IF EXISTS `" . db_prefix() . "user_api_quotas`"); + } public function down() { @@ -101,15 +101,15 @@ class Migration_Version_210 extends App_module_migration WHERE request_limit IS NOT NULL "); - // Remove quota fields from user_api table - $this->db->query(" - ALTER TABLE `" . db_prefix() . "user_api` - DROP COLUMN `request_limit`, - DROP COLUMN `time_window`, - DROP COLUMN `burst_limit`, - DROP COLUMN `quota_active`, - DROP COLUMN `quota_created_at`, - DROP COLUMN `quota_updated_at` - "); - } + // Remove quota fields from user_api table + $this->db->query(" + ALTER TABLE `" . db_prefix() . "user_api` + DROP COLUMN `request_limit`, + DROP COLUMN `time_window`, + DROP COLUMN `burst_limit`, + DROP COLUMN `quota_active`, + DROP COLUMN `quota_created_at`, + DROP COLUMN `quota_updated_at` + "); + } } diff --git a/api/migrations/211_version_211.php b/api/migrations/211_version_211.php new file mode 100644 index 0000000..e7fcdf9 --- /dev/null +++ b/api/migrations/211_version_211.php @@ -0,0 +1,49 @@ +load->database(); + $this->db = $CI->db; + } + + public function up() + { + // Add rate limiting columns to api_usage_logs table + if (!$this->db->field_exists('rate_limit_checked', db_prefix() . 'api_usage_logs')) { + $this->db->query(" + ALTER TABLE `" . db_prefix() . "api_usage_logs` + ADD `rate_limit_checked` tinyint(1) NOT NULL DEFAULT 0 AFTER `user_agent`, + ADD `rate_limit_type` varchar(20) NULL AFTER `rate_limit_checked`, + ADD `rate_limit_limit` int(11) NULL AFTER `rate_limit_type`, + ADD `rate_limit_current` int(11) NULL AFTER `rate_limit_limit`, + ADD `rate_limit_exceeded` tinyint(1) NOT NULL DEFAULT 0 AFTER `rate_limit_current` + "); + } + } + + public function down() + { + // Remove rate limiting columns from api_usage_logs table + if ($this->db->field_exists('rate_limit_checked', db_prefix() . 'api_usage_logs')) { + $this->db->query(" + ALTER TABLE `" . db_prefix() . "api_usage_logs` + DROP COLUMN `rate_limit_checked`, + DROP COLUMN `rate_limit_type`, + DROP COLUMN `rate_limit_limit`, + DROP COLUMN `rate_limit_current`, + DROP COLUMN `rate_limit_exceeded` + "); + } + } +} \ No newline at end of file