Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ meta {
}

get {
url: {{baseUrl}}/api/articles?_locale=fr&publishedAt[archive]=2023-06
url: {{baseUrl}}/api/articles?_locale=fr&order[publishedAt]=desc
body: none
auth: none
}

params:query {
_locale: fr
publishedAt[archive]: 2023-06
order[publishedAt]: desc
~publishedAt[archive]: 2023-06
~tagGroup[0]: quis,ut
~tagGroup[1]: modi-en
~page:
~itemsPerPage:
~properties[]:
~order[unpublishedAt]:
~order[publishedAt]:
~unpublishedAt[before]:
~unpublishedAt[strictly_before]:
~unpublishedAt[after]:
Expand Down
13 changes: 4 additions & 9 deletions config/packages/roadiz_rozier.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,10 @@ roadiz_rozier:
route: nodesHomeDraftPage
icon: uk-icon-rz-draft-nodes
roles: ~
pending_nodes:
name: 'pending.nodes'
route: nodesHomePendingPage
icon: uk-icon-rz-pending-nodes
roles: ~
archived_nodes:
name: 'archived.nodes'
route: nodesHomeArchivedPage
icon: uk-icon-rz-archives-nodes
published_nodes:
name: 'published.nodes'
route: nodesHomePublishedPage
icon: uk-icon-rz-published-nodes
roles: ~
deleted_nodes:
name: 'deleted.nodes'
Expand Down
6 changes: 0 additions & 6 deletions lib/Models/src/Core/AbstractEntities/NodeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,5 @@ public function getChildrenOrder(): string;

public function getChildrenOrderDirection(): string;

public function isDraft(): bool;

public function isPending(): bool;

public function isPublished(): bool;

public function getNodeTypeName(): string;
}
3 changes: 1 addition & 2 deletions lib/RoadizCoreBundle/config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -655,9 +655,8 @@ services:
#
# Workflows
#
state_machine.node:
RZ\Roadiz\CoreBundle\Workflow\NodesSourcesWorkflow:
public: true
alias: RZ\Roadiz\CoreBundle\Workflow\NodeWorkflow

RZ\TreeWalker\WalkerContextInterface:
factory: [ '@RZ\Roadiz\CoreBundle\Api\TreeWalker\NodeSourceWalkerContextFactory', 'createWalkerContext' ]
29 changes: 29 additions & 0 deletions lib/RoadizCoreBundle/migrations/Version20250629125716.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace RZ\Roadiz\Migrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250629125716 extends AbstractMigration
{
public function getDescription(): string
{
return '[NodesSources status 1/4] Add datetime columns to nodes_sources table';
}

public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE nodes_sources ADD created_at DATETIME DEFAULT NULL, ADD updated_at DATETIME DEFAULT NULL, ADD deleted_at DATETIME DEFAULT NULL');
}

public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE nodes_sources DROP created_at, DROP updated_at, DROP deleted_at');
}
}
121 changes: 121 additions & 0 deletions lib/RoadizCoreBundle/migrations/Version20250629130118.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?php

declare(strict_types=1);

namespace RZ\Roadiz\Migrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250629130118 extends AbstractMigration
{
public function getDescription(): string
{
return '[NodesSources status 2/4] Convert nodes status to nodes_sources published_at and deleted_at.';
}

public function up(Schema $schema): void
{
$draftIds = implode(',', $this->connection->executeQuery(<<<SQL
SELECT ns.id FROM nodes_sources AS ns
INNER JOIN nodes AS n ON n.id = ns.node_id
WHERE n.status <= 20
SQL)->fetchFirstColumn());

$publishedIds = implode(',', $this->connection->executeQuery(<<<SQL
SELECT ns.id FROM nodes_sources AS ns
INNER JOIN nodes AS n ON n.id = ns.node_id
WHERE n.status = 30
SQL)->fetchFirstColumn());

$deletedIds = implode(',', $this->connection->executeQuery(<<<SQL
SELECT ns.id FROM nodes_sources AS ns
INNER JOIN nodes AS n ON n.id = ns.node_id
WHERE n.status = 40 OR n.status = 50
SQL)->fetchFirstColumn());

// Set nodes sources created_at and update_at from node created_at and update_at
$this->addSql(<<<SQL
UPDATE nodes_sources,nodes SET nodes_sources.created_at = nodes.created_at, nodes_sources.updated_at = nodes.updated_at
WHERE nodes_sources.node_id=nodes.id
SQL);

// Draft nodes sources with node status DRAFT (10, 20) and published_at is past
$this->addSql(<<<SQL
UPDATE nodes_sources SET published_at = NULL
WHERE
(published_at IS NOT NULL AND published_at <= NOW())
AND id IN ({$draftIds});
SQL);

// Publish nodes sources with node status PUBLISHED (30)
$this->addSql(<<<SQL
UPDATE nodes_sources SET published_at = NOW()
WHERE
(published_at IS NULL OR published_at > NOW())
AND id IN ({$publishedIds});
SQL);

// Delete nodes sources with node status DELETED (50) and ARCHIVED (40)
$this->addSql(<<<SQL
UPDATE nodes_sources SET deleted_at = NOW()
WHERE
(deleted_at IS NULL OR deleted_at > NOW())
AND id IN ({$deletedIds});
SQL);
}

public function down(Schema $schema): void
{
// Set nodes created_at and update_at from nodes_sources created_at and update_at
$this->addSql(<<<SQL
UPDATE nodes_sources,nodes SET nodes.created_at = nodes_sources.created_at, nodes.updated_at = nodes_sources.updated_at
WHERE nodes_sources.node_id=nodes.id
SQL);

$draftIds = $this->connection->executeQuery(<<<SQL
SELECT n.id FROM nodes AS n
INNER JOIN nodes_sources AS ns ON n.id = ns.node_id
WHERE ns.published_at IS NULL OR ns.published_at > NOW()
SQL)->fetchFirstColumn();

$this->warnIf(
count($draftIds) > 0,
'Some nodes_sources are marked draft, this will force their node to be draft too.'
);

$draftIds = implode(',', $draftIds);

$publishedIds = implode(',', $this->connection->executeQuery(<<<SQL
SELECT n.id FROM nodes AS n
INNER JOIN nodes_sources AS ns ON n.id = ns.node_id
WHERE ns.published_at IS NOT NULL AND ns.published_at <= NOW()
SQL)->fetchFirstColumn());

$deletedIds = $this->connection->executeQuery(<<<SQL
SELECT n.id FROM nodes AS n
INNER JOIN nodes_sources AS ns ON n.id = ns.node_id
WHERE ns.deleted_at IS NOT NULL AND ns.deleted_at <= NOW()
SQL)->fetchFirstColumn();

$this->warnIf(
count($deletedIds) > 0,
'Some nodes_sources are marked deleted, this will not be reverted!'
);

// Draft nodes status DRAFT (10) when nodes_sources published_at is NULL or in the future
$this->addSql(<<<SQL
UPDATE nodes SET status = 10
WHERE id IN ({$draftIds});
SQL);

// Draft nodes status PUBLISHED (30) when nodes_sources published_at is past
$this->addSql(<<<SQL
UPDATE nodes SET status = 30
WHERE id IN ({$publishedIds});
SQL);
}
}
39 changes: 39 additions & 0 deletions lib/RoadizCoreBundle/migrations/Version20250629150839.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

namespace RZ\Roadiz\Migrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250629150839 extends AbstractMigration
{
public function getDescription(): string
{
return '[NodesSources status 3/4] Rename nodes_sources indexes to be more explicit.';
}

public function up(Schema $schema): void
{
$this->addSql('CREATE INDEX ns_created_at ON nodes_sources (created_at)');
$this->addSql('CREATE INDEX ns_deleted_at ON nodes_sources (deleted_at)');
$this->addSql('CREATE INDEX ns_updated_at ON nodes_sources (updated_at)');
$this->addSql('ALTER TABLE nodes_sources RENAME INDEX idx_7c7ded6d4ad26064 TO ns_discr');
$this->addSql('ALTER TABLE nodes_sources RENAME INDEX idx_7c7ded6de0d4fde1 TO ns_published_at');
$this->addSql('ALTER TABLE nodes_sources RENAME INDEX idx_7c7ded6d2b36786b TO ns_title');
}

public function down(Schema $schema): void
{
$this->addSql('DROP INDEX ns_created_at ON nodes_sources');
$this->addSql('DROP INDEX ns_deleted_at ON nodes_sources');
$this->addSql('DROP INDEX ns_updated_at ON nodes_sources');
$this->addSql('ALTER TABLE nodes_sources RENAME INDEX ns_discr TO IDX_7C7DED6D4AD26064');
$this->addSql('ALTER TABLE nodes_sources RENAME INDEX ns_title TO IDX_7C7DED6D2B36786B');
$this->addSql('ALTER TABLE nodes_sources RENAME INDEX ns_published_at TO IDX_7C7DED6DE0D4FDE1');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
use ApiPlatform\Doctrine\Orm\Util\QueryBuilderHelper;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use RZ\Roadiz\CoreBundle\Entity\AttributeValue;
use RZ\Roadiz\CoreBundle\Enum\NodeStatus;
use RZ\Roadiz\CoreBundle\Preview\PreviewResolverInterface;

final readonly class AttributeValueQueryExtension implements QueryItemExtensionInterface, QueryCollectionExtensionInterface
{
use NodesSourcesStatusExtensionTrait;

public function __construct(
private PreviewResolverInterface $previewResolver,
) {
Expand All @@ -30,7 +32,7 @@ public function applyToItem(
?Operation $operation = null,
array $context = [],
): void {
$this->apply($queryBuilder, $resourceClass);
$this->apply($queryBuilder, $queryNameGenerator, $resourceClass);
}

#[\Override]
Expand All @@ -41,11 +43,12 @@ public function applyToCollection(
?Operation $operation = null,
array $context = [],
): void {
$this->apply($queryBuilder, $resourceClass);
$this->apply($queryBuilder, $queryNameGenerator, $resourceClass);
}

private function apply(
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
): void {
if (
Expand All @@ -68,18 +71,14 @@ private function apply(
$joinAlias = $existingNodeJoin->getAlias();
}

if ($this->previewResolver->isPreview()) {
$queryBuilder
->andWhere($queryBuilder->expr()->lte($joinAlias.'.status', ':status'))
->setParameter(':status', NodeStatus::PUBLISHED);

return;
}

$queryBuilder
->andWhere($queryBuilder->expr()->eq($joinAlias.'.status', ':status'))
->setParameter(':status', NodeStatus::PUBLISHED);
$alias = QueryBuilderHelper::addJoinOnce(
$queryBuilder,
$queryNameGenerator,
$joinAlias,
'nodeSources',
Join::INNER_JOIN
);

return;
$this->alterQueryBuilderWithStatus($queryBuilder, $alias);
}
}
18 changes: 3 additions & 15 deletions lib/RoadizCoreBundle/src/Api/Extension/NodeQueryExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use RZ\Roadiz\CoreBundle\Entity\Node;
use RZ\Roadiz\CoreBundle\Enum\NodeStatus;
use RZ\Roadiz\CoreBundle\Preview\PreviewResolverInterface;

final readonly class NodeQueryExtension implements QueryItemExtensionInterface, QueryCollectionExtensionInterface
{
use NodesSourcesStatusExtensionTrait;

public function __construct(
private PreviewResolverInterface $previewResolver,
) {
Expand All @@ -43,28 +44,15 @@ private function apply(
return;
}

if ($this->previewResolver->isPreview()) {
$queryBuilder
->andWhere($queryBuilder->expr()->lte('o.status', ':status'))
->setParameter(':status', NodeStatus::PUBLISHED);

return;
}

$alias = QueryBuilderHelper::addJoinOnce(
$queryBuilder,
$queryNameGenerator,
'o',
'nodeSources',
Join::INNER_JOIN
);
$queryBuilder
->andWhere($queryBuilder->expr()->lte($alias.'.publishedAt', ':lte_published_at'))
->andWhere($queryBuilder->expr()->eq('o.status', ':status'))
->setParameter(':lte_published_at', new \DateTime())
->setParameter(':status', NodeStatus::PUBLISHED);

return;
$this->alterQueryBuilderWithStatus($queryBuilder, $alias);
}

#[\Override]
Expand Down
Loading