Skip to content

Commit

Permalink
Merge 46d9e0e into 755e68f
Browse files Browse the repository at this point in the history
  • Loading branch information
wimski committed Jun 21, 2021
2 parents 755e68f + 46d9e0e commit e61b3d6
Show file tree
Hide file tree
Showing 5 changed files with 579 additions and 0 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ Make sure the following middleware is enabled for Lighthouse:
- [Logout](#logout)
- [Register](#register)
- [Email Verification](#email-verification)
- [Resend Email Verification Link](#resend-email-verification-link)
- [Forgot Password](#forgot-password)
- [Reset Password](#reset-password)

Expand Down Expand Up @@ -220,6 +221,22 @@ mutation VerifyEmail {
}
```

### Resend Email Verification Link

```graphql
mutation ResendEmailVerification {
resendEmailVerification(input: {
email: "john.doe@gmail.com",
verification_url: {
url: "https://my-front-end.com/verify-email?id=__ID__&token=__HASH__"
# Signed: url: "https://my-front-end.com/verify-email?id=__ID__&token=__HASH__&expires=__EXPIRES__&signature=__SIGNATURE__"
}
}) {
status
}
}
```

### Forgot Password

Sends a reset password notification.
Expand Down
16 changes: 16 additions & 0 deletions graphql/sanctum.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,27 @@ enum EmailVerificationStatus {
VERIFIED
}

type ResendEmailVerificationResponse {
status: ResendEmailVerificationStatus!
}

enum ResendEmailVerificationStatus {
"""EMAIL_SENT"""
EMAIL_SENT
}

input VerifyEmailInput {
id: ID!
hash: String!
expires: Int
signature: String
}

input ResendEmailVerificationInput {
email: String! @rules(apply: ["email"])
verification_url: VerificationUrlInput
}

input RegisterInput {
name: String!
email: String! @rules(apply: ["bail", "email", "unique:users,email"])
Expand Down Expand Up @@ -126,6 +140,8 @@ extend type Mutation {
@field(resolver: "DanielDeWit\\LighthouseSanctum\\GraphQL\\Mutations\\Register")
verifyEmail(input: VerifyEmailInput! @spread): EmailVerificationResponse!
@field(resolver: "DanielDeWit\\LighthouseSanctum\\GraphQL\\Mutations\\VerifyEmail")
resendEmailVerification(input: ResendEmailVerificationInput! @spread): ResendEmailVerificationResponse!
@field(resolver: "DanielDeWit\\LighthouseSanctum\\GraphQL\\Mutations\\ResendEmailVerification")
forgotPassword(input: ForgotPasswordInput! @spread): ForgotPasswordResponse!
@field(resolver: "DanielDeWit\\LighthouseSanctum\\GraphQL\\Mutations\\ForgotPassword")
resetPassword(input: ResetPasswordInput! @spread): ResetPasswordResponse!
Expand Down
66 changes: 66 additions & 0 deletions src/GraphQL/Mutations/ResendEmailVerification.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

declare(strict_types=1);

namespace DanielDeWit\LighthouseSanctum\GraphQL\Mutations;

use DanielDeWit\LighthouseSanctum\Contracts\Services\EmailVerificationServiceInterface;
use DanielDeWit\LighthouseSanctum\Traits\CreatesUserProvider;
use Illuminate\Auth\AuthManager;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Contracts\Config\Repository as Config;

class ResendEmailVerification
{
use CreatesUserProvider;

protected AuthManager $authManager;
protected Config $config;
protected EmailVerificationServiceInterface $emailVerificationService;

public function __construct(
AuthManager $authManager,
Config $config,
EmailVerificationServiceInterface $emailVerificationService
) {
$this->authManager = $authManager;
$this->config = $config;
$this->emailVerificationService = $emailVerificationService;
}

/**
* @param mixed $_
* @param array<string, mixed> $args
* @return array<string, string>
*/
public function __invoke($_, array $args): array
{
$userProvider = $this->createUserProvider();

$user = $userProvider->retrieveByCredentials([
'email' => $args['email'],
]);

if ($user && $user instanceof MustVerifyEmail && ! $user->hasVerifiedEmail()) {
if (isset($args['verification_url'])) {
$this->emailVerificationService->setVerificationUrl($args['verification_url']['url']);
}

$user->sendEmailVerificationNotification();
}

return [
'status' => 'EMAIL_SENT',
];
}

protected function getAuthManager(): AuthManager
{
return $this->authManager;
}

protected function getConfig(): Config
{
return $this->config;
}
}

0 comments on commit e61b3d6

Please sign in to comment.