public async Task <Question> PostQuestion(int lectureId, [FromBody] QuestionCreate model)
        {
            Lecture lecture = await _context.Lectures
                              .Where(x => x.Id == lectureId)
                              .Where(x => x.Course.Members.Any(y => y.MemberId == GetUserId()))
                              .Include(x => x.Questions)
                              .ThenInclude(x => x.Answers)
                              .SingleOrDefaultAsync();

            ILAUser user = await _context.Users.FindAsync(GetUserId());

            Question question = new Question
            {
                PointedQuestion = model.PointedQuestion,
                Lecture         = lecture,
                User            = user
            };

            await _context.Questions.AddAsync(question);

            await _context.SaveChangesAsync();

            question.User    = null;
            question.Lecture = null;
            return(question);
        }
예제 #2
0
        public async Task <JsonWebToken> Create(ILAUser user, UserManager <ILAUser> userManager)
        {
            var nowUtc  = DateTime.UtcNow;
            var expires = nowUtc.AddMinutes(_options.ExpiryMinutes);
            var exp     = ((DateTimeOffset)expires).ToUnixTimeSeconds();
            var iat     = ((DateTimeOffset)nowUtc).ToUnixTimeSeconds();
            var guid    = Guid.NewGuid().ToString();

            var payload = new JwtPayload
            {
                { JwtRegisteredClaimNames.Sub, user.Id },
                { JwtRegisteredClaimNames.Iss, _options.Issuer },
                { JwtRegisteredClaimNames.Iat, iat },
                { JwtRegisteredClaimNames.Exp, exp },
                { JwtRegisteredClaimNames.Jti, guid }
            };

            await _tokenManager.ActivateAsync(guid);

            return(new JsonWebToken
            {
                AccessToken = _jwtSecurityTokenHandler.WriteToken(new JwtSecurityToken(_jwtHeader, payload)),
                Expires = exp
            });
        }
예제 #3
0
        public async Task <PushTokens> SaveToken(string userId, string token, string deviceId)
        {
            ILAUser user = await _context.Users.FindAsync(userId);

            PushTokens pushToken = await _context.PushTokens.Where(x => x.DeviceId == deviceId).SingleOrDefaultAsync(x => x.User.Id == userId);

            if (pushToken == null)
            {
                pushToken = new PushTokens {
                    DeviceId = deviceId, User = user, Token = token
                };
                await _context.PushTokens.AddAsync(pushToken);
            }
            else
            {
                pushToken.Token = token;
                pushToken.User  = user;
                _context.PushTokens.Update(pushToken);
            }

            await _context.SaveChangesAsync();

            pushToken.User = null;

            return(pushToken);
        }
예제 #4
0
        public async Task DeleteUser(ILAUser user)
        {
            var identityResult = await _userManager.DeleteAsync(user);

            if (!identityResult.Succeeded)
            {
                throw new UserException(identityResult.Errors.Select(x => x.Description).ToList());
            }
        }
예제 #5
0
        public async Task ChangePassword(ILAUser user, string oldPassword, string newPassword)
        {
            var identityResult = await _userManager.ChangePasswordAsync(user, oldPassword, newPassword);

            if (!identityResult.Succeeded)
            {
                throw new UserException(identityResult.Errors.Select(x => x.Description).ToList());
            }
        }
예제 #6
0
        public async Task SignUp(string email, string password, string firstName, string lastName)
        {
            ILAUser user = new ILAUser
            {
                UserName  = email,
                Email     = email,
                LastName  = lastName,
                FirstName = firstName,
            };

            var identityResult = await _userManager.CreateAsync(user, password);

            if (!identityResult.Succeeded)
            {
                throw new UserException(identityResult.Errors.Select(x => x.Description).ToList());
            }
        }
예제 #7
0
        public async Task <TestPush> TestPush()
        {
            ILAUser user = await _dbContext.Users
                           .Where(x => x.Id == GetUserId())
                           .Include(x => x.PushTokens)
                           .SingleOrDefaultAsync();

            if (user == null)
            {
                throw new UserException(404);
            }

            _fireBaseService.SendPushNotificationMessageToSingleUser(user, "Test", "Ping", null);

            return(new TestPush {
                Message = "Send Test Notifications"
            });
        }
        public async Task <Pause> PostPause(int lectureId)
        {
            Lecture lecture = await _context.Lectures
                              .Include(x => x.Pauses)
                              .ThenInclude(x => x.User)
                              .FirstOrDefaultAsync(x => x.Id == lectureId);

            ILAUser user = await _context.Users.FindAsync(GetUserId());

            if (lecture == null)
            {
                throw new UserException("Lecture not found", 404);
            }

            if (user == null)
            {
                throw new UserException("Internal server Error", 500);
            }

            Pause pause = new Pause
            {
                Lecture   = lecture,
                TimeStamp = DateTime.Now.ToUniversalTime(),
                User      = user
            };

            if (lecture.Pauses.Any(x => x.User.Id == GetUserId() && (pause.TimeStamp - x.TimeStamp).TotalSeconds < 120))
            {
                throw new UserException("You can pause ery 120 seconds only.", 481);
            }

            await _context.Pauses.AddAsync(pause);

            await _context.SaveChangesAsync();

            pause.User    = null;
            pause.Lecture = null;

            await _hubContext.Clients.Group(lectureId.ToString()).SendAsync("Pause", pause);

            return(pause);
        }
        public async Task <IActionResult> Create([Bind("Id,Title,Description,Archived")] Course course)
        {
            if (ModelState.IsValid)
            {
                ILAUser user = await _context.Users.FindAsync(GetUserId());

                if (user == null)
                {
                    return(NotFound());
                }

                course.Owner = user;

                _context.Add(course);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(course));
        }
        public async Task <Answer> PostAnswer(int questionId, [FromBody] AnswerCreate model)
        {
            Question question = await _context.Questions
                                .Where(x => x.Lecture.Course.Members.Any(y => y.MemberId == GetUserId()))
                                .Where(x => x.Id == questionId)
                                .Include(x => x.User)
                                .ThenInclude(x => x.PushTokens)
                                .SingleOrDefaultAsync();

            ILAUser user = await _context.Users.FindAsync(GetUserId());

            if (question == null || user == null)
            {
                throw new UserException(404);
            }

            Answer answer = new Answer
            {
                Question = question,
                User     = user,
                Comment  = model.Comment,
            };

            await _context.Answers.AddAsync(answer);

            await _context.SaveChangesAsync();

            _fireBaseService.SendPushNotificationMessageToSingleUser(question.User, "New Answer",
                                                                     "Someone answerd your question",
                                                                     new Dictionary <string, string>
            {
                { "questionId", question.Id.ToString() },
                { "answerId", answer.Id.ToString() }
            });

            question.User    = null;
            question.Lecture = null;

            return(answer);
        }
예제 #11
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (ModelState.IsValid)
            {
                var user = new ILAUser {
                    UserName = Input.Email, Email = Input.Email, FirstName = Input.FirstName, LastName = Input.LastName
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { userId = user.Id, code = code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                                                      $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    await _signInManager.SignInAsync(user, isPersistent : false);

                    return(LocalRedirect(returnUrl));
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
예제 #12
0
 public void SendPushNotificationMessageToSingleUser(ILAUser user, string title, string body, Dictionary <string, string> data = null) =>
 SendPushNotificationMessage(new List <ILAUser> {
     user
 }, title, body, data);