diff --git a/src/packages/com_mokoog/api/src/Controller/TagsController.php b/src/packages/com_mokoog/api/src/Controller/TagsController.php new file mode 100644 index 0000000..28457f4 --- /dev/null +++ b/src/packages/com_mokoog/api/src/Controller/TagsController.php @@ -0,0 +1,68 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + */ + +namespace Joomla\Component\MokoOG\Api\Controller; + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\MVC\Controller\ApiController; + +class TagsController extends ApiController +{ + /** + * The content type for JSON:API output. + * + * @var string + */ + protected $contentType = 'tags'; + + /** + * The default view for the API. + * + * @var string + */ + protected $default_view = 'tags'; + + /** + * Lookup an OG tag by content_type and content_id. + * + * GET /api/index.php/v1/mokoog/lookup/:content_type/:content_id + * + * @return static + */ + public function lookup(): static + { + $contentType = $this->input->getString('content_type', ''); + $contentId = $this->input->getInt('content_id', 0); + + if (empty($contentType) || $contentId <= 0) { + throw new \RuntimeException('content_type and content_id are required', 400); + } + + $db = Factory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from($db->quoteName('#__mokoog_tags')) + ->where($db->quoteName('content_type') . ' = ' . $db->quote($contentType)) + ->where($db->quoteName('content_id') . ' = ' . $contentId); + + $db->setQuery($query); + $id = $db->loadResult(); + + if (!$id) { + throw new \RuntimeException('OG tag not found for ' . $contentType . ':' . $contentId, 404); + } + + $this->input->set('id', $id); + + return $this->displayItem(); + } +} diff --git a/src/packages/com_mokoog/api/src/View/Tags/JsonapiView.php b/src/packages/com_mokoog/api/src/View/Tags/JsonapiView.php new file mode 100644 index 0000000..c103df2 --- /dev/null +++ b/src/packages/com_mokoog/api/src/View/Tags/JsonapiView.php @@ -0,0 +1,66 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + */ + +namespace Joomla\Component\MokoOG\Api\View\Tags; + +defined('_JEXEC') or die; + +use Joomla\CMS\MVC\View\JsonApiView as BaseApiView; + +class JsonapiView extends BaseApiView +{ + /** + * The fields to render in the API response. + * + * Whitelist of fields from #__mokoog_tags that are safe to expose. + * + * @var array + */ + protected $fieldsToRenderItem = [ + 'id', + 'content_type', + 'content_id', + 'og_title', + 'og_description', + 'og_image', + 'og_type', + 'seo_title', + 'meta_description', + 'robots', + 'canonical_url', + 'language', + 'published', + 'created', + 'modified', + ]; + + /** + * The fields to render in list responses. + * + * @var array + */ + protected $fieldsToRenderList = [ + 'id', + 'content_type', + 'content_id', + 'og_title', + 'og_description', + 'og_image', + 'og_type', + 'seo_title', + 'meta_description', + 'robots', + 'canonical_url', + 'language', + 'published', + 'created', + 'modified', + ]; +} diff --git a/src/packages/com_mokoog/forms/tag.xml b/src/packages/com_mokoog/forms/tag.xml index 363ef5f..3c1ab5c 100644 --- a/src/packages/com_mokoog/forms/tag.xml +++ b/src/packages/com_mokoog/forms/tag.xml @@ -70,4 +70,37 @@ +
diff --git a/src/packages/com_mokoog/language/en-GB/com_mokoog.ini b/src/packages/com_mokoog/language/en-GB/com_mokoog.ini index 0e56059..c7dca09 100644 --- a/src/packages/com_mokoog/language/en-GB/com_mokoog.ini +++ b/src/packages/com_mokoog/language/en-GB/com_mokoog.ini @@ -13,4 +13,45 @@ COM_MOKOOG_HEADING_CONTENT_TYPE="Content Type" COM_MOKOOG_HEADING_CONTENT_ID="Content ID" COM_MOKOOG_HEADING_OG_TITLE="OG Title" COM_MOKOOG_HEADING_IMAGE="Image" +COM_MOKOOG_HEADING_SEO="SEO" +COM_MOKOOG_HEADING_DEBUG="Debug" COM_MOKOOG_HEADING_MODIFIED="Modified" + +COM_MOKOOG_SEO_OK="OK" +COM_MOKOOG_SEO_MISSING_DESC="No meta description" +COM_MOKOOG_SEO_TITLE_LONG="SEO title too long" +COM_MOKOOG_SEO_NOINDEX="noindex" + +COM_MOKOOG_FIELD_CONTENT_TYPE="Content Type" +COM_MOKOOG_FIELD_CONTENT_ID="Content ID" +COM_MOKOOG_FIELD_OG_TITLE="OG Title" +COM_MOKOOG_FIELD_OG_TITLE_DESC="Custom title for social sharing." +COM_MOKOOG_FIELD_OG_DESCRIPTION="OG Description" +COM_MOKOOG_FIELD_OG_DESCRIPTION_DESC="Custom description for social sharing." +COM_MOKOOG_FIELD_OG_IMAGE="OG Image" +COM_MOKOOG_FIELD_OG_IMAGE_DESC="Custom image for social sharing." +COM_MOKOOG_FIELD_OG_TYPE="OG Type" +COM_MOKOOG_FIELD_OG_TYPE_DESC="The Open Graph content type." + +COM_MOKOOG_FILTER_SEARCH="Search OG titles" +COM_MOKOOG_FILTER_CONTENT_TYPE="Content Type" +COM_MOKOOG_FILTER_SELECT_TYPE="- Select Type -" +COM_MOKOOG_HEADING_OG_TITLE_ASC="OG Title ascending" +COM_MOKOOG_HEADING_OG_TITLE_DESC="OG Title descending" +COM_MOKOOG_HEADING_MODIFIED_ASC="Modified ascending" +COM_MOKOOG_HEADING_MODIFIED_DESC="Modified descending" + +COM_MOKOOG_TOOLBAR_BATCH_GENERATE="Batch Generate" +COM_MOKOOG_BATCH_TITLE="Batch OG Tag Generation" +COM_MOKOOG_BATCH_COUNTING="Counting articles without OG tags..." +COM_MOKOOG_BATCH_NONE="All articles already have OG tags." +COM_MOKOOG_BATCH_FOUND="articles found without OG tags." +COM_MOKOOG_BATCH_PROCESSED="processed" +COM_MOKOOG_BATCH_COMPLETE="Batch generation complete!" +COM_MOKOOG_BATCH_ERROR="Error:" + +COM_MOKOOG_TOOLBAR_EXPORT="Export CSV" +COM_MOKOOG_TOOLBAR_IMPORT="Import CSV" +COM_MOKOOG_IMPORT_NO_FILE="No CSV file was uploaded." +COM_MOKOOG_IMPORT_READ_ERROR="Could not read the uploaded CSV file." +COM_MOKOOG_IMPORT_RESULT="Import complete: %d created, %d updated, %d skipped." diff --git a/src/packages/com_mokoog/language/en-US/com_mokoog.ini b/src/packages/com_mokoog/language/en-US/com_mokoog.ini index 0e56059..c7dca09 100644 --- a/src/packages/com_mokoog/language/en-US/com_mokoog.ini +++ b/src/packages/com_mokoog/language/en-US/com_mokoog.ini @@ -13,4 +13,45 @@ COM_MOKOOG_HEADING_CONTENT_TYPE="Content Type" COM_MOKOOG_HEADING_CONTENT_ID="Content ID" COM_MOKOOG_HEADING_OG_TITLE="OG Title" COM_MOKOOG_HEADING_IMAGE="Image" +COM_MOKOOG_HEADING_SEO="SEO" +COM_MOKOOG_HEADING_DEBUG="Debug" COM_MOKOOG_HEADING_MODIFIED="Modified" + +COM_MOKOOG_SEO_OK="OK" +COM_MOKOOG_SEO_MISSING_DESC="No meta description" +COM_MOKOOG_SEO_TITLE_LONG="SEO title too long" +COM_MOKOOG_SEO_NOINDEX="noindex" + +COM_MOKOOG_FIELD_CONTENT_TYPE="Content Type" +COM_MOKOOG_FIELD_CONTENT_ID="Content ID" +COM_MOKOOG_FIELD_OG_TITLE="OG Title" +COM_MOKOOG_FIELD_OG_TITLE_DESC="Custom title for social sharing." +COM_MOKOOG_FIELD_OG_DESCRIPTION="OG Description" +COM_MOKOOG_FIELD_OG_DESCRIPTION_DESC="Custom description for social sharing." +COM_MOKOOG_FIELD_OG_IMAGE="OG Image" +COM_MOKOOG_FIELD_OG_IMAGE_DESC="Custom image for social sharing." +COM_MOKOOG_FIELD_OG_TYPE="OG Type" +COM_MOKOOG_FIELD_OG_TYPE_DESC="The Open Graph content type." + +COM_MOKOOG_FILTER_SEARCH="Search OG titles" +COM_MOKOOG_FILTER_CONTENT_TYPE="Content Type" +COM_MOKOOG_FILTER_SELECT_TYPE="- Select Type -" +COM_MOKOOG_HEADING_OG_TITLE_ASC="OG Title ascending" +COM_MOKOOG_HEADING_OG_TITLE_DESC="OG Title descending" +COM_MOKOOG_HEADING_MODIFIED_ASC="Modified ascending" +COM_MOKOOG_HEADING_MODIFIED_DESC="Modified descending" + +COM_MOKOOG_TOOLBAR_BATCH_GENERATE="Batch Generate" +COM_MOKOOG_BATCH_TITLE="Batch OG Tag Generation" +COM_MOKOOG_BATCH_COUNTING="Counting articles without OG tags..." +COM_MOKOOG_BATCH_NONE="All articles already have OG tags." +COM_MOKOOG_BATCH_FOUND="articles found without OG tags." +COM_MOKOOG_BATCH_PROCESSED="processed" +COM_MOKOOG_BATCH_COMPLETE="Batch generation complete!" +COM_MOKOOG_BATCH_ERROR="Error:" + +COM_MOKOOG_TOOLBAR_EXPORT="Export CSV" +COM_MOKOOG_TOOLBAR_IMPORT="Import CSV" +COM_MOKOOG_IMPORT_NO_FILE="No CSV file was uploaded." +COM_MOKOOG_IMPORT_READ_ERROR="Could not read the uploaded CSV file." +COM_MOKOOG_IMPORT_RESULT="Import complete: %d created, %d updated, %d skipped." diff --git a/src/packages/com_mokoog/mokoog.xml b/src/packages/com_mokoog/mokoog.xml index 3089e4f..f5baeb3 100644 --- a/src/packages/com_mokoog/mokoog.xml +++ b/src/packages/com_mokoog/mokoog.xml @@ -42,6 +42,7 @@