mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-08-18 21:22:15 +01:00
Compare commits
1 Commits
v0.18.0
...
b418bb5caf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b418bb5caf |
@@ -23,10 +23,6 @@ class InvitationService
|
|||||||
*/
|
*/
|
||||||
public function inviteUser(Organization $organization, string $email, Role $role, User $inviter): OrganizationInvitation
|
public function inviteUser(Organization $organization, string $email, Role $role, User $inviter): OrganizationInvitation
|
||||||
{
|
{
|
||||||
// Normalize the email so it matches how user emails are stored (see UserService::createUser),
|
|
||||||
// otherwise a mixed-case invite silently fails to link on registration.
|
|
||||||
$email = strtolower($email);
|
|
||||||
|
|
||||||
if (app(MemberService::class)->isEmailAlreadyMember($organization, $email)) {
|
if (app(MemberService::class)->isEmailAlreadyMember($organization, $email)) {
|
||||||
throw new UserIsAlreadyMemberOfOrganizationApiException;
|
throw new UserIsAlreadyMemberOfOrganizationApiException;
|
||||||
}
|
}
|
||||||
@@ -59,7 +55,7 @@ class InvitationService
|
|||||||
$organizations = new Collection;
|
$organizations = new Collection;
|
||||||
|
|
||||||
$invitations = OrganizationInvitation::query()
|
$invitations = OrganizationInvitation::query()
|
||||||
->whereRaw('lower(email) = ?', [strtolower($user->email)])
|
->where('email', $user->email)
|
||||||
->whereNotNull('accepted_at')
|
->whereNotNull('accepted_at')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
|
|||||||
1657
package-lock.json
generated
1657
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -40,14 +40,14 @@
|
|||||||
"axios": "^1.16.0",
|
"axios": "^1.16.0",
|
||||||
"eslint-plugin-unused-imports": "^4.4.1",
|
"eslint-plugin-unused-imports": "^4.4.1",
|
||||||
"happy-dom": "^20.8.9",
|
"happy-dom": "^20.8.9",
|
||||||
"laravel-vite-plugin": "^2.1.0",
|
"laravel-vite-plugin": "^3.1.3",
|
||||||
"openapi-zod-client": "^1.18.3",
|
"openapi-zod-client": "^1.18.3",
|
||||||
"postcss": "^8.5.14",
|
"postcss": "^8.5.14",
|
||||||
"postcss-import": "^15.1.0",
|
"postcss-import": "^15.1.0",
|
||||||
"postcss-nesting": "^12.1.5",
|
"postcss-nesting": "^12.1.5",
|
||||||
"tailwindcss": "^3.4.19",
|
"tailwindcss": "^3.4.19",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
"vite": "^7.3.3",
|
"vite": "^8.1.5",
|
||||||
"vite-plugin-checker": "^0.12.0",
|
"vite-plugin-checker": "^0.12.0",
|
||||||
"vitest": "^4.1.4",
|
"vitest": "^4.1.4",
|
||||||
"vue": "^3.5.34",
|
"vue": "^3.5.34",
|
||||||
|
|||||||
@@ -380,40 +380,6 @@ class RegistrationTest extends TestCaseWithDatabase
|
|||||||
$this->assertSame($user->organization->id, $organizations->first()->id);
|
$this->assertSame($user->organization->id, $organizations->first()->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function test_registration_joins_invited_organization_even_if_invitation_email_casing_differs(): void
|
|
||||||
{
|
|
||||||
// Arrange: invitation stored with a different casing than the registration email
|
|
||||||
$user = $this->createUserWithPermission();
|
|
||||||
OrganizationInvitation::factory()
|
|
||||||
->forOrganization($user->organization)
|
|
||||||
->role(Role::Employee)
|
|
||||||
->accepted()
|
|
||||||
->create([
|
|
||||||
'email' => 'Invited.User@example.com',
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
$response = $this->post('/register', [
|
|
||||||
'name' => 'Invited User',
|
|
||||||
'email' => 'invited.user@example.com',
|
|
||||||
'password' => 'password',
|
|
||||||
'password_confirmation' => 'password',
|
|
||||||
'terms' => true,
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Assert: joined the inviting organization, no extra personal organization, invitation consumed
|
|
||||||
$this->assertAuthenticated();
|
|
||||||
$response->assertRedirect(RouteServiceProvider::HOME);
|
|
||||||
$newUser = User::where('email', 'invited.user@example.com')->first();
|
|
||||||
$this->assertNotNull($newUser);
|
|
||||||
$this->assertDatabaseMissing(OrganizationInvitation::class, [
|
|
||||||
'email' => 'Invited.User@example.com',
|
|
||||||
]);
|
|
||||||
$organizations = $newUser->organizations;
|
|
||||||
$this->assertCount(1, $organizations);
|
|
||||||
$this->assertSame($user->organization->id, $organizations->first()->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_registration_logs_and_skips_accepted_invitation_with_invalid_role(): void
|
public function test_registration_logs_and_skips_accepted_invitation_with_invalid_role(): void
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
|
|||||||
Reference in New Issue
Block a user