public VersionDetail IncrementVersion(IVersionRequest request)
        {
            var versions = GetVersions(request);

            var versionList = versions.OrderBy(x => new Version(x.Version.Major, x.Version.Minor)).Reverse();

            VersionSimple version = null;

            if (versionList.Count() == 0)
            {
                version.CreateIncrement(request);
            }
            else
            {
                version = versionList.First().Version;
                version.CalculateIncrement(request);
            }

            var versionDetail = new VersionDetail
            {
                Version     = version,
                CreatedDate = DateTime.Now,
                Product     = new Product
                {
                    Id = request.ProductId
                }
            };

            var created = _repository.Add(versionDetail);

            return(created);
        }
        public IEnumerable <VersionDetail> GetVersions(IVersionRequest request)
        {
            var listOfVersions = _repository.GetByProductId(request.ProductId);

            return(listOfVersions
                   .WithMajorVersion(request.Major)
                   .WithMinorVersion(request.Minor));
        }
        public static VersionSimple CalculateIncrement(this VersionSimple version, IVersionRequest request)
        {
            VersionSimple incrementedVersion = version;

            if (!request.Major.HasValue && request.Minor.HasValue)
            {
                throw new ArgumentException("Cannot pass a Minor version without Major version");
            }

            if (request.Major.HasValue && request.Minor.HasValue)
            {
                incrementedVersion = incrementedVersion.IncrementBuild();
            }
            else if (request.Major.HasValue && !request.Minor.HasValue)
            {
                incrementedVersion = incrementedVersion.IncrementMinor();
            }
            else
            {
                incrementedVersion = incrementedVersion.IncrementMajor();
            }

            return(incrementedVersion);
        }
        public static VersionSimple CreateIncrement(this VersionSimple version, IVersionRequest request)
        {
            VersionSimple incrementedVersion = version;

            if (!request.Major.HasValue && request.Minor.HasValue)
            {
                throw new ArgumentException("Cannot pass a Minor version without Major version");
            }

            if (request.Major.HasValue && !request.Minor.HasValue)
            {
                incrementedVersion = new VersionSimple(request.Major.Value, 0, 0, 0);
            }
            else if (request.Major.HasValue && request.Minor.HasValue)
            {
                incrementedVersion = new VersionSimple(request.Major.Value, request.Minor.Value, 0, 0);
            }
            else
            {
                incrementedVersion = new VersionSimple(1, 0, 0, 0);
            }

            return(incrementedVersion);
        }