public async Task <JsonResult> Create([FromBody] NonTrasparentBuildingElemetDto dto)
        {
            var mapperDtoNonTransparentBulidingElement = _mapper.GetMapper <NonTrasparentBuildingElemet, NonTrasparentBuildingElemetDto>();
            var mapperDtoMaterialThickness             = _mapper.GetMapper <MaterialThickness, MaterialThicknessDto>();

            NonTrasparentBuildingElemet entity = mapperDtoNonTransparentBulidingElement.MapToEntity(dto, new NonTrasparentBuildingElemet());

            entity.MaterialsUsed = entity.MaterialsUsed ?? new List <MaterialThickness>();
            foreach (var item in dto.MaterialsUsed)
            {
                entity.MaterialsUsed.Add(mapperDtoMaterialThickness.MapToEntity(item, new MaterialThickness()));
            }
            //entity.MaterialsUsed = dto.MaterialsUsed.Select(mapperDtoMaterialThickness.MapToEntity).ToList();// (go,new MaterialThickness()));

            Project project = (await GetUserAsync()).Projects.FirstOrDefault();            //TODO take passed project id when there is support for more then one project

            if (project != null)
            {
                entity.ProjectId = project.Id;
                if (entity.Id == new Int32())
                {                //NEW
                    entity = await _nonTrasparentBuildingElemetService.CreateAndAssignToUser(entity);
                }
                else
                {                //UPDATE
                    entity = await _nonTrasparentBuildingElemetService.Update(entity);
                }
            }

            return(Json((mapperDtoNonTransparentBulidingElement.MapToDto(entity))));
        }
        public async Task Archive(int id)
        {
            NonTrasparentBuildingElemet ev = Get(id);

            if (ev != null)
            {
                ev.IsArchived = true;
                _dbContext.NonTrasparentBuildingElemets.Update(ev);
                await _dbContext.SaveChangesAsync();
            }
        }
        public async Task <NonTrasparentBuildingElemet> CreateAndAssignToUser(NonTrasparentBuildingElemet nonTrasparentBuildingElemet)
        {
            if (nonTrasparentBuildingElemet == null)
            {
                throw new ArgumentNullException("NonTrasparentBuildingElemet or userId cannot be null!");
            }

            nonTrasparentBuildingElemet.CreatedAt      = DateTime.UtcNow;
            nonTrasparentBuildingElemet.LastModifiedAt = nonTrasparentBuildingElemet.CreatedAt;

            return(await Create(nonTrasparentBuildingElemet));
        }
        public async Task <NonTrasparentBuildingElemet> Create(NonTrasparentBuildingElemet pl)
        {
            if (pl == null)
            {
                throw new ArgumentNullException("Element cannot be null!");
            }


            _dbContext.NonTrasparentBuildingElemets.Add(pl);
            await _dbContext.SaveChangesAsync();

            return(pl);
        }
        public async Task <NonTrasparentBuildingElemet> Update(NonTrasparentBuildingElemet nonTrasparentBuildingElemet)
        {
            try
            {
                _dbContext.NonTrasparentBuildingElemets.Update(nonTrasparentBuildingElemet);
                await _dbContext.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                var z = 2;
                throw;
            }

            return(Get(nonTrasparentBuildingElemet.Id));
        }
        public async Task <ActionResult> Get([FromQuery] int id, [FromQuery] int projectId)
        {
            ApplicationUser user = await GetUserAsync();

            Project project = user.Projects.FirstOrDefault();            //TODO take passed project id when there is support for more then one project

            if (project == null)
            {
                return(Json(null));
            }

            NonTrasparentBuildingElemet ev = _nonTrasparentBuildingElemetService.Get(id, project.Id);
            var mapper = _mapper.GetMapper <NonTrasparentBuildingElemet, NonTrasparentBuildingElemetDto>();

            return(Json(mapper.MapToDto(ev)));
        }
        public async Task <JsonResult> Update([FromBody] NonTrasparentBuildingElemetDto dto)
        {
            var mapperDtoNonTransparentBulidingElement = _mapper.GetMapper <NonTrasparentBuildingElemet, NonTrasparentBuildingElemetDto>();
            var mapperDtoMaterialThickness             = _mapper.GetMapper <MaterialThickness, MaterialThicknessDto>();

            //Extract user and project
            ApplicationUser user = await GetUserAsync();

            Project project = user.Projects.FirstOrDefault();            //TODO take passed project id when there is support for more then one project

            if (project == null)
            {
                return(Json(null));
            }
            NonTrasparentBuildingElemet buildingELement = _nonTrasparentBuildingElemetService.Get(dto.Id, project.Id);


            NonTrasparentBuildingElemet entity = mapperDtoNonTransparentBulidingElement.MapToEntity(dto, buildingELement);

            entity.ProjectId = buildingELement.Project.Id;

            //DEAL with MAterial Thickness children
            foreach (var item in dto.MaterialsUsed ?? new List <MaterialThicknessDto>())
            {
                if (item.Id == new int())
                {                //new
                    entity.MaterialsUsed.Add(mapperDtoMaterialThickness.MapToEntity(item, new MaterialThickness()));
                }
                else
                {                //updated
                    var tmp = entity.MaterialsUsed.FirstOrDefault(x => x.Id == item.Id);
                    entity.MaterialsUsed.Remove(tmp);
                    entity.MaterialsUsed.Add(mapperDtoMaterialThickness.MapToEntity(item, tmp));
                }
            }
            List <int> idsToBeRemoved = entity.MaterialsUsed.Select(go => go.Id).Except(dto.MaterialsUsed.Select(go1 => go1.Id)).ToList();

            foreach (var item in idsToBeRemoved)
            {            //DELETED
                entity.MaterialsUsed.Remove(entity.MaterialsUsed.FirstOrDefault(go => go.Id == item));
            }

            entity = await _nonTrasparentBuildingElemetService.Update(entity);

            return(Json((mapperDtoNonTransparentBulidingElement.MapToDto(entity))));
        }