// !! IMPORTANT NOTE: PrivateTalk, PrivateTalkReceiver, PrivateTalkTeamReceiver models should have [JsonIgnore] for that method to work properly.
        public PrivateTalkInsideOut GetNewUnreadPrivateTalk(int privateTalkId, string thisMember)
        {
            //[Type(MyOrReceived), PrivateTalk, MessageCountModel, Receivers, TeamReceivers]

            DateTimeOffset lastSeen     = (context.PrivateTalkLastSeen.Where(pt => pt.PrivateTalkId == privateTalkId && pt.Visitor == thisMember).FirstOrDefault()?.LastSeen) ?? new DateTimeOffset(DateTime.MinValue, TimeSpan.Zero);
            int            messageCount = context.PrivateTalkMessage.Where(ptm => ptm.PrivateTalkId == privateTalkId && ptm.Sender != thisMember && ptm.DateTimeSent > lastSeen).Count(); //messages belongs to others.

            if (messageCount > 0)
            {
                PrivateTalk pTalk = this.PrivateTalks.Where(pt => pt.PrivateTalkId == privateTalkId).FirstOrDefault();
                pTalk = new PrivateTalk {
                    PrivateTalkId = pTalk.PrivateTalkId, Owner = pTalk.Owner, Sender = pTalk.Sender, Thread = pTalk.Thread, DateTimeCreated = pTalk.DateTimeCreated
                };

                bool my = pTalk.Sender == thisMember;
                MessageCountModel mcm = new MessageCountModel {
                    PrivateTalkId = privateTalkId, MessagesCount = messageCount, OrderingCriterion = DateTimeOffset.MinValue
                };

                PrivateTalkReceiver[]     ptr  = PrivateTalkReceivers.Where(pt => pt.PrivateTalkId == privateTalkId)?.ToArray();
                PrivateTalkTeamReceiver[] pttr = PrivateTalkTeamReceivers.Where(pt => pt.PrivateTalkId == privateTalkId)?.ToArray();

                return(new PrivateTalkInsideOut {
                    My = my, PrivateTalk = pTalk, MessageCountModel = mcm, Receivers = ptr, TeamReceivers = pttr
                });
            }
            return(null);
        }
        [HttpDelete("{privateTalkId}")]                                        // DELETE PrivateTalks/1
        public IActionResult DeletePrivateTalk([FromRoute] long privateTalkId) //[FromRoute] is optional, it already accepts from route parameters not JSON.
        {
            PrivateTalk privateTalk = IPrivateTalkRepository.DeletePrivateTalk(privateTalkId);

            if (privateTalk != null)
            {
                return(Ok(privateTalk)); // or use No Content without arguments returned.
            }
            return(NoContent());         // 404 resource not found, Microsoft docs use NotFound for this kind of behavior.
        }
        [HttpGet("{privateTalkId}")]                            // GET PrivateTalks/2133
        public IActionResult GetPrivateTalk(long privateTalkId) //Accepts from route parameters not JSON. You don't have to speficy [FromRoute], but you can..
        {
            PrivateTalk privateTalk = IPrivateTalkRepository.GetPrivateTalk(privateTalkId);

            if (privateTalk != null)
            {
                return(Ok(privateTalk));
            }
            return(NoContent());  // 404 resource not found, Microsoft docs use NotFound for this kind of behavior.
        }
        public PrivateTalk DeletePrivateTalk(long privateTalkId) // Return null for any errors otherwise PrivateTalk(deleted)
        {
            PrivateTalk privateTalk = context.PrivateTalk.Where(bt => bt.PrivateTalkId == privateTalkId).FirstOrDefault();

            if (privateTalk != null)
            {
                context.Remove(privateTalk);
                context.SaveChanges();
            }
            return(privateTalk);
        }
 public ReturnModel NewPrivateTalk(PrivateTalk privateTalk) // Return -1 for any errors otherwise PrivateTalkId
 {
     try
     {
         context.PrivateTalk.Add(privateTalk);
         context.SaveChanges();
     }
     catch { return(new ReturnModel {
             ErrorCode = ErrorCodes.DatabaseError
         }); }
     return(new ReturnModel {
         ErrorCode = ErrorCodes.OK, ReturnedId = privateTalk.PrivateTalkId
     });                                                                                           // Provides PrivateTalkId(identity autoset from db)
 }
        public bool isMyPrivateTalkGuard(long privateTalkId, string thisMember)
        {
            PrivateTalk privateTalk = PrivateTalks.Where(p => p.PrivateTalkId == privateTalkId).FirstOrDefault();

            if (privateTalk == null)
            {
                return(false);
            }
            if (privateTalk.Sender == thisMember)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        [HttpPut("{privateTalkId}")] // PUT PrivateTalks/3 + JSON Object
        public IActionResult UpdatePrivateTalk([FromRoute] long privateTalkId, [FromBody] PrivateTalk privateTalk)
        {
            if (privateTalk == null || privateTalk.Sender != User.Identity.Name || privateTalkId != privateTalk.PrivateTalkId)
            {
                return(BadRequest()); // 400 Bad Request
            }
            ReturnModel r = IPrivateTalkRepository.UpdatePrivateTalk(privateTalk);

            if (r.ErrorCode == ErrorCodes.OK)
            {
                return(NoContent()); //204 No Content
            }
            else if (r.ErrorCode == ErrorCodes.ItemNotFoundError)
            {
                return(BadRequest());
            }
            return(new StatusCodeResult(StatusCodes.Status503ServiceUnavailable));  // 503 Service Unavailable Error.
        }
        //for unique, GroupBy(ptr => ptr.PrivateTalkId).Select(group => group.First())
        // public PrivateTalk[] PrivateTalksReceived(string receiver, int pageNo, string searchValue,int pageSize=50) // gelen kutusu
        // {
        //     var context2 = new XYZToDo.Models.DatabasePersistanceLayer.XYZToDoSQLDbContext();

        //     //int pageSize = 12;
        //     PrivateTalk[] ptrs = PrivateTalkReceivers.Where(ptr => ptr.Receiver == receiver).Select(ptr => ptr.PrivateTalk).ToArray();

        //     PrivateTalk[] ptrs2 = context.TeamMember.Where(tm => tm.Username == receiver && tm.Status == true).SelectMany(tm => tm.Team.PrivateTalkTeamReceiver).Select(rec => rec.PrivateTalk).Where(pt => pt.Sender != receiver).ToArray(); //İçinde bulunduğum takımların, takım alıcıları. 2 takımında bulunuyorum, private talk id 2, 3 takımında bulunuyoorum private talk 5, buradan private talkları getirelim.
        //     PrivateTalk[] pTalks = null;
        //     try
        //     {
        //         pTalks = ptrs.Concat(ptrs2)?.GroupBy(pt => pt.PrivateTalkId).Select(x => x.First())
        //         .OrderByDescending(pt => PTOrderingCriterion(pt.PrivateTalkId, receiver, context2)).
        //         Where(bt => searchValue == "undefined" || (bt.Thread.Contains(searchValue) || bt.Sender.Contains(searchValue))).Skip((pageNo - 1) * pageSize).Take(pageSize).ToArray();
        //     }

        //     catch (System.Exception)
        //     {
        //     }
        //     context2.Dispose();
        //     return pTalks;
        // }
        public bool isPrivateTalkJoinedGuard(long privateTalkId, string thisMember)
        {
            PrivateTalk pTalk = PrivateTalkReceivers.Where(ptr => ptr.Receiver == thisMember).Select(ptr => ptr.PrivateTalk).Where(pt => pt.PrivateTalkId == privateTalkId).FirstOrDefault();

            if (pTalk != null)
            {
                return(true);
            }

            PrivateTalk pTalk2 = context.TeamMember.Where(tm => tm.Username == thisMember && tm.Status == true).
                                 SelectMany(tm => tm.Team.PrivateTalkTeamReceiver).Select(rec => rec.PrivateTalk).Where(pt => pt.Sender != thisMember).Where(pt => pt.PrivateTalkId == privateTalkId).FirstOrDefault();

            if (pTalk2 != null)
            {
                return(true);
            }

            return(false);
        }
        public ReturnModel UpdatePrivateTalk(PrivateTalk privateTalk)
        {
            if (privateTalk.PrivateTalkId == 0)
            {
                return new ReturnModel {
                           ErrorCode = ErrorCodes.ItemNotFoundError
                }
            }
            ;
            try
            {
                context.Entry(privateTalk).State = EntityState.Modified;

                context.SaveChanges();
            }
            catch { return(new ReturnModel {
                    ErrorCode = ErrorCodes.DatabaseError
                }); }
            return(new ReturnModel {
                ErrorCode = ErrorCodes.OK
            });
        }
        [HttpPost()]                                                            // POST /PrivateTalks + JSON Object
        public IActionResult NewPrivateTalk([FromBody] PrivateTalk privateTalk) //Accepts JSON body, not x-www-form-urlencoded!
        {
            if (privateTalk == null)
            {
                return(BadRequest());        // 400 Bad Request
            }
            var member = User.Identity.Name; // For security. From Claim(ClaimTypes.Name, Username) in JWT

            if (member == null)
            {
                return(Unauthorized());
            }

            privateTalk.Sender = member;
            ReturnModel newPrivateTalk = IPrivateTalkRepository.NewPrivateTalk(privateTalk);

            if (newPrivateTalk.ErrorCode == ErrorCodes.OK)
            {
                return(CreatedAtAction(nameof(GetPrivateTalk), new { PrivateTalkId = newPrivateTalk.ReturnedId }, newPrivateTalk.ReturnedId)); // 201 Created
            }
            return(new StatusCodeResult(StatusCodes.Status503ServiceUnavailable));                                                             // 503 Service Unavailable Error.
        }