Usage
All services follow the same pattern: inject the service and call its methods. Methods accept/return associative arrays matching the One Page CRM API schemas.
Dependency injection
use Drupal\one_page_crm_api\Service\ContactsService;
public function __construct(
private readonly ContactsService $contacts,
) {}
public static function create(ContainerInterface $container): static {
return new static($container->get('one_page_crm_api.contacts'));
}
Error handling
API errors throw GuzzleHttp\Exception\RequestException:
use GuzzleHttp\Exception\RequestException;
try {
$result = $contacts->getContact($id);
}
catch (RequestException $e) {
$status = $e->hasResponse()
? $e->getResponse()->getStatusCode()
: 0;
\Drupal::logger('my_module')->error(
'API error @status: @msg',
['@status' => $status, '@msg' => $e->getMessage()]
);
}
Contacts
$contacts = \Drupal::service('one_page_crm_api.contacts');
// List
$result = $contacts->getContacts(['per_page' => 20, 'page' => 1, 'search' => 'Acme']);
// Get
$result = $contacts->getContact('CONTACT_ID');
// Create
$result = $contacts->createContact([
'first_name' => 'Jane',
'last_name' => 'Doe',
'emails' => [['value' => 'jane@example.com', 'type' => 'work']],
]);
// Update
$result = $contacts->updateContact('CONTACT_ID', ['last_name' => 'Smith']);
// Delete
$contacts->deleteContact('CONTACT_ID');
Companies
$companies = \Drupal::service('one_page_crm_api.companies');
$result = $companies->getCompanies(['per_page' => 20]);
$result = $companies->getCompany('COMPANY_ID');
$result = $companies->createCompany(['name' => 'Acme Inc']);
$result = $companies->updateCompany('COMPANY_ID', ['name' => 'Acme Corp']);
$companies->deleteCompany('COMPANY_ID');
Deals
$deals = \Drupal::service('one_page_crm_api.deals');
$result = $deals->getDeals(['contact_id' => 'CONTACT_ID']);
$result = $deals->getDeal('DEAL_ID');
$result = $deals->createDeal([
'contact_id' => 'CONTACT_ID',
'name' => 'Enterprise license',
'amount' => 15000,
'stage' => 'negotiation',
]);
$result = $deals->updateDeal('DEAL_ID', ['status' => 'won']);
$deals->deleteDeal('DEAL_ID');
Notes
$notes = \Drupal::service('one_page_crm_api.notes');
$result = $notes->getNotes(['contact_id' => 'CONTACT_ID']);
$result = $notes->getNote('NOTE_ID');
$result = $notes->createNote(['contact_id' => 'CONTACT_ID', 'text' => 'Met at conference']);
$result = $notes->updateNote('NOTE_ID', ['text' => 'Updated note']);
$notes->deleteNote('NOTE_ID');
Calls
$calls = \Drupal::service('one_page_crm_api.calls');
$result = $calls->getCalls(['contact_id' => 'CONTACT_ID']);
$result = $calls->getCall('CALL_ID');
$result = $calls->createCall([
'contact_id' => 'CONTACT_ID',
'text' => 'Discussed pricing',
'call_result' => 'interested',
]);
$result = $calls->updateCall('CALL_ID', ['text' => 'Updated notes']);
$calls->deleteCall('CALL_ID');
Meetings
$meetings = \Drupal::service('one_page_crm_api.meetings');
$result = $meetings->getMeetings(['contact_id' => 'CONTACT_ID']);
$result = $meetings->getMeeting('MEETING_ID');
$result = $meetings->createMeeting([
'contact_id' => 'CONTACT_ID',
'text' => 'Product demo',
'meeting_time_int' => time(),
'place' => 'Conference room',
]);
$result = $meetings->updateMeeting('MEETING_ID', ['text' => 'Rescheduled']);
$meetings->deleteMeeting('MEETING_ID');
Actions
$actions = \Drupal::service('one_page_crm_api.actions');
$result = $actions->getActions(['contact_id' => 'CONTACT_ID']);
$result = $actions->getAction('ACTION_ID');
$result = $actions->createAction([
'contact_id' => 'CONTACT_ID',
'text' => 'Follow up call',
'status' => 'asap',
]);
$result = $actions->updateAction('ACTION_ID', ['text' => 'Updated'], ['done' => 'true']);
$actions->deleteAction('ACTION_ID');
// Special operations
$actions->markAsDone('ACTION_ID');
$actions->undoCompletion('ACTION_ID');
$actions->promote('ACTION_ID');
$actions->revertPromotion('ACTION_ID');
$actions->unassign('ACTION_ID');
$actions->swap('ACTION_ID', ['target_action_id' => 'OTHER_ID']);
Attachments
$attachments = \Drupal::service('one_page_crm_api.attachments');
// Get S3 upload form data
$result = $attachments->getS3Form('CONTACT_ID');
// Create (after uploading to S3)
$result = $attachments->createAttachment([
'contact_id' => 'CONTACT_ID',
'name' => 'document.pdf',
'key' => 's3-key',
'size' => 1048576,
]);
// Update (PATCH)
$result = $attachments->updateAttachment('ATTACHMENT_ID', [
'attachment' => ['custom_filename' => 'renamed.pdf'],
]);
$attachments->deleteAttachment('ATTACHMENT_ID');
$attachments->pin('ATTACHMENT_ID');
$attachments->unpin('ATTACHMENT_ID');
Predefined actions
$service = \Drupal::service('one_page_crm_api.predefined_actions');
$result = $service->getPredefinedActions();
$result = $service->getPredefinedAction('ID');
$result = $service->createPredefinedAction(['text' => 'Send proposal']);
$result = $service->updatePredefinedAction('ID', ['text' => 'Updated']);
$service->deletePredefinedAction('ID');
Predefined items
$service = \Drupal::service('one_page_crm_api.predefined_items');
$result = $service->getPredefinedItems();
$result = $service->getPredefinedItem('ID');
$result = $service->createPredefinedItem(['name' => 'Widget', 'amount' => 99.99]);
$result = $service->updatePredefinedItem('ID', ['amount' => 149.99]);
$service->deletePredefinedItem('ID');
Predefined item groups
$service = \Drupal::service('one_page_crm_api.predefined_item_groups');
$result = $service->getPredefinedItemGroups();
$result = $service->getPredefinedItemGroup('ID');
$result = $service->createPredefinedItemGroup(['name' => 'Services']);
$service->deletePredefinedItemGroup('ID');
Relationship types, custom fields, company fields, deal fields
Standard CRUD services following the same pattern:
$service = \Drupal::service('one_page_crm_api.relationship_types');
$service = \Drupal::service('one_page_crm_api.custom_fields');
$service = \Drupal::service('one_page_crm_api.company_fields');
$service = \Drupal::service('one_page_crm_api.deal_fields');
Read-only services
Call results
$result = \Drupal::service('one_page_crm_api.call_results')->getCallResults();
Filters
$filters = \Drupal::service('one_page_crm_api.filters');
$result = $filters->getFilters();
$result = $filters->getFilter('FILTER_ID');
Countries
$result = \Drupal::service('one_page_crm_api.countries')->getCountries();
Lead sources
$sources = \Drupal::service('one_page_crm_api.lead_sources');
$result = $sources->getLeadSources();
$result = $sources->getLeadSource('SOURCE_ID');
Statuses
$statuses = \Drupal::service('one_page_crm_api.statuses');
$result = $statuses->getStatuses();
$result = $statuses->getStatus('STATUS_ID');
Pipelines
$pipelines = \Drupal::service('one_page_crm_api.pipelines');
$result = $pipelines->getPipelines();
$result = $pipelines->getPipeline('PIPELINE_ID');
Notifications
$notifications = \Drupal::service('one_page_crm_api.notifications');
$result = $notifications->getNotifications(['page' => 1]);
$result = $notifications->getNotification('NOTIFICATION_ID');
$notifications->markAsRead('NOTIFICATION_ID');
$notifications->markAllAsRead();
Webhooks
$webhooks = \Drupal::service('one_page_crm_api.webhooks');
$result = $webhooks->getWebhooks();
$result = $webhooks->getWebhook('WEBHOOK_ID');
$webhooks->deleteWebhook('WEBHOOK_ID');
Users
$users = \Drupal::service('one_page_crm_api.users');
$result = $users->getUsers();
$result = $users->getUser('USER_ID');
$result = $users->updateUser('USER_ID', ['first_name' => 'Updated']);