public async Task <ActionResult <ReadEventResource> > Update(Guid id, CreateEventResource resource)
        {
            var eventEntity = await UnitOfWork.Events.GetEventWithAttenders(id);

            if (eventEntity == null)
            {
                throw new RestError(HttpStatusCode.NotFound, new { Event = "Event not found." });
            }

            var userId = Guid.Parse(HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value);

            if (eventEntity.HostId != userId)
            {
                throw new RestError(HttpStatusCode.NotFound, new { Event = "Event not found." });
            }

            if (eventEntity.Attendances.Count() > 0)
            {
                throw new RestError(HttpStatusCode.NotFound, new { Event = "You can't update an event which has attenders." });
            }

            Mapper.Map <CreateEventResource, Event>(resource, eventEntity);

            await UnitOfWork.CompleteAsync();

            eventEntity.Id = id;

            var result = Mapper.Map <Event, ReadEventResource>(eventEntity);

            return(Ok(result));
        }
        public async Task <ActionResult <ReadEventResource> > CreateEvent(CreateEventResource resource)
        {
            if (!(resource.StartDate >= DateTime.Now.AddDays(1)))
            {
                throw new RestError(HttpStatusCode.BadRequest, new { StartDate = "Event start date can start from 1 day away." });
            }

            var category = await UnitOfWork.Categories.Get(resource.CategoryId);

            if (category == null)
            {
                throw new RestError(HttpStatusCode.BadRequest, new { Category = "Category doesn't exist" });
            }

            var userId = Guid.Parse(HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value);

            //check if host has any active events whose StartDate-EndDate conflicts

            var hostEvents = await UnitOfWork.Events.GetEventsWithoutSortingAndPaging(new EventQuery()
            {
                HostId = userId, StartDate = DateTime.Now, IsActive = true
            });

            foreach (var evt in hostEvents)
            {
                if (resource.StartDate.IsInRange(evt.StartDate, evt.EndDate) ||
                    resource.StartDate.AddHours(resource.DurationInHours).IsInRange(evt.StartDate, evt.EndDate))
                {
                    throw new RestError(HttpStatusCode.BadRequest, new { StartDate = $"Event conflict's with one of your active future events: {evt.Title}" });
                }
            }

            //check if user joined another event

            var attendances = await UnitOfWork.Attendances.GetUserAttendanceEvents(userId);

            foreach (var att in attendances)
            {
                if (resource.StartDate.IsInRange(att.Event.StartDate, att.Event.EndDate) ||
                    resource.StartDate.AddHours(resource.DurationInHours).IsInRange(att.Event.StartDate, att.Event.EndDate))
                {
                    throw new RestError(HttpStatusCode.BadRequest, new { StartDate = $"You already joined at an event at that time: {att.Event.Title}" });
                }
            }

            Event eventEntity = Mapper.Map <CreateEventResource, Event>(resource);

            eventEntity.HostId    = userId;
            eventEntity.CreatedAt = DateTime.Now;

            UnitOfWork.Events.Add(eventEntity);
            await UnitOfWork.CompleteAsync();

            var createdEvent = await UnitOfWork.Events.GetWithRelated(eventEntity.Id, e => e.Host, e => e.Category);

            var response = Mapper.Map <Event, ReadEventResource>(createdEvent);

            return(Ok(response));
        }
Beispiel #3
0
        public async Task <IActionResult> CreateEvent([FromBody] CreateEventResource eventResource)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var myEvent = mapper.Map <CreateEventResource, Event>(eventResource);

            context.Events.Add(myEvent);
            await context.SaveChangesAsync();

            var result = mapper.Map <Event, EventResource>(myEvent);

            return(Ok(result));
        }
Beispiel #4
0
        public async Task <IActionResult> Update(int id, [FromBody] CreateEventResource updateEventResource)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var myEvent = await context.Events.FindAsync(id);

            mapper.Map <CreateEventResource, Event>(updateEventResource, myEvent);

            await context.SaveChangesAsync();

            var result = mapper.Map <Event, CreateEventResource>(myEvent);

            return(Ok(result));
        }