public async Task <ActionResult> DeclineCircleRequest([FromBody] CircleRequest model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            var loggedInUser = await GetLoggedInUserAsync();

            if (loggedInUser == null)
            {
                return(Unauthorized());
            }
            if (!await _repo.IsOwner(loggedInUser.Id, model.CircleId))
            {
                return(Unauthorized());
            }
            var circleRequestFromRepo = await _repo.GetCircleRequest((int)model.AppUserId, model.CircleId);

            if (circleRequestFromRepo == null)
            {
                return(NotFound("リクエストが見つかりません"));
            }

            circleRequestFromRepo.Declined = true;
            await _repo.SaveAll();

            return(Ok());
        }
        public IActionResult Put([FromBody] CircleRequest request)
        {
            var circle = _mapper.Map <Circle>(request);

            _CircleService.Update(request.CircleId, circle);

            return(Ok());
        }
        public IActionResult Post([FromBody] CircleRequest request)
        {
            var circle = _mapper.Map <Circle>(request);

            var result = _CircleService.Create(circle);

            return(Ok(_mapper.Map <CircleResponse>(result)));
        }
        public async Task <ActionResult> ApproveCircleRequest([FromBody] CircleRequest model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            var loggedInUser = await GetLoggedInUserAsync();

            if (loggedInUser == null)
            {
                return(Unauthorized());
            }
            if (!await _repo.IsOwner(loggedInUser.Id, model.CircleId))
            {
                return(Unauthorized());
            }
            var circleRequestFromRepo = await _repo.GetCircleRequest((int)model.AppUserId, model.CircleId);

            if (circleRequestFromRepo == null)
            {
                return(NotFound("リクエストが見つかりません"));
            }

            _repo.Delete(circleRequestFromRepo);
            //If already member, just remove request and create nothing
            if (await _repo.IsMember(model.AppUserId, model.CircleId))
            {
                await _repo.SaveAll();

                return(Ok());
            }

            var newCircleMember = new CircleMember()
            {
                AppUserId      = (int)model.AppUserId,
                Circle         = circleRequestFromRepo.Circle,
                CircleId       = model.CircleId,
                Role           = CircleRoleEnum.MEMBER,
                DateJoined     = DateTime.Now,
                DateLastActive = DateTime.Now
            };

            _repo.Add(newCircleMember);
            await _repo.SaveAll();

            await _notificationRepo.AddNotification(NotificationEnum.CircleRequestAccepted, model.AppUserId, newCircleMember);

            await _repo.SaveAll();

            return(CreatedAtRoute("GetCircleMember", new { userId = model.AppUserId, circleId = model.CircleId }, _mapper.Map <CircleMemberForReturnDto>(await _repo.GetCircleMember(model.AppUserId, model.CircleId))));
        }
        public async Task <ActionResult> SendCircleRequest([FromBody] CircleRequest model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            if (!await this.MatchAppUserWithToken(model.AppUserId))
            {
                return(Unauthorized());
            }
            if (await _repo.IsMember((int)model.AppUserId, model.CircleId))
            {
                return(BadRequest("既にメンバーになっています"));
            }
            var circleFromRepo = await _repo.Get <Circle>(model.CircleId);

            if (circleFromRepo == null)
            {
                return(NotFound("サークルレコードが見つかりません: " + model.CircleId));
            }
            if (await _repo.RequestSent((int)model.AppUserId, model.CircleId))
            {
                return(BadRequest("既にリクエストしています"));
            }

            if (circleFromRepo.ApprovalRequired)
            {
                _repo.Add(model);
                await _notificationRepo.AddNotification(NotificationEnum.NewCircleMemberRequest, model.AppUserId, model);

                await _repo.SaveAll();

                return(CreatedAtRoute("GetCircleRequest", new { userId = model.AppUserId, circleId = model.CircleId }, null));
            }
            _repo.Add(new CircleMember()
            {
                AppUserId      = (int)model.AppUserId,
                CircleId       = model.CircleId,
                Role           = CircleRoleEnum.MEMBER,
                DateJoined     = DateTime.Now,
                DateLastActive = DateTime.Now
            });
            await _repo.SaveAll();

            return(CreatedAtRoute("GetCircleMember", new { userId = model.AppUserId, circleId = model.CircleId }, null));
        }
        private async Task AddNewCircleMemberRequestNotification(int appUserId, CircleRequest circleRequest)
        {
            // var circleRequest = record as CircleRequest;
            if (circleRequest == null)
            {
                return;
            }
            var user = await _context.AppUsers.FirstOrDefaultAsync(au => au.Id == appUserId);

            await AddNotificationIfNotExist(new Notification()
            {
                AppUserId         = (int)circleRequest.Circle.AppUserId,
                NotificationType  = NotificationEnum.NewCircleMemberRequest,
                RecordType        = "Circle",
                RecordId          = circleRequest.CircleId,
                FromUserName      = user.DisplayName,
                TargetRecordTitle = circleRequest.Circle.Name,
                // Message = circleRequest.AppUser.DisplayName + "さんからコミュニティ" + circleRequest.Circle.Name + "の参加リクエストがあります"
            });
        }
        public async Task AcceptRequest_AddMemberAndNotification()
        {
            //Arrange
            string circleOwnerName = "TestMember1";
            // int ownerUserId = TestData.GetAppUserIdByName(circleOwnerName);
            // int ownerUserId = 11;
            string requestUserName = "******";
            // int requestUserId = 13;
            int requestUserId = TestDataSeeder.GetAppUserIdByName(requestUserName);

            //Act
            var approvingRequest = new CircleRequest {
                AppUserId = requestUserId, CircleId = 1
            };

            //Accept circle request by owner
            await LoginByUser(circleOwnerName);

            var contents = new StringContent(JsonConvert.SerializeObject(approvingRequest), Encoding.UTF8, "application/json");
            var response = await _client.PostAsync("/api/circlemember/approve", contents);

            response.EnsureSuccessStatusCode();
            //Check if a new member was added
            response = await _client.GetAsync("/api/circlemember/" + approvingRequest.CircleId + "/latest");

            response.EnsureSuccessStatusCode();
            var jsonResult = JsonConvert.DeserializeObject <JArray>(await response.Content.ReadAsStringAsync());
            var memberList = jsonResult.ToObject <List <CircleMember> >();

            Assert.True(memberList.Any(ml => ml.AppUserId == requestUserId && ml.CircleId == 1));

            //Check if notification was created
            await LoginByUser(requestUserName);

            var notifications = await _client.GetAsync("/api/notification/" + requestUserId);

            string result = await notifications.Content.ReadAsStringAsync();

            Assert.Contains("notificationType\":" + (int)NotificationEnum.CircleRequestAccepted, result);
        }