In your case you need to implement custom SOAP API endpoint. Luckily you may heavily reuse Downloadable Product API implementation.
If you create all files listed below, you will have new SOAP V2 API available: catalogProductAttachLinkList. To enable add/remove methods, just port them from app/code/core/Mage/Downloadable/Model/Link/Api.php to app/code/community/Intellimage/Attachs/Model/Link/Api.php.
To test new API run one of the following:
<?php
/* SOAP V2 Style */
$client = new SoapClient('http://simple-magento-vagrant.dev/index.php/api/v2_soap/?wsdl');
$sessionId = $client->login('apiUser', 'apiKey');
$productId = 1;
$result = $client->catalogProductAttachLinkList($sessionId, $productId);
print_r($result);
/* SOAP V1 style. If you want to use this style, you may skip creation of custom wsdl.xml and Api/V2.php files proposed below. Adding api.xml and Api.php will be enough */
$client = new SoapClient('http://simple-magento-vagrant.dev/index.php/api/soap/?wsdl');
$sessionId = $client->login('apiUser', 'apiKey');
$productId = 1;
$result = $client->call($sessionId, 'attach_link.list', [$productId]);
print_r($result);
Files to be added to your module:
app/code/community/Intellimage/Attachs/etc/api.xml
<?xml version="1.0"?>
<config>
<api>
<resources>
<catalog_product_attach_link translate="title" module="intellimage_attachs">
<model>attachs/link_api</model>
<title>Category API</title>
<acl>downloadable/link</acl>
<methods>
<list translate="title" module="intellimage_attachs">
<title>Retrieve links and samples list from attach product</title>
<method>items</method>
<acl>downloadable/link/list</acl>
</list>
</methods>
</catalog_product_attach_link>
</resources>
<resources_alias>
<attach_link>catalog_product_attach_link</attach_link>
</resources_alias>
<v2>
<resources_function_prefix>
<attach_link>catalogProductAttachLink</attach_link>
</resources_function_prefix>
</v2>
</api>
</config>
app/code/community/Intellimage/Attachs/etc/wsdl.xml
(Please note, that wsi.xml should be created if SOAP V2 WS-I compatibility is necessary)
<?xml version="1.0"?>
<config>
<api>
<resources>
<catalog_product_attach_link translate="title" module="intellimage_attachs">
<model>attachs/link_api</model>
<title>Category API</title>
<acl>downloadable/link</acl>
<methods>
<list translate="title" module="intellimage_attachs">
<title>Retrieve links and samples list from attach product</title>
<method>items</method>
<acl>downloadable/link/list</acl>
</list>
</methods>
</catalog_product_attach_link>
</resources>
<resources_alias>
<attach_link>catalog_product_attach_link</attach_link>
</resources_alias>
<v2>
<resources_function_prefix>
<attach_link>catalogProductAttachLink</attach_link>
</resources_function_prefix>
</v2>
</api>
</config>
app/code/community/Intellimage/Attachs/Model/Link/Api/V2.php
<?php
class Intellimage_Attachs_Model_Link_Api_V2 extends Intellimage_Attachs_Model_Link_Api
{
protected function _prepareData(&$var)
{
if (is_object($var)) {
$var = get_object_vars($var);
foreach ($var as $key => &$value) {
$this->_prepareData($value);
}
}
}
public function add($productId, $resource, $resourceType, $store = null, $identifierType = null)
{
$this->_prepareData($resource);
return parent::add($productId, $resource, $resourceType, $store, $identifierType);
}
}
app/code/community/Intellimage/Attachs/Model/Link/Api.php
<?php
class Intellimage_Attachs_Model_Link_Api extends Mage_Catalog_Model_Api_Resource
{
public function items($productId, $store = null, $identifierType = null)
{
$product = parent::_getProduct($productId, $store, $identifierType);
$typeInstance = $product->getTypeInstance(true);
$product->setTypeInstance(Mage::getModel('attachs/product_type', $typeInstance), true);
$linkArr = array();
$links = $product->getTypeInstance(true)->getSamples($product);
$downloadHelper = Mage::helper('downloadable');
foreach ($links as $item) {
$tmpLinkItem = array(
'link_id' => $item->getId(),
'title' => $item->getTitle(),
'price' => $item->getPrice(),
'number_of_downloads' => $item->getNumberOfDownloads(),
'is_shareable' => $item->getIsShareable(),
'link_url' => $item->getLinkUrl(),
'link_type' => $item->getLinkType(),
'sample_file' => $item->getSampleFile(),
'sample_url' => $item->getSampleUrl(),
'sample_type' => $item->getSampleType(),
'sort_order' => $item->getSortOrder()
);
$file = Mage::helper('downloadable/file')->getFilePath(
Mage_Downloadable_Model_Link::getBasePath(), $item->getLinkFile()
);
if ($item->getLinkFile() && !is_file($file)) {
Mage::helper('core/file_storage_database')->saveFileToFilesystem($file);
}
if ($item->getLinkFile() && is_file($file)) {
$name = Mage::helper('downloadable/file')->getFileFromPathFile($item->getLinkFile());
$tmpLinkItem['file_save'] = array(
array(
'file' => $item->getLinkFile(),
'name' => $name,
'size' => filesize($file),
'status' => 'old'
));
}
$sampleFile = Mage::helper('downloadable/file')->getFilePath(
Mage_Downloadable_Model_Link::getBaseSamplePath(), $item->getSampleFile()
);
if ($item->getSampleFile() && is_file($sampleFile)) {
$tmpLinkItem['sample_file_save'] = array(
array(
'file' => $item->getSampleFile(),
'name' => Mage::helper('downloadable/file')->getFileFromPathFile($item->getSampleFile()),
'size' => filesize($sampleFile),
'status' => 'old'
));
}
if ($item->getNumberOfDownloads() == '0') {
$tmpLinkItem['is_unlimited'] = 1;
}
if ($product->getStoreId() && $item->getStoreTitle()) {
$tmpLinkItem['store_title'] = $item->getStoreTitle();
}
if ($product->getStoreId() && $downloadHelper->getIsPriceWebsiteScope()) {
$tmpLinkItem['website_price'] = $item->getWebsitePrice();
}
$linkArr[] = $tmpLinkItem;
}
unset($item);
unset($tmpLinkItem);
unset($links);
$samples = $product->getTypeInstance(true)->getSamples($product)->getData();
return array('links' => $linkArr, 'samples' => $samples);
}
}