Example #1
0
        public async Task <ProjectPermissionModel> Handle(AcceptProjectInviteRequest request, CancellationToken cancellationToken)
        {
            var identity = GetIdentity();

            // TODO: We don't handle scenario where user is already in project? Should we? or should FE handle it?
            var dto = await fDbTransactionService.InTransactionAsync(async() =>
            {
                var invite = await fProjectInviteRepository.GetByTokenAsync(request.Token, cancellationToken);
                if (invite is null)
                {
                    throw new NotFoundCodeException($"Project Invite with Token '{request.Token}' was not found.");
                }

                var permission = await fProjectPermissionRepository.CreateOrUpdateAsync(
                    invite.ProjectId, identity.Id, invite.ProjectPermissionType, cancellationToken);

                if (!invite.IsMultiUse)
                {
                    await fProjectInviteRepository.DeleteWithoutSelectAsync(invite.Id, cancellationToken);
                }

                return(permission);
            }, cancellationToken);

            // TODO: Find better solution instead of the AfterMap
            return(fMapper.Map <ProjectPermissionDto, ProjectPermissionModel>(
                       dto, opt => opt.AfterMap((_, model) => model.UserEmail = identity.Email)));
        }