public BuildSessionModel InitBuildSession(StartBuildDto startBuildDto)
        {
            SessionService.CheckSession(startBuildDto.Session);
            FurnitureItemModel furniture = FurnitureRepo.Get(startBuildDto.FurnitureId.Value);

            if (furniture == null)
            {
                throw new NotFoundException("furniture");
            }

            bool canBuild = FurnitureService.CanBuild(startBuildDto.Session, startBuildDto.FurnitureId.Value);

            if (!canBuild)
            {
                throw new NotFoundException("all owned parts");
            }

            int userId = startBuildDto.Session.UserId.Value;

            if (UserBuildTokens.ContainsKey(userId))
            {
                RemoveSessionByUserId(userId);
            }
            //throw new ConflictException("build sessions");

            string token = HashingService.GetHash(Guid.NewGuid().ToString());

            IEnumerable <ConcretePartModel> possiblePartsToUse = ConcretePartRepo
                                                                 .GetOwnedByUser(userId)
                                                                 .Where(part => !part.IsForSell && !part.IsInUse)
                                                                 .ToList();

            BuildSessionManager buildSessionInfo = new BuildSessionManager(
                userId, possiblePartsToUse, furniture,
                new BuildSessionModel(token, furniture.Id)
                );

            UserBuildTokens.Add(userId, token);
            BuildSessions.Add(token, buildSessionInfo);
            return(buildSessionInfo.BuildSession);
        }