Files
gustavoo-me/wp-content/plugins/fluent-crm/app/Http/Controllers/ListsController.php
T
2026-07-23 22:56:30 -03:00

261 lines
7.4 KiB
PHP

<?php
namespace FluentCrm\App\Http\Controllers;
use FluentCrm\App\Models\Lists;
use FluentCrm\App\Models\Subscriber;
use FluentCrm\App\Services\Helper;
use FluentCrm\Framework\Support\Arr;
use FluentCrm\Framework\Http\Request\Request;
/**
* ListsController - REST API Handler Class
*
* REST API Handler
*
* @package FluentCrm\App\Http
*
* @version 1.0.0
*/
class ListsController extends Controller
{
/**
* Get all of the lists
*
* @param \FluentCrm\Framework\Http\Request\Request $request
* @return \WP_REST_Response
*/
public function index(Request $request)
{
$with = $request->get('with', []);
$order = [
'by' => $request->getSafe('sort_by', 'sanitize_sql_orderby', 'id'),
'order' => $request->getSafe('sort_order', 'sanitize_sql_orderby', 'DESC')
];
$paginatedLists = Lists::orderBy($order['by'], $order['order'])
->searchBy($request->getSafe('search'))
->paginate();
$lists = $paginatedLists->items();
if (!$request->get('exclude_counts')) {
foreach ($lists as $list) {
$list->totalCount = $list->totalCount();
$list->subscribersCount = $list->countByStatus('subscribed');
}
}
$data = [
'lists' => $lists,
'pagination' => [
'total' => $paginatedLists->total(),
]
];
if ($request->get('all_lists')) {
$allLists = Lists::get();
$formattedLists = [];
foreach ($allLists as $list) {
$formattedLists[] = [
'id' => strval($list->id),
'title' => $list->title,
'slug' => $list->slug,
'description' => $list->description
];
}
$data['all_lists'] = $formattedLists;
}
return $this->send($data);
}
/**
* Find a list.
*
* @param \FluentCrm\Framework\Http\Request\Request $request
* @param int $id
* @return \WP_REST_Response
*/
public function find(Request $request, $id)
{
return $this->send(Lists::find($id));
}
/**
* Store a list.
*
* @param \FluentCrm\Framework\Http\Request\Request $request
* @return \WP_REST_Response
*/
public function create(Request $request)
{
$allData = $request->all();
if (empty($allData['slug'])) {
if ($allData['title']) {
$allData['slug'] = sanitize_text_field($allData['title']);
}
}
$data = $this->validate($allData, [
'title' => 'required',
'slug' => "required|unique:fc_lists,slug"
]);
$list = Lists::create([
'title' => sanitize_text_field($allData['title']),
'slug' => sanitize_title($data['slug'], 'display'),
'description' => sanitize_textarea_field(Arr::get($allData, 'description'))
]);
do_action('fluentcrm_list_created', $list->id);
do_action('fluent_crm/list_created', $list);
return $this->send([
'lists' => $list,
'item' => $list,
'message' => __('Successfully saved the list.', 'fluent-crm')
]);
}
/**
* Store a list.
*
* @param \FluentCrm\Framework\Http\Request\Request $request
* @param $id int
* @return \WP_REST_Response
*/
public function update(Request $request, $id)
{
$allData = $this->validate($request->all(), [
'title' => 'required'
]);
if(!empty($allData['slug'])) {
$allData['slug'] = Helper::slugify($allData['title']);
}
if ($id == 0 && $request->get('update_by') == 'slug' && !empty($allData['slug'])) {
$list = Lists::where('slug', $allData['slug'])->first();
if (!$list) {
return $this->sendError([
'message' => __('List could not be found', 'fluent-crm')
]);
}
$id = $list->id;
} else {
$list = Lists::findOrFail($id);
if(empty($allData['slug'])) {
$allData['slug'] = $list->slug;
}
}
if (Lists::where('slug', $allData['slug'])->where('id', '!=', $id)->first()) {
return $this->sendError([
'message' => __('Provided slug already exists in another list', 'fluent-crm')
]);
}
$list = Lists::where('id', $id)->update([
'title' => sanitize_text_field($allData['title']),
'slug' => $allData['slug'],
'description' => sanitize_textarea_field(Arr::get($allData, 'description')),
]);
do_action('fluentcrm_list_updated', $id);
do_action('fluent_crm/list_updated', $list);
return $this->send([
'lists' => $list,
'message' => __('Successfully saved the list.', 'fluent-crm'),
]);
}
/**
* Bulk store lists.
*
* @param \FluentCrm\Framework\Http\Request\Request $request
* @return \WP_REST_Response
*/
public function storeBulk(Request $request)
{
$lists = $request->get('lists', []);
if (empty($lists)) {
$lists = $this->request->get('items', []);
}
$createdIds = [];
foreach ($lists as $list) {
if (empty($list['title'])) {
continue;
}
if (empty($list['slug'])) {
$list['slug'] = Helper::slugify($list['title']);
}
$list = Lists::updateOrCreate(
['slug' => sanitize_title($list['slug'], 'display')],
['title' => sanitize_text_field($list['title'])]
);
$createdIds[] = $list->id;
if($list->wasRecentlyCreated) {
do_action('fluentcrm_list_created', $list->id);
do_action('fluent_crm/list_created', $list);
} else {
do_action('fluentcrm_list_updated', $list->id);
do_action('fluent_crm/list_updated', $list);
}
}
return $this->sendSuccess([
'message' => __('Provided Lists have been successfully created', 'fluent-crm'),
'ids' => $createdIds
]);
}
/**
* Delete a list
*
* @param \FluentCrm\Framework\Http\Request\Request $request
* @param int $id
* @return \WP_REST_Response
*/
public function remove(Request $request, $id)
{
Lists::where('id', $id)->delete();
do_action('fluent_crm/list_deleted', $id);
do_action('fluentcrm_list_deleted', $id);
return $this->send([
'message' => __('Successfully removed the list.', 'fluent-crm')
]);
}
public function handleBulkAction(Request $request)
{
$listIds = array_map('intval', (array)$request->get('listIds', []));
$listIds = array_unique(array_filter($listIds));
foreach ($listIds as $listId) {
Lists::where('id', $listId)->delete();
do_action('fluent_crm/list_deleted', $listId);
do_action('fluentcrm_list_deleted', $listId);
}
return $this->sendSuccess([
'message' => __('Selected Lists have been removed permanently', 'fluent-crm'),
]);
}
}