Skip to content

Commit ee31f47

Browse files
committed
Basic webhooks implementation + mail styles
1 parent eb1e6d9 commit ee31f47

27 files changed

+530
-145
lines changed

compose.yml

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,6 @@ services:
2222
XDEBUG_MODE: debug
2323
PHP_IDE_CONFIG: "serverName=speedpuzzling"
2424

25-
messenger-consumer:
26-
image: ghcr.io/myspeedpuzzling/web-base:main
27-
restart: unless-stopped
28-
tty: true
29-
command: "bash -c 'wait-for-it postgres:5432 -- sleep 5 && bin/console messenger:consume async -vv --time-limit 3600 --memory-limit 256M'"
30-
volumes:
31-
- .:/app
32-
depends_on:
33-
- postgres
34-
- redis
35-
- minio
36-
environment:
37-
XDEBUG_CONFIG: "client_host=host.docker.internal"
38-
XDEBUG_MODE: debug
39-
PHP_IDE_CONFIG: "serverName=speedpuzzling"
40-
4125
postgres:
4226
image: postgres:16.0
4327
environment:

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@
8585
"symfony/web-link": "^7.0",
8686
"symfony/webpack-encore-bundle": "^2.0",
8787
"symfony/yaml": "^7.0",
88-
"twig/cssinliner-extra": "^3.11",
89-
"twig/extra-bundle": "^3.11",
88+
"twig/cssinliner-extra": "^3.18",
89+
"twig/extra-bundle": "^3.18",
9090
"twig/intl-extra": "^3.8",
9191
"twig/string-extra": "^3.7",
9292
"twig/twig": "^3.0"

composer.lock

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/packages/twig.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,7 @@
2222

2323
$twig->global('get_notifications')
2424
->value(service(GetNotifications::class));
25+
26+
$twig->path('%kernel.project_dir%/public/img', 'images');
27+
$twig->path('%kernel.project_dir%/public/css', 'styles');
2528
};

public/css/email.css

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
body {
2+
color: #111;
3+
font-family: Arial, Tahoma, Sans-serif, serif;
4+
background: #ebebeb;
5+
font-size: 15px;
6+
}
7+
8+
h1 {
9+
font-weight: normal;
10+
font-size: 26px;
11+
}
12+
13+
h2 {
14+
font-weight: normal;
15+
font-size: 22px;
16+
}
17+
18+
h3 {
19+
font-weight: normal;
20+
font-size: 18px;
21+
}
22+
23+
p {
24+
margin: 1em 0;
25+
}
26+
27+
a {
28+
color: #f34770;
29+
text-decoration: underline;
30+
}
31+
32+
hr {
33+
border-bottom: 1px solid #ccc;
34+
margin: 15px 0;
35+
padding: 0;
36+
height: 1px;
37+
}
38+
39+
40+
h1.newsletter {
41+
color: #f34770;
42+
font-size: 24px;
43+
font-weight: normal;
44+
}
45+
46+
.admin-h1 {
47+
font-size: 24px;
48+
font-weight: normal;
49+
}
50+
51+
.logo {
52+
width: 80px;
53+
}
54+
55+
.newsletterContainer {
56+
width: 100%;
57+
max-width: 600px;
58+
margin: 15px auto;
59+
border: 1px solid #f34770;
60+
padding: 15px;
61+
background: #fff;
62+
}
63+
64+
.border-bottom {
65+
border-bottom: 1px solid #333;
66+
padding-bottom: 15px;
67+
margin-bottom: 15px;
68+
}
69+
70+
.text-center {
71+
text-align: center;
72+
}
73+
74+
.text-end {
75+
text-align: right;
76+
}

src/Events/SubscriptionPaymentFailed.php

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SpeedPuzzling\Web\Message;
6+
7+
readonly final class CreateMembershipSubscription
8+
{
9+
public function __construct(
10+
public string $stripeSubscriptionId,
11+
) {
12+
}
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SpeedPuzzling\Web\Message;
6+
7+
readonly final class NotifyAboutFailedPayment
8+
{
9+
public function __construct(
10+
public string $stripeSubscriptionId,
11+
) {
12+
}
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SpeedPuzzling\Web\Message;
6+
7+
readonly final class UpdateMembershipSubscription
8+
{
9+
public function __construct(
10+
public string $stripeSubscriptionId,
11+
) {
12+
}
13+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SpeedPuzzling\Web\MessageHandler;
6+
7+
use DateTimeImmutable;
8+
use Psr\Clock\ClockInterface;
9+
use Ramsey\Uuid\Uuid;
10+
use SpeedPuzzling\Web\Entity\Membership;
11+
use SpeedPuzzling\Web\Exceptions\MembershipNotFound;
12+
use SpeedPuzzling\Web\Exceptions\PlayerNotFound;
13+
use SpeedPuzzling\Web\Message\CreateMembershipSubscription;
14+
use SpeedPuzzling\Web\Message\UpdateMembershipSubscription;
15+
use SpeedPuzzling\Web\Repository\MembershipRepository;
16+
use SpeedPuzzling\Web\Repository\PlayerRepository;
17+
use Stripe\StripeClient;
18+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
19+
use Symfony\Component\Messenger\MessageBusInterface;
20+
21+
#[AsMessageHandler]
22+
readonly final class CreateMembershipSubscriptionHandler
23+
{
24+
public function __construct(
25+
private StripeClient $stripeClient,
26+
private PlayerRepository $playerRepository,
27+
private MembershipRepository $membershipRepository,
28+
private ClockInterface $clock,
29+
private MessageBusInterface $messageBus,
30+
) {
31+
}
32+
33+
/**
34+
* @throws PlayerNotFound
35+
*/
36+
public function __invoke(CreateMembershipSubscription $message): void
37+
{
38+
$subscriptionId = $message->stripeSubscriptionId;
39+
$subscription = $this->stripeClient->subscriptions->retrieve($subscriptionId);
40+
$billingPeriodEnd = DateTimeImmutable::createFromFormat('U', (string) $subscription->current_period_end);
41+
assert($billingPeriodEnd instanceof DateTimeImmutable);
42+
43+
$customerId = $subscription->customer;
44+
assert(is_string($customerId));
45+
46+
$customer = $this->stripeClient->customers->retrieve($customerId);
47+
$playerId = $customer->metadata->player_id ?? null;
48+
49+
if (!is_string($playerId)) {
50+
// Can not continue without playerId
51+
return;
52+
}
53+
54+
try {
55+
$this->membershipRepository->getByPlayerId($playerId);
56+
$this->messageBus->dispatch(
57+
new UpdateMembershipSubscription($subscriptionId),
58+
);
59+
} catch (MembershipNotFound) {
60+
$player = $this->playerRepository->get($playerId);
61+
$membership = new Membership(
62+
Uuid::uuid7(),
63+
$player,
64+
$this->clock->now(),
65+
$subscriptionId,
66+
$billingPeriodEnd,
67+
);
68+
69+
$this->membershipRepository->save($membership);
70+
}
71+
}
72+
}

0 commit comments

Comments
 (0)