public async Task <LinkedProject> GetLinkedAcceptedProject(int projectId, int userId, bool invalidateCache = false)
        {
            var key = $"LinkedAcceptedProject:{projectId}:{userId}";

            if (invalidateCache || !_cache.TryGetValue(key, out LinkedProject linkedProject))
            {
                linkedProject = await LinkedProjects.FirstOrDefaultAsync(x => x.ProjectId == projectId && x.UserId == userId && x.Accepted);

                if (linkedProject != null)
                {
                    _cache.Set(key, linkedProject, cacheOptions);
                }
            }

            return(linkedProject);
        }
        public TimetrackerContext(DbContextOptions <TimetrackerContext> options, IMemoryCache cache) : base(options)
        {
            _cache       = cache;
            cacheOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromHours(1));

            Database.Migrate();

            Roles.Load();
            States.Load();
            Tokens.Load();
            Passes.Load();
            Users.Load();
            Projects.Load();
            LinkedProjects.Load();
            Worktasks.Load();
            Worktracks.Load();
        }
 public LinkedProject GetLinkedProjectForUser(int projectId, int userId)
 {
     return(LinkedProjects.FirstOrDefault(x => x.ProjectId == projectId && x.UserId == userId));
 }
        public LocaleEditorDesignData() : base()
        {
            //var metaFile = new FileInfo(@"G:\Divinity Original Sin 2\DefEd\Data\Mods\Nemesis_627c8d3a-7e6b-4fd2-8ce5-610d553fdbe9\meta.lsx");
            //ModProjectData testData = new ModProjectData(metaFile, @"G:\Divinity Original Sin 2\DefEd\Data\Projects");

            //var result = LoadStringKeyData(@"G:\Divinity Original Sin 2\DefEd\Data\", testData);
            //Data = result.Data;
            //Name = result.Error;

            ModsGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Skills")
            {
                ChangesUnsaved = true
            });
            ModsGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Statuses"));
            for (var i = 1; i < 4; i++)
            {
                ModsGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Potionslalalalala" + i));
            }

            PublicGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Skills"));
            PublicGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Statuses"));
            PublicGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Potions"));

            for (var i = 1; i < 5; i++)
            {
                CustomGroup.DataFiles.Add(new LocaleTestFileData(ModsGroup, "Custom" + i));
            }

            foreach (var d in ModsGroup.DataFiles)
            {
                LocaleEditorCommands.Debug_CreateEntries(d, d.Entries);
            }

            foreach (var d in PublicGroup.DataFiles)
            {
                LocaleEditorCommands.Debug_CreateEntries(d, d.Entries);
                d.ChangesUnsaved = true;
                d.Entries.First().ChangesUnsaved = true;
            }

            foreach (var d in CustomGroup.DataFiles)
            {
                d.CanClose = d.CanRename = true;
                LocaleEditorCommands.Debug_CreateCustomEntries(d, d.Entries);
            }

            UpdateCombinedGroup(true);

            //SelectedGroupIndex = 1;
            //SelectedGroup.SelectedFileIndex = 2;

            System.Diagnostics.Trace.WriteLine("Design data test");

            SelectedGroupIndex = Groups.IndexOf(PublicGroup);
            SelectedEntry      = CombinedGroup.Tabs.First().Entries.First();

            LinkedProjects.Add(new ModProjectData()
            {
                DisplayName = "TestMod1"
            });
            LinkedProjects.Add(new ModProjectData()
            {
                DisplayName = "TestMod2"
            });
        }