Skip to content

Arquivos para API REST WORDPRESS para favoritar POSTS #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 37 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,37 @@
# WordPress Back-end Challenge

Desafio para os futuros programadores back-end em WordPress da Apiki.

## Introduçã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/).

**Especifícações**:

* Possibilidade de favoritar e desfavoritar um post;
* Persistir os dados em uma [tabela a parte](https://codex.wordpress.org/Creating_Tables_with_Plugins);

## Instruções

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.

## Pré-requisitos

* PHP >= 5.6
* Orientado a objetos

## Dúvidas

Em caso de dúvidas, crie uma issue.
# Favoritar Posts com WordPress Plugin

## Descrição
Este plugin permite que usuários logados favoritem e desfavoritem posts no WordPress utilizando a WP REST API.

## Justificativa para Uso de Frameworks/Bibliotecas
Optamos por utilizar o PHP nativo e a WP REST API para manter a simplicidade e compatibilidade total com o WordPress.

## Decisões Técnicas e Arquiteturais
- **Banco de Dados**: Usamos uma tabela separada no banco de dados para armazenar os favoritos dos usuários.
- **API REST**: Implementação de endpoints para adicionar e remover favoritos, garantindo uma interface robusta e escalável.
- **Permissões**: Apenas usuários logados podem favoritar e desfavoritar posts, garantindo a segurança e integridade dos dados.
- **Testes**: Utilizamos PHPUnit para garantir a qualidade do código e PHP_CodeSniffer para manter padrões de codificação.

## Instruções de Compilação e Execução
### Requisitos
- PHP >= 5.6
- Composer

### Passos
1. Clone o repositório para o diretório `wp-content/plugins` do seu WordPress.
2. Execute `composer install` para instalar as dependências.
3. Ative o plugin no painel de administração do WordPress.
4. Para rodar os testes, execute `composer test`.
5. Para verificar os padrões de codificação, execute `composer lint`.

## Notas Adicionais
- Certifique-se de que o WordPress está configurado corretamente com o ambiente de desenvolvimento.
- O plugin foi desenvolvido considerando a simplicidade e facilidade de uso, mantendo o código limpo e bem documentado.

## Exemplo de Uso
Após ativar o plugin, você pode interagir com os endpoints REST:
- **Adicionar Favorito**: `POST /wp-json/favoritos/v1/add` com `{"post_id": <ID do Post>}`
- **Remover Favorito**: `POST /wp-json/favoritos/v1/remove` com `{"post_id": <ID do Post>}`

## Contato
Para mais informações, entre em contato com o desenvolvedor: [Rene Ballesteros Machado Junior](mailto:[email protected])
14 changes: 14 additions & 0 deletions wp-content/plugins/favoritar/favoritar.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php
/*
Plugin Name: Favoritar
Description: Plugin para favoritar posts.
Version: 1.0
Author: Rene Ballesteros Machado Junior
*/

// Include the main class
require_once plugin_dir_path(__FILE__) . 'includes/class-favoritos.php';

// Initialize the plugin
add_action('plugins_loaded', ['Favoritos', 'init']);
?>
84 changes: 84 additions & 0 deletions wp-content/plugins/favoritar/includes/class-favoritos.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php

class Favoritos {

public static function init() {
add_action('init', [__CLASS__, 'create_favoritos_table']);
add_action('rest_api_init', [__CLASS__, 'register_routes']);
}

public static function create_favoritos_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'favoritos';
$charset_collate = $wpdb->get_charset_collate();

// Verifica se a tabela já existe
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
post_id bigint(20) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
}

public static function register_routes() {
register_rest_route('favoritos/v1', '/add/', [
'methods' => 'POST',
'callback' => [__CLASS__, 'add_favorito'],
'permission_callback' => [__CLASS__, 'check_permissions']
]);

register_rest_route('favoritos/v1', '/remove/', [
'methods' => 'POST',
'callback' => [__CLASS__, 'remove_favorito'],
'permission_callback' => [__CLASS__, 'check_permissions']
]);
}

public static function add_favorito($request) {
$user_id = get_current_user_id();
$post_id = $request['post_id'];

if ($user_id && $post_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'favoritos';
$wpdb->insert($table_name, [
'user_id' => $user_id,
'post_id' => $post_id
]);

return new WP_REST_Response('Post favoritado', 200);
}

return new WP_REST_Response('Erro ao favoritar post', 400);
}

public static function remove_favorito($request) {
$user_id = get_current_user_id();
$post_id = $request['post_id'];

if ($user_id && $post_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'favoritos';
$wpdb->delete($table_name, [
'user_id' => $user_id,
'post_id' => $post_id
]);

return new WP_REST_Response('Post desfavoritado', 200);
}

return new WP_REST_Response('Erro ao desfavoritar post', 400);
}

public static function check_permissions() {
return is_user_logged_in();
}
}

?>
11 changes: 11 additions & 0 deletions wp-content/plugins/favoritar/uninstall.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

if (!defined('WP_UNINSTALL_PLUGIN')) {
die;
}

global $wpdb;
$table_name = $wpdb->prefix . 'favoritos';
$wpdb->query("DROP TABLE IF EXISTS $table_name");

?>