public async Task <ActionResponse> AddStudent(int batchId, string roll, string name, string email, string phone)
        {
            var batch = await _db.Batches.FirstOrDefaultAsync(x => x.Id == batchId);

            if (batch == null)
            {
                return(new ActionResponse(false, "Invalid Batch"));
            }

            var user = await _db.Users.FirstOrDefaultAsync(x => x.UserName == roll);

            if (user != null)
            {
                return(new ActionResponse(false, "Roll already exists"));
            }
            else
            {
                var allCourses = await _db.Courses.Where(x => x.Semester.Batch.Id == batchId)
                                 .ToListAsync();

                int.TryParse(roll, out int studentRoll);
                var student = new DBUser()
                {
                    Batch                = batch,
                    Email                = email,
                    EnrolledIn           = CurrentTime,
                    Name                 = name,
                    UserName             = roll,
                    Roll                 = studentRoll,
                    Role                 = AppConstants.Student,
                    PhoneNumber          = FixPhone(phone),
                    PhoneNumberConfirmed = false
                };
                var idUser = IdentityDBUser.Create(student);
                var res    = await _usermanager.CreateAsync(idUser);

                if (res.Succeeded)
                {
                    var mRes = await _usermanager.AddToRoleAsync(idUser, AppConstants.Student);

                    if (mRes.Succeeded)
                    {
                        foreach (var course in allCourses)
                        {
                            _db.StudentCourses.Add(new StudentCourse()
                            {
                                Course  = course,
                                Student = student
                            });
                        }
                        await _db.SaveChangesAsync();

                        var msg = EmailMessageCreator.CreateInvitation(phone, roll);
                        _emailSender.SendEmailAsync(student.Email, "Registration", msg);
                        return(new ActionResponse(true));
                    }
                }
                return(new ActionResponse(false, "Failed to create User"));
            }
        }
        internal async Task <List <DBUser> > AddStudents(IList <DBUser> students, int batchID)
        {
            var users = new List <DBUser>();
            var batch = await _db.Batches.FindAsync(batchID);

            var allCourses = await _db.Courses.Where(x => x.Semester.Batch.Id == batchID)
                             .ToListAsync();

            foreach (var student in students)
            {
                var oldUser = await _db.Users.FirstOrDefaultAsync(x => x.UserName == student.UserName);

                if (oldUser != null)
                {
                    continue;
                }

                student.Batch                = batch;
                student.PhoneNumber          = FixPhone(student.PhoneNumber);
                student.UserName             = student.Roll.ToString();
                student.PhoneNumberConfirmed = false;
                student.Role = AppConstants.Student;

                var idbUser = IdentityDBUser.Create(student);
                var res     = await _usermanager.CreateAsync(idbUser);

                if (res.Succeeded)
                {
                    await _usermanager.AddToRoleAsync(idbUser, AppConstants.Student);

                    foreach (var course in allCourses)
                    {
                        _db.StudentCourses.Add(new StudentCourse()
                        {
                            Course  = course,
                            Student = student
                        });
                    }
                }
                var msg = EmailMessageCreator.CreateInvitation(student.PhoneNumber, student.UserName);
                _emailSender.SendEmailAsync(student.Email, "Registration", msg);
            }
            await _db.SaveChangesAsync();

            return(users);
        }
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            using var scope = _serviceProvider.CreateScope();
            // Get the DbContext instance
            var db = scope.ServiceProvider.GetRequiredService <StudentDBContext>();
            await db.Database.MigrateAsync();

            var _roleManager = scope.ServiceProvider.GetService <RoleManager <IdentityRole> >();
            var _userManager = scope.ServiceProvider.GetRequiredService <UserManager <IdentityDBUser> >();
            var adminRole    = await _roleManager.FindByNameAsync(AppConstants.Admin);

            if (adminRole == null)
            {
                adminRole = new IdentityRole(AppConstants.Admin);
                //create the roles and seed them to the database
                await _roleManager.CreateAsync(adminRole);

                await _roleManager.CreateAsync(new IdentityRole(AppConstants.Student));
            }
            //Assign Admin role to the main User here we have given our newly registered
            //login id for Admin management
            var user = await _userManager.FindByNameAsync("admin");

            if (user == null)
            {
                var dbUser = new DBUser()
                {
                    UserName    = "******",
                    Email       = "*****@*****.**",
                    Role        = AppConstants.Admin,
                    PhoneNumber = "017000000"
                };
                user = IdentityDBUser.Create(dbUser);
                await _userManager.CreateAsync(user, "pass_WORD_1234");

                await _userManager.AddToRoleAsync(user, AppConstants.Admin);


                var _feedService = scope.ServiceProvider.GetRequiredService <FeedDataService>();
#if DEBUG
                await _feedService.StartAsync(dbUser.Id);
#endif
            }
        }