Skip to content

Commit efc42f2

Browse files
committed
fixup! feat(snowflake): extend Entity class to support snowflakes
1 parent 4eaed44 commit efc42f2

19 files changed

+193
-67
lines changed

core/BackgroundJobs/MovePreviewJob.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
use OCP\IAppConfig;
2727
use OCP\IConfig;
2828
use OCP\IDBConnection;
29-
use OCP\Snowflake\IGenerator;
29+
use OCP\Snowflake\ISnowflakeGenerator;
3030
use Override;
3131
use Psr\Log\LoggerInterface;
3232

@@ -45,7 +45,7 @@ public function __construct(
4545
private readonly IMimeTypeDetector $mimeTypeDetector,
4646
private readonly IMimeTypeLoader $mimeTypeLoader,
4747
private readonly LoggerInterface $logger,
48-
private readonly IGenerator $generator,
48+
private readonly ISnowflakeGenerator $generator,
4949
IAppDataFactory $appDataFactory,
5050
) {
5151
parent::__construct($time);

core/Command/SnowflakeDecodeId.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
*/
99
namespace OC\Core\Command;
1010

11-
use OCP\Snowflake\IDecoder;
11+
use OCP\Snowflake\ISnowflakeDecoder;
1212
use Symfony\Component\Console\Helper\Table;
1313
use Symfony\Component\Console\Input\InputArgument;
1414
use Symfony\Component\Console\Input\InputInterface;
1515
use Symfony\Component\Console\Output\OutputInterface;
1616

1717
class SnowflakeDecodeId extends Base {
1818
public function __construct(
19-
private readonly IDecoder $decoder,
19+
private readonly ISnowflakeDecoder $decoder,
2020
) {
2121
parent::__construct();
2222
}

lib/private/Preview/Db/PreviewMapper.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use OCP\DB\QueryBuilder\IQueryBuilder;
1616
use OCP\Files\IMimeTypeLoader;
1717
use OCP\IDBConnection;
18-
use OCP\Snowflake\IGenerator;
18+
use OCP\Snowflake\ISnowflakeGenerator;
1919
use Override;
2020

2121
/**
@@ -30,7 +30,7 @@ class PreviewMapper extends QBMapper {
3030
public function __construct(
3131
IDBConnection $db,
3232
private readonly IMimeTypeLoader $mimeTypeLoader,
33-
private readonly IGenerator $snowflake,
33+
private readonly ISnowflakeGenerator $snowflake,
3434
) {
3535
parent::__construct($db, self::TABLE_NAME, Preview::class);
3636
}

lib/private/Preview/Generator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
use OCP\IStreamImage;
2424
use OCP\Preview\BeforePreviewFetchedEvent;
2525
use OCP\Preview\IVersionedPreviewFile;
26-
use OCP\Snowflake\IGenerator;
26+
use OCP\Snowflake\ISnowflakeGenerator;
2727
use Psr\Log\LoggerInterface;
2828

2929
class Generator {
@@ -38,7 +38,7 @@ public function __construct(
3838
private LoggerInterface $logger,
3939
private PreviewMapper $previewMapper,
4040
private StorageFactory $storageFactory,
41-
private IGenerator $snowflakeGenerator,
41+
private ISnowflakeGenerator $snowflakeGenerator,
4242
) {
4343
}
4444

lib/private/Preview/Storage/LocalPreviewStorage.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
use OCP\IAppConfig;
2323
use OCP\IConfig;
2424
use OCP\IDBConnection;
25-
use OCP\Snowflake\IGenerator;
25+
use OCP\Snowflake\ISnowflakeGenerator;
2626
use Override;
2727
use Psr\Log\LoggerInterface;
2828
use RecursiveDirectoryIterator;
@@ -39,7 +39,7 @@ public function __construct(
3939
private readonly IDBConnection $connection,
4040
private readonly IMimeTypeDetector $mimeTypeDetector,
4141
private readonly LoggerInterface $logger,
42-
private readonly IGenerator $generator,
42+
private readonly ISnowflakeGenerator $generator,
4343
) {
4444
$this->instanceId = $this->config->getSystemValueString('instanceid');
4545
$this->rootFolder = $this->config->getSystemValue('datadirectory', OC::$SERVERROOT . '/data');

lib/private/PreviewManager.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
use OCP\IConfig;
2424
use OCP\IPreview;
2525
use OCP\Preview\IProviderV2;
26-
use OCP\Snowflake\IGenerator;
26+
use OCP\Snowflake\ISnowflakeGenerator;
2727
use Psr\Container\ContainerInterface;
2828
use Psr\Container\NotFoundExceptionInterface;
2929
use Psr\Log\LoggerInterface;
@@ -142,7 +142,7 @@ private function getGenerator(): Generator {
142142
$this->container->get(LoggerInterface::class),
143143
$this->container->get(PreviewMapper::class),
144144
$this->container->get(StorageFactory::class),
145-
$this->container->get(IGenerator::class),
145+
$this->container->get(ISnowflakeGenerator::class),
146146
);
147147
}
148148
return $this->generator;

lib/private/Server.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@
117117
use OC\Share20\ProviderFactory;
118118
use OC\Share20\ShareHelper;
119119
use OC\Snowflake\APCuSequence;
120-
use OC\Snowflake\Decoder;
121120
use OC\Snowflake\FileSequence;
122-
use OC\Snowflake\Generator;
123121
use OC\Snowflake\ISequence;
122+
use OC\Snowflake\SnowflakeDecoder;
123+
use OC\Snowflake\SnowflakeGenerator;
124124
use OC\SpeechToText\SpeechToTextManager;
125125
use OC\SystemTag\ManagerFactory as SystemTagManagerFactory;
126126
use OC\Talk\Broker;
@@ -230,8 +230,8 @@
230230
use OCP\SetupCheck\ISetupCheckManager;
231231
use OCP\Share\IProviderFactory;
232232
use OCP\Share\IShareHelper;
233-
use OCP\Snowflake\IDecoder;
234-
use OCP\Snowflake\IGenerator;
233+
use OCP\Snowflake\ISnowflakeDecoder;
234+
use OCP\Snowflake\ISnowflakeGenerator;
235235
use OCP\SpeechToText\ISpeechToTextManager;
236236
use OCP\SystemTag\ISystemTagManager;
237237
use OCP\SystemTag\ISystemTagObjectMapper;
@@ -1266,7 +1266,7 @@ public function __construct($webRoot, \OC\Config $config) {
12661266

12671267
$this->registerAlias(ISignatureManager::class, SignatureManager::class);
12681268

1269-
$this->registerAlias(IGenerator::class, Generator::class);
1269+
$this->registerAlias(ISnowflakeGenerator::class, SnowflakeGenerator::class);
12701270
$this->registerService(ISequence::class, function (ContainerInterface $c): ISequence {
12711271
if (PHP_SAPI !== 'cli') {
12721272
$sequence = $c->get(APCuSequence::class);
@@ -1277,7 +1277,7 @@ public function __construct($webRoot, \OC\Config $config) {
12771277

12781278
return $c->get(FileSequence::class);
12791279
}, false);
1280-
$this->registerAlias(IDecoder::class, Decoder::class);
1280+
$this->registerAlias(ISnowflakeDecoder::class, SnowflakeDecoder::class);
12811281

12821282
$this->connectDispatcher();
12831283
}

lib/private/Snowflake/Decoder.php renamed to lib/private/Snowflake/SnowflakeDecoder.php

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99

1010
namespace OC\Snowflake;
1111

12-
use OCP\Snowflake\IDecoder;
13-
use OCP\Snowflake\IGenerator;
12+
use OCP\Snowflake\ISnowflakeDecoder;
13+
use OCP\Snowflake\ISnowflakeGenerator;
14+
use OCP\Snowflake\Snowflake;
1415
use Override;
1516

1617
/**
@@ -20,7 +21,7 @@
2021
*
2122
* @since 33.0.0
2223
*/
23-
final class Decoder implements IDecoder {
24+
final class SnowflakeDecoder implements ISnowflakeDecoder {
2425
#[Override]
2526
public function decode(string $snowflakeId): array {
2627
if (!ctype_digit($snowflakeId)) {
@@ -35,7 +36,7 @@ public function decode(string $snowflakeId): array {
3536
$data['createdAt'] = new \DateTimeImmutable(
3637
sprintf(
3738
'@%d.%03d',
38-
$data['seconds'] + IGenerator::TS_OFFSET + intdiv($data['milliseconds'], 1000),
39+
$data['seconds'] + ISnowflakeGenerator::TS_OFFSET + intdiv($data['milliseconds'], 1000),
3940
$data['milliseconds'] % 1000,
4041
)
4142
);
@@ -51,11 +52,11 @@ private function decode64bits(int $snowflakeId): array {
5152
$milliseconds = $secondHalf >> 22;
5253

5354
return [
54-
'seconds' => $seconds,
55-
'milliseconds' => $milliseconds,
5655
'serverId' => ($secondHalf >> 13) & 0x1FF,
5756
'sequenceId' => $secondHalf & 0xFFF,
5857
'isCli' => (bool)(($secondHalf >> 12) & 0x1),
58+
'seconds' => $seconds,
59+
'milliseconds' => $milliseconds,
5960
];
6061
}
6162

@@ -88,12 +89,12 @@ private function convertBase16(string $decimal): string {
8889
$hex = '';
8990
$digits = '0123456789ABCDEF';
9091

91-
while (strlen($decimal) > 0 && $decimal !== '0') {
92+
while ($decimal !== '' && $decimal !== '0') {
9293
$remainder = 0;
9394
$newDecimal = '';
9495

9596
// Perform division by 16 manually for arbitrary precision
96-
for ($i = 0; $i < strlen($decimal); $i++) {
97+
for ($i = 0, $iMax = strlen($decimal); $i < $iMax; $i++) {
9798
$digit = (int)$decimal[$i];
9899
$current = $remainder * 10 + $digit;
99100

@@ -104,7 +105,7 @@ private function convertBase16(string $decimal): string {
104105
} else {
105106
$remainder = $current;
106107
// Only add quotient digit if we already have some digits in result
107-
if (strlen($newDecimal) > 0) {
108+
if ($newDecimal !== '') {
108109
$newDecimal .= '0';
109110
}
110111
}
@@ -119,4 +120,9 @@ private function convertBase16(string $decimal): string {
119120

120121
return str_pad($hex, 16, '0', STR_PAD_LEFT);
121122
}
123+
124+
public function decodeToSnowflake(string $snowflakeId): Snowflake {
125+
$data = $this->decode($snowflakeId);
126+
return Snowflake::fromArray($data);
127+
}
122128
}

lib/private/Snowflake/Generator.php renamed to lib/private/Snowflake/SnowflakeGenerator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
use OCP\AppFramework\Utility\ITimeFactory;
1313
use OCP\IConfig;
14-
use OCP\Snowflake\IGenerator;
14+
use OCP\Snowflake\ISnowflakeGenerator;
1515
use Override;
1616

1717
/**
@@ -21,7 +21,7 @@
2121
*
2222
* @since 33.0.0
2323
*/
24-
final class Generator implements IGenerator {
24+
final class SnowflakeGenerator implements ISnowflakeGenerator {
2525
public function __construct(
2626
private readonly ITimeFactory $timeFactory,
2727
private readonly IConfig $config,

lib/public/AppFramework/Db/SnowflakeAwareEntity.php

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
namespace OCP\AppFramework\Db;
44

5+
use OCP\AppFramework\Attribute\Consumable;
56
use OCP\Server;
6-
use OCP\Snowflake\IDecoder;
7-
use OCP\Snowflake\IGenerator;
7+
use OCP\Snowflake\ISnowflakeDecoder;
8+
use OCP\Snowflake\ISnowflakeGenerator;
9+
use OCP\Snowflake\Snowflake;
810

911
/**
10-
* @method string getId()
12+
* @since 33.0.0
1113
*/
12-
class SnowflakeAwareEntity extends Entity {
14+
#[Consumable(since: '33.0.0')]
15+
abstract class SnowflakeAwareEntity extends Entity {
1316
/** @var string $id */
1417
public $id;
1518

@@ -19,24 +22,27 @@ class SnowflakeAwareEntity extends Entity {
1922
#[\Override]
2023
public function setId(): void {
2124
if (empty($this->id)) {
22-
$generator = Server::get(IGenerator::class);
23-
$this->id = $generator->nextId();
25+
$this->id = Server::get(ISnowflakeGenerator::class)->nextId();
2426
$this->markFieldUpdated('id');
2527
}
2628
}
2729

30+
#[\Override]
31+
public function getId(): string {
32+
return $this->id;
33+
}
34+
2835
public function getCreatedAt(): ?\DateTimeImmutable {
2936
if (empty($this->id)) {
3037
return null;
3138
}
32-
$decoder = Server::get(IDecoder::class);
33-
return $decoder->decode($this->id)['created_at'];
39+
return Server::get(ISnowflakeDecoder::class)->decodeToSnowflake($this->id)->getCreatedAt();
3440
}
3541

36-
public function getDecodedId(): array {
42+
public function getSnowflake(): ?Snowflake {
3743
if (empty($this->id)) {
38-
return [];
44+
return null;
3945
}
40-
return Server::get(IDecoder::class)->decode($this->id);
46+
return Server::get(ISnowflakeDecoder::class)->decodeToSnowflake($this->id);
4147
}
4248
}

0 commit comments

Comments
 (0)