Browse Source

Finalized.

pull/354/head
Sebastian Stehle 7 years ago
parent
commit
afd1d65810
  1. 4
      src/Squidex.Domain.Apps.Entities/Apps/Invitation/InvitationEmailEventConsumer.cs
  2. 4
      src/Squidex.Domain.Apps.Entities/Apps/Invitation/InvitationEmailSender.cs
  3. 6
      src/Squidex.Domain.Users/DefaultUserResolver.cs
  4. 7
      src/Squidex.Domain.Users/UserValues.cs
  5. 2
      src/Squidex.Shared/Identity/SquidexClaimTypes.cs
  6. 2
      src/Squidex.Shared/Users/IUserResolver.cs
  7. 5
      src/Squidex.Shared/Users/UserExtensions.cs
  8. 2
      src/Squidex/Config/Domain/EntitiesServices.cs
  9. 4
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts
  10. 2
      src/Squidex/app/shared/services/app-contributors.service.spec.ts
  11. 4
      src/Squidex/app/shared/services/app-contributors.service.ts
  12. 2
      src/Squidex/app/shared/state/contributors.state.ts
  13. 10
      src/Squidex/appsettings.json
  14. 10
      tests/Squidex.Domain.Apps.Entities.Tests/Apps/Invitation/InviteUserCommandMiddlewareTests.cs

4
src/Squidex.Domain.Apps.Entities/Apps/Invitation/InvitationEmailEventConsumer.cs

@ -60,7 +60,9 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
return;
}
if (@event.Payload is AppContributorAssigned appContributorAssigned && appContributorAssigned.Actor.IsSubject)
if (@event.Payload is AppContributorAssigned appContributorAssigned &&
appContributorAssigned.IsCreated &&
appContributorAssigned.Actor.IsSubject)
{
var assignerId = appContributorAssigned.Actor.Identifier;
var assigneeId = appContributorAssigned.ContributorId;

4
src/Squidex.Domain.Apps.Entities/Apps/Invitation/InvitationEmailSender.cs

@ -45,12 +45,12 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
public Task SendExistingUserEmailAsync(IUser assigner, IUser assignee, string appName)
{
return SendEmailAsync(texts.ExistingUserSubject, texts.ExistingUserBody, assigner, assignee, appName);
return SendEmailAsync(texts.ExistingUserBody, texts.ExistingUserSubject, assigner, assignee, appName);
}
public Task SendNewUserEmailAsync(IUser assigner, IUser assignee, string appName)
{
return SendEmailAsync(texts.NewUserBody, texts.NewUserSubject, assigner, assignee, appName);
return SendEmailAsync(texts.NewUserSubject, texts.NewUserBody, assigner, assignee, appName);
}
private async Task SendEmailAsync(string emailSubj, string emailBody, IUser assigner, IUser assignee, string appName)

6
src/Squidex.Domain.Users/DefaultUserResolver.cs

@ -28,7 +28,7 @@ namespace Squidex.Domain.Users
this.userFactory = userFactory;
}
public async Task<bool> CreateUserIfNotExists(string email)
public async Task<bool> CreateUserIfNotExists(string email, bool invited)
{
var user = userFactory.Create(email);
@ -38,7 +38,9 @@ namespace Squidex.Domain.Users
if (result.Succeeded)
{
await userManager.UpdateAsync(user, new UserValues { DisplayName = email });
var values = new UserValues { DisplayName = email, Invited = invited };
await userManager.UpdateAsync(user, values);
}
return result.Succeeded;

7
src/Squidex.Domain.Users/UserValues.cs

@ -22,6 +22,8 @@ namespace Squidex.Domain.Users
public string Email { get; set; }
public bool? Invited { get; set; }
public bool? Consent { get; set; }
public bool? ConsentForEmails { get; set; }
@ -47,6 +49,11 @@ namespace Squidex.Domain.Users
yield return new Claim(SquidexClaimTypes.Hidden, Hidden.ToString());
}
if (Invited.HasValue)
{
yield return new Claim(SquidexClaimTypes.Invited, Invited.ToString());
}
if (Consent.HasValue)
{
yield return new Claim(SquidexClaimTypes.Consent, Consent.ToString());

2
src/Squidex.Shared/Identity/SquidexClaimTypes.cs

@ -19,6 +19,8 @@ namespace Squidex.Shared.Identity
public static readonly string Hidden = "urn:squidex:hidden";
public static readonly string Invited = "urn:squidex:invited";
public static readonly string Permissions = "urn:squidex:permissions";
public static readonly string PermissionsClient = "client_urn:squidex:permissions";

2
src/Squidex.Shared/Users/IUserResolver.cs

@ -12,7 +12,7 @@ namespace Squidex.Shared.Users
{
public interface IUserResolver
{
Task<bool> CreateUserIfNotExists(string email);
Task<bool> CreateUserIfNotExists(string email, bool invited = false);
Task<IUser> FindByIdOrEmailAsync(string idOrEmail);

5
src/Squidex.Shared/Users/UserExtensions.cs

@ -19,6 +19,11 @@ namespace Squidex.Shared.Users
return new PermissionSet(user.GetClaimValues(SquidexClaimTypes.Permissions).Select(x => new Permission(x)));
}
public static bool IsInvited(this IUser user)
{
return user.HasClaimValue(SquidexClaimTypes.Invited, "true");
}
public static bool IsHidden(this IUser user)
{
return user.HasClaimValue(SquidexClaimTypes.Hidden, "true");

2
src/Squidex/Config/Domain/EntitiesServices.cs

@ -150,7 +150,7 @@ namespace Squidex.Config.Domain
return result;
});
var emailOptions = config.GetValue<SmptOptions>("email:smtp");
var emailOptions = config.GetSection("email:smtp").Get<SmptOptions>();
if (emailOptions.IsConfigured())
{

4
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts

@ -99,10 +99,10 @@ export class ContributorsPageComponent implements OnInit {
const requestDto = new AssignContributorDto(user, 'Editor', true);
this.contributorsState.assign(requestDto)
.subscribe(wasInvited => {
.subscribe(isCreated => {
this.assignContributorForm.submitCompleted({});
if (wasInvited) {
if (isCreated) {
this.dialogs.notifyInfo('A new user with the entered email address has been created and assigned as contributor.');
}
}, error => {

2
src/Squidex/app/shared/services/app-contributors.service.spec.ts

@ -94,7 +94,7 @@ describe('AppContributorsService', () => {
expect(req.request.method).toEqual('POST');
expect(req.request.headers.get('If-Match')).toEqual(version.value);
req.flush({ contributorId: '123', wasInvited: true });
req.flush({ contributorId: '123', isCreated: true });
expect(contributorAssignedDto!.contributorId).toEqual('123');
}));

4
src/Squidex/app/shared/services/app-contributors.service.ts

@ -52,7 +52,7 @@ export class AppContributorDto extends Model {
export class ContributorAssignedDto {
constructor(
public readonly contributorId: string,
public readonly wasInvited: boolean
public readonly isCreated: boolean
) {
}
}
@ -93,7 +93,7 @@ export class AppContributorsService {
map(response => {
const body: any = response.payload.body;
const result = new ContributorAssignedDto(body.contributorId, body.wasInvited);
const result = new ContributorAssignedDto(body.contributorId, body.isCreated);
return new Versioned(response.version, result);
}),

2
src/Squidex/app/shared/state/contributors.state.ts

@ -115,7 +115,7 @@ export class ContributorsState extends State<Snapshot> {
this.replaceContributors(contributors, dto.version);
return dto.payload.wasInvited;
return dto.payload.isCreated;
}),
catchError(error => {
if (Types.is(error, ErrorDto) && error.statusCode === 404) {

10
src/Squidex/appsettings.json

@ -96,23 +96,23 @@
*/
"port": 465
},
"invitiations": {
"invitations": {
/*
* The email subject when a new user is added as contributor.
*/
"newUserSubject": "Welcome to Squidex, you have been invited to app $APP_NAME",
"newUserSubject": "Welcome to Squidex, you have been invited to join Project $APP_NAME",
/*
* The email body when a new user is added as contributor.
*/
"newUserBody": "You have been invited to join an app at Squidex CMS\n\nWelcome to Squidex\n$ASSIGNER_NAME ($ASSIGNER_EMAIL) has invited you to join app $APP_NAME at Squidex headless CMS.\nLogin with your Github, Google or Microsoft account to create a new user account and start editing content now.\n\nThank you very much,\nThe Squidex Team\n<<Start now!>> [$UI_URL]",
"newUserBody": "You have been invited to join a Project at Squidex CMS\n\nWelcome to Squidex\n$ASSIGNER_NAME ($ASSIGNER_EMAIL) has invited you to join app $APP_NAME at Squidex Headless CMS.\nLogin with your Github, Google or Microsoft credentials to create a new user account and start editing content now.\n\nThank you very much,\nThe Squidex Team\n<<Start now!>> [$UI_URL]",
/*
* The email subject when an existing user is added as contributor.
*/
"existingUserSubject": "[Squidex CMS] You have been invited to app $APP_NAME",
"existingUserSubject": "[Squidex CMS] You have been invited to App $APP_NAME",
/*
* The email body when an existing user is added as contributor.
*/
"existingUserBody": "You have been invited to join an app at Squidex CMS\n\nWelcome to Squidex\n$ASSIGNER_NAME ($ASSIGNER_EMAIL) has invited you to join app $APP_NAME at Squidex headless CMS.\nLogin or reload the Management UI to see the app.\n\nThank you very much,\nThe Squidex Team\n<<Start now!>> [$UI_URL]"
"existingUserBody": "You have been invited to join an App at Squidex CMS\n\nWelcome to Squidex\n$ASSIGNER_NAME ($ASSIGNER_EMAIL) has invited you to join app $APP_NAME at Squidex Headless CMS.\nLogin or reload the Management UI to see the app.\n\nThank you very much,\nThe Squidex Team\n<<Start now!>> [$UI_URL]"
}
},

10
tests/Squidex.Domain.Apps.Entities.Tests/Apps/Invitation/InviteUserCommandMiddlewareTests.cs

@ -31,7 +31,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
var command = new AssignContributor { ContributorId = "me@email.com", IsInviting = true };
var context = new CommandContext(command, commandBus);
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com"))
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com", true))
.Returns(true);
var result = EntityCreatedResult.Create("13", 13L);
@ -42,7 +42,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
Assert.Same(context.Result<InvitedResult>().Id, result);
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com"))
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com", true))
.MustHaveHappened();
}
@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
var command = new AssignContributor { ContributorId = "me@email.com", IsInviting = true };
var context = new CommandContext(command, commandBus);
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com"))
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com", true))
.Returns(false);
var result = EntityCreatedResult.Create("13", 13L);
@ -63,7 +63,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
Assert.Same(context.Result<EntityCreatedResult<string>>(), result);
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com"))
A.CallTo(() => userResolver.CreateUserIfNotExists("me@email.com", true))
.MustHaveHappened();
}
@ -75,7 +75,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Invitation
await sut.HandleAsync(context);
A.CallTo(() => userResolver.CreateUserIfNotExists(A<string>.Ignored))
A.CallTo(() => userResolver.CreateUserIfNotExists(A<string>.Ignored, A<bool>.Ignored))
.MustNotHaveHappened();
}
}

Loading…
Cancel
Save