From 7cc6970b6e0b16fc6ee05be405bc8c9189218448 Mon Sep 17 00:00:00 2001 From: David-Lucas17 Date: Sat, 21 Mar 2026 00:25:26 -0300 Subject: [PATCH] plugin de favoritacao de posts --- README.md | 39 +++++---- apiki-favoritos.php | 20 +++++ src/class-favoritos.php | 182 ++++++++++++++++++++++++++++++++++++++++ src/class-tabela.php | 46 ++++++++++ 4 files changed, 271 insertions(+), 16 deletions(-) create mode 100644 apiki-favoritos.php create mode 100644 src/class-favoritos.php create mode 100644 src/class-tabela.php diff --git a/README.md b/README.md index a4f6c256..02993888 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,34 @@ -# WordPress Back-end Challenge +# Apiki Favoritos -Desafio para os futuros programadores back-end em WordPress da Apiki. +Plugin WordPress para favoritar posts via WP REST API. -## Introdução +## Instalação -Desenvolva um Plugin em WordPress que implemente a funcionalidade de favoritar posts para usuários logados usando a [WP REST API](https://developer.wordpress.org/rest-api/). +1. Copie a pasta `apiki-favoritos` para `wp-content/plugins/` +2. Ative o plugin no painel do WordPress em **Plugins > Plugins instalados** +3. A tabela `apiki_favoritos` será criada automaticamente no banco de dados -**Especifícações**: +## Endpoints -* Possibilidade de favoritar e desfavoritar um post; -* Persistir os dados em uma [tabela a parte](https://codex.wordpress.org/Creating_Tables_with_Plugins); +Base URL: `/wp-json/apiki/v1` -## Instruções +### Listar favoritos -1. Efetue o fork deste repositório e crie um branch com o seu nome e sobrenome. (exemplo: fulano-dasilva) -2. Após finalizar o desafio, crie um Pull Request. -3. Aguarde algum contribuidor realizar o code review. +``` +GET /wp-json/apiki/v1/favoritos +``` -## Pré-requisitos +Retorna todos os posts favoritados pelo usuário logado. -* PHP >= 5.6 -* Orientado a objetos +### Favoritar um post -## Dúvidas +``` +POST /wp-json/apiki/v1/favoritos/{post_id} +``` + +### Desfavoritar um post + +``` +DELETE /wp-json/apiki/v1/favoritos/{post_id} +``` -Em caso de dúvidas, crie uma issue. diff --git a/apiki-favoritos.php b/apiki-favoritos.php new file mode 100644 index 00000000..20029b07 --- /dev/null +++ b/apiki-favoritos.php @@ -0,0 +1,20 @@ +registrarRotas(); +}); diff --git a/src/class-favoritos.php b/src/class-favoritos.php new file mode 100644 index 00000000..30ef8453 --- /dev/null +++ b/src/class-favoritos.php @@ -0,0 +1,182 @@ +_tabela = $wpdb->prefix . Tabela::NOME; + } + + /** + * Registra as rotas da REST API. + * + * @return void + */ + public function registrarRotas() + { + register_rest_route($this->_namespace, '/favoritos', [ + 'methods' => 'GET', + 'callback' => [$this, 'listar'], + 'permission_callback' => [$this, 'usuarioLogado'], + ]); + + register_rest_route($this->_namespace, '/favoritos/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [$this, 'favoritar'], + 'permission_callback' => [$this, 'usuarioLogado'], + ]); + + register_rest_route($this->_namespace, '/favoritos/(?P\d+)/deletar', [ + 'methods' => 'POST', + 'callback' => [$this, 'desfavoritar'], + 'permission_callback' => [$this, 'usuarioLogado'], + ]); + } + + /** + * Verifica se o usuário está logado. + * + * @return bool + */ + public function usuarioLogado() + { + return is_user_logged_in(); + } + + /** + * Lista os posts favoritados pelo usuário logado. + * + * @return WP_REST_Response + */ + public function listar() + { + global $wpdb; + + $usuarioId = get_current_user_id(); + $favoritos = $wpdb->get_results( + $wpdb->prepare( + "SELECT post_id, criado_em FROM {$this->_tabela} + WHERE usuario_id = %d ORDER BY criado_em DESC", + $usuarioId + ) + ); + + return rest_ensure_response($favoritos); + } + + /** + * Favorita um post para o usuário logado. + * + * @param WP_REST_Request $requisicao dados da requisição. + * + * @return WP_REST_Response + */ + public function favoritar($requisicao) + { + global $wpdb; + + $postId = (int) $requisicao['post_id']; + $usuarioId = get_current_user_id(); + + if (!get_post($postId)) { + return new WP_REST_Response( + ['mensagem' => 'Post não encontrado.'], + 404 + ); + } + + $jaFavoritado = $wpdb->get_var( + $wpdb->prepare( + "SELECT id FROM {$this->_tabela} + WHERE usuario_id = %d AND post_id = %d", + $usuarioId, + $postId + ) + ); + + if ($jaFavoritado) { + return new WP_REST_Response( + ['mensagem' => 'Post já está nos favoritos.'], + 409 + ); + } + + $wpdb->insert( + $this->_tabela, + [ + 'usuario_id' => $usuarioId, + 'post_id' => $postId, + ], + ['%d', '%d'] + ); + + return new WP_REST_Response( + ['mensagem' => 'Post favoritado com sucesso.'], + 201 + ); + } + + /** + * Desfavorita um post para o usuário logado. + * + * @param WP_REST_Request $requisicao dados da requisição. + * + * @return WP_REST_Response + */ + public function desfavoritar($requisicao) + { + global $wpdb; + + $postId = (int) $requisicao['post_id']; + $usuarioId = get_current_user_id(); + + $deletado = $wpdb->delete( + $this->_tabela, + [ + 'usuario_id' => $usuarioId, + 'post_id' => $postId, + ], + ['%d', '%d'] + ); + + if (!$deletado) { + return new WP_REST_Response( + ['mensagem' => 'Post não está nos favoritos.'], + 404 + ); + } + + return new WP_REST_Response( + ['mensagem' => 'Post desfavoritado com sucesso.'], + 200 + ); + } +} diff --git a/src/class-tabela.php b/src/class-tabela.php new file mode 100644 index 00000000..baa13cdc --- /dev/null +++ b/src/class-tabela.php @@ -0,0 +1,46 @@ +prefix . self::NOME; + $charset = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE IF NOT EXISTS {$tabela} ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + usuario_id BIGINT(20) UNSIGNED NOT NULL, + post_id BIGINT(20) UNSIGNED NOT NULL, + criado_em DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id), + UNIQUE KEY usuario_post (usuario_id, post_id) + ) {$charset};"; + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + dbDelta($sql); + } +}