Пример #1
0
        public static User EnsureCreated(string controller, UserInfo user)
        {
            var db = new RepoContext();

            // Поиск пользователя по айди одного из аккаунтов
            var existed = db.Users.FirstOrDefault(x => x.Accounts.Any(y => y.Controller == controller && y.UserId == user.Id));

            if (existed != null)
            {
                return(existed);
            }

            // Ищем по юзернейму или создаем нового
            var usrn = user.Username != null
                ? db.Users.FirstOrDefault(x => x.Username == user.Username)
                       ?? FromUsername(user.Username) : FromUsername(user.Username);

            // Добавляем ему аккаунт
            var account = new Account {
                Controller = controller, UserId = user.Id
            };

            usrn.Accounts.Add(account);
            db.Update(usrn);
            db.SaveChanges();
            return(usrn);
        }
Пример #2
0
        public bool Exclude(ICollection <Chat> chats)
        {
            var db = new RepoContext();

            Chats.RemoveAll(x => chats.Any(y => x.ChatId == y.Id));
            if (Chats.Count < 2)
            {
                db.Remove(this);
                db.SaveChanges();
                return(true);
            }
            db.Update(this);
            db.SaveChanges();
            return(false);
        }
Пример #3
0
        public static void EnsureContained(string controller, ChatInfo chat, User user)
        {
            var db      = new RepoContext();
            var existed = Resolve(controller, chat.Id);

            if (existed == null)
            {
                return;
            }
            if (!existed.Members.Any(x => x.UserId == user.Id))
            {
                user.AssignPermissions(existed, UserScope.None);
                db.Update(user);
                db.SaveChanges();
            }
        }
Пример #4
0
        public static void Set(string key, string value)
        {
            var db  = new RepoContext();
            var val = new KeyValue {
                Key = key, Value = value
            };

            if (Get(key) == null)
            {
                db.Add(val);
            }
            else
            {
                db.Update(val);
            }
            db.SaveChanges();
        }
Пример #5
0
        private static void CreateAdmins()
        {
            var db = new Models.RepoContext();

            foreach (var admin in Options.SU)
            {
                var user = db.Users.FirstOrDefault(x => x.Username == admin);
                if (user == null)
                {
                    user = new User {
                        Username = admin
                    }
                }
                ;
                user.IsSuperUser = true;
                db.Update(user);
            }
            db.SaveChanges();
        }
Пример #6
0
        public static (bool, Route) Sync(User owner, ICollection <Chat> chats)
        {
            var db      = new RepoContext();
            var route   = Resolve(owner, chats);
            var created = route.Id == 0;

            foreach (var chat in chats)
            {
                if (route.Chats.Any(x => x.ChatId == chat.Id))
                {
                    continue;
                }
                route.Chats.Add(new ChatRoute {
                    Chat = chat
                });
            }
            route.Owner = owner;
            db.Update(route);
            db.SaveChanges();
            return(created, route);
        }
Пример #7
0
        public static Route Resolve(User owner, ICollection <Chat> chats)
        {
            var db = new RepoContext();

            // Ищем частичное совпадение в более чем 2 маршрутах
            var routes = db.Routes
                         .Where(x => x.Chats
                                .Any(y => chats.Contains(y.Chat) && y.Route.Owner.Id == owner.Id))
                         .ToList();

            if (routes.Any())
            {
                routes[0].Chats = routes
                                  .Select(x => x.Chats.AsEnumerable())
                                  .Aggregate((a, b) => a.Concat(b))
                                  .Distinct()
                                  .ToList();
                db.Update(routes[0]);
                foreach (var other in routes.Skip(1))
                {
                    db.Remove(other);
                }
                db.SaveChanges();
                return(routes[0]);
            }

            // Или полное совпадение
            var route = db.Routes
                        .FirstOrDefault(x => x.Chats.Select(y => y.Chat)
                                        .Intersect(chats).Count() == chats.Count);

            if (route != null)
            {
                return(route);
            }

            // Или создаем новый маршрут
            return(new Route());
        }