//Get a specific Resource from a GUID
        public ApiResponse<Domain.Models.Resource> Get(Guid guid)
        {
            Domain.Models.Resource ResourceToReturn = new Domain.Models.Resource();

            try
            {
                //Gets a Resource with all of its children
               ResourceToReturn = _applicationContext.Resources
                    .Include(Resource => Resource.TimeSlots)
                    .SingleOrDefault(Resource => Resource.Id == guid);

                if (ResourceToReturn == null)
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.NoContent, null);
                }
                else
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.OK, ResourceToReturn);
                }
            }
            catch (Exception)
            {
                return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.InternalServerError, null);
            }
        }
        //Delete a Resource
        public async Task<ApiResponse<Domain.Models.Resource>> Delete(Guid guid)
        {
            Domain.Models.Resource ResourceToDelete = new Domain.Models.Resource();

            try
            {
                //Gets the Resource to be deleted. All children are tracked as well, so that they are also deleted.
                ResourceToDelete = _applicationContext.Resources
                    .Include(Resource => Resource.TimeSlots)
                    .SingleOrDefault(Resource => Resource.Id == guid);

                if (ResourceToDelete == null)
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.NoContent, null);
                }
                else
                {
                    var Resource = await _applicationContext.Resources.FirstOrDefaultAsync(x => x.Id == ResourceToDelete.Id);
                    //This will cascade delete.
                    _applicationContext.Resources.Remove(ResourceToDelete);
                    
                    _applicationContext.SaveChanges();

                    _eventBus.PublishEvent(new ResourceDeletedEvent(Resource));
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.OK, null);
                }
            }
            catch (Exception)
            {
                return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.InternalServerError, null);
            }
        }
        //Creates a Resource
        public ApiResponse<Domain.Models.Resource> Create(Domain.Models.Resource Resource)
        {
            bool invalidDate = false;

            try
            {
                if (Resource == null)
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.NoContent, null);
                }

                foreach (var timeslot in Resource.TimeSlots)
                {
                    timeslot.Id = Guid.NewGuid();
                }

                //Checks that the timeslots do not overlap.
                Resource.TimeSlots.ForEach(delegate (AvailableTime outerTime)
                {
                    Resource.TimeSlots.ForEach(delegate (AvailableTime innerTime)
                    {
                        if (!(((outerTime.From <= innerTime.From) && (outerTime.To <= innerTime.From)) ||
                        ((outerTime.From >= innerTime.To) && (outerTime.To >= innerTime.To))))
                        {
                            if (outerTime.Id != innerTime.Id)
                            {
                                invalidDate = true;
                            }
                        }
                    });
                });

                if (!invalidDate)
                {
                    _applicationContext.Add(Resource);
                    _applicationContext.SaveChanges();

                    _eventBus.PublishEvent(new ResourceCreatedEvent(Resource));
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.OK, Resource);
                }
                else
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.NotModified, null);
                }
            }
            catch (Exception e)
            {
                return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.InternalServerError, null);
            }
        }
 public Domain.Client.Dtos.Resource Update(Domain.Client.Dtos.Resource entity)
 {
     try
     {
         Domain.Models.Resource ormEntity = _mapper.Map <Domain.Client.Dtos.Resource, Domain.Models.Resource>(entity);
         ormEntity = _repository.Update(ormEntity);
         entity    = _mapper.Map <Domain.Models.Resource, Domain.Client.Dtos.Resource>(ormEntity);
     }
     catch (Exception ex)
     {
         _logger.LogError(ex.ToString());
         this.ErrorMessage = ex.ToString();
     }
     return(entity);
 }
 public Domain.Client.Dtos.Resource Read(int id, string includeProperties = null)
 {
     Domain.Client.Dtos.Resource toReturn = null;
     try
     {
         Domain.Models.Resource ormEntity = _repository.Read(id, includeProperties);
         toReturn = _mapper.Map <Domain.Models.Resource, Domain.Client.Dtos.Resource>(ormEntity);
     }
     catch (Exception ex)
     {
         _logger.LogError(ex.ToString());
         this.ErrorMessage = ex.ToString();
     }
     return(toReturn);
 }
Example #6
0
 public async Task <ApiResponse <Domain.Models.Resource> > UpdateResource([FromBody] Domain.Models.Resource Resource)
 {
     return(await _ResourceService.Update(Resource));
 }
Example #7
0
 public ApiResponse <Domain.Models.Resource> CreateResource([FromBody] Domain.Models.Resource Resource)
 {
     return(_ResourceService.Create(Resource));
 }
        //Update a Resource
        //Should ignore reservations when being updated
        public async Task<ApiResponse<Domain.Models.Resource>> Update(Domain.Models.Resource Resource)
        {
            Domain.Models.Resource ResourceToUpdate = new Domain.Models.Resource();

            bool invalidDate = false;

            try
            {
                ResourceToUpdate = _applicationContext.Resources.Include(r => r.TimeSlots).SingleOrDefault(r => r.Id == Resource.Id);

                if (ResourceToUpdate == null)
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.NoContent, null);
                }

                //Checks that the timeslots do not overlap. Also makes sure that he id is not the same, if the times do match.
                Resource.TimeSlots.ForEach(delegate (AvailableTime newTimeSlot)
                {
                    ResourceToUpdate.TimeSlots.ForEach(delegate (AvailableTime existingTimeSlot)
                    {
                        if (!(((newTimeSlot.From <= existingTimeSlot.From) && (newTimeSlot.To <= existingTimeSlot.From)) ||
                        ((newTimeSlot.From >= existingTimeSlot.To) && (newTimeSlot.To >= existingTimeSlot.To))))
                        {
                            if (newTimeSlot.Id != existingTimeSlot.Id)
                            {
                                invalidDate = true;
                            }
                        }
                    });
                });

                if (!invalidDate)
                {
                    ResourceToUpdate.Name = Resource.Name;
                    ResourceToUpdate.Description = Resource.Description;

                    //Makes sure that new timeslots that is not in db has no ID because of Auto Assignment
                    Resource.TimeSlots.ForEach(newTimeSlot =>
                    {
                        if(ResourceToUpdate.TimeSlots.FirstOrDefault(x => x.Id == newTimeSlot.Id) == null)
                            newTimeSlot.Id = Guid.Empty;
                    });
                    ResourceToUpdate.TimeSlots = Resource.TimeSlots;

                    Domain.Models.Resource OldResourece = await _applicationContext.Resources.FirstOrDefaultAsync(x => x.Id == ResourceToUpdate.Id);
                    _applicationContext.Resources.Update(ResourceToUpdate);
                    _applicationContext.SaveChanges();
                    _eventBus.PublishEvent(new ResourceUpdatedEvent(ResourceToUpdate));

                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.OK, ResourceToUpdate);
                }
                else
                {
                    return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.NotModified, null);
                }
            }
            catch (Exception)
            {
                return new ApiResponse<Domain.Models.Resource>(ApiResponseCode.InternalServerError, null);
            }
        }