diff --git a/README.md b/README.md index 0ca05b9..b23b6e7 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ You can overwrite default `Profile views` text with your own label. You can provide a `base` number to add to the counter. This is useful if you are migrating from another service. + For example, a user with 1000 views on another service who wants to migrate to GHPVC will use the following url to ensure the 1000 views are accounted for: ```markdown @@ -128,7 +129,7 @@ This project provides minimalistic counter only. Use [Ÿ HŸPE] service if you w ### How to reset counter? -To reset counter you should login to the [Ÿ HŸPE] service and then you will be able to reset counter on the https://yhype.me/ghpvc page. +To reset counter you should log in to the [Ÿ HŸPE] service, and then you will be able to reset counter on the https://yhype.me/ghpvc page. ### Why does the counter increase every time the page is reloaded? diff --git a/public/index.php b/public/index.php index d357ff4..0d10a97 100644 --- a/public/index.php +++ b/public/index.php @@ -63,13 +63,13 @@ ); if ($baseCount !== '0') { $count = $count->plus( - Count::ofString($baseCount) + Count::ofString($baseCount), ); } echo $badgeImageRenderer->renderBadgeWithCount( $badgeLabel, - $count->toInt(), + $count, $badgeMessageBackgroundFill, $badgeStyle, ); diff --git a/src/BadgeImageRendererService.php b/src/BadgeImageRendererService.php index 04a9127..f4ad326 100644 --- a/src/BadgeImageRendererService.php +++ b/src/BadgeImageRendererService.php @@ -36,11 +36,11 @@ public function __construct() public function renderBadgeWithCount( string $label, - int $count, + Count $count, string $messageBackgroundFill, string $badgeStyle ): string { - $message = number_format($count); + $message = $this->formatNumber($count->toInt()); return $this->renderBadge( $label, @@ -84,4 +84,17 @@ private function renderBadge( Badge::DEFAULT_FORMAT, ); } + + /** + * This method required because of native `number_format` + * method has big integer format limitation. + */ + private function formatNumber( + int $number + ): string { + $reversedString = strrev(strval($number)); + $formattedNumber = implode(',', str_split($reversedString, 3)); + + return strrev($formattedNumber); + } } diff --git a/src/Count.php b/src/Count.php index 046595f..6330014 100644 --- a/src/Count.php +++ b/src/Count.php @@ -22,29 +22,32 @@ final class Count private int $count; public function __construct( - float $count + int $count ) { + $this->count = $count; + Assert::lessThan( - $count, - self::MAX_COUNT, - 'The maximum number of views has been reached' + $count, + self::MAX_COUNT, + 'The maximum number of views has been reached', ); - $this->count = intval($count); Assert::greaterThanEq( - $count, - 0, - "Received a negative number of views" + $count, + 0, + 'Number of views cannot be negative', ); } - public static function ofString(string $countStr): self - { - Assert::digits( - $countStr, - 'The base count must only contain digits' - ); - $count = floatval($countStr); - return new self($count); + public static function ofString( + string $value + ): self { + Assert::digits( + $value, + 'The base count must only contain digits', + ); + $count = intval($value); + + return new self($count); } public function toInt(): int @@ -52,8 +55,17 @@ public function toInt(): int return $this->count; } - public function plus(self $count): self - { - return new self($this->toInt() + $count->toInt()); + public function plus( + self $that + ): self { + $sum = $this->toInt() + $that->toInt(); + + if (!is_int($sum)) { + throw new \InvalidArgumentException( + 'The maximum number of views has been reached', + ); + } + + return new self($sum); } }