public async override Task <IEnumerable <Course> > GetAllAsync()
        {
            var result = await Query <Course>
                         .Collection()
                         .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                         .StoredProcedure("[CourseBoundedContext].[pCourse_GetAll]")
                         .ExecuteAsync();

            return(result.Records);
        }
 protected override Command CreateDeleteCommand(Course entity, IAuthenticatedUser user, string selector)
 {
     return(Command
            .NonQuery()
            .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
            .StoredProcedure("[CourseBoundedContext].[pCourse_Delete]")
            .Parameters(
                p => p.Name("courseId").Value(entity.Id)
                ));
 }
        public async override Task <(int, IEnumerable <Course>)> GetAsync(CollectionQueryParameters queryParameters)
        {
            var result = await Query <Course>
                         .Collection()
                         .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                         .StoredProcedure("[CourseBoundedContext].[pCourse_Get]")
                         .QueryParameters(queryParameters)
                         .Parameters(p => p.Name("count").Count())
                         .ExecuteAsync();

            return(result.Count, result.Records);
        }
        public IEnumerable <Course> GetAllIsRequiredByForCourse(int courseId)
        {
            var result = Query <Course>
                         .Collection()
                         .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                         .StoredProcedure("[CourseBoundedContext].[pCourse_GetAllIsRequiredBy]")
                         .Parameters(
                p => p.Name("courseId").Value(courseId)
                )
                         .Execute();

            return(result.Records);
        }
        public async override Task <Course> GetByIdAsync(int courseId)
        {
            var result = await Query <Course>
                         .Single()
                         .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                         .StoredProcedure("[CourseBoundedContext].[pCourse_GetById]")
                         .Parameters(
                p => p.Name("courseId").Value(courseId)
                )
                         .ExecuteAsync();

            return(result.Record);
        }
        public (int, IEnumerable <Course>) GetRequiresForCourse(int courseId, CollectionQueryParameters queryParameters)
        {
            var result = Query <Course>
                         .Collection()
                         .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                         .StoredProcedure("[CourseBoundedContext].[pCourse_GetRequires]")
                         .QueryParameters(queryParameters)
                         .Parameters(p => p.Name("count").Count())
                         .Parameters(
                p => p.Name("courseId").Value(courseId)
                )
                         .Execute();

            return(result.Count, result.Records);
        }
        protected override Command CreateUpdateCommand(Course entity, IAuthenticatedUser user, string selector)
        {
            if (user != null)
            {
                entity.UpdatedBy = (int)user.Id;
            }

            return(Command
                   .NonQuery()
                   .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                   .StoredProcedure("[CourseBoundedContext].[pCourse_Update]")
                   .Parameters(
                       p => p.Name("courseId").Value(entity.Id),
                       p => p.Name("description").Value(entity.Description),
                       p => p.Name("updatedBy").Value(entity.UpdatedBy)
                       ));
        }
        protected override Command CreateInsertCommand(Course entity, IAuthenticatedUser user, string selector)
        {
            if (user != null)
            {
                entity.CreatedBy = (int)user.Id;
            }

            var command = Query <Course>
                          .Single()
                          .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                          .StoredProcedure("[CourseBoundedContext].[pCourse_Insert]")
                          .Parameters(
                p => p.Name("description").Value(entity.Description),
                p => p.Name("createdBy").Value(entity.CreatedBy)
                )
                          .RecordInstance(entity)
                          .MapProperties(
                p => p.Name("Id").Index(0)
                );

            return(command);
        }
        protected override Command CreateDeleteLinksCommand(Course entity, IAuthenticatedUser user, string selector)
        {
            switch (selector)
            {
            case "UnlinkIsRequiredByFromCourse": return(Command
                                                        .NonQuery()
                                                        .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                                                        .StoredProcedure("[CourseBoundedContext].[pCourse_UnlinkIsRequiredBy]")
                                                        .Parameters(
                                                            p => p.Name("courseId").Value(entity.Id)
                                                            ));

            case "UnlinkRequiresFromCourse": return(Command
                                                    .NonQuery()
                                                    .ThrowWhenNoRecordIsUpdated(false)
                                                    .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                                                    .StoredProcedure("[CourseBoundedContext].[pCourse_UnlinkRequires]")
                                                    .Parameters(
                                                        p => p.Name("courseId").Value(entity.Id)
                                                        ));

            default: throw new InvalidOperationException();
            }
        }
 public CreatePreRequisiteCommandAggregate() : base(new DomainFramework.DataAccess.RepositoryContext(CourseWithPreRequisitesConnectionClass.GetConnectionName()))
 {
 }
 public CreatePreRequisiteCommandAggregate(PreRequisiteInputDto preRequisite, EntityDependency[] dependencies = null) : base(new DomainFramework.DataAccess.RepositoryContext(CourseWithPreRequisitesConnectionClass.GetConnectionName()))
 {
     Initialize(preRequisite, dependencies);
 }
        protected override Command CreateInsertCommand(PreRequisite entity, IAuthenticatedUser user, string selector)
        {
            if (user != null)
            {
                entity.CreatedBy = (int)user.Id;
            }

            var command = Command
                          .NonQuery()
                          .Connection(CourseWithPreRequisitesConnectionClass.GetConnectionName())
                          .StoredProcedure("[CourseBoundedContext].[pPreRequisite_Insert]")
                          .Parameters(
                p => p.Name("createdBy").Value(entity.CreatedBy)
                )
                          .OnBeforeCommandExecuted(cmd =>
            {
                var dependencies = Dependencies();

                if (!dependencies.Any())
                {
                    cmd.Parameters(
                        p => p.Name("requiredCourseId").Value(entity.Id.RequiredCourseId),
                        p => p.Name("courseId").Value(entity.Id.CourseId)
                        );
                }
                else
                {
                    switch (selector)
                    {
                    case "Requires":
                        {
                            var course = (Course)dependencies.ElementAt(0).Entity;

                            cmd.Parameters(
                                p => p.Name("requiredCourseId").Value(course.Id),
                                p => p.Name("courseId").Value(course.Id)
                                );
                        }
                        break;

                    case "IsRequiredBy":
                        {
                            var course = (Course)dependencies.ElementAt(0).Entity;

                            cmd.Parameters(
                                p => p.Name("requiredCourseId").Value(course.Id),
                                p => p.Name("courseId").Value(course.Id)
                                );
                        }
                        break;

                    default:
                        {
                            var requiresCourse = (Course)dependencies.Single(d => d.Selector == "Requires").Entity;

                            var isRequiredByCourse = (Course)dependencies.Single(d => d.Selector == "IsRequiredBy").Entity;

                            entity.Id = new PreRequisiteId
                            {
                                RequiredCourseId = requiresCourse.Id,
                                CourseId         = isRequiredByCourse.Id
                            };

                            cmd.Parameters(
                                p => p.Name("requiredCourseId").Value(requiresCourse.Id),
                                p => p.Name("courseId").Value(isRequiredByCourse.Id)
                                );
                        }
                        break;
                    }
                }
            });

            return(command);
        }