Пример #1
0
            public async Task <ProfileEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var target = await _context.Persons.FirstOrDefaultAsync(x => x.Username == message.Username, cancellationToken);

                if (target == null)
                {
                    throw new RestException(HttpStatusCode.NotFound, new { Target = "Target not found." });
                }

                var observer = await _context.Persons.FirstOrDefaultAsync(x => x.Username == _currentUserAccessor.GetCurrentUsername(), cancellationToken);

                var followedPeople = await _context.FollowedPeople.FirstOrDefaultAsync(x => x.ObserverId == observer.PersonId && x.TargetId == target.PersonId, cancellationToken);

                if (followedPeople == null)
                {
                    followedPeople = new FollowedPeople()
                    {
                        Observer   = observer,
                        ObserverId = observer.PersonId,
                        Target     = target,
                        TargetId   = target.PersonId
                    };
                    await _context.FollowedPeople.AddAsync(followedPeople, cancellationToken);

                    await _context.SaveChangesAsync(cancellationToken);
                }

                return(await _profileReader.ReadProfile(message.Username));
            }
Пример #2
0
            public async Task <CommentEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var Project = await _context.Projects
                              .Include(x => x.Comments)
                              .FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken);

                if (Project == null)
                {
                    throw new RestException(HttpStatusCode.NotFound, new { Project = "Project not found." });
                }

                var author = await _context.Persons.FirstAsync(x => x.Username == _currentUserAccessor.GetCurrentUsername(), cancellationToken);

                var comment = new Comment()
                {
                    Author    = author,
                    Body      = message.Comment.Body,
                    CreatedAt = DateTime.UtcNow,
                    UpdatedAt = DateTime.UtcNow
                };
                await _context.Comments.AddAsync(comment, cancellationToken);

                Project.Comments.Add(comment);

                await _context.SaveChangesAsync(cancellationToken);

                return(new CommentEnvelope(comment));
            }
Пример #3
0
            public async Task <ComponentEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var component = await _context.Components
                                .Where(x => x.Slug == message.Slug)
                                .FirstOrDefaultAsync(cancellationToken);

                if (component == null)
                {
                    throw new RestException(HttpStatusCode.NotFound, new { Component = "Component not found." });
                }


                component.ComponentImage = message.Component.ComponentImage ?? component.ComponentImage;
                component.Description    = message.Component.Description ?? component.Description;
                component.Slug           = component.ComponentId.GenerateSlug();

                if (_context.ChangeTracker.Entries().First(x => x.Entity == component).State == EntityState.Modified)
                {
                    component.UpdatedAt = DateTime.UtcNow;
                }

                await _context.SaveChangesAsync(cancellationToken);

                return(new ComponentEnvelope(await _context.Components.GetAllData()
                                             .Where(x => x.Slug == component.Slug)
                                             .FirstOrDefaultAsync(cancellationToken)));
            }
Пример #4
0
            public async Task <UserEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                if (await _context.Persons.Where(x => x.Username == message.User.Username).AnyAsync(cancellationToken))
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { User = $"Username {message.User.Username} is already taken." });
                }

                if (await _context.Persons.Where(x => x.Email == message.User.Email).AnyAsync(cancellationToken))
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { User = $"E-mail {message.User.Email} is already taken." });
                }

                var salt   = Guid.NewGuid().ToByteArray();
                var person = new Person
                {
                    Username = message.User.Username,
                    Email    = message.User.Email,
                    Hash     = _passwordHasher.Hash(message.User.Password, salt),
                    Salt     = salt
                };

                _context.Persons.Add(person);
                await _context.SaveChangesAsync(cancellationToken);

                var user = _mapper.Map <Person, User>(person);

                user.Token = await _jwtTokenGenerator.CreateToken(person.Username);

                return(new UserEnvelope(user));
            }
Пример #5
0
            public async Task <ProjectEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var Project = await _context.Projects
                              .Where(x => x.Slug == message.Slug)
                              .FirstOrDefaultAsync(cancellationToken);

                if (Project == null)
                {
                    throw new RestException(HttpStatusCode.NotFound, new { Project = "Project not found." });
                }


                Project.Description  = message.Project.Description ?? Project.Description;
                Project.Body         = message.Project.Body ?? Project.Body;
                Project.Title        = message.Project.Title ?? Project.Title;
                Project.ProjectImage = message.Project.ProjectImage ?? Project.ProjectImage;
                Project.Slug         = Project.Title.GenerateSlug();

                if (_context.ChangeTracker.Entries().First(x => x.Entity == Project).State == EntityState.Modified)
                {
                    Project.UpdatedAt = DateTime.UtcNow;
                }

                await _context.SaveChangesAsync(cancellationToken);

                return(new ProjectEnvelope(await _context.Projects.GetAllData()
                                           .Where(x => x.Slug == Project.Slug)
                                           .FirstOrDefaultAsync(cancellationToken)));
            }
Пример #6
0
            public async Task <ProjectEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var Project = await _context.Projects.FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken);

                if (Project == null)
                {
                    throw new RestException(HttpStatusCode.NotFound, new { Project = "Project not found." });
                }

                var person = await _context.Persons.FirstOrDefaultAsync(x => x.Username == _currentUserAccessor.GetCurrentUsername(), cancellationToken);

                var favorite = await _context.ProjectFavorites.FirstOrDefaultAsync(x => x.ProjectId == Project.ProjectId && x.PersonId == person.PersonId, cancellationToken);

                if (favorite == null)
                {
                    favorite = new ProjectFavorite()
                    {
                        Project   = Project,
                        ProjectId = Project.ProjectId,
                        Person    = person,
                        PersonId  = person.PersonId
                    };
                    await _context.ProjectFavorites.AddAsync(favorite, cancellationToken);

                    await _context.SaveChangesAsync(cancellationToken);
                }

                return(new ProjectEnvelope(await _context.Projects.GetAllData()
                                           .FirstOrDefaultAsync(x => x.ProjectId == Project.ProjectId, cancellationToken)));
            }
Пример #7
0
            public async Task <ComponentEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var whereToFindIt = new List <WhereToFindIt>();

                foreach (var where in (message.Component.WhereToFindItList ?? Enumerable.Empty <string>()))
                {
                    var w = await _context.WhereToFind.FindAsync(where);

                    if (w == null)
                    {
                        w = new WhereToFindIt()
                        {
                            WhereToFindItId = where
                        };
                        await _context.WhereToFind.AddAsync(w, cancellationToken);

                        await _context.SaveChangesAsync(cancellationToken);
                    }
                    whereToFindIt.Add(w);
                }

                var component = new Component()
                {
                    ComponentId    = message.Component.Name,
                    CreatedAt      = DateTime.UtcNow,
                    UpdatedAt      = DateTime.UtcNow,
                    Description    = message.Component.Description,
                    ComponentImage = string.IsNullOrEmpty(message.Component.ComponentImage) ? ImagePath.ImageNotProvided : message.Component.ComponentImage,
                    Slug           = message.Component.Name.GenerateSlug()
                };
                await _context.Components.AddAsync(component, cancellationToken);

                await _context.ComponentWhereToFindIt.AddRangeAsync(whereToFindIt.Select(x => new ComponentWhereToFindIt()
                {
                    Component     = component,
                    WhereToFindIt = x
                }), cancellationToken);

                await _context.SaveChangesAsync(cancellationToken);

                return(new ComponentEnvelope(component));
            }
Пример #8
0
            public async Task Handle(Command message, CancellationToken cancellationToken)
            {
                var component = await _context.Components
                                .FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken);

                if (component == null)
                {
                    throw new RestException(HttpStatusCode.NotFound, new { Component = "Component not found." });
                }

                _context.Components.Remove(component);
                await _context.SaveChangesAsync(cancellationToken);
            }
Пример #9
0
            public async Task <UserEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var currentUsername = _currentUserAccessor.GetCurrentUsername();
                var person          = await _context.Persons.Where(x => x.Username == currentUsername).FirstOrDefaultAsync(cancellationToken);

                person.Username = message.User.Username ?? person.Username;
                person.Email    = message.User.Email ?? person.Email;
                person.Bio      = message.User.Bio ?? person.Bio;
                person.Image    = message.User.Image ?? person.Image;

                if (!string.IsNullOrWhiteSpace(message.User.Password))
                {
                    var salt = Guid.NewGuid().ToByteArray();
                    person.Hash = _passwordHasher.Hash(message.User.Password, salt);
                    person.Salt = salt;
                }

                await _context.SaveChangesAsync(cancellationToken);

                return(new UserEnvelope(_mapper.Map <Person, User>(person)));
            }
Пример #10
0
            public async Task <ProjectEnvelope> Handle(Command message, CancellationToken cancellationToken)
            {
                var author = await _context.Persons.FirstAsync(x => x.Username == _currentUserAccessor.GetCurrentUsername(), cancellationToken);

                var components = new List <Component>();

                foreach (var component in (message.Project.ComponentList ?? Enumerable.Empty <string>()))
                {
                    var c = await _context.Components.FindAsync(component);

                    if (c == null)
                    {
                        c = new Component()
                        {
                            ComponentId = component,
                            CreatedAt   = DateTime.Now,
                            UpdatedAt   = DateTime.Now,
                            Slug        = component.GenerateSlug()
                        };
                        await _context.Components.AddAsync(c, cancellationToken);

                        await _context.SaveChangesAsync(cancellationToken);
                    }
                    components.Add(c);
                }
                var tags = new List <Tag>();

                foreach (var tag in (message.Project.TagList ?? Enumerable.Empty <string>()))
                {
                    var t = await _context.Tags.FindAsync(tag);

                    if (t == null)
                    {
                        t = new Tag()
                        {
                            TagId = tag
                        };
                        await _context.Tags.AddAsync(t, cancellationToken);

                        await _context.SaveChangesAsync(cancellationToken);
                    }
                    tags.Add(t);
                }

                var Project = new Project()
                {
                    Author       = author,
                    Body         = message.Project.Body,
                    CreatedAt    = DateTime.UtcNow,
                    UpdatedAt    = DateTime.UtcNow,
                    Description  = message.Project.Description,
                    ProjectImage = string.IsNullOrEmpty(message.Project.ProjectImage) ? ImagePath.ImageNotProvided : message.Project.ProjectImage,
                    Title        = message.Project.Title,
                    Slug         = message.Project.Title.GenerateSlug()
                };
                await _context.Projects.AddAsync(Project, cancellationToken);

                await _context.ProjectComponents.AddRangeAsync(components.Select(x => new ProjectComponent()
                {
                    Project   = Project,
                    Component = x
                }), cancellationToken);

                await _context.SaveChangesAsync(cancellationToken);

                await _context.ProjectTags.AddRangeAsync(tags.Select(x => new ProjectTag()
                {
                    Project = Project,
                    Tag     = x
                }), cancellationToken);

                await _context.SaveChangesAsync(cancellationToken);

                return(new ProjectEnvelope(Project));
            }