Skip to content

Commit

Permalink
Merged PR 54830: Product created_date falls back to old date if missing
Browse files Browse the repository at this point in the history
## What's being changed

The product schema for catalog sync. Products without a `created_at` value will now have the `created_date` of '1970-01-01 01:00:00' (not '1970-01-01 00:00:00' because that ends up returning the current time, it must be after the start of the Unix epoch).

## Why it's being changed

Somehow it is possible for catalog products to have no `created_at` value.

## How to review / test this change

- Erase the created_at value for a product row in catalog_product_entity (or replace `$product->getCreatedAt()` with null in the code)
- Now try to sync the matching product
- Import data should show 1970-01-01 as the created_date
- Data should be successfully imported into DD

## Notes

As an alternative we could simply unset created_date if not supplied, but my understanding was this value was important for some functionality platform-side.

Related work items: #257276
  • Loading branch information
sta1r committed Jun 7, 2024
1 parent c940c0c commit a291488
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 4 deletions.
9 changes: 7 additions & 2 deletions Model/Connector/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
class Product extends AbstractConnectorModel
{
public const TYPE_VARIANT = 'Variant';
private const DEFAULT_PRODUCT_CREATED_DATE = '1970-01-01 01:00:00';

/**
* Dotdigital catalog required schema
Expand All @@ -38,7 +39,8 @@ class Product extends AbstractConnectorModel
'price' => ':isFloat',
'sku' => ':isString',
'url' => ':url',
'imagePath' => ':url'
'imagePath' => ':url',
'created_date' => ':dateFormatAtom'
];

/**
Expand Down Expand Up @@ -273,7 +275,10 @@ public function setProduct($product, ?int $storeId)
$this->id = $product->getId();
$this->sku = $product->getSku();
$this->name = $product->getName();
$this->created_date = $this->dateTime->date(\DateTimeInterface::ATOM, $product->getCreatedAt());
$this->created_date = $this->dateTime->date(
\DateTimeInterface::ATOM,
$product->getCreatedAt() ?: self::DEFAULT_PRODUCT_CREATED_DATE
);

$this->status = $this->statusFactory->create()
->getOptionText($product->getStatus());
Expand Down
19 changes: 19 additions & 0 deletions Model/Validator/Schema/Rule/DateFormatAtomRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Dotdigitalgroup\Email\Model\Validator\Schema\Rule;

class DateFormatAtomRule implements ValidatorRuleInterface
{
/**
* Validate ATOM date format
*
* @param mixed $value
* @return bool
*/
public function passes($value):bool
{
$date = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $value);
$formattedDate = $date->format(\DateTimeInterface::ATOM);
return ($formattedDate === $value);
}
}
12 changes: 10 additions & 2 deletions Model/Validator/Schema/SchemaValidatorRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace Dotdigitalgroup\Email\Model\Validator\Schema;

use Dotdigitalgroup\Email\Model\Validator\Schema\Exception\PatternInvalidException;
use Dotdigitalgroup\Email\Model\Validator\Schema\Exception\RuleNotDefinedException;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\DateFormatAtomRuleFactory;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\DateFormatRuleFactory;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\IsFloatRuleFactory;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\IsIntRuleFactory;
Expand All @@ -14,7 +14,6 @@

class SchemaValidatorRule implements SchemaValidatorRuleInterface
{

/**
* @var mixed|string
*/
Expand All @@ -25,6 +24,11 @@ class SchemaValidatorRule implements SchemaValidatorRuleInterface
*/
private $rule;

/**
* @var DateFormatAtomRuleFactory
*/
private $dateFormatAtomRuleFactory;

/**
* @var DateFormatRuleFactory
*/
Expand Down Expand Up @@ -58,16 +62,19 @@ class SchemaValidatorRule implements SchemaValidatorRuleInterface
/**
* Construct SchemaValidatorRule
*
* @param DateFormatAtomRuleFactory $dateFormatAtomRuleFactory
* @param DateFormatRuleFactory $dateFormatRuleFactory
* @param IsFloatRuleFactory $isFloatRuleFactory
* @param IsIntRuleFactory $isIntRuleFactory
* @param IsStringRuleFactory $isStringRuleFactory
* @param RequiredRuleFactory $requiredRuleFactory
* @param UrlRuleFactory $urlRuleFactory
* @param string $pattern
*
* @throws RuleNotDefinedException
*/
public function __construct(
DateFormatAtomRuleFactory $dateFormatAtomRuleFactory,
DateFormatRuleFactory $dateFormatRuleFactory,
IsFloatRuleFactory $isFloatRuleFactory,
IsIntRuleFactory $isIntRuleFactory,
Expand All @@ -76,6 +83,7 @@ public function __construct(
UrlRuleFactory $urlRuleFactory,
string $pattern
) {
$this->dateFormatAtomRuleFactory = $dateFormatAtomRuleFactory;
$this->dateFormatRuleFactory = $dateFormatRuleFactory;
$this->isFloatRuleFactory = $isFloatRuleFactory;
$this->isIntRuleFactory = $isIntRuleFactory;
Expand Down
7 changes: 7 additions & 0 deletions Test/Unit/Model/SchemaValidator/SchemaValidatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Dotdigitalgroup\Email\Test\Unit\Model\SchemaValidator;

use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\DateFormatAtomRule;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\DateFormatRule;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\DateFormatAtomRuleFactory;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\DateFormatRuleFactory;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\IsFloatRule;
use Dotdigitalgroup\Email\Model\Validator\Schema\Rule\IsFloatRuleFactory;
Expand Down Expand Up @@ -146,6 +148,10 @@ public function testPatternMatchIsNotValid()
*/
private function getRuleFactory($rule)
{
$dateFormatAtomRuleFactory = $this->createMock(DateFormatAtomRuleFactory::class);
$dateFormatAtomRuleFactory
->method('create')
->willReturn(new DateFormatAtomRule());
$dateFormatRuleFactory = $this->createMock(DateFormatRuleFactory::class);
$dateFormatRuleFactory
->method('create')
Expand All @@ -172,6 +178,7 @@ private function getRuleFactory($rule)
->willReturn(new UrlRule($this->urlValidatorMock));

return new SchemaValidatorRule(
$dateFormatAtomRuleFactory,
$dateFormatRuleFactory,
$isFloatRuleFactory,
$isIntRuleFactory,
Expand Down

0 comments on commit a291488

Please sign in to comment.