protected override async Task <UserLogin> HandleInput(UserRegisterParams input) { using (var connection = database.GetConnection()) { using (var transaction = connection.BeginTransaction()) { IUserRepo userRepo = database.GetRepo <IUserRepo>(connection); ISpaceRepo spaceRepo = database.GetRepo <ISpaceRepo>(connection); ISubscriptionRepo subRepo = database.GetRepo <ISubscriptionRepo>(connection); // Check that the email is free first. if (!String.IsNullOrWhiteSpace(input.Email)) { User?emailInUse = await userRepo.FindByEmail(input.Email); if (emailInUse != null) { throw new CollisionException("Email is already in use"); } } User?usernameInUse = await userRepo.FindByUsername(input.Username); if (usernameInUse != null) { throw new CollisionException("Username is unavailable"); } User user = new User() { Username = input.Username, PasswordHash = passwordHasher.Hash(input.Password), Email = StringUtils.NullifyWhiteSpace(input.Email), JoinedDate = System.DateTime.UtcNow }; await userRepo.Add(user); // Subscribe the user to the default spaces. IEnumerable <Space> defaultSpaces = await spaceRepo.FindDefault(); IEnumerable <Subscription> defaultSubscriptions = defaultSpaces.Select(space => new Subscription() { User = user, Space = space }); foreach (Subscription s in defaultSubscriptions) { await subRepo.Add(s); s.Space.SubscriptionCount++; await spaceRepo.Update(s.Space); } UserView userView = userMapper.Map(user); string authToken = tokenHandler.IssueToken(user); transaction.Commit(); return(new UserLogin(userView, authToken)); } } }
public async Task Handle(UserRegisterEvent domainEvent) { IEnumerable <Space> defaultSpaces = await spaceRepo.FindDefault(); IEnumerable <Subscription> subs = defaultSpaces.Select(s => subscriptionFactory.CreateFor(domainEvent.User, s)); foreach (Subscription s in subs) { await subscriptionRepo.Add(s); } }
public async Task<Subscription> CreateSubscription(SubscriptionCreate create, User user) { Space? space = await spaceRepo.FindByName(create.Space); if (space == null) { throw new NotFoundException($"No space with name {create.Space} found."); } Subscription s = factory.CreateFor(user, space); await repo.Add(s); await bus.Dispatch(new SubscriptionCreateEvent(s)); return s; }
protected override async Task <SubscriptionView> HandleInput(SubscriptionCreateParams input) { using (var connection = database.GetConnection()) { ISpaceRepo spaceRepo = database.GetRepo <ISpaceRepo>(connection); ISubscriptionRepo subRepo = database.GetRepo <ISubscriptionRepo>(connection); //Check to see if the Space exists first Space?space = await spaceRepo.FindByName(input.Space); if (space == null) { throw new InvalidOperationException($"No space with name {input.Space} exists."); } //Ensure no sub for this combo is already in place Subscription?existingSub = await subRepo.FindByUserAndSpace(input.User.Username, input.Space); if (existingSub != null) { return(subscriptionMapper.Map(existingSub)); } //Create the subscription Subscription sub = new Subscription() { Space = space, User = input.User }; await subRepo.Add(sub); //Update sub count space.SubscriptionCount++; await spaceRepo.Update(space); return(subscriptionMapper.Map(sub)); } }